| Index: src/core/SkDevice.cpp
 | 
| diff --git a/src/core/SkDevice.cpp b/src/core/SkDevice.cpp
 | 
| index 185b9bbd2762a192e08d571a5e2c862ad2016877..2dcedb4bd733bcf824191c51bafdd5ee28e63142 100644
 | 
| --- a/src/core/SkDevice.cpp
 | 
| +++ b/src/core/SkDevice.cpp
 | 
| @@ -403,6 +403,47 @@ void SkBaseDevice::drawTextOnPath(const SkDraw& draw, const void* text, size_t b
 | 
|      }
 | 
|  }
 | 
|  
 | 
| +#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 SkDraw& draw, 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;
 | 
| +    }
 | 
| +
 | 
| +    SkDraw localD(draw);
 | 
| +    SkMatrix localM, currM;
 | 
| +    const void* stopText = (const char*)text + len;
 | 
| +    while ((const char*)text < (const char*)stopText) {
 | 
| +        localM.setRSXform(*xform++);
 | 
| +        currM.setConcat(*draw.fMatrix, localM);
 | 
| +        localD.fMatrix = &currM;
 | 
| +        int subLen = proc((const char*)text);
 | 
| +        this->drawText(localD, text, subLen, 0, 0, paint);
 | 
| +        text = (const char*)text + subLen;
 | 
| +    }
 | 
| +}
 | 
| +
 | 
|  //////////////////////////////////////////////////////////////////////////////////////////
 | 
|  
 | 
|  void SkBaseDevice::drawSpriteWithFilter(const SkDraw& draw, const SkBitmap& bitmap,
 | 
| 
 |