mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2025-01-04 01:05:58 +03:00
LibGfx: Add BitmapMixer
With this BitmapMixer one can draw one Bitmap onto another with different modes. For now the only supported mixing methods implemented are Add and Lightest (which is very naive).
This commit is contained in:
parent
9d45e5ac8f
commit
06ae5b3536
Notes:
sideshowbarker
2024-07-18 22:57:59 +09:00
Author: https://github.com/TobyAsE Commit: https://github.com/SerenityOS/serenity/commit/06ae5b3536a Pull-request: https://github.com/SerenityOS/serenity/pull/11614 Reviewed-by: https://github.com/IdanHo ✅
48
Userland/Libraries/LibGfx/BitmapMixer.cpp
Normal file
48
Userland/Libraries/LibGfx/BitmapMixer.cpp
Normal file
@ -0,0 +1,48 @@
|
||||
/*
|
||||
* Copyright (c) 2022, Tobias Christiansen <tobyase@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#include "BitmapMixer.h"
|
||||
|
||||
namespace Gfx {
|
||||
|
||||
void BitmapMixer::mix_with(Bitmap& other_bitmap, MixingMethod mixing_method)
|
||||
{
|
||||
VERIFY(m_bitmap.size() == other_bitmap.size());
|
||||
|
||||
int height = m_bitmap.height();
|
||||
int width = m_bitmap.width();
|
||||
|
||||
for (int y = 0; y < height; ++y) {
|
||||
for (int x = 0; x < width; ++x) {
|
||||
auto original_color = m_bitmap.get_pixel(x, y);
|
||||
auto other_color = other_bitmap.get_pixel(x, y);
|
||||
|
||||
Color output_color = { 0, 0, 0, original_color.alpha() };
|
||||
switch (mixing_method) {
|
||||
case MixingMethod::Add:
|
||||
output_color.set_red(original_color.red() + other_color.red());
|
||||
output_color.set_green(original_color.green() + other_color.green());
|
||||
output_color.set_blue(original_color.blue() + other_color.blue());
|
||||
break;
|
||||
case MixingMethod::Lightest:
|
||||
auto original_lightness = original_color.red() + original_color.green() + original_color.blue();
|
||||
auto other_lightness = other_color.red() + other_color.green() + other_color.blue();
|
||||
if (original_lightness > other_lightness) {
|
||||
output_color = original_color;
|
||||
} else {
|
||||
output_color.set_red(other_color.red());
|
||||
output_color.set_green(other_color.green());
|
||||
output_color.set_blue(other_color.blue());
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (original_color != output_color)
|
||||
m_bitmap.set_pixel(x, y, output_color);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
29
Userland/Libraries/LibGfx/BitmapMixer.h
Normal file
29
Userland/Libraries/LibGfx/BitmapMixer.h
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright (c) 2022, Tobias Christiansen <tobyase@serenityos.org>
|
||||
*
|
||||
* SPDX-License-Identifier: BSD-2-Clause
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
|
||||
#include "Bitmap.h"
|
||||
|
||||
namespace Gfx {
|
||||
|
||||
class BitmapMixer {
|
||||
public:
|
||||
enum class MixingMethod {
|
||||
Add,
|
||||
Lightest,
|
||||
};
|
||||
|
||||
BitmapMixer(Bitmap& bitmap)
|
||||
: m_bitmap(bitmap) {};
|
||||
|
||||
void mix_with(Bitmap&, MixingMethod);
|
||||
|
||||
private:
|
||||
Bitmap& m_bitmap;
|
||||
};
|
||||
|
||||
}
|
@ -2,6 +2,7 @@ set(SOURCES
|
||||
AffineTransform.cpp
|
||||
AntiAliasingPainter.cpp
|
||||
Bitmap.cpp
|
||||
BitmapMixer.cpp
|
||||
BitmapFont.cpp
|
||||
BMPLoader.cpp
|
||||
BMPWriter.cpp
|
||||
|
Loading…
Reference in New Issue
Block a user