From fbc066e0a21c6381a0c8a1dd2d5175fd9a8f28ad Mon Sep 17 00:00:00 2001 From: Alexey Ushakov Date: Wed, 21 Oct 2020 20:08:48 +0000 Subject: [PATCH] 8255149: Lanai: DrawImage/IncorrectAlphaConversionBicubic.java failure --- src/java.desktop/macosx/native/libawt_lwawt/awt/common.h | 1 + src/java.desktop/macosx/native/libawt_lwawt/awt/shaders.metal | 4 ++++ .../macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m | 4 +++- 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/src/java.desktop/macosx/native/libawt_lwawt/awt/common.h b/src/java.desktop/macosx/native/libawt_lwawt/awt/common.h index a00227c00e7..0053d0ceeb3 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/awt/common.h +++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/common.h @@ -102,6 +102,7 @@ struct TxtFrameUniforms { vector_float4 color; int mode; // NOTE: consider to use bit fields int isSrcOpaque; + int isSrcPremult; int isDstOpaque; float extraAlpha; }; diff --git a/src/java.desktop/macosx/native/libawt_lwawt/awt/shaders.metal b/src/java.desktop/macosx/native/libawt_lwawt/awt/shaders.metal index 64b377e104c..b944c74cb15 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/awt/shaders.metal +++ b/src/java.desktop/macosx/native/libawt_lwawt/awt/shaders.metal @@ -177,6 +177,10 @@ fragment half4 frag_txt( return half4(c.r, c.g, c.b , c.a); } + if (uniforms.isSrcPremult) { + pixelColor.rgb /= srcA; + } + return half4(pixelColor.r, pixelColor.g, pixelColor.b, srcA)*uniforms.extraAlpha; diff --git a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m index 26675398cfc..49dad8b9b65 100644 --- a/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m +++ b/src/java.desktop/macosx/native/libawt_lwawt/java2d/metal/MTLPaints.m @@ -858,7 +858,9 @@ static void setTxtUniforms( id encoder, int color, int mode, int interpolation, bool repeat, jfloat extraAlpha, const SurfaceRasterFlags * srcFlags, const SurfaceRasterFlags * dstFlags ) { - struct TxtFrameUniforms uf = {RGBA_TO_V4(color), mode, srcFlags->isOpaque, dstFlags->isOpaque, extraAlpha}; + struct TxtFrameUniforms uf = { + RGBA_TO_V4(color), mode, srcFlags->isOpaque, srcFlags->isPremultiplied, + dstFlags->isOpaque, extraAlpha}; [encoder setFragmentBytes:&uf length:sizeof(uf) atIndex:FrameUniformBuffer]; setSampler(encoder, interpolation, repeat);