aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/svg/SkSVGDevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/svg/SkSVGDevice.cpp')
-rw-r--r--src/svg/SkSVGDevice.cpp62
1 files changed, 28 insertions, 34 deletions
diff --git a/src/svg/SkSVGDevice.cpp b/src/svg/SkSVGDevice.cpp
index 4a83a9c841..9a2eb99a77 100644
--- a/src/svg/SkSVGDevice.cpp
+++ b/src/svg/SkSVGDevice.cpp
@@ -119,6 +119,13 @@ struct Resources {
SkString fClip;
};
+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;
+}
+
class SVGTextBuilder : SkNoncopyable {
public:
SVGTextBuilder(const void* text, size_t byteLen, const SkPaint& paint, const SkPoint& offset,
@@ -131,42 +138,29 @@ public:
SkASSERT(scalarsPerPos <= 2);
SkASSERT(scalarsPerPos == 0 || SkToBool(pos));
- int count = paint.countText(text, byteLen);
-
- const char* stop = (const char*)text + byteLen;
- switch(paint.getTextEncoding()) {
- case SkPaint::kGlyphID_TextEncoding: {
- SkASSERT(count * sizeof(uint16_t) == byteLen);
- SkAutoSTArray<64, SkUnichar> unichars(count);
- paint.glyphsToUnichars((const uint16_t*)text, count, unichars.get());
- for (int i = 0; i < count; ++i) {
- this->appendUnichar(unichars[i]);
- }
- } break;
- case SkPaint::kUTF8_TextEncoding: {
- const char* c8 = reinterpret_cast<const char*>(text);
- for (int i = 0; i < count; ++i) {
- this->appendUnichar(SkUTF8_NextUnichar(&c8, stop));
- }
- SkASSERT(reinterpret_cast<const char*>(text) + byteLen == c8);
- } break;
- case SkPaint::kUTF16_TextEncoding: {
- const uint16_t* c16 = reinterpret_cast<const uint16_t*>(text);
- for (int i = 0; i < count; ++i) {
- this->appendUnichar(SkUTF16_NextUnichar(&c16, (const uint16_t*)stop));
+ SkPaint::TextEncoding encoding = paint.getTextEncoding();
+ switch(encoding) {
+ case SkPaint::kGlyphID_TextEncoding: {
+ int count = paint.countText(text, byteLen);
+ SkASSERT(count * sizeof(uint16_t) == byteLen);
+ SkAutoSTArray<64, SkUnichar> unichars(count);
+ paint.glyphsToUnichars((const uint16_t*)text, count, unichars.get());
+ for (int i = 0; i < count; ++i) {
+ this->appendUnichar(unichars[i]);
+ }
+ break;
}
- SkASSERT(SkIsAlign2(byteLen));
- SkASSERT(reinterpret_cast<const uint16_t*>(text) + (byteLen / 2) == c16);
- } break;
- case SkPaint::kUTF32_TextEncoding: {
- SkASSERT(count * sizeof(uint32_t) == byteLen);
- const uint32_t* c32 = reinterpret_cast<const uint32_t*>(text);
- for (int i = 0; i < count; ++i) {
- this->appendUnichar(c32[i]);
+ case SkPaint::kUTF8_TextEncoding:
+ case SkPaint::kUTF16_TextEncoding:
+ case SkPaint::kUTF32_TextEncoding: {
+ const void* stop = (const char*)text + byteLen;
+ while (text < stop) {
+ this->appendUnichar(SkUTFN_Next(to_encoding(encoding), &text, stop));
+ }
+ break;
}
- } break;
- default:
- SK_ABORT("unknown text encoding");
+ default:
+ SK_ABORT("unknown text encoding");
}
if (scalarsPerPos < 2) {