Avoid UTF-8 conversions and string copies whenever possible.

Change-Id: Ie4584417bbb7247e6c567fbfdb819529e548bb8f
diff --git a/libs/hwui/TextDropShadowCache.cpp b/libs/hwui/TextDropShadowCache.cpp
index 3256790..8f6f860 100644
--- a/libs/hwui/TextDropShadowCache.cpp
+++ b/libs/hwui/TextDropShadowCache.cpp
@@ -147,6 +147,9 @@
             if (mDebugEnabled) {
                 LOGD("Shadow texture created, size = %d", texture->bitmapSize);
             }
+
+            entry.copyTextLocally();
+
             mSize += size;
             mCache.put(entry, texture);
         } else {
diff --git a/libs/hwui/TextDropShadowCache.h b/libs/hwui/TextDropShadowCache.h
index 1e065d1..62c4250 100644
--- a/libs/hwui/TextDropShadowCache.h
+++ b/libs/hwui/TextDropShadowCache.h
@@ -21,7 +21,7 @@
 
 #include <SkPaint.h>
 
-#include <utils/String8.h>
+#include <utils/String16.h>
 
 #include "utils/Compare.h"
 #include "utils/GenerationCache.h"
@@ -37,18 +37,13 @@
 
     ShadowText(SkPaint* paint, uint32_t radius, uint32_t len, const char* srcText):
             radius(radius), len(len) {
-        // The source text we receive is in UTF-16, convert to UTF-8
-        str.setTo((const char16_t*) srcText, len >> 1);
+        // TODO: Propagate this through the API, we should not cast here
+        text = (const char16_t*) srcText;
 
         textSize = paint->getTextSize();
         typeface = paint->getTypeface();
     }
 
-    ShadowText(const ShadowText& shadow):
-            radius(shadow.radius), len(shadow.len), textSize(shadow.textSize),
-            typeface(shadow.typeface), str(shadow.str) {
-    }
-
     ~ShadowText() {
     }
 
@@ -56,16 +51,21 @@
     uint32_t len;
     float textSize;
     SkTypeface* typeface;
-    String8 str;
+    const char16_t* text;
+    String16 str;
+
+    void copyTextLocally() {
+        str.setTo((const char16_t*) text, len >> 1);
+        text = str.string();
+    }
 
     // TODO: Should take into account fake bold and text skew
     bool operator<(const ShadowText& rhs) const {
         LTE_INT(len) {
             LTE_INT(radius) {
                 LTE_FLOAT(textSize) {
-                    if (typeface < rhs.typeface) return true;
-                    else if (typeface == rhs.typeface) {
-                        return str.compare(rhs.str) < 0;
+                    LTE_INT(typeface) {
+                        return strncmp16(text, rhs.text, len >> 1) < 0;
                     }
                 }
             }