mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 12:17:44 +00:00
PixelPaint: Refactor falloff computation and extend hardness range
This commit is contained in:
parent
7fae46361b
commit
b6d921f682
4 changed files with 14 additions and 7 deletions
|
@ -95,7 +95,7 @@ void BrushTool::draw_point(Gfx::Bitmap& bitmap, Gfx::Color const& color, Gfx::In
|
||||||
if (distance >= size())
|
if (distance >= size())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto falloff = (1.0 - double { distance / size() }) * (1.0 / (100 - hardness()));
|
auto falloff = get_falloff(distance);
|
||||||
auto pixel_color = color;
|
auto pixel_color = color;
|
||||||
pixel_color.set_alpha(falloff * 255);
|
pixel_color.set_alpha(falloff * 255);
|
||||||
bitmap.set_pixel(x, y, bitmap.get_pixel(x, y).blend(pixel_color));
|
bitmap.set_pixel(x, y, bitmap.get_pixel(x, y).blend(pixel_color));
|
||||||
|
@ -168,7 +168,7 @@ GUI::Widget* BrushTool::get_properties_widget()
|
||||||
hardness_label.set_fixed_size(80, 20);
|
hardness_label.set_fixed_size(80, 20);
|
||||||
|
|
||||||
auto& hardness_slider = hardness_container.add<GUI::ValueSlider>(Orientation::Horizontal, "%");
|
auto& hardness_slider = hardness_container.add<GUI::ValueSlider>(Orientation::Horizontal, "%");
|
||||||
hardness_slider.set_range(1, 99);
|
hardness_slider.set_range(1, 100);
|
||||||
hardness_slider.set_value(m_hardness);
|
hardness_slider.set_value(m_hardness);
|
||||||
|
|
||||||
hardness_slider.on_change = [&](int value) {
|
hardness_slider.on_change = [&](int value) {
|
||||||
|
|
|
@ -28,6 +28,12 @@ public:
|
||||||
void set_hardness(int hardness) { m_hardness = hardness; }
|
void set_hardness(int hardness) { m_hardness = hardness; }
|
||||||
int hardness() const { return m_hardness; }
|
int hardness() const { return m_hardness; }
|
||||||
|
|
||||||
|
double get_falloff(double distance)
|
||||||
|
{
|
||||||
|
double multiplicand = hardness() == 100 ? 1.0 : 1.0 / (100 - hardness());
|
||||||
|
return (1.0 - double { distance / size() }) * multiplicand;
|
||||||
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual Color color_for(GUI::MouseEvent const& event);
|
virtual Color color_for(GUI::MouseEvent const& event);
|
||||||
virtual void draw_point(Gfx::Bitmap& bitmap, Gfx::Color const& color, Gfx::IntPoint const& point);
|
virtual void draw_point(Gfx::Bitmap& bitmap, Gfx::Color const& color, Gfx::IntPoint const& point);
|
||||||
|
|
|
@ -37,7 +37,7 @@ void CloneTool::draw_point(Gfx::Bitmap& bitmap, Gfx::Color const&, Gfx::IntPoint
|
||||||
if (source_x < 0 || source_x >= bitmap.width() || source_y < 0 || source_y >= bitmap.height())
|
if (source_x < 0 || source_x >= bitmap.width() || source_y < 0 || source_y >= bitmap.height())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto falloff = (1.0 - double { distance / size() }) * (1.0 / (100 - hardness()));
|
auto falloff = get_falloff(distance);
|
||||||
auto pixel_color = bitmap.get_pixel(source_x, source_y);
|
auto pixel_color = bitmap.get_pixel(source_x, source_y);
|
||||||
pixel_color.set_alpha(falloff * 255);
|
pixel_color.set_alpha(falloff * 255);
|
||||||
bitmap.set_pixel(target_x, target_y, bitmap.get_pixel(target_x, target_y).blend(pixel_color));
|
bitmap.set_pixel(target_x, target_y, bitmap.get_pixel(target_x, target_y).blend(pixel_color));
|
||||||
|
@ -165,11 +165,11 @@ GUI::Widget* CloneTool::get_properties_widget()
|
||||||
hardness_label.set_fixed_size(80, 20);
|
hardness_label.set_fixed_size(80, 20);
|
||||||
|
|
||||||
auto& hardness_slider = hardness_container.add<GUI::ValueSlider>(Orientation::Horizontal, "%");
|
auto& hardness_slider = hardness_container.add<GUI::ValueSlider>(Orientation::Horizontal, "%");
|
||||||
hardness_slider.set_range(1, 99);
|
hardness_slider.set_range(1, 100);
|
||||||
hardness_slider.on_change = [&](int value) {
|
hardness_slider.on_change = [&](int value) {
|
||||||
set_hardness(value);
|
set_hardness(value);
|
||||||
};
|
};
|
||||||
hardness_slider.set_value(99);
|
hardness_slider.set_value(100);
|
||||||
set_secondary_slider(&hardness_slider);
|
set_secondary_slider(&hardness_slider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,8 +50,9 @@ void EraseTool::draw_point(Gfx::Bitmap& bitmap, Gfx::Color const& color, Gfx::In
|
||||||
continue;
|
continue;
|
||||||
if (distance >= size())
|
if (distance >= size())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
auto old_color = bitmap.get_pixel(x, y);
|
auto old_color = bitmap.get_pixel(x, y);
|
||||||
auto falloff = (1.0 - double { distance / size() }) * (1.0 / (100 - hardness()));
|
auto falloff = get_falloff(distance);
|
||||||
auto new_color = old_color.interpolate(color, falloff);
|
auto new_color = old_color.interpolate(color, falloff);
|
||||||
bitmap.set_pixel(x, y, new_color);
|
bitmap.set_pixel(x, y, new_color);
|
||||||
}
|
}
|
||||||
|
@ -91,7 +92,7 @@ GUI::Widget* EraseTool::get_properties_widget()
|
||||||
hardness_label.set_fixed_size(80, 20);
|
hardness_label.set_fixed_size(80, 20);
|
||||||
|
|
||||||
auto& hardness_slider = hardness_container.add<GUI::ValueSlider>(Orientation::Horizontal, "%");
|
auto& hardness_slider = hardness_container.add<GUI::ValueSlider>(Orientation::Horizontal, "%");
|
||||||
hardness_slider.set_range(1, 99);
|
hardness_slider.set_range(1, 100);
|
||||||
hardness_slider.set_value(hardness());
|
hardness_slider.set_value(hardness());
|
||||||
|
|
||||||
hardness_slider.on_change = [&](int value) {
|
hardness_slider.on_change = [&](int value) {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue