From fe3963f3d4f3ace16da5ab8aa4540cb99a68dd29 Mon Sep 17 00:00:00 2001 From: Sahan Fernando Date: Tue, 8 Dec 2020 12:44:24 +1100 Subject: [PATCH] LibGfx: SIMD optimized alpha blending --- Libraries/LibGfx/Color.h | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/Libraries/LibGfx/Color.h b/Libraries/LibGfx/Color.h index e7f5eb4a42..595d1bf9d9 100644 --- a/Libraries/LibGfx/Color.h +++ b/Libraries/LibGfx/Color.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -131,12 +132,31 @@ public: if (!source.alpha()) return *this; +#ifdef __SSE__ + using AK::SIMD::i32x4; + + const i32x4 color = { + red(), + green(), + blue() + }; + const i32x4 source_color = { + source.red(), + source.green(), + source.blue() + }; + + const int d = 255 * (alpha() + source.alpha()) - alpha() * source.alpha(); + const i32x4 out = (color * alpha() * (255 - source.alpha()) + 255 * source.alpha() * source_color) / d; + return Color(out[0], out[1], out[2], d / 255); +#else int d = 255 * (alpha() + source.alpha()) - alpha() * source.alpha(); u8 r = (red() * alpha() * (255 - source.alpha()) + 255 * source.alpha() * source.red()) / d; u8 g = (green() * alpha() * (255 - source.alpha()) + 255 * source.alpha() * source.green()) / d; u8 b = (blue() * alpha() * (255 - source.alpha()) + 255 * source.alpha() * source.blue()) / d; u8 a = d / 255; return Color(r, g, b, a); +#endif } Color to_grayscale() const