Changeset 848
- Timestamp:
- 04/18/08 15:51:45 (6 months ago)
- Files:
-
- trunk/Subtitles/SubATSUIRenderer.m (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
- Modified
- Copied
- Moved
trunk/Subtitles/SubATSUIRenderer.m
r847 r848 655 655 656 656 static 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) 658 658 { 659 659 int recOffset = 0; … … 670 670 ATSLayoutRecord *rec = &records[j]; 671 671 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)) { 674 675 if (recPos >= idealLineWidth) { 675 676 error = recPos - idealLineWidth; … … 680 681 rec = &records[lastIndex]; 681 682 j = lastIndex; 683 recPos = rec->realPos - widthOffset; 684 charOffset = rec->originalOffset/2 + lastHardBreak; 682 685 } 683 686 } … … 687 690 688 691 foundABreak = YES; 689 lastBreakOffset = rec->originalOffset/2;690 ATSUSetSoftLineBreak(layout, rec->originalOffset/2);692 lastBreakOffset = charOffset; 693 ATSUSetSoftLineBreak(layout, charOffset); 691 694 break; 692 695 } … … 698 701 widthOffset = records[j].realPos; 699 702 recOffset = j; 700 } while (foundABreak && numBreaks--); 703 numBreaks--; 704 } while (foundABreak && numBreaks); 701 705 702 706 return (numBreaks == 0) ? 0 : lastBreakOffset; … … 707 711 UniCharArrayOffset hardBreaks[numHardBreaks+2]; 708 712 declare_bitfield(breakOpportunities, textLen); 709 710 float fWidth = FixedToFloat(breakingWidth);713 float fBreakingWidth = FixedToFloat(breakingWidth); 714 int i; 711 715 712 716 ATSUGetSoftLineBreaks(layout, kATSUFromTextBeginning, kATSUToTextEnd, numHardBreaks, &hardBreaks[1], NULL); 713 717 FindAllPossibleLineBreaks(breakLocator, utext, textLen, breakOpportunities); 714 int i;715 718 716 719 hardBreaks[0] = 0; … … 722 725 723 726 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); 726 729 727 if ( fixLineWidth > breakingWidth) {730 if (lineWidth > breakingWidth) { 728 731 ATSLayoutRecord *records; 729 732 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); 732 735 733 736 ATSUDirectGetLayoutDataArrayPtrFromTextLayout(layout, thisBreak, kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, (void*)&records, &numRecords); 734 737 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); 736 741 737 742 if (res) ATSUBatchBreakLines(layout, res, nextBreak - res, breakingWidth, NULL); 738 739 ATSUDirectReleaseLayoutDataArrayPtr(NULL, kATSUDirectDataLayoutRecordATSLayoutRecordCurrent, (void*)&records);740 743 } 741 744 }
