From 7061f7d7910fdf1189ea7bf1398f6cf8b9bd0104 Mon Sep 17 00:00:00 2001 From: yuyang Date: Tue, 27 May 2014 16:15:02 +0800 Subject: Fix a resource race bug in PathCache When enabled defer rendering, it will do precache for DrawPathOp. The paint used for creating PathTask in precache just get the address of mFilteredPaint of OpenGLRenderer. So for the following defer operation like DrawTextOp has possibility change the mFilteredPaint by getPaint while another WorkerThread in PathCache is using the paint which pointed to the same address of mFilteredPaint to generate bitmap. As a result, it will generate a wrong bitmap for generateTexture in PathCache. To fix it, do a copy of paint when creating PathTask. CRs-Fixed: 664244 Change-Id: I5516f5b143458b88d3573d15b7ebb34f688800c7 --- libs/hwui/PathCache.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'libs/hwui/PathCache.cpp') diff --git a/libs/hwui/PathCache.cpp b/libs/hwui/PathCache.cpp index cf8adf8772f3..0794aecaceb6 100644 --- a/libs/hwui/PathCache.cpp +++ b/libs/hwui/PathCache.cpp @@ -346,7 +346,7 @@ void PathCache::PathProcessor::onProcess(const sp >& task) { float left, top, offset; uint32_t width, height; - PathCache::computePathBounds(t->path, t->paint, left, top, offset, width, height); + PathCache::computePathBounds(t->path, &t->paint, left, top, offset, width, height); PathTexture* texture = t->texture; texture->left = left; @@ -357,7 +357,7 @@ void PathCache::PathProcessor::onProcess(const sp >& task) { if (width <= mMaxTextureSize && height <= mMaxTextureSize) { SkBitmap* bitmap = new SkBitmap(); - drawPath(t->path, t->paint, *bitmap, left, top, offset, width, height); + drawPath(t->path, &t->paint, *bitmap, left, top, offset, width, height); t->setResult(bitmap); } else { texture->width = 0; -- cgit v1.2.3-59-g8ed1b