Index: src/core/SkAdvancedTypefaceMetrics.cpp |
diff --git a/src/core/SkAdvancedTypefaceMetrics.cpp b/src/core/SkAdvancedTypefaceMetrics.cpp |
index 0e9ba95bf40896f123458a44331ef174529a4022..fab5f5e462498a78055718385ca4369727de54df 100644 |
--- a/src/core/SkAdvancedTypefaceMetrics.cpp |
+++ b/src/core/SkAdvancedTypefaceMetrics.cpp |
@@ -27,36 +27,13 @@ typedef struct FT_FaceRec_* FT_Face; |
#include <CoreFoundation/CoreFoundation.h> |
#endif |
-template <typename Data> |
-static void unwind(SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* ptr) { |
- while (ptr) { |
- SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* next = ptr->fNext.release(); |
- delete ptr; |
- ptr = next; |
- } |
-} |
- |
-SkAdvancedTypefaceMetrics::~SkAdvancedTypefaceMetrics() { |
- // If the stacks are too deep we could get stack overflow, |
- // so we manually destruct the linked lists. |
- unwind(fGlyphWidths.release()); |
- unwind(fVerticalMetrics.release()); |
-} |
- |
-namespace skia_advanced_typeface_metrics_utils { |
+SkAdvancedTypefaceMetrics::~SkAdvancedTypefaceMetrics() {} |
const int16_t kInvalidAdvance = SK_MinS16; |
const int16_t kDontCareAdvance = SK_MinS16 + 1; |
-template <typename Data> |
-void stripUninterestingTrailingAdvancesFromRange( |
- SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* range) { |
- SkASSERT(false); |
-} |
- |
-template <> |
-void stripUninterestingTrailingAdvancesFromRange<int16_t>( |
- SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t>* range) { |
+static void stripUninterestingTrailingAdvancesFromRange( |
+ SkAdvancedTypefaceMetrics::WidthRange* range) { |
SkASSERT(range); |
int expectedAdvanceCount = range->fEndId - range->fStartId + 1; |
@@ -74,31 +51,7 @@ void stripUninterestingTrailingAdvancesFromRange<int16_t>( |
} |
} |
-template <typename Data> |
-void resetRange(SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* range, |
- int startId) { |
- range->fStartId = startId; |
- range->fAdvance.setCount(0); |
-} |
- |
-template <typename Data, template<typename> class AutoTDelete> |
-SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* appendRange( |
- AutoTDelete<SkAdvancedTypefaceMetrics::AdvanceMetric<Data> >* nextSlot, |
- int startId) { |
- nextSlot->reset(new SkAdvancedTypefaceMetrics::AdvanceMetric<Data>); |
- resetRange(nextSlot->get(), startId); |
- return nextSlot->get(); |
-} |
- |
-template <typename Data> |
-void zeroWildcardsInRange( |
- SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* range) { |
- SkASSERT(false); |
-} |
- |
-template <> |
-void zeroWildcardsInRange<int16_t>( |
- SkAdvancedTypefaceMetrics::AdvanceMetric<int16_t>* range) { |
+static void zeroWildcardsInRange(SkAdvancedTypefaceMetrics::WidthRange* range) { |
SkASSERT(range); |
if (range->fType != SkAdvancedTypefaceMetrics::WidthRange::kRange) { |
return; |
@@ -113,22 +66,19 @@ void zeroWildcardsInRange<int16_t>( |
} |
} |
-template <typename Data> |
-void finishRange( |
- SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* range, |
+void SkAdvancedTypefaceMetrics::FinishRange( |
+ SkAdvancedTypefaceMetrics::WidthRange* range, |
int endId, |
- typename SkAdvancedTypefaceMetrics::AdvanceMetric<Data>::MetricType |
- type) { |
+ SkAdvancedTypefaceMetrics::WidthRange::MetricType type) { |
range->fEndId = endId; |
range->fType = type; |
stripUninterestingTrailingAdvancesFromRange(range); |
int newLength; |
- if (type == SkAdvancedTypefaceMetrics::AdvanceMetric<Data>::kRange) { |
+ if (type == SkAdvancedTypefaceMetrics::WidthRange::kRange) { |
newLength = range->fEndId - range->fStartId + 1; |
} else { |
if (range->fEndId == range->fStartId) { |
- range->fType = |
- SkAdvancedTypefaceMetrics::AdvanceMetric<Data>::kRange; |
+ range->fType = SkAdvancedTypefaceMetrics::WidthRange::kRange; |
} |
newLength = 1; |
} |
@@ -137,13 +87,13 @@ void finishRange( |
zeroWildcardsInRange(range); |
} |
-template <typename Data, typename FontHandle> |
-SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* getAdvanceData( |
+template <typename FontHandle> |
+void SkAdvancedTypefaceMetrics::setGlyphWidths( |
FontHandle fontHandle, |
int num_glyphs, |
const uint32_t* subsetGlyphIDs, |
uint32_t subsetGlyphIDsLength, |
- bool (*getAdvance)(FontHandle fontHandle, int gId, Data* data)) { |
+ bool (*getAdvance)(FontHandle fontHandle, int gId, int16_t* data)) { |
// 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 |
@@ -159,10 +109,8 @@ SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* getAdvanceData( |
// d. Removing a leading 0/don't cares is a win because it is omitted |
// e. Removing 2 repeating advances is a win |
- SkAutoTDelete<SkAdvancedTypefaceMetrics::AdvanceMetric<Data> > result; |
- SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* curRange; |
- SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* prevRange = nullptr; |
- Data lastAdvance = kInvalidAdvance; |
+ WidthRange* prevRange = nullptr; |
+ int16_t lastAdvance = kInvalidAdvance; |
int repeatedAdvances = 0; |
int wildCardsInRun = 0; |
int trailingWildCards = 0; |
@@ -176,10 +124,10 @@ SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* getAdvanceData( |
lastIndex = |
static_cast<int>(subsetGlyphIDs[subsetGlyphIDsLength - 1]) + 1; |
} |
- curRange = appendRange(&result, firstIndex); |
+ WidthRange curRange(firstIndex); |
for (int gId = firstIndex; gId <= lastIndex; gId++) { |
- Data advance = kInvalidAdvance; |
+ 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 && |
@@ -199,16 +147,16 @@ SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* getAdvanceData( |
} else if (advance == kDontCareAdvance) { |
wildCardsInRun++; |
trailingWildCards++; |
- } else if (curRange->fAdvance.count() == |
+ } else if (curRange.fAdvance.count() == |
repeatedAdvances + 1 + wildCardsInRun) { // All in run. |
if (lastAdvance == 0) { |
- resetRange(curRange, gId); |
+ curRange.fStartId = gId; // reset |
+ curRange.fAdvance.setCount(0); |
trailingWildCards = 0; |
} else if (repeatedAdvances + 1 >= 2 || trailingWildCards >= 4) { |
- finishRange(curRange, gId - 1, |
- SkAdvancedTypefaceMetrics::WidthRange::kRun); |
- prevRange = curRange; |
- curRange = appendRange(&curRange->fNext, gId); |
+ FinishRange(&curRange, gId - 1, WidthRange::kRun); |
+ prevRange = fGlyphWidths.emplace_back(std::move(curRange)); |
+ curRange = WidthRange(gId); |
trailingWildCards = 0; |
} |
repeatedAdvances = 0; |
@@ -217,61 +165,57 @@ SkAdvancedTypefaceMetrics::AdvanceMetric<Data>* getAdvanceData( |
} else { |
if (lastAdvance == 0 && |
repeatedAdvances + 1 + wildCardsInRun >= 4) { |
- finishRange(curRange, |
+ FinishRange(&curRange, |
gId - repeatedAdvances - wildCardsInRun - 2, |
- SkAdvancedTypefaceMetrics::WidthRange::kRange); |
- prevRange = curRange; |
- curRange = appendRange(&curRange->fNext, gId); |
+ 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, |
- SkAdvancedTypefaceMetrics::WidthRange::kRange); |
- prevRange = curRange; |
- curRange = appendRange(&curRange->fNext, gId); |
+ 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, |
+ FinishRange(&curRange, |
gId - repeatedAdvances - wildCardsInRun - 2, |
- SkAdvancedTypefaceMetrics::WidthRange::kRange); |
+ WidthRange::kRange); |
+ (void)fGlyphWidths.emplace_back(std::move(curRange)); |
curRange = |
- appendRange(&curRange->fNext, |
- gId - repeatedAdvances - wildCardsInRun - 1); |
- curRange->fAdvance.append(1, &lastAdvance); |
- finishRange(curRange, gId - 1, |
- SkAdvancedTypefaceMetrics::WidthRange::kRun); |
- prevRange = curRange; |
- curRange = appendRange(&curRange->fNext, gId); |
+ 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); |
+ curRange.fAdvance.append(1, &advance); |
if (advance != kDontCareAdvance) { |
lastAdvance = advance; |
} |
} |
- if (curRange->fStartId == lastIndex) { |
+ if (curRange.fStartId == lastIndex) { |
SkASSERT(prevRange); |
if (!prevRange) { |
- return nullptr; // https://crbug.com/567031 |
+ fGlyphWidths.reset(); |
+ return; // https://crbug.com/567031 |
} |
- SkASSERT(prevRange->fNext->fStartId == lastIndex); |
- prevRange->fNext.reset(); |
} else { |
- finishRange(curRange, lastIndex - 1, |
- SkAdvancedTypefaceMetrics::WidthRange::kRange); |
+ FinishRange(&curRange, lastIndex - 1, WidthRange::kRange); |
+ fGlyphWidths.emplace_back(std::move(curRange)); |
} |
- return result.release(); |
} |
// Make AdvanceMetric template functions available for linking with typename |
// WidthRange and VerticalAdvanceRange. |
-template SkAdvancedTypefaceMetrics::WidthRange* getAdvanceData( |
+template void SkAdvancedTypefaceMetrics::setGlyphWidths( |
FT_Face face, |
int num_glyphs, |
const uint32_t* subsetGlyphIDs, |
@@ -279,55 +223,30 @@ template SkAdvancedTypefaceMetrics::WidthRange* getAdvanceData( |
bool (*getAdvance)(FT_Face face, int gId, int16_t* data)); |
#if defined(SK_BUILD_FOR_WIN) |
-template SkAdvancedTypefaceMetrics::WidthRange* getAdvanceData( |
+template void SkAdvancedTypefaceMetrics::setGlyphWidths( |
HDC hdc, |
int num_glyphs, |
const uint32_t* subsetGlyphIDs, |
uint32_t subsetGlyphIDsLength, |
bool (*getAdvance)(HDC hdc, int gId, int16_t* data)); |
-template SkAdvancedTypefaceMetrics::WidthRange* getAdvanceData( |
+template void SkAdvancedTypefaceMetrics::setGlyphWidths( |
IDWriteFontFace* fontFace, |
int num_glyphs, |
const uint32_t* subsetGlyphIDs, |
uint32_t subsetGlyphIDsLength, |
bool (*getAdvance)(IDWriteFontFace* fontFace, int gId, int16_t* data)); |
#elif defined(SK_BUILD_FOR_MAC) || defined(SK_BUILD_FOR_IOS) |
-template SkAdvancedTypefaceMetrics::WidthRange* getAdvanceData( |
+template void SkAdvancedTypefaceMetrics::setGlyphWidths( |
CTFontRef ctFont, |
int num_glyphs, |
const uint32_t* subsetGlyphIDs, |
uint32_t subsetGlyphIDsLength, |
bool (*getAdvance)(CTFontRef ctFont, int gId, int16_t* data)); |
#endif |
-template void resetRange( |
- SkAdvancedTypefaceMetrics::WidthRange* range, |
- int startId); |
-template SkAdvancedTypefaceMetrics::WidthRange* appendRange( |
- SkAutoTDelete<SkAdvancedTypefaceMetrics::WidthRange >* nextSlot, |
- int startId); |
-template void finishRange<int16_t>( |
- SkAdvancedTypefaceMetrics::WidthRange* range, |
- int endId, |
- SkAdvancedTypefaceMetrics::WidthRange::MetricType type); |
- |
-template void resetRange( |
- SkAdvancedTypefaceMetrics::VerticalAdvanceRange* range, |
- int startId); |
-template SkAdvancedTypefaceMetrics::VerticalAdvanceRange* appendRange( |
- SkAutoTDelete<SkAdvancedTypefaceMetrics::VerticalAdvanceRange >* |
- nextSlot, |
- int startId); |
-template void finishRange<SkAdvancedTypefaceMetrics::VerticalMetric>( |
- SkAdvancedTypefaceMetrics::VerticalAdvanceRange* range, |
- int endId, |
- SkAdvancedTypefaceMetrics::VerticalAdvanceRange::MetricType type); |
- |
// additional declaration needed for testing with a face of an unknown type |
-template SkAdvancedTypefaceMetrics::WidthRange* getAdvanceData( |
+template void SkAdvancedTypefaceMetrics::setGlyphWidths( |
void* fontData, |
int num_glyphs, |
const uint32_t* subsetGlyphIDs, |
uint32_t subsetGlyphIDsLength, |
bool (*getAdvance)(void* fontData, int gId, int16_t* data)); |
- |
-} // namespace skia_advanced_typeface_metrics_utils |