From c15aa20087069a5028bcfcb48540563b3a533eed Mon Sep 17 00:00:00 2001 From: Andreas Butti Date: Sat, 3 Nov 2018 11:51:50 +0100 Subject: [PATCH] Color wrapper class --- src/control/SearchControl.cpp | 6 +-- src/control/SearchControl.h | 3 +- src/control/jobs/AutosaveJob.cpp | 2 +- src/control/jobs/AutosaveJob.h | 2 +- src/control/jobs/BlockingJob.cpp | 4 +- src/control/jobs/BlockingJob.h | 2 +- src/control/jobs/ExportJob.cpp | 2 +- src/control/jobs/ExportJob.h | 2 +- src/control/jobs/Job.cpp | 4 +- src/control/jobs/Job.h | 4 +- src/control/jobs/PdfExportJob.cpp | 2 +- src/control/jobs/PdfExportJob.h | 2 +- src/control/jobs/PreviewJob.cpp | 2 +- src/control/jobs/PreviewJob.h | 2 +- src/control/jobs/RenderJob.cpp | 2 +- src/control/jobs/RenderJob.h | 2 +- src/control/jobs/SaveJob.cpp | 2 +- src/control/jobs/SaveJob.h | 2 +- src/control/jobs/Scheduler.cpp | 2 +- src/control/tools/EditSelection.cpp | 11 +++--- src/control/tools/Selection.cpp | 15 ++++---- src/control/tools/VerticalToolHandler.cpp | 8 ++-- src/util/GtkColorWrapper.cpp | 34 +++++++++++++++++ src/util/GtkColorWrapper.h | 45 +++++++++++++++++++++++ src/util/XournalTypeList.h | 2 + 25 files changed, 123 insertions(+), 41 deletions(-) create mode 100644 src/util/GtkColorWrapper.cpp create mode 100644 src/util/GtkColorWrapper.h diff --git a/src/control/SearchControl.cpp b/src/control/SearchControl.cpp index 914c6916..9bf041cf 100644 --- a/src/control/SearchControl.cpp +++ b/src/control/SearchControl.cpp @@ -37,7 +37,7 @@ void SearchControl::freeSearchResults() } } -void SearchControl::paint(cairo_t* cr, GdkRectangle* rect, double zoom, GdkColor color) +void SearchControl::paint(cairo_t* cr, GdkRectangle* rect, double zoom, GtkColorWrapper color) { XOJ_CHECK_TYPE(SearchControl); @@ -48,9 +48,9 @@ void SearchControl::paint(cairo_t* cr, GdkRectangle* rect, double zoom, GdkColor { XojPopplerRectangle* rect = (XojPopplerRectangle*) l->data; cairo_rectangle(cr, rect->x1, rect->y1, rect->x2 - rect->x1, rect->y2 - rect->y1); - cairo_set_source_rgb(cr, color.red / 65536.0, color.green / 65536.0, color.blue / 65536.0); + color.apply(cr); cairo_stroke_preserve(cr); - cairo_set_source_rgba(cr, color.red / 65536.0, color.green / 65536.0, color.blue / 65536.0, 0.3); + color.applyWithAlpha(cr, 0.3); cairo_fill(cr); } } diff --git a/src/control/SearchControl.h b/src/control/SearchControl.h index 40727aba..9c6e886b 100644 --- a/src/control/SearchControl.h +++ b/src/control/SearchControl.h @@ -12,6 +12,7 @@ #pragma once #include "model/PageRef.h" +#include "util/GtkColorWrapper.h" #include "pdf/popplerdirect/poppler/XojPopplerPage.h" class SearchControl @@ -21,7 +22,7 @@ public: virtual ~SearchControl(); bool search(string text, int* occures, double* top); - void paint(cairo_t* cr, GdkRectangle* rect, double zoom, GdkColor color); + void paint(cairo_t* cr, GdkRectangle* rect, double zoom, GtkColorWrapper color); private: void freeSearchResults(); diff --git a/src/control/jobs/AutosaveJob.cpp b/src/control/jobs/AutosaveJob.cpp index 9643d7ba..5fc62776 100644 --- a/src/control/jobs/AutosaveJob.cpp +++ b/src/control/jobs/AutosaveJob.cpp @@ -29,7 +29,7 @@ void AutosaveJob::afterRun() gtk_widget_destroy(dialog); } -void AutosaveJob::run() +void AutosaveJob::run(bool noThreads) { XOJ_CHECK_TYPE(AutosaveJob); diff --git a/src/control/jobs/AutosaveJob.h b/src/control/jobs/AutosaveJob.h index a8a6d73b..c21f6c52 100644 --- a/src/control/jobs/AutosaveJob.h +++ b/src/control/jobs/AutosaveJob.h @@ -27,7 +27,7 @@ protected: virtual ~AutosaveJob(); public: - virtual void run(); + virtual void run(bool noThreads); void afterRun(); virtual JobType getType(); diff --git a/src/control/jobs/BlockingJob.cpp b/src/control/jobs/BlockingJob.cpp index f1c0a41b..ff2094bd 100644 --- a/src/control/jobs/BlockingJob.cpp +++ b/src/control/jobs/BlockingJob.cpp @@ -20,11 +20,11 @@ BlockingJob::~BlockingJob() XOJ_RELEASE_TYPE(BlockingJob); } -void BlockingJob::execute() +void BlockingJob::execute(bool noThreads) { XOJ_CHECK_TYPE(BlockingJob); - this->run(); + this->run(false); g_idle_add((GSourceFunc) finished, this->control); } diff --git a/src/control/jobs/BlockingJob.h b/src/control/jobs/BlockingJob.h index ab728a75..e1bd1789 100644 --- a/src/control/jobs/BlockingJob.h +++ b/src/control/jobs/BlockingJob.h @@ -29,7 +29,7 @@ protected: virtual ~BlockingJob(); public: - void execute(); + void execute(bool noThreads); virtual JobType getType(); diff --git a/src/control/jobs/ExportJob.cpp b/src/control/jobs/ExportJob.cpp index 1d6b808a..a86b5fce 100644 --- a/src/control/jobs/ExportJob.cpp +++ b/src/control/jobs/ExportJob.cpp @@ -141,7 +141,7 @@ bool ExportJob::freeSurface(int id) return true; } -void ExportJob::run() +void ExportJob::run(bool noThreads) { XOJ_CHECK_TYPE(ExportJob); diff --git a/src/control/jobs/ExportJob.h b/src/control/jobs/ExportJob.h index b27dd5d4..a64b2959 100644 --- a/src/control/jobs/ExportJob.h +++ b/src/control/jobs/ExportJob.h @@ -30,7 +30,7 @@ protected: virtual ~ExportJob(); public: - virtual void run(); + virtual void run(bool noThreads); private: bool createSurface(int id, double width, double height); diff --git a/src/control/jobs/Job.cpp b/src/control/jobs/Job.cpp index 06f25768..07713c26 100644 --- a/src/control/jobs/Job.cpp +++ b/src/control/jobs/Job.cpp @@ -55,11 +55,11 @@ void Job::deleteJob() } } -void Job::execute() +void Job::execute(bool noThreads) { XOJ_CHECK_TYPE(Job); - this->run(); + this->run(noThreads); } void* Job::getSource() diff --git a/src/control/jobs/Job.h b/src/control/jobs/Job.h index 91d78fb4..82e521a6 100644 --- a/src/control/jobs/Job.h +++ b/src/control/jobs/Job.h @@ -52,7 +52,7 @@ public: /** * this method is called */ - virtual void execute(); + virtual void execute(bool noThreads); virtual void* getSource(); @@ -60,7 +60,7 @@ protected: /** * override this method */ - virtual void run() = 0; + virtual void run(bool noThreads) = 0; /** * This method should be called as _last_ operation in run diff --git a/src/control/jobs/PdfExportJob.cpp b/src/control/jobs/PdfExportJob.cpp index d1ce4bc4..1ba654f3 100644 --- a/src/control/jobs/PdfExportJob.cpp +++ b/src/control/jobs/PdfExportJob.cpp @@ -102,7 +102,7 @@ void PdfExportJob::afterRun() } } -void PdfExportJob::run() +void PdfExportJob::run(bool noThreads) { XOJ_CHECK_TYPE(PdfExportJob); diff --git a/src/control/jobs/PdfExportJob.h b/src/control/jobs/PdfExportJob.h index c8bcdb8e..d826b5bd 100644 --- a/src/control/jobs/PdfExportJob.h +++ b/src/control/jobs/PdfExportJob.h @@ -30,7 +30,7 @@ protected: virtual ~PdfExportJob(); public: - void run(); + void run(bool noThreads); virtual void afterRun(); public: diff --git a/src/control/jobs/PreviewJob.cpp b/src/control/jobs/PreviewJob.cpp index 37647273..1389393b 100644 --- a/src/control/jobs/PreviewJob.cpp +++ b/src/control/jobs/PreviewJob.cpp @@ -129,7 +129,7 @@ void PreviewJob::drawPage(int layer) cairo_destroy(cr2); } -void PreviewJob::run() +void PreviewJob::run(bool noThreads) { XOJ_CHECK_TYPE(PreviewJob); diff --git a/src/control/jobs/PreviewJob.h b/src/control/jobs/PreviewJob.h index bef4e27d..df3adb4d 100644 --- a/src/control/jobs/PreviewJob.h +++ b/src/control/jobs/PreviewJob.h @@ -31,7 +31,7 @@ protected: public: virtual void* getSource(); - virtual void run(); + virtual void run(bool noThreads); virtual JobType getType(); diff --git a/src/control/jobs/RenderJob.cpp b/src/control/jobs/RenderJob.cpp index 9f4c3680..cdf58a58 100644 --- a/src/control/jobs/RenderJob.cpp +++ b/src/control/jobs/RenderJob.cpp @@ -204,7 +204,7 @@ private: RepaintWidgetHandler* handler = NULL; -void RenderJob::run() +void RenderJob::run(bool noThreads) { XOJ_CHECK_TYPE(RenderJob); diff --git a/src/control/jobs/RenderJob.h b/src/control/jobs/RenderJob.h index f14ebb64..c2d71e55 100644 --- a/src/control/jobs/RenderJob.h +++ b/src/control/jobs/RenderJob.h @@ -31,7 +31,7 @@ public: void* getSource(); - void run(); + void run(bool noThreads); public: static void rerenderRectangle(RenderJob* renderJob, Rectangle* rect); diff --git a/src/control/jobs/SaveJob.cpp b/src/control/jobs/SaveJob.cpp index fa83a2e1..c0d8545a 100644 --- a/src/control/jobs/SaveJob.cpp +++ b/src/control/jobs/SaveJob.cpp @@ -23,7 +23,7 @@ SaveJob::~SaveJob() XOJ_RELEASE_TYPE(SaveJob); } -void SaveJob::run() +void SaveJob::run(bool noThreads) { XOJ_CHECK_TYPE(SaveJob); diff --git a/src/control/jobs/SaveJob.h b/src/control/jobs/SaveJob.h index 1d547bd5..170faaf3 100644 --- a/src/control/jobs/SaveJob.h +++ b/src/control/jobs/SaveJob.h @@ -25,7 +25,7 @@ protected: virtual ~SaveJob(); public: - virtual void run(); + virtual void run(bool noThreads); bool save(); diff --git a/src/control/jobs/Scheduler.cpp b/src/control/jobs/Scheduler.cpp index 7de316c2..6e6378f8 100644 --- a/src/control/jobs/Scheduler.cpp +++ b/src/control/jobs/Scheduler.cpp @@ -318,7 +318,7 @@ gpointer Scheduler::jobThreadCallback(Scheduler* scheduler) g_mutex_lock(&scheduler->jobRunningMutex); - job->execute(); + job->execute(false); job->unref(); g_mutex_unlock(&scheduler->jobRunningMutex); diff --git a/src/control/tools/EditSelection.cpp b/src/control/tools/EditSelection.cpp index 356d29c1..ead2a6ae 100644 --- a/src/control/tools/EditSelection.cpp +++ b/src/control/tools/EditSelection.cpp @@ -16,6 +16,7 @@ #include "undo/FontUndoAction.h" #include "undo/SizeUndoAction.h" #include "undo/UndoRedoHandler.h" +#include "util/GtkColorWrapper.h" #include "view/DocumentView.h" #include @@ -637,19 +638,19 @@ void EditSelection::paint(cairo_t* cr, double zoom) cairo_set_operator(cr, CAIRO_OPERATOR_OVER); - GdkColor selectionColor = view->getSelectionColor(); + GtkColorWrapper selectionColor = view->getSelectionColor(); // set the line always the same size on display cairo_set_line_width(cr, 1); const double dashes[] = {10.0, 10.0}; cairo_set_dash(cr, dashes, sizeof(dashes) / sizeof(dashes[0]), 0); - cairo_set_source_rgb(cr, selectionColor.red / 65536.0, selectionColor.green / 65536.0, selectionColor.blue / 65536.0); + selectionColor.apply(cr); cairo_rectangle(cr, x * zoom, y * zoom, width * zoom, height * zoom); cairo_stroke_preserve(cr); - cairo_set_source_rgba(cr, selectionColor.red / 65536.0, selectionColor.green / 65536.0, selectionColor.blue / 65536.0, 0.3); + selectionColor.applyWithAlpha(cr, 0.3); cairo_fill(cr); cairo_set_dash(cr, NULL, 0, 0); @@ -683,8 +684,8 @@ void EditSelection::drawAnchorRect(cairo_t* cr, double x, double y, double zoom) { XOJ_CHECK_TYPE(EditSelection); - GdkColor selectionColor = view->getSelectionColor(); - cairo_set_source_rgb(cr, selectionColor.red / 65536.0, selectionColor.green / 65536.0, selectionColor.blue / 65536.0); + GtkColorWrapper selectionColor = view->getSelectionColor(); + selectionColor.apply(cr); cairo_rectangle(cr, x * zoom - 4, y * zoom - 4, 8, 8); cairo_stroke_preserve(cr); cairo_set_source_rgb(cr, 1, 1, 1); diff --git a/src/control/tools/Selection.cpp b/src/control/tools/Selection.cpp index c2ea11b5..c5696cf3 100644 --- a/src/control/tools/Selection.cpp +++ b/src/control/tools/Selection.cpp @@ -1,6 +1,7 @@ #include "Selection.h" #include "model/Layer.h" +#include "util/GtkColorWrapper.h" Selection::Selection(Redrawable* view) { @@ -142,12 +143,12 @@ void RectSelection::paint(cairo_t* cr, GdkRectangle* rect, double zoom) { XOJ_CHECK_TYPE(RectSelection); - GdkColor selectionColor = view->getSelectionColor(); + GtkColorWrapper selectionColor = view->getSelectionColor(); // set the line always the same size on display cairo_set_line_width(cr, 1 / zoom); gdk_threads_enter(); - gdk_cairo_set_source_color(cr, &selectionColor); + selectionColor.apply(cr); gdk_threads_leave(); @@ -164,8 +165,7 @@ void RectSelection::paint(cairo_t* cr, GdkRectangle* rect, double zoom) cairo_close_path(cr); cairo_stroke_preserve(cr); - cairo_set_source_rgba(cr, selectionColor.red / 65536.0, - selectionColor.green / 65536.0, selectionColor.blue / 65536.0, 0.3); + selectionColor.applyWithAlpha(cr, 0.3); cairo_fill(cr); } @@ -212,12 +212,12 @@ void RegionSelect::paint(cairo_t* cr, GdkRectangle* rect, double zoom) // at least three points needed if (this->points && this->points->next && this->points->next->next) { - GdkColor selectionColor = view->getSelectionColor(); + GtkColorWrapper selectionColor = view->getSelectionColor(); // set the line always the same size on display cairo_set_line_width(cr, 1 / zoom); gdk_threads_enter(); - gdk_cairo_set_source_color(cr, &selectionColor); + selectionColor.apply(cr); gdk_threads_leave(); RegionPoint* r0 = (RegionPoint*) this->points->data; @@ -232,8 +232,7 @@ void RegionSelect::paint(cairo_t* cr, GdkRectangle* rect, double zoom) cairo_line_to(cr, r0->x, r0->y); cairo_stroke_preserve(cr); - cairo_set_source_rgba(cr, selectionColor.red / 65536.0, - selectionColor.green / 65536.0, selectionColor.blue / 65536.0, 0.3); + selectionColor.applyWithAlpha(cr, 0.3); cairo_fill(cr); } } diff --git a/src/control/tools/VerticalToolHandler.cpp b/src/control/tools/VerticalToolHandler.cpp index 0600742d..bb57146b 100644 --- a/src/control/tools/VerticalToolHandler.cpp +++ b/src/control/tools/VerticalToolHandler.cpp @@ -2,6 +2,7 @@ #include "model/Layer.h" #include "undo/UndoRedoHandler.h" +#include "util/GtkColorWrapper.h" #include "view/DocumentView.h" VerticalToolHandler::VerticalToolHandler(Redrawable* view, PageRef page, double y, double zoom) @@ -65,12 +66,12 @@ void VerticalToolHandler::paint(cairo_t* cr, GdkRectangle* rect, double zoom) { XOJ_CHECK_TYPE(VerticalToolHandler); - GdkColor selectionColor = view->getSelectionColor(); + GtkColorWrapper selectionColor = view->getSelectionColor(); cairo_set_line_width(cr, 1); gdk_threads_enter(); - gdk_cairo_set_source_color(cr, &selectionColor); + selectionColor.apply(cr); double y; double height; @@ -89,8 +90,7 @@ void VerticalToolHandler::paint(cairo_t* cr, GdkRectangle* rect, double zoom) cairo_rectangle(cr, 0, y * zoom, this->page->getWidth() * zoom, height * zoom); cairo_stroke_preserve(cr); - cairo_set_source_rgba(cr,selectionColor.red / 65536.0, - selectionColor.green / 65536.0, selectionColor.blue / 65536.0, 0.3); + selectionColor.applyWithAlpha(cr, 0.3); cairo_fill(cr); cairo_set_source_surface(cr, this->crBuffer, 0, this->endY * zoom); diff --git a/src/util/GtkColorWrapper.cpp b/src/util/GtkColorWrapper.cpp new file mode 100644 index 00000000..d320d4ca --- /dev/null +++ b/src/util/GtkColorWrapper.cpp @@ -0,0 +1,34 @@ +#include "GtkColorWrapper.h" + +GtkColorWrapper::GtkColorWrapper() : red(0), green(0), blue(0) +{ + XOJ_INIT_TYPE(GtkColorWrapper); +} + +GtkColorWrapper::GtkColorWrapper(const GdkColor& color) : red(color.red), green(color.green), blue(color.blue) +{ + XOJ_INIT_TYPE(GtkColorWrapper); +} + +GtkColorWrapper::~GtkColorWrapper() +{ + XOJ_RELEASE_TYPE(GtkColorWrapper); +} + +/** + * Apply the color to a cairo interface with "cairo_set_source_rgb" + */ +void GtkColorWrapper::apply(cairo_t* cr) +{ + XOJ_CHECK_TYPE(GtkColorWrapper); + cairo_set_source_rgb(cr, red / 65536.0, green / 65536.0, blue / 65536.0); +} + +/** + * Apply the color to a cairo interface with "cairo_set_source_rgba" and a specified alpha value + */ +void GtkColorWrapper::applyWithAlpha(cairo_t* cr, double alpha) +{ + XOJ_CHECK_TYPE(GtkColorWrapper); + cairo_set_source_rgba(cr, red / 65536.0, green / 65536.0, blue / 65536.0, alpha); +} diff --git a/src/util/GtkColorWrapper.h b/src/util/GtkColorWrapper.h new file mode 100644 index 00000000..753a6cd4 --- /dev/null +++ b/src/util/GtkColorWrapper.h @@ -0,0 +1,45 @@ +/* + * Xournal++ + * + * Helper functions to wrap GdkColor/GdkRGBA color types used by GTK2 / GTK3 + * + * @author Xournal++ Team + * https://github.com/xournalpp/xournalpp + * + * @license GNU GPLv2 or later + */ + +#pragma once + +#include +#include +#include + +class GtkColorWrapper +{ +public: + GtkColorWrapper(); + GtkColorWrapper(const GdkColor& color); + virtual ~GtkColorWrapper(); + +public: + /** + * Apply the color to a cairo interface with "cairo_set_source_rgb" + */ + void apply(cairo_t* cr); + + /** + * Apply the color to a cairo interface with "cairo_set_source_rgba" and a specified alpha value + */ + void applyWithAlpha(cairo_t* cr, double alpha); + +private: + XOJ_TYPE_ATTRIB; + + /** + * Color values, 0-65535 + */ + guint16 red; + guint16 green; + guint16 blue; +}; diff --git a/src/util/XournalTypeList.h b/src/util/XournalTypeList.h index 46337b36..3de5fbfb 100644 --- a/src/util/XournalTypeList.h +++ b/src/util/XournalTypeList.h @@ -214,5 +214,7 @@ XOJ_DECLARE_TYPE(SidebarPreviewPages, 202); XOJ_DECLARE_TYPE(SidebarPreviewLayers, 203); XOJ_DECLARE_TYPE(SidebarPreviewPageEntry, 204); XOJ_DECLARE_TYPE(SidebarPreviewLayerEntry, 205); +XOJ_DECLARE_TYPE(GtkColorWrapper, 206); + //XOJ_DECLARE_TYPE(XXXXXXXXXXXXXXXX, 206);