summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Applications/Magnifier/CMakeLists.txt2
-rw-r--r--Userland/Applications/Magnifier/MagnifierWidget.cpp24
-rw-r--r--Userland/Applications/Magnifier/MagnifierWidget.h4
-rw-r--r--Userland/Applications/Magnifier/main.cpp62
4 files changed, 91 insertions, 1 deletions
diff --git a/Userland/Applications/Magnifier/CMakeLists.txt b/Userland/Applications/Magnifier/CMakeLists.txt
index b3ed8910db..1aad903524 100644
--- a/Userland/Applications/Magnifier/CMakeLists.txt
+++ b/Userland/Applications/Magnifier/CMakeLists.txt
@@ -11,4 +11,4 @@ set(SOURCES
)
serenity_app(Magnifier ICON app-magnifier)
-target_link_libraries(Magnifier LibGUI LibMain)
+target_link_libraries(Magnifier LibGfx LibGUI LibMain)
diff --git a/Userland/Applications/Magnifier/MagnifierWidget.cpp b/Userland/Applications/Magnifier/MagnifierWidget.cpp
index 78969e3863..b069eceeca 100644
--- a/Userland/Applications/Magnifier/MagnifierWidget.cpp
+++ b/Userland/Applications/Magnifier/MagnifierWidget.cpp
@@ -27,6 +27,12 @@ void MagnifierWidget::set_scale_factor(int scale_factor)
update();
}
+void MagnifierWidget::set_color_filter(OwnPtr<Gfx::ColorBlindnessFilter> color_filter)
+{
+ m_color_filter = move(color_filter);
+ sync();
+}
+
void MagnifierWidget::display_previous_frame()
{
--m_frame_offset_from_head;
@@ -64,3 +70,21 @@ void MagnifierWidget::paint_event(GUI::PaintEvent& event)
if (m_grabbed_bitmap)
painter.draw_scaled_bitmap(frame_inner_rect(), *m_grabbed_bitmap, m_grabbed_bitmap->rect());
}
+
+void MagnifierWidget::second_paint_event(GUI::PaintEvent&)
+{
+ if (!m_color_filter)
+ return;
+
+ GUI::Painter painter(*this);
+
+ auto target = painter.target();
+ auto bitmap_clone_or_error = target->clone();
+ if (bitmap_clone_or_error.is_error())
+ return;
+
+ auto clone = bitmap_clone_or_error.release_value();
+ auto rect = target->rect();
+
+ m_color_filter->apply(*target, rect, *clone, rect);
+}
diff --git a/Userland/Applications/Magnifier/MagnifierWidget.h b/Userland/Applications/Magnifier/MagnifierWidget.h
index 323ff47491..0a7af0a4be 100644
--- a/Userland/Applications/Magnifier/MagnifierWidget.h
+++ b/Userland/Applications/Magnifier/MagnifierWidget.h
@@ -8,6 +8,7 @@
#include <AK/CircularQueue.h>
#include <LibGUI/Frame.h>
+#include <LibGfx/Filters/ColorBlindnessFilter.h>
class MagnifierWidget final : public GUI::Frame {
C_OBJECT(MagnifierWidget);
@@ -15,6 +16,7 @@ class MagnifierWidget final : public GUI::Frame {
public:
virtual ~MagnifierWidget();
void set_scale_factor(int scale_factor);
+ void set_color_filter(OwnPtr<Gfx::ColorBlindnessFilter>);
void pause_capture(bool pause)
{
m_pause_capture = pause;
@@ -28,10 +30,12 @@ private:
MagnifierWidget();
virtual void paint_event(GUI::PaintEvent&) override;
+ virtual void second_paint_event(GUI::PaintEvent&) override;
void sync();
int m_scale_factor { 2 };
+ OwnPtr<Gfx::ColorBlindnessFilter> m_color_filter;
RefPtr<Gfx::Bitmap> m_grabbed_bitmap;
CircularQueue<RefPtr<Gfx::Bitmap>, 512> m_grabbed_bitmaps {};
ssize_t m_frame_offset_from_head { 0 };
diff --git a/Userland/Applications/Magnifier/main.cpp b/Userland/Applications/Magnifier/main.cpp
index 51a01d6daf..830667e409 100644
--- a/Userland/Applications/Magnifier/main.cpp
+++ b/Userland/Applications/Magnifier/main.cpp
@@ -12,6 +12,7 @@
#include <LibGUI/Menu.h>
#include <LibGUI/Menubar.h>
#include <LibGUI/Window.h>
+#include <LibGfx/Filters/ColorBlindnessFilter.h>
#include <LibMain/Main.h>
ErrorOr<int> serenity_main(Main::Arguments arguments)
@@ -91,6 +92,67 @@ ErrorOr<int> serenity_main(Main::Arguments arguments)
TRY(timeline_menu->try_add_action(previous_frame_action));
TRY(timeline_menu->try_add_action(next_frame_action));
+ auto accessibility_menu = TRY(window->try_add_menu("&Accessibility"));
+
+ auto default_accessibility_action = GUI::Action::create_checkable("Default - non-impaired", { Mod_AltGr, Key_1 }, [&](auto&) {
+ magnifier->set_color_filter(nullptr);
+ });
+ default_accessibility_action->set_checked(true);
+
+ auto pratanopia_accessibility_action = GUI::Action::create_checkable("Protanopia", { Mod_AltGr, Key_2 }, [&](auto&) {
+ magnifier->set_color_filter(Gfx::ColorBlindnessFilter::create_protanopia());
+ });
+
+ auto pratanomaly_accessibility_action = GUI::Action::create_checkable("Protanomaly", { Mod_AltGr, Key_3 }, [&](auto&) {
+ magnifier->set_color_filter(Gfx::ColorBlindnessFilter::create_protanomaly());
+ });
+
+ auto tritanopia_accessibility_action = GUI::Action::create_checkable("Tritanopia", { Mod_AltGr, Key_4 }, [&](auto&) {
+ magnifier->set_color_filter(Gfx::ColorBlindnessFilter::create_tritanopia());
+ });
+
+ auto tritanomaly_accessibility_action = GUI::Action::create_checkable("Tritanomaly", { Mod_AltGr, Key_5 }, [&](auto&) {
+ magnifier->set_color_filter(Gfx::ColorBlindnessFilter::create_tritanomaly());
+ });
+
+ auto deuteranopia_accessibility_action = GUI::Action::create_checkable("Deuteranopia", { Mod_AltGr, Key_6 }, [&](auto&) {
+ magnifier->set_color_filter(Gfx::ColorBlindnessFilter::create_deuteranopia());
+ });
+
+ auto deuteranomaly_accessibility_action = GUI::Action::create_checkable("Deuteranomaly", { Mod_AltGr, Key_7 }, [&](auto&) {
+ magnifier->set_color_filter(Gfx::ColorBlindnessFilter::create_deuteranomaly());
+ });
+
+ auto achromatopsia_accessibility_action = GUI::Action::create_checkable("Achromatopsia", { Mod_AltGr, Key_8 }, [&](auto&) {
+ magnifier->set_color_filter(Gfx::ColorBlindnessFilter::create_achromatopsia());
+ });
+
+ auto achromatomaly_accessibility_action = GUI::Action::create_checkable("Achromatomaly", { Mod_AltGr, Key_9 }, [&](auto&) {
+ magnifier->set_color_filter(Gfx::ColorBlindnessFilter::create_achromatomaly());
+ });
+
+ auto preview_type_action_group = make<GUI::ActionGroup>();
+ preview_type_action_group->set_exclusive(true);
+ preview_type_action_group->add_action(*default_accessibility_action);
+ preview_type_action_group->add_action(*pratanopia_accessibility_action);
+ preview_type_action_group->add_action(*pratanomaly_accessibility_action);
+ preview_type_action_group->add_action(*tritanopia_accessibility_action);
+ preview_type_action_group->add_action(*tritanomaly_accessibility_action);
+ preview_type_action_group->add_action(*deuteranopia_accessibility_action);
+ preview_type_action_group->add_action(*deuteranomaly_accessibility_action);
+ preview_type_action_group->add_action(*achromatopsia_accessibility_action);
+ preview_type_action_group->add_action(*achromatomaly_accessibility_action);
+
+ TRY(accessibility_menu->try_add_action(default_accessibility_action));
+ TRY(accessibility_menu->try_add_action(pratanopia_accessibility_action));
+ TRY(accessibility_menu->try_add_action(pratanomaly_accessibility_action));
+ TRY(accessibility_menu->try_add_action(tritanopia_accessibility_action));
+ TRY(accessibility_menu->try_add_action(tritanomaly_accessibility_action));
+ TRY(accessibility_menu->try_add_action(deuteranopia_accessibility_action));
+ TRY(accessibility_menu->try_add_action(deuteranomaly_accessibility_action));
+ TRY(accessibility_menu->try_add_action(achromatopsia_accessibility_action));
+ TRY(accessibility_menu->try_add_action(achromatomaly_accessibility_action));
+
auto help_menu = TRY(window->try_add_menu("&Help"));
help_menu->add_action(GUI::CommonActions::make_about_action("Magnifier", app_icon, window));