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
This commit is contained in:
@@ -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),
|
||||
reinterpret_cast<const SkPoint*>(texs),
|
||||
reinterpret_cast<const SkColor*>(colors),
|
||||
indexCount, indices).get(),
|
||||
SkBlendMode::kModulate, *paint);
|
||||
|
||||
// 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(),
|
||||
blendMode, *paint);
|
||||
}
|
||||
|
||||
static void drawNinePatch(JNIEnv* env, jobject, jlong canvasHandle, jlong bitmapHandle,
|
||||
|
||||
Reference in New Issue
Block a user