From 321dce646dc3c2ecfbd72a693d8d9294a6119736 Mon Sep 17 00:00:00 2001 From: Romain Guy Date: Tue, 1 Mar 2011 11:45:33 -0800 Subject: Avoid UTF-8 conversions and string copies whenever possible. Change-Id: Ie4584417bbb7247e6c567fbfdb819529e548bb8f --- libs/hwui/TextDropShadowCache.cpp | 3 +++ libs/hwui/TextDropShadowCache.h | 24 ++++++++++++------------ 2 files changed, 15 insertions(+), 12 deletions(-) (limited to 'libs') 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 @@ ShadowTexture* TextDropShadowCache::get(SkPaint* paint, const char* text, uint32 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 -#include +#include #include "utils/Compare.h" #include "utils/GenerationCache.h" @@ -37,18 +37,13 @@ struct ShadowText { 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 @@ struct ShadowText { 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; } } } -- cgit v1.1