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

Commit a21bbb02 authored by Nolan Scobie's avatar Nolan Scobie
Browse files

Fix Canvas#drawVertices color blending when no shader is provided

Since https://skia-review.googlesource.com/c/skia/+/473676, Skia will
blend paint and vertex colors when no shader is provided. This fix
mimics the old behavior of ignoring the paint and using the vertex
colors directly when no shader is provided.

Additionally, centralizes some legacy compatability logic of disabling
the shader if no texs array is provided. I think this simplifies the
logic/cognitive overhead of understanding what compatability tweaks are
being made to the call.

Tests added in Iddb4d2a3872b905684ec57c0e039d0bd0ca64a71
Test: atest ExactCanvasTests

Fix: 239398877

Change-Id: Ie9a6389b422cc0c315485d8a8097314cb6706538
parent a9aaecab
Loading
Loading
Loading
Loading
+21 −7
Original line number Diff line number Diff line
@@ -407,14 +407,28 @@ static void drawVertices(JNIEnv* env, jobject, jlong canvasHandle,
        indices = (const uint16_t*)(indexA.ptr() + indexIndex);
    }

    SkVertices::VertexMode mode = static_cast<SkVertices::VertexMode>(modeHandle);
    SkVertices::VertexMode vertexMode = static_cast<SkVertices::VertexMode>(modeHandle);
    const Paint* paint = reinterpret_cast<Paint*>(paintHandle);
    get_canvas(canvasHandle)->drawVertices(SkVertices::MakeCopy(mode, vertexCount,
                                           reinterpret_cast<const SkPoint*>(verts),

    // Preserve legacy Skia behavior: ignore the shader if there are no texs set.
    Paint noShaderPaint;
    if (jtexs == NULL) {
        noShaderPaint = Paint(*paint);
        noShaderPaint.setShader(nullptr);
        paint = &noShaderPaint;
    }
    // Since https://skia-review.googlesource.com/c/skia/+/473676, Skia will blend paint and vertex
    // colors when no shader is provided. This ternary uses kDst to mimic the old behavior of
    // ignoring the paint and using the vertex colors directly when no shader is provided.
    SkBlendMode blendMode = paint->getShader() ? SkBlendMode::kModulate : SkBlendMode::kDst;

    get_canvas(canvasHandle)
            ->drawVertices(SkVertices::MakeCopy(
                                   vertexMode, vertexCount, reinterpret_cast<const SkPoint*>(verts),
                                   reinterpret_cast<const SkPoint*>(texs),
                                           reinterpret_cast<const SkColor*>(colors),
                                           indexCount, indices).get(),
                                           SkBlendMode::kModulate, *paint);
                                   reinterpret_cast<const SkColor*>(colors), indexCount, indices)
                                   .get(),
                           blendMode, *paint);
}

static void drawNinePatch(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmapHandle,