summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBehdad Esfahbod <behdad@google.com>2014-08-21 19:14:14 -0400
committerBehdad Esfahbod <behdad@google.com>2014-08-21 19:25:06 -0400
commit56c7fb8c0633f1b02115bb4370854016f8c84fb4 (patch)
tree3a03819cce4134d69ccbde7018f91c17ed59ddef
parent6da7796cbe8a17efd61a3302369e69bb222fdb4f (diff)
downloadandroid_frameworks_minikin-56c7fb8c0633f1b02115bb4370854016f8c84fb4.tar.gz
android_frameworks_minikin-56c7fb8c0633f1b02115bb4370854016f8c84fb4.tar.bz2
android_frameworks_minikin-56c7fb8c0633f1b02115bb4370854016f8c84fb4.zip
Allocate font vector on stack
This reduces another allocation (last one?) we were doing when fulfilling shaping requests from the cache. Bug: 17111260 Change-Id: Ieb8ae1ccfcaacedb257e1e9263777f10623aaf98
-rw-r--r--libs/minikin/Layout.cpp15
1 files changed, 12 insertions, 3 deletions
diff --git a/libs/minikin/Layout.cpp b/libs/minikin/Layout.cpp
index 46819d6..c3d4c13 100644
--- a/libs/minikin/Layout.cpp
+++ b/libs/minikin/Layout.cpp
@@ -760,11 +760,16 @@ void Layout::doLayoutRun(const uint16_t* buf, size_t start, size_t count, size_t
}
void Layout::appendLayout(Layout* src, size_t start) {
- // Note: size==1 is by far most common, should have specialized vector for this
- std::vector<int> fontMap;
+ int fontMapStack[16];
+ int* fontMap;
+ if (src->mFaces.size() < sizeof(fontMapStack) / sizeof(fontMapStack[0])) {
+ fontMap = fontMapStack;
+ } else {
+ fontMap = new int[src->mFaces.size()];
+ }
for (size_t i = 0; i < src->mFaces.size(); i++) {
int font_ix = findFace(src->mFaces[i], NULL);
- fontMap.push_back(font_ix);
+ fontMap[i] = font_ix;
}
int x0 = mAdvance;
for (size_t i = 0; i < src->mGlyphs.size(); i++) {
@@ -783,6 +788,10 @@ void Layout::appendLayout(Layout* src, size_t start) {
srcBounds.offset(x0, 0);
mBounds.join(srcBounds);
mAdvance += src->mAdvance;
+
+ if (fontMap != fontMapStack) {
+ delete[] fontMap;
+ }
}
void Layout::draw(Bitmap* surface, int x0, int y0, float size) const {