diff --git a/Userland/Libraries/LibGfx/Bitmap.cpp b/Userland/Libraries/LibGfx/Bitmap.cpp index 33ef24c2b6..c29c3ac476 100644 --- a/Userland/Libraries/LibGfx/Bitmap.cpp +++ b/Userland/Libraries/LibGfx/Bitmap.cpp @@ -344,6 +344,25 @@ ErrorOr> Bitmap::flipped(Gfx::Orientation orientation return new_bitmap; } +void Bitmap::apply_mask(Gfx::Bitmap const& mask, MaskKind mask_kind) +{ + VERIFY(size() == mask.size()); + + for (int y = 0; y < height(); y++) { + for (int x = 0; x < width(); x++) { + auto color = get_pixel(x, y); + auto mask_color = mask.get_pixel(x, y); + if (mask_kind == MaskKind::Luminance) { + color = color.with_alpha(color.alpha() * mask_color.alpha() * mask_color.luminosity() / (255 * 255)); + } else { + VERIFY(mask_kind == MaskKind::Alpha); + color = color.with_alpha(color.alpha() * mask_color.alpha() / 255); + } + set_pixel(x, y, color); + } + } +} + ErrorOr> Bitmap::scaled(int sx, int sy) const { VERIFY(sx >= 0 && sy >= 0); diff --git a/Userland/Libraries/LibGfx/Bitmap.h b/Userland/Libraries/LibGfx/Bitmap.h index 4e5321a6d2..339399527d 100644 --- a/Userland/Libraries/LibGfx/Bitmap.h +++ b/Userland/Libraries/LibGfx/Bitmap.h @@ -133,6 +133,13 @@ public: ErrorOr> inverted() const; + enum class MaskKind { + Alpha, + Luminance + }; + + void apply_mask(Gfx::Bitmap const& mask, MaskKind); + ~Bitmap(); [[nodiscard]] u8* scanline_u8(int physical_y);