diff options
author | 2010-10-22 16:17:12 -0700 | |
---|---|---|
committer | 2010-10-26 12:52:03 -0700 | |
commit | ad93c2bb63dfc813b2eefa1043aa63afbddce655 (patch) | |
tree | b1a5a9cd667ed0dca718405390d76081a8241d54 /libs/hwui/ResourceCache.cpp | |
parent | 78098341f86b4c71256017ca2b33674d6bcab046 (diff) |
Optimizing ColorFilter in display lists
Change-Id: Ie4d5e5b0bc45e0ce47bba144049303c270762e54
Diffstat (limited to 'libs/hwui/ResourceCache.cpp')
-rw-r--r-- | libs/hwui/ResourceCache.cpp | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/libs/hwui/ResourceCache.cpp b/libs/hwui/ResourceCache.cpp index b0fbe65339bb..47c5d489b3e8 100644 --- a/libs/hwui/ResourceCache.cpp +++ b/libs/hwui/ResourceCache.cpp @@ -67,6 +67,11 @@ void ResourceCache::incrementRefcount(SkiaShader* shaderResource) { incrementRefcount((void*)shaderResource, kShader); } +void ResourceCache::incrementRefcount(SkiaColorFilter* filterResource) { + filterResource->getSkColorFilter()->safeRef(); + incrementRefcount((void*)filterResource, kColorFilter); +} + void ResourceCache::decrementRefcount(void* resource) { ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL; if (ref == NULL) { @@ -90,6 +95,11 @@ void ResourceCache::decrementRefcount(SkiaShader* shaderResource) { decrementRefcount((void*)shaderResource); } +void ResourceCache::decrementRefcount(SkiaColorFilter* filterResource) { + filterResource->getSkColorFilter()->safeUnref(); + decrementRefcount((void*)filterResource); +} + void ResourceCache::recycle(SkBitmap* resource) { if (mCache->indexOfKey(resource) < 0) { // not tracking this resource; just recycle the pixel data @@ -145,6 +155,20 @@ void ResourceCache::destructor(SkiaShader* resource) { } } +void ResourceCache::destructor(SkiaColorFilter* resource) { + ResourceReference* ref = mCache->indexOfKey(resource) >= 0 ? mCache->valueFor(resource) : NULL; + if (ref == NULL) { + // If we're not tracking this resource, just delete it + delete resource; + return; + } + ref->destroyed = true; + if (ref->refCount == 0) { + deleteResourceReference(resource, ref); + return; + } +} + void ResourceCache::deleteResourceReference(void* resource, ResourceReference* ref) { if (ref->recycled && ref->resourceType == kBitmap) { ((SkBitmap*) resource)->setPixels(NULL, NULL); @@ -161,12 +185,20 @@ void ResourceCache::deleteResourceReference(void* resource, ResourceReference* r } break; case kShader: + { SkiaShader* shader = (SkiaShader*)resource; if (Caches::hasInstance()) { Caches::getInstance().gradientCache.remove(shader->getSkShader()); } delete shader; - break; + } + break; + case kColorFilter: + { + SkiaColorFilter* filter = (SkiaColorFilter*)resource; + delete filter; + } + break; } } mCache->removeItem(resource); |