Changeset 848

Show
Ignore:
Timestamp:
04/18/08 15:51:45 (6 months ago)
Author:
astrange
Message:

Fix line breaking some more; it was completely wrong after the first hard break.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/Subtitles/SubATSUIRenderer.m

    r847 r848  
    655655 
    656656static UniCharArrayOffset BreakOneLineSpan(ATSUTextLayout layout, SubRenderDiv *div, unsigned char *breakOpportunities, 
    657                                                                                    ATSLayoutRecord *records, ItemCount lineLen, Fixed idealLineWidth, Fixed originalLineWidth, Fixed maximumLineWidth, unsigned numBreaks
     657                                                                                   ATSLayoutRecord *records, ItemCount lineLen, Fixed idealLineWidth, Fixed originalLineWidth, Fixed maximumLineWidth, unsigned numBreaks, unsigned lastHardBreak
    658658{                
    659659        int recOffset = 0; 
     
    670670                        ATSLayoutRecord *rec = &records[j]; 
    671671                        Fixed recPos = rec->realPos - widthOffset; 
    672  
    673                         if (bitfield_test(breakOpportunities, rec->originalOffset/2)) { 
     672                        UniCharArrayOffset charOffset = rec->originalOffset/2 + lastHardBreak; 
     673 
     674                        if (bitfield_test(breakOpportunities, charOffset)) { 
    674675                                if (recPos >= idealLineWidth) { 
    675676                                        error = recPos - idealLineWidth; 
     
    680681                                                        rec = &records[lastIndex]; 
    681682                                                        j = lastIndex; 
     683                                                        recPos = rec->realPos - widthOffset; 
     684                                                        charOffset = rec->originalOffset/2 + lastHardBreak; 
    682685                                                } 
    683686                                        } 
     
    687690                                                 
    688691                                        foundABreak = YES; 
    689                                         lastBreakOffset = rec->originalOffset/2
    690                                         ATSUSetSoftLineBreak(layout, rec->originalOffset/2); 
     692                                        lastBreakOffset = charOffset
     693                                        ATSUSetSoftLineBreak(layout, charOffset); 
    691694                                        break; 
    692695                                } 
     
    698701                widthOffset = records[j].realPos; 
    699702                recOffset = j; 
    700         } while (foundABreak && numBreaks--); 
     703                numBreaks--; 
     704        } while (foundABreak && numBreaks); 
    701705                 
    702706        return (numBreaks == 0) ? 0 : lastBreakOffset; 
     
    707711        UniCharArrayOffset hardBreaks[numHardBreaks+2]; 
    708712        declare_bitfield(breakOpportunities, textLen); 
    709          
    710         float fWidth = FixedToFloat(breakingWidth)
     713        float fBreakingWidth = FixedToFloat(breakingWidth); 
     714        int i
    711715         
    712716        ATSUGetSoftLineBreaks(layout, kATSUFromTextBeginning, kATSUToTextEnd, numHardBreaks, &hardBreaks[1], NULL);      
    713717        FindAllPossibleLineBreaks(breakLocator, utext, textLen, breakOpportunities); 
    714         int i; 
    715718                 
    716719        hardBreaks[0] = 0; 
     
    722725                 
    723726                ATSUGetUnjustifiedBounds(layout, thisBreak, nextBreak - thisBreak, &leftEdge, &rightEdge, &ignore, &ignore); 
    724                 Fixed fixLineWidth = rightEdge - leftEdge; 
    725                 float lineWidth = FixedToFloat(fixLineWidth); 
     727                Fixed lineWidth = rightEdge - leftEdge; 
     728                float fLineWidth = FixedToFloat(lineWidth); 
    726729                                 
    727                 if (fixLineWidth > breakingWidth) { 
     730                if (lineWidth > breakingWidth) { 
    728731                        ATSLayoutRecord *records; 
    729732                        ItemCount numRecords; 
    730                         unsigned idealSplitLines = ceil(lineWidth / fWidth); 
    731                         Fixed idealBreakWidth = FloatToFixed(lineWidth / ceil(lineWidth / fWidth)); 
     733                        unsigned idealSplitLines = ceil(fLineWidth / fBreakingWidth); 
     734                        Fixed idealBreakWidth = FloatToFixed(fLineWidth / idealSplitLines); 
    732735                         
    733736                        ATSUDirectGetLayoutDataArrayPtrFromTextLayout(layout, thisBreak, kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, (void*)&records, &numRecords); 
    734737                                                 
    735                         UniCharArrayOffset res = BreakOneLineSpan(layout, div, breakOpportunities, records, numRecords, idealBreakWidth, fixLineWidth, breakingWidth, idealSplitLines-1); 
     738                        UniCharArrayOffset res = BreakOneLineSpan(layout, div, breakOpportunities, records, numRecords, idealBreakWidth, lineWidth, breakingWidth, idealSplitLines-1, thisBreak); 
     739                         
     740                        ATSUDirectReleaseLayoutDataArrayPtr(NULL, kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, (void*)&records); 
    736741                         
    737742                        if (res) ATSUBatchBreakLines(layout, res, nextBreak - res, breakingWidth, NULL); 
    738                          
    739                         ATSUDirectReleaseLayoutDataArrayPtr(NULL, kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, (void*)&records); 
    740743                } 
    741744        }