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;
}
}
}