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)); |
- } |
-} |