1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 06:47:35 +00:00

PixelPaint: Introduce a vectorscope

Vectorscopes are a standard tool in professional video/film color
grading. *Very* simply, the Vectorscope shows image colors with hue as
the angle and saturation as the radius; brightness for each point in the
scope is determined by the number of "color vectors" at that point. More
specifically, the Vectorscope shows a 2D UV histogram of the image,
where U and V are the chroma ("color") channels of the image.

Co-authored-by: MacDue <macdue@dueutil.tech>
This commit is contained in:
kleines Filmröllchen 2022-08-17 12:18:16 +02:00 committed by Linus Groh
parent f9b08272db
commit c1c2e6f7d7
6 changed files with 295 additions and 0 deletions

View file

@ -46,6 +46,7 @@ MainWidget::MainWidget()
m_palette_widget = *find_descendant_of_type_named<PixelPaint::PaletteWidget>("palette_widget");
m_histogram_widget = *find_descendant_of_type_named<PixelPaint::HistogramWidget>("histogram_widget");
m_vectorscope_widget = *find_descendant_of_type_named<PixelPaint::VectorscopeWidget>("vectorscope_widget");
m_layer_list_widget = *find_descendant_of_type_named<PixelPaint::LayerListWidget>("layer_list_widget");
m_layer_list_widget->on_layer_select = [&](auto* layer) {
auto* editor = current_image_editor();
@ -74,6 +75,7 @@ MainWidget::MainWidget()
m_tab_widget->remove_tab(image_editor);
if (m_tab_widget->children().size() == 0) {
m_histogram_widget->set_image(nullptr);
m_vectorscope_widget->set_image(nullptr);
m_layer_list_widget->set_image(nullptr);
m_layer_properties_widget->set_layer(nullptr);
m_palette_widget->set_image_editor(nullptr);
@ -88,12 +90,14 @@ MainWidget::MainWidget()
auto& image_editor = verify_cast<PixelPaint::ImageEditor>(widget);
m_palette_widget->set_image_editor(&image_editor);
m_histogram_widget->set_image(&image_editor.image());
m_vectorscope_widget->set_image(&image_editor.image());
m_layer_list_widget->set_image(&image_editor.image());
m_layer_properties_widget->set_layer(image_editor.active_layer());
window()->set_modified(image_editor.is_modified());
image_editor.on_modified_change = [this](bool modified) {
window()->set_modified(modified);
m_histogram_widget->image_changed();
m_vectorscope_widget->image_changed();
};
if (auto* active_tool = m_toolbox->active_tool())
image_editor.set_active_tool(active_tool);
@ -161,6 +165,7 @@ void MainWidget::initialize_menubar(GUI::Window& window)
editor.undo_stack().set_current_unmodified();
m_histogram_widget->set_image(image);
m_vectorscope_widget->set_image(image);
m_layer_list_widget->set_image(image);
m_layer_list_widget->set_selected_layer(bg_layer);
}
@ -978,15 +983,18 @@ ImageEditor& MainWidget::create_new_editor(NonnullRefPtr<Image> image)
if (image_rectangle.contains(mouse_position)) {
m_statusbar->set_override_text(mouse_position.to_string());
m_histogram_widget->set_color_at_mouseposition(current_image_editor()->image().color_at(mouse_position));
m_vectorscope_widget->set_color_at_mouseposition(current_image_editor()->image().color_at(mouse_position));
} else {
m_statusbar->set_override_text({});
m_histogram_widget->set_color_at_mouseposition(Color::Transparent);
m_vectorscope_widget->set_color_at_mouseposition(Color::Transparent);
}
};
image_editor.on_leave = [&]() {
m_statusbar->set_override_text({});
m_histogram_widget->set_color_at_mouseposition(Color::Transparent);
m_vectorscope_widget->set_color_at_mouseposition(Color::Transparent);
};
image_editor.on_set_guide_visibility = [&](bool show_guides) {