Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7061f7d7 authored by yuyang's avatar yuyang Committed by Digish Pandya
Browse files

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
parent 9cd3ff7d
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -346,7 +346,7 @@ void PathCache::PathProcessor::onProcess(const sp<Task<SkBitmap*> >& 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<SkBitmap*> >& 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;
+3 −2
Original line number Diff line number Diff line
@@ -293,7 +293,7 @@ private:
    class PathTask: public Task<SkBitmap*> {
    public:
        PathTask(SkPath* path, SkPaint* paint, PathTexture* texture):
            path(path), paint(paint), texture(texture) {
            path(path), paint(*paint), texture(texture) {
        }

        ~PathTask() {
@@ -301,7 +301,8 @@ private:
        }

        SkPath* path;
        SkPaint* paint;
        //copied, since input paint may not be immutable
        SkPaint paint;
        PathTexture* texture;
    };