Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(108)

Unified Diff: src/core/SkAdvancedTypefaceMetrics.cpp

Issue 2222523003: SkPDF/SkAdvancedTypefaceMetrics: simplify ATM, PDF takes over (Closed) Base URL: https://skia.googlesource.com/skia.git@SkPDF_no_kHAdvance
Patch Set: rebase and nit Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/core/SkAdvancedTypefaceMetrics.h ('k') | src/pdf/SkPDFFont.cpp » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/core/SkAdvancedTypefaceMetrics.cpp
diff --git a/src/core/SkAdvancedTypefaceMetrics.cpp b/src/core/SkAdvancedTypefaceMetrics.cpp
deleted file mode 100644
index bddd91260c460dcd8013b36cafd2a0de50d0ce86..0000000000000000000000000000000000000000
--- a/src/core/SkAdvancedTypefaceMetrics.cpp
+++ /dev/null
@@ -1,193 +0,0 @@
-/*
- * Copyright 2011 Google Inc.
- *
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-
-#include "SkAdvancedTypefaceMetrics.h"
-#include "SkTypes.h"
-
-SkAdvancedTypefaceMetrics::~SkAdvancedTypefaceMetrics() {}
-
-const int16_t kInvalidAdvance = SK_MinS16;
-const int16_t kDontCareAdvance = SK_MinS16 + 1;
-
-static void stripUninterestingTrailingAdvancesFromRange(
- SkAdvancedTypefaceMetrics::WidthRange* range) {
- SkASSERT(range);
-
- int expectedAdvanceCount = range->fEndId - range->fStartId + 1;
- if (range->fAdvance.count() < expectedAdvanceCount) {
- return;
- }
-
- for (int i = expectedAdvanceCount - 1; i >= 0; --i) {
- if (range->fAdvance[i] != kDontCareAdvance &&
- range->fAdvance[i] != kInvalidAdvance &&
- range->fAdvance[i] != 0) {
- range->fEndId = range->fStartId + i;
- break;
- }
- }
-}
-
-static void zeroWildcardsInRange(SkAdvancedTypefaceMetrics::WidthRange* range) {
- SkASSERT(range);
- if (range->fType != SkAdvancedTypefaceMetrics::WidthRange::kRange) {
- return;
- }
- SkASSERT(range->fAdvance.count() == range->fEndId - range->fStartId + 1);
-
- // Zero out wildcards.
- for (int i = 0; i < range->fAdvance.count(); ++i) {
- if (range->fAdvance[i] == kDontCareAdvance) {
- range->fAdvance[i] = 0;
- }
- }
-}
-
-void SkAdvancedTypefaceMetrics::FinishRange(
- SkAdvancedTypefaceMetrics::WidthRange* range,
- int endId,
- SkAdvancedTypefaceMetrics::WidthRange::MetricType type) {
- range->fEndId = endId;
- range->fType = type;
- stripUninterestingTrailingAdvancesFromRange(range);
- int newLength;
- if (type == SkAdvancedTypefaceMetrics::WidthRange::kRange) {
- newLength = range->fEndId - range->fStartId + 1;
- } else {
- if (range->fEndId == range->fStartId) {
- range->fType = SkAdvancedTypefaceMetrics::WidthRange::kRange;
- }
- newLength = 1;
- }
- SkASSERT(range->fAdvance.count() >= newLength);
- range->fAdvance.setCount(newLength);
- zeroWildcardsInRange(range);
-}
-
-void SkAdvancedTypefaceMetrics::setGlyphWidths(
- int num_glyphs,
- const uint32_t* subsetGlyphIDs,
- uint32_t subsetGlyphIDsLength,
- SkAdvancedTypefaceMetrics::GetAdvance getAdvance) {
- // Assuming that on average, the ASCII representation of an advance plus
- // a space is 8 characters and the ASCII representation of a glyph id is 3
- // characters, then the following cut offs for using different range types
- // apply:
- // The cost of stopping and starting the range is 7 characers
- // a. Removing 4 0's or don't care's is a win
- // The cost of stopping and starting the range plus a run is 22
- // characters
- // b. Removing 3 repeating advances is a win
- // c. Removing 2 repeating advances and 3 don't cares is a win
- // When not currently in a range the cost of a run over a range is 16
- // characaters, so:
- // d. Removing a leading 0/don't cares is a win because it is omitted
- // e. Removing 2 repeating advances is a win
-
- WidthRange* prevRange = nullptr;
- int16_t lastAdvance = kInvalidAdvance;
- int repeatedAdvances = 0;
- int wildCardsInRun = 0;
- int trailingWildCards = 0;
- uint32_t subsetIndex = 0;
-
- // Limit the loop count to glyph id ranges provided.
- int firstIndex = 0;
- int lastIndex = num_glyphs;
- if (subsetGlyphIDs) {
- firstIndex = static_cast<int>(subsetGlyphIDs[0]);
- lastIndex =
- static_cast<int>(subsetGlyphIDs[subsetGlyphIDsLength - 1]) + 1;
- }
- WidthRange curRange(firstIndex);
-
- for (int gId = firstIndex; gId <= lastIndex; gId++) {
- int16_t advance = kInvalidAdvance;
- if (gId < lastIndex) {
- // Get glyph id only when subset is nullptr, or the id is in subset.
- SkASSERT(!subsetGlyphIDs || (subsetIndex < subsetGlyphIDsLength &&
- static_cast<uint32_t>(gId) <= subsetGlyphIDs[subsetIndex]));
- if (!subsetGlyphIDs ||
- (subsetIndex < subsetGlyphIDsLength &&
- static_cast<uint32_t>(gId) == subsetGlyphIDs[subsetIndex])) {
- SkAssertResult(getAdvance(gId, &advance));
- ++subsetIndex;
- } else {
- advance = kDontCareAdvance;
- }
- }
- if (advance == lastAdvance) {
- repeatedAdvances++;
- trailingWildCards = 0;
- } else if (advance == kDontCareAdvance) {
- wildCardsInRun++;
- trailingWildCards++;
- } else if (curRange.fAdvance.count() ==
- repeatedAdvances + 1 + wildCardsInRun) { // All in run.
- if (lastAdvance == 0) {
- curRange.fStartId = gId; // reset
- curRange.fAdvance.setCount(0);
- trailingWildCards = 0;
- } else if (repeatedAdvances + 1 >= 2 || trailingWildCards >= 4) {
- FinishRange(&curRange, gId - 1, WidthRange::kRun);
- prevRange = fGlyphWidths.emplace_back(std::move(curRange));
- curRange = WidthRange(gId);
- trailingWildCards = 0;
- }
- repeatedAdvances = 0;
- wildCardsInRun = trailingWildCards;
- trailingWildCards = 0;
- } else {
- if (lastAdvance == 0 &&
- repeatedAdvances + 1 + wildCardsInRun >= 4) {
- FinishRange(&curRange,
- gId - repeatedAdvances - wildCardsInRun - 2,
- WidthRange::kRange);
- prevRange = fGlyphWidths.emplace_back(std::move(curRange));
- curRange = WidthRange(gId);
- trailingWildCards = 0;
- } else if (trailingWildCards >= 4 && repeatedAdvances + 1 < 2) {
- FinishRange(&curRange, gId - trailingWildCards - 1,
- WidthRange::kRange);
- prevRange = fGlyphWidths.emplace_back(std::move(curRange));
- curRange = WidthRange(gId);
- trailingWildCards = 0;
- } else if (lastAdvance != 0 &&
- (repeatedAdvances + 1 >= 3 ||
- (repeatedAdvances + 1 >= 2 && wildCardsInRun >= 3))) {
- FinishRange(&curRange,
- gId - repeatedAdvances - wildCardsInRun - 2,
- WidthRange::kRange);
- (void)fGlyphWidths.emplace_back(std::move(curRange));
- curRange =
- WidthRange(gId - repeatedAdvances - wildCardsInRun - 1);
- curRange.fAdvance.append(1, &lastAdvance);
- FinishRange(&curRange, gId - 1, WidthRange::kRun);
- prevRange = fGlyphWidths.emplace_back(std::move(curRange));
- curRange = WidthRange(gId);
- trailingWildCards = 0;
- }
- repeatedAdvances = 0;
- wildCardsInRun = trailingWildCards;
- trailingWildCards = 0;
- }
- curRange.fAdvance.append(1, &advance);
- if (advance != kDontCareAdvance) {
- lastAdvance = advance;
- }
- }
- if (curRange.fStartId == lastIndex) {
- if (!prevRange) {
- fGlyphWidths.reset();
- return; // https://crbug.com/567031
- }
- } else {
- FinishRange(&curRange, lastIndex - 1, WidthRange::kRange);
- fGlyphWidths.emplace_back(std::move(curRange));
- }
-}
« no previous file with comments | « src/core/SkAdvancedTypefaceMetrics.h ('k') | src/pdf/SkPDFFont.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698