From 34dae877941d1010fafa358a5ebcaebb9a23594a Mon Sep 17 00:00:00 2001 From: "vandebo@chromium.org" Date: Tue, 10 May 2011 23:25:03 +0000 Subject: [PDF] Fix ending condition for font advance construction. The old code always ended (the last sequence of glyphs) on a range, even if there was a very long run at the end. This fixes that. Review URL: http://codereview.appspot.com/4539045 git-svn-id: http://skia.googlecode.com/svn/trunk@1293 2bbb7eff-a529-9590-31e7-b0007b416f81 --- src/core/SkAdvancedTypefaceMetrics.cpp | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) (limited to 'src/core/SkAdvancedTypefaceMetrics.cpp') diff --git a/src/core/SkAdvancedTypefaceMetrics.cpp b/src/core/SkAdvancedTypefaceMetrics.cpp index 731478b8b1..7e8a03087b 100644 --- a/src/core/SkAdvancedTypefaceMetrics.cpp +++ b/src/core/SkAdvancedTypefaceMetrics.cpp @@ -75,12 +75,17 @@ SkAdvancedTypefaceMetrics::AdvanceMetric* getAdvanceData( SkTScopedPtr > result; SkAdvancedTypefaceMetrics::AdvanceMetric* curRange; + SkAdvancedTypefaceMetrics::AdvanceMetric* prevRange = NULL; curRange = appendRange(&result, 0); Data lastAdvance = SK_MinS16; int repeats = 0; - for (int gId = 0; gId < num_glyphs; gId++) { + for (int gId = 0; gId <= num_glyphs; gId++) { Data advance; - SkAssertResult(getAdvance(fontHandle, gId, &advance)); + if (gId < num_glyphs) { + SkAssertResult(getAdvance(fontHandle, gId, &advance)); + } else { + advance = SK_MinS16; + } if (advance == lastAdvance) { repeats++; } else if (curRange->fAdvance.count() == repeats + 1) { @@ -89,6 +94,7 @@ SkAdvancedTypefaceMetrics::AdvanceMetric* getAdvanceData( } else if (repeats >= 2) { finishRange(curRange, gId - 1, SkAdvancedTypefaceMetrics::WidthRange::kRun); + prevRange = curRange; curRange = appendRange(&curRange->fNext, gId); } repeats = 0; @@ -96,6 +102,7 @@ SkAdvancedTypefaceMetrics::AdvanceMetric* getAdvanceData( if (lastAdvance == 0 && repeats >= 3) { finishRange(curRange, gId - repeats - 2, SkAdvancedTypefaceMetrics::WidthRange::kRange); + prevRange = curRange; curRange = appendRange(&curRange->fNext, gId); } else if (repeats >= 4) { finishRange(curRange, gId - repeats - 2, @@ -104,6 +111,7 @@ SkAdvancedTypefaceMetrics::AdvanceMetric* getAdvanceData( curRange->fAdvance.append(1, &lastAdvance); finishRange(curRange, gId - 1, SkAdvancedTypefaceMetrics::WidthRange::kRun); + prevRange = curRange; curRange = appendRange(&curRange->fNext, gId); } repeats = 0; @@ -111,8 +119,14 @@ SkAdvancedTypefaceMetrics::AdvanceMetric* getAdvanceData( curRange->fAdvance.append(1, &advance); lastAdvance = advance; } - finishRange(curRange, num_glyphs - 1, - SkAdvancedTypefaceMetrics::WidthRange::kRange); + if (curRange->fStartId == num_glyphs) { + SkASSERT(prevRange); + SkASSERT(prevRange->fNext->fStartId == num_glyphs); + prevRange->fNext.reset(); + } else { + finishRange(curRange, num_glyphs - 1, + SkAdvancedTypefaceMetrics::WidthRange::kRange); + } return result.release(); } -- cgit v1.2.3