aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkDevice.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/core/SkDevice.cpp')
-rw-r--r--src/core/SkDevice.cpp47
1 files changed, 21 insertions, 26 deletions
diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp
index 23560986bc..46404b2887 100644
--- a/src/core/SkDevice.cpp
+++ b/src/core/SkDevice.cpp
@@ -483,33 +483,11 @@ void SkBaseDevice::drawTextOnPath(const void* text, size_t byteLength,
}
#include "SkUtils.h"
-typedef int (*CountTextProc)(const char* text);
-static int count_utf16(const char* text) {
- const uint16_t* prev = (uint16_t*)text;
- (void)SkUTF16_NextUnichar(&prev);
- return SkToInt((const char*)prev - text);
-}
-static int return_4(const char* text) { return 4; }
-static int return_2(const char* text) { return 2; }
void SkBaseDevice::drawTextRSXform(const void* text, size_t len,
const SkRSXform xform[], const SkPaint& paint) {
- CountTextProc proc = nullptr;
- switch (paint.getTextEncoding()) {
- case SkPaint::kUTF8_TextEncoding:
- proc = SkUTF8_CountUTF8Bytes;
- break;
- case SkPaint::kUTF16_TextEncoding:
- proc = count_utf16;
- break;
- case SkPaint::kUTF32_TextEncoding:
- proc = return_4;
- break;
- case SkPaint::kGlyphID_TextEncoding:
- proc = return_2;
- break;
- }
-
+ SkPaint::TextEncoding textEncoding = paint.getTextEncoding();
+ const char* end = (const char*)text + len;
SkPaint localPaint(paint);
SkShader* shader = paint.getShader();
SkScalar pos[2] = {0.0f, 0.0f};
@@ -533,8 +511,25 @@ void SkBaseDevice::drawTextRSXform(const void* text, size_t len,
localPaint.setShader(nullptr); // can't handle this xform
}
}
-
- int subLen = proc((const char*)text);
+ int subLen = 0;
+ switch (textEncoding) {
+ case SkPaint::kUTF8_TextEncoding:
+ subLen = SkUTF8_CountUTF8Bytes((const char*)text);
+ break;
+ case SkPaint::kUTF16_TextEncoding:
+ {
+ const uint16_t* ptr = (const uint16_t*)text;
+ (void)SkUTF16_NextUnichar(&ptr, (const uint16_t*)end);
+ subLen = SkToInt((const char*)ptr - (const char*)text);
+ };
+ break;
+ case SkPaint::kUTF32_TextEncoding:
+ subLen = 4;
+ break;
+ case SkPaint::kGlyphID_TextEncoding:
+ subLen = 2;
+ break;
+ }
this->drawPosText(text, subLen, pos, 2, origin, localPaint);
text = (const char*)text + subLen;
}