diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp index 25afe63267fe5..5df64080b102e 100644 --- a/libs/hwui/PathCache.cpp +++ b/libs/hwui/PathCache.cpp @@ -214,7 +214,22 @@ void PathCache::operator()(PathDescription& entry, PathTexture*& texture) { void PathCache::removeTexture(PathTexture* texture) { if (texture) { const uint32_t size = texture->width * texture->height; - mSize -= size; + + // If there is a pending task we must wait for it to return + // before attempting our cleanup + const sp >& task = texture->task(); + if (task != NULL) { + SkBitmap* bitmap = task->getResult(); + texture->clearTask(); + } else { + // If there is a pending task, the path was not added + // to the cache and the size wasn't increased + if (size > mSize) { + ALOGE("Removing path texture of size %d will leave " + "the cache in an inconsistent state", size); + } + mSize -= size; + } PATH_LOGD("PathCache::delete name, size, mSize = %d, %d, %d", texture->id, size, mSize); diff --git a/tests/HwAccelerationTest/src/com/android/test/hwui/PathsCacheActivity.java b/tests/HwAccelerationTest/src/com/android/test/hwui/PathsCacheActivity.java index 9f973117f4df4..c1e7f4ad156c8 100644 --- a/tests/HwAccelerationTest/src/com/android/test/hwui/PathsCacheActivity.java +++ b/tests/HwAccelerationTest/src/com/android/test/hwui/PathsCacheActivity.java @@ -88,8 +88,6 @@ public class PathsCacheActivity extends Activity { @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); - - Log.d("OpenGLRenderer", "Start frame"); canvas.drawARGB(255, 255, 255, 255); @@ -104,6 +102,13 @@ public class PathsCacheActivity extends Activity { canvas.drawPath(mPath, mMediumPaint); canvas.drawPath(mPath, mMediumPaint); + mPath.reset(); + buildPath(mPath); + + canvas.translate(30.0f, 30.0f); + canvas.drawPath(mPath, mMediumPaint); + canvas.drawPath(mPath, mMediumPaint); + canvas.restore(); for (int i = 0; i < mRandom.nextInt(20); i++) {