aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkAdvancedTypefaceMetrics.cpp
diff options
context:
space:
mode:
authorGravatar vandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-05-10 23:25:03 +0000
committerGravatar vandebo@chromium.org <vandebo@chromium.org@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-05-10 23:25:03 +0000
commit34dae877941d1010fafa358a5ebcaebb9a23594a (patch)
tree9f833ac487f159708274be379005a4974b1fb537 /src/core/SkAdvancedTypefaceMetrics.cpp
parent246bd0f2718fb17f18bd3fd4bc5e99fdd0560a82 (diff)
[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
Diffstat (limited to 'src/core/SkAdvancedTypefaceMetrics.cpp')
-rw-r--r--src/core/SkAdvancedTypefaceMetrics.cpp22
1 files changed, 18 insertions, 4 deletions
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<Data>* getAdvanceData(
SkTScopedPtr<SkAdvancedTypefaceMetrics::AdvanceMetric<Data> > result;
SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* curRange;
+ SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* 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<Data>* 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<Data>* 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<Data>* 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<Data>* 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();
}