Path precaching creates duplicate cache entries
Bug #8478275
Change-Id: Ib541ea051e42e01cc0d277790e9c09de38ef72ee
diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp
index 07c4207..fdb10e2 100644
--- a/libs/hwui/PathCache.cpp
+++ b/libs/hwui/PathCache.cpp
@@ -262,12 +262,13 @@
PathTexture* texture = createTexture(left, top, offset, width, height,
path->getGenerationID());
- addTexture(entry, &bitmap, texture);
+ generateTexture(entry, &bitmap, texture);
return texture;
}
-void PathCache::addTexture(const PathDescription& entry, SkBitmap* bitmap, PathTexture* texture) {
+void PathCache::generateTexture(const PathDescription& entry, SkBitmap* bitmap,
+ PathTexture* texture, bool addToCache) {
generateTexture(*bitmap, texture);
uint32_t size = texture->width * texture->height;
@@ -278,7 +279,9 @@
if (mDebugEnabled) {
ALOGD("Shape created, size = %d", size);
}
- mCache.put(entry, texture);
+ if (addToCache) {
+ mCache.put(entry, texture);
+ }
} else {
texture->cleanup = true;
}
@@ -414,7 +417,7 @@
// producing the bitmap, so let's wait
SkBitmap* bitmap = task->getResult();
if (bitmap) {
- addTexture(entry, bitmap, texture);
+ generateTexture(entry, bitmap, texture, false);
texture->clearTask();
} else {
ALOGW("Path too large to be rendered into a texture");
@@ -423,6 +426,8 @@
mCache.remove(entry);
}
} else if (path->getGenerationID() != texture->generation) {
+ // The size of the path might have changed so we first
+ // remove the entry from the cache
mCache.remove(entry);
texture = addTexture(entry, path, paint);
}
diff --git a/libs/hwui/PathCache.h b/libs/hwui/PathCache.h
index 1467231..dd1f996 100644
--- a/libs/hwui/PathCache.h
+++ b/libs/hwui/PathCache.h
@@ -253,7 +253,13 @@
PathTexture* addTexture(const PathDescription& entry,
const SkPath *path, const SkPaint* paint);
PathTexture* addTexture(const PathDescription& entry, SkBitmap* bitmap);
- void addTexture(const PathDescription& entry, SkBitmap* bitmap, PathTexture* texture);
+
+ /**
+ * Generates the texture from a bitmap into the specified texture structure.
+ */
+ void generateTexture(SkBitmap& bitmap, Texture* texture);
+ void generateTexture(const PathDescription& entry, SkBitmap* bitmap, PathTexture* texture,
+ bool addToCache = true);
PathTexture* get(const PathDescription& entry) {
return mCache.get(entry);
@@ -282,11 +288,6 @@
return true;
}
- /**
- * Generates the texture from a bitmap into the specified texture structure.
- */
- void generateTexture(SkBitmap& bitmap, Texture* texture);
-
void init();
class PathTask: public Task<SkBitmap*> {