start to divert legacy paint method impls to font
Bug: skia:
Change-Id: Ib972e7c0daaa71f707d3d64e62e842d2b021a1c4
Reviewed-on: https://skia-review.googlesource.com/c/172644
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
diff --git a/src/core/SkPaint_text.cpp b/src/core/SkPaint_text.cpp
index 33e9091..bc1f77e 100644
--- a/src/core/SkPaint_text.cpp
+++ b/src/core/SkPaint_text.cpp
@@ -61,91 +61,20 @@
#include "SkGlyphCache.h"
#include "SkUtils.h"
-int SkPaint::countText(const void* text, size_t byteLength) const {
- SkASSERT(text != nullptr);
- switch (this->getTextEncoding()) {
- case kUTF8_TextEncoding:
- return SkUTF::CountUTF8((const char*)text, byteLength);
- case kUTF16_TextEncoding:
- return SkUTF::CountUTF16((const uint16_t*)text, byteLength);
- case kUTF32_TextEncoding:
- return SkToInt(byteLength >> 2);
- case kGlyphID_TextEncoding:
- return SkToInt(byteLength >> 1);
- default:
- SkDEBUGFAIL("unknown text encoding");
- }
-
- return 0;
+int SkPaint::countText(const void* text, size_t length) const {
+ return SkFont::LEGACY_ExtractFromPaint(*this).countText(text, length,
+ (SkTextEncoding)this->getTextEncoding());
}
-static SkTypeface::Encoding to_encoding(SkPaint::TextEncoding e) {
- static_assert((int)SkTypeface::kUTF8_Encoding == (int)SkPaint::kUTF8_TextEncoding, "");
- static_assert((int)SkTypeface::kUTF16_Encoding == (int)SkPaint::kUTF16_TextEncoding, "");
- static_assert((int)SkTypeface::kUTF32_Encoding == (int)SkPaint::kUTF32_TextEncoding, "");
- return (SkTypeface::Encoding)e;
+int SkPaint::textToGlyphs(const void* text, size_t length, uint16_t glyphs[]) const {
+ return SkFont::LEGACY_ExtractFromPaint(*this).textToGlyphs(text, length,
+ (SkTextEncoding)this->getTextEncoding(),
+ glyphs, length);
}
-int SkPaint::textToGlyphs(const void* textData, size_t byteLength, uint16_t glyphs[]) const {
- SkASSERT(textData != nullptr);
-
- if (nullptr == glyphs) {
- return this->countText(textData, byteLength);
- }
-
- // if we get here, we have a valid glyphs[] array, so time to fill it in
-
- // handle this encoding before the setup for the glyphcache
- if (this->getTextEncoding() == kGlyphID_TextEncoding) {
- // we want to ignore the low bit of byteLength
- memcpy(glyphs, textData, byteLength >> 1 << 1);
- return SkToInt(byteLength >> 1);
- }
-
- auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(*this);
-
- const void* stop = (const char*)textData + byteLength;
- uint16_t* gptr = glyphs;
- const SkTypeface::Encoding encoding = to_encoding(this->getTextEncoding());
-
- while (textData < stop) {
- SkUnichar unichar = SkUTFN_Next(encoding, &textData, stop);
- if (unichar < 0) {
- return 0; // bad UTF-N sequence
- }
- *gptr++ = cache->unicharToGlyph(unichar);
- }
- return SkToInt(gptr - glyphs);
-}
-
-bool SkPaint::containsText(const void* textData, size_t byteLength) const {
- if (0 == byteLength) {
- return true;
- }
-
- SkASSERT(textData != nullptr);
-
- // handle this encoding before the setup for the glyphcache
- if (this->getTextEncoding() == kGlyphID_TextEncoding) {
- const uint16_t* glyphID = static_cast<const uint16_t*>(textData);
- size_t count = byteLength >> 1;
- for (size_t i = 0; i < count; i++) {
- if (0 == glyphID[i]) {
- return false;
- }
- }
- return true;
- }
-
- auto cache = SkStrikeCache::FindOrCreateStrikeWithNoDeviceExclusive(*this);
- const void* stop = (const char*)textData + byteLength;
- const SkTypeface::Encoding encoding = to_encoding(this->getTextEncoding());
- while (textData < stop) {
- if (0 == cache->unicharToGlyph(SkUTFN_Next(encoding, &textData, stop))) {
- return false;
- }
- }
- return true;
+bool SkPaint::containsText(const void* text, size_t length) const {
+ return SkFont::LEGACY_ExtractFromPaint(*this).containsText(text, length,
+ (SkTextEncoding)this->getTextEncoding());
}
void SkPaint::glyphsToUnichars(const uint16_t glyphs[], int count, SkUnichar textData[]) const {
@@ -470,35 +399,8 @@
return text - stop + length;
}
-///////////////////////////////////////////////////////////////////////////////
-
SkScalar SkPaint::getFontMetrics(SkFontMetrics* metrics) const {
- SkCanonicalizePaint canon(*this);
- const SkPaint& paint = canon.getPaint();
- SkScalar scale = canon.getScale();
-
- SkFontMetrics storage;
- if (nullptr == metrics) {
- metrics = &storage;
- }
-
- SkAutoDescriptor ad;
- SkScalerContextEffects effects;
-
- auto desc = SkScalerContext::CreateDescriptorAndEffectsUsingPaint(
- paint, SkSurfaceProps(0, kUnknown_SkPixelGeometry),
- SkScalerContextFlags::kNone, SkMatrix::I(), &ad, &effects);
-
- {
- auto typeface = SkPaintPriv::GetTypefaceOrDefault(paint);
- auto cache = SkStrikeCache::FindOrCreateStrikeExclusive(*desc, effects, *typeface);
- *metrics = cache->getFontMetrics();
- }
-
- if (scale) {
- SkPaintPriv::ScaleFontMetrics(metrics, scale);
- }
- return metrics->fDescent - metrics->fAscent + metrics->fLeading;
+ return SkFont::LEGACY_ExtractFromPaint(*this).getMetrics(metrics);
}
///////////////////////////////////////////////////////////////////////////////