diff options
author | Luboš Luňák <l.lunak@collabora.com> | 2021-11-25 22:38:55 +0100 |
---|---|---|
committer | Luboš Luňák <l.lunak@collabora.com> | 2021-11-29 21:48:53 +0100 |
commit | 4a11c85baeb4998e12bc2ab45b0c23d7203bd5b0 (patch) | |
tree | 7afb38108114ea30bf455668a84d0d9a0de04a4d | |
parent | 7a2616501bba1225df3f6bc0225c3d5a7a692002 (diff) |
remove Skia kDifference workaround
I thought it was a driver problem, but now I'm actually not sure,
as I cannot reproduce it anymore and I don't know if it was a driver
update or Skia update. Either way, this works now.
Also switch to kExclusion, because the end result is the same,
but this formula is simpler (to understand primarily, the performance
is going to be probably the same).
Change-Id: I6ced098ca4a3361cf98d3f9b32968c128eb9f299
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/126050
Tested-by: Jenkins
Reviewed-by: Luboš Luňák <l.lunak@collabora.com>
-rw-r--r-- | vcl/inc/skia/utils.hxx | 3 | ||||
-rw-r--r-- | vcl/skia/SkiaHelper.cxx | 34 | ||||
-rw-r--r-- | vcl/skia/gdiimpl.cxx | 7 |
3 files changed, 4 insertions, 40 deletions
diff --git a/vcl/inc/skia/utils.hxx b/vcl/inc/skia/utils.hxx index 0583e9ceb624..ac8a185e711e 100644 --- a/vcl/inc/skia/utils.hxx +++ b/vcl/inc/skia/utils.hxx @@ -103,9 +103,6 @@ enum DirectImage No }; -// Do 'paint->setBlendMode(SkBlendMode::kDifference)' (workaround for buggy drivers). -void setBlendModeDifference(SkPaint* paint); - // Must be called in any VCL backend before any Skia functionality is used. // If not set, Skia will be disabled. VCL_DLLPUBLIC void diff --git a/vcl/skia/SkiaHelper.cxx b/vcl/skia/SkiaHelper.cxx index 631e5b64fe52..d082b6799129 100644 --- a/vcl/skia/SkiaHelper.cxx +++ b/vcl/skia/SkiaHelper.cxx @@ -644,45 +644,11 @@ tools::Long maxImageCacheSize() return officecfg::Office::Common::Cache::Skia::ImageCacheSize::get(); } -static sk_sp<SkBlender> differenceBlender; - -void setBlendModeDifference(SkPaint* paint) -{ - // This should normally do 'paint->setBlendMode(SkBlendMode::kDifference);'. - // But some drivers have a problem with this, namely currently AMD on Windows - // (e.g. 'Vulkan API version: 1.2.170, driver version: 2.0.179, vendor: 0x1002 (AMD), - // device: 0x15dd, type: integrated, name: AMD Radeon(TM) Vega 8 Graphics') - // simply crashes when kDifference is used. - // Intel also had repaint problems with kDifference (tdf#130430), but it seems - // those do not(?) exist anymore. - // Interestingly, explicitly writing a shader that does exactly the same works fine, - // so do that. - if (!differenceBlender) - { - const char* const diff = R"( - vec4 main( vec4 src, vec4 dst ) - { - return vec4(abs( src.r - dst.r ), abs( src.g - dst.g ), abs( src.b - dst.b ), dst.a ); - } - )"; - auto effect = SkRuntimeEffect::MakeForBlender(SkString(diff)); - if (!effect.effect) - { - SAL_WARN("vcl.skia", - "SKRuntimeEffect::MakeForBlender failed: " << effect.errorText.c_str()); - abort(); - } - differenceBlender = effect.effect->makeBlender(nullptr); - } - paint->setBlender(differenceBlender); -} - void cleanup() { sharedWindowContext.reset(); imageCache.clear(); imageCacheSize = 0; - differenceBlender.reset(); } static SkSurfaceProps commonSurfaceProps; diff --git a/vcl/skia/gdiimpl.cxx b/vcl/skia/gdiimpl.cxx index 3d7697c4dcfa..63d588aa913e 100644 --- a/vcl/skia/gdiimpl.cxx +++ b/vcl/skia/gdiimpl.cxx @@ -1507,7 +1507,10 @@ void SkiaSalGraphicsImpl::invert(basegfx::B2DPolygon const& rPoly, SalInvert eFl addUpdateRegion(aPath.getBounds()); SkAutoCanvasRestore autoRestore(getDrawCanvas(), true); SkPaint aPaint; - setBlendModeDifference(&aPaint); + // There's no blend mode for inverting as such, but kExclusion is 's + d - 2*s*d', + // so with d = 1.0 (all channels) it becomes effectively '1 - s', i.e. inverted color. + aPaint.setBlendMode(SkBlendMode::kExclusion); + aPaint.setColor(SkColorSetARGB(255, 255, 255, 255)); // TrackFrame just inverts a dashed path around the polygon if (eFlags == SalInvert::TrackFrame) { @@ -1519,11 +1522,9 @@ void SkiaSalGraphicsImpl::invert(basegfx::B2DPolygon const& rPoly, SalInvert eFl constexpr float intervals[] = { 4.0f, 4.0f }; aPaint.setStyle(SkPaint::kStroke_Style); aPaint.setPathEffect(SkDashPathEffect::Make(intervals, SK_ARRAY_COUNT(intervals), 0)); - aPaint.setColor(SkColorSetARGB(255, 255, 255, 255)); } else { - aPaint.setColor(SkColorSetARGB(255, 255, 255, 255)); aPaint.setStyle(SkPaint::kFill_Style); // N50 inverts in checker pattern |