Path precaching creates duplicate cache entries

Bug #8478275

Change-Id: Ib541ea051e42e01cc0d277790e9c09de38ef72ee
This commit is contained in:
Romain Guy
2013-03-26 17:29:51 -07:00
parent 96885eb480
commit 4500a8d5d7
2 changed files with 16 additions and 10 deletions

View File

@@ -262,12 +262,13 @@ PathTexture* PathCache::addTexture(const PathDescription& entry, const SkPath *p
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 @@ void PathCache::addTexture(const PathDescription& entry, SkBitmap* bitmap, PathT
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 @@ PathTexture* PathCache::get(SkPath* path, SkPaint* paint) {
// 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 @@ PathTexture* PathCache::get(SkPath* path, SkPaint* paint) {
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);
}

View File

@@ -253,7 +253,13 @@ private:
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 @@ private:
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*> {