ソースを参照

LibGfx: Add Gfx::Bitmap::apply_mask()

This allows applying an alpha or luminance mask to a bitmap (of the same
size) inplace.
MacDue 1 年間 前
コミット
b69e8ee893
2 ファイル変更26 行追加0 行削除
  1. 19 0
      Userland/Libraries/LibGfx/Bitmap.cpp
  2. 7 0
      Userland/Libraries/LibGfx/Bitmap.h

+ 19 - 0
Userland/Libraries/LibGfx/Bitmap.cpp

@@ -344,6 +344,25 @@ ErrorOr<NonnullRefPtr<Gfx::Bitmap>> Bitmap::flipped(Gfx::Orientation orientation
     return new_bitmap;
     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<NonnullRefPtr<Gfx::Bitmap>> Bitmap::scaled(int sx, int sy) const
 ErrorOr<NonnullRefPtr<Gfx::Bitmap>> Bitmap::scaled(int sx, int sy) const
 {
 {
     VERIFY(sx >= 0 && sy >= 0);
     VERIFY(sx >= 0 && sy >= 0);

+ 7 - 0
Userland/Libraries/LibGfx/Bitmap.h

@@ -133,6 +133,13 @@ public:
 
 
     ErrorOr<NonnullRefPtr<Gfx::Bitmap>> inverted() const;
     ErrorOr<NonnullRefPtr<Gfx::Bitmap>> inverted() const;
 
 
+    enum class MaskKind {
+        Alpha,
+        Luminance
+    };
+
+    void apply_mask(Gfx::Bitmap const& mask, MaskKind);
+
     ~Bitmap();
     ~Bitmap();
 
 
     [[nodiscard]] u8* scanline_u8(int physical_y);
     [[nodiscard]] u8* scanline_u8(int physical_y);