Ansel 0.0
A darktable fork - bloat + design vision
Loading...
Searching...
No Matches
dtgtk/paint.c
Go to the documentation of this file.
1/*
2 This file is part of darktable,
3 Copyright (C) 2010-2012 Henrik Andersson.
4 Copyright (C) 2010-2012 johannes hanika.
5 Copyright (C) 2010-2016, 2018, 2020 Tobias Ellinghaus.
6 Copyright (C) 2010 Wyatt Olson.
7 Copyright (C) 2011 Petr Styblo.
8 Copyright (C) 2011 Robert Bieber.
9 Copyright (C) 2012 Jérémy Rosen.
10 Copyright (C) 2012 Loic Guibert.
11 Copyright (C) 2012 Richard Wonka.
12 Copyright (C) 2012-2013, 2016-2017, 2019 Ulrich Pegelow.
13 Copyright (C) 2013, 2015, 2020-2022 Aldric Renaudin.
14 Copyright (C) 2013, 2018-2022 Pascal Obry.
15 Copyright (C) 2014 Mikhail Trishchenkov.
16 Copyright (C) 2015-2016 Roman Lebedev.
17 Copyright (C) 2016 Asma.
18 Copyright (C) 2018 grand-piano.
19 Copyright (C) 2018 Matthieu Moy.
20 Copyright (C) 2019-2020, 2023, 2025 Aurélien PIERRE.
21 Copyright (C) 2019 Edgardo Hoszowski.
22 Copyright (C) 2019 Florian Wernert.
23 Copyright (C) 2019 luzpaz.
24 Copyright (C) 2019, 2021-2022 Philippe Weyland.
25 Copyright (C) 2020 Chris Elston.
26 Copyright (C) 2020 Hanno Schwalm.
27 Copyright (C) 2020-2021 Hubert Kowalski.
28 Copyright (C) 2020-2021 Marco.
29 Copyright (C) 2020-2021 Mark-64.
30 Copyright (C) 2020 Ralf Brown.
31 Copyright (C) 2020 U-DESKTOP-HQME86J\marco.
32 Copyright (C) 2021 Dan Torop.
33 Copyright (C) 2021 Diederik Ter Rahe.
34 Copyright (C) 2021 Harald.
35 Copyright (C) 2021-2022 Nicolas Auffray.
36 Copyright (C) 2022 Martin Bařinka.
37
38 darktable is free software: you can redistribute it and/or modify
39 it under the terms of the GNU General Public License as published by
40 the Free Software Foundation, either version 3 of the License, or
41 (at your option) any later version.
42
43 darktable is distributed in the hope that it will be useful,
44 but WITHOUT ANY WARRANTY; without even the implied warranty of
45 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
46 GNU General Public License for more details.
47
48 You should have received a copy of the GNU General Public License
49 along with darktable. If not, see <http://www.gnu.org/licenses/>.
50*/
51
52#include "common/darktable.h"
53#include "bauhaus/bauhaus.h"
54#include "dtgtk/paint.h"
55#include "gui/draw.h"
56#include <math.h>
57
58#ifndef M_PI
59#define M_PI 3.141592654
60#endif
61
62#define PREAMBLE(scaling, line_scaling, x_offset, y_offset) { \
63 cairo_save(cr); \
64 cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND); \
65 const float s = ((w < h) ? w : h) * scaling; \
66 cairo_translate(cr, x + (w / 2.0) - (s / 2.0), y + (h / 2.0) - (s / 2.0)); \
67 cairo_scale(cr, s, s); \
68 cairo_translate(cr, x_offset, y_offset); \
69 cairo_matrix_t matrix; \
70 cairo_get_matrix(cr, &matrix); \
71 cairo_set_line_width(cr, 1. / hypot(matrix.xx, matrix.yy)); }
72
73#define FINISH { cairo_identity_matrix(cr); \
74 cairo_restore(cr); }
75
76static void _rounded_rectangle(cairo_t *cr) // create rounded rectangle to use in other icons
77{
78 const double degrees = M_PI / 180.0;
79
80 cairo_new_sub_path (cr);
81 cairo_arc (cr, 0.9, 0.1, 0.1, -90 * degrees, 0 * degrees);
82 cairo_arc (cr, 0.9, 0.9, 0.1, 0 * degrees, 90 * degrees);
83 cairo_arc (cr, 0.1, 0.9, 0.1, 90 * degrees, 180 * degrees);
84 cairo_arc (cr, 0.1, 0.1, 0.1, 180 * degrees, 270 * degrees);
85 cairo_close_path (cr);
86}
87
102static void _paint_cursor_arrow(cairo_t *cr, const double tip_x, const double tip_y, const double size)
103{
104 // Unit geometry: tip at (0, 0), total height 1.0.
105 const double axis_len = sqrt(0.39 * 0.39 + 0.75 * 0.75);
106 const double axis_x = 0.39 / axis_len;
107 const double axis_y = 0.75 / axis_len;
108 // Place control points symmetrically about the central axis through the tip and curve center.
109 const double curve_ctrl_axis_offset = -0.2;
110 const double curve_ctrl_0_x = 0.39 + axis_x * curve_ctrl_axis_offset;
111 const double curve_ctrl_0_y = 0.75 + axis_y * curve_ctrl_axis_offset;
112 //const double curve_ctrl_1_x = 0.39 - axis_x * curve_ctrl_axis_offset;
113 //const double curve_ctrl_1_y = 0.75 - axis_y * curve_ctrl_axis_offset;
114 // Keep the tail centered on the arrow axis so the center line crosses it.
115 const double base_axis_offset = 0.33 * axis_x + 0.49 * axis_y;
116 const double tail_axis_offset = 0.3;
117 const double base_center_x = axis_x * (base_axis_offset + tail_axis_offset);
118 const double base_center_y = axis_y * (base_axis_offset + tail_axis_offset);
119 const double tail_length = 0.47;
120 const double tail_half_width = 0.09;
121 const double tail_dir_x = axis_x;
122 const double tail_dir_y = axis_y;
123 const double tail_half_length = tail_length * 0.5;
124 const double tail_start_x = base_center_x - tail_dir_x * tail_half_length;
125 const double tail_start_y = base_center_y - tail_dir_y * tail_half_length;
126 const double tail_perp_x = -tail_dir_y * tail_half_width;
127 const double tail_perp_y = tail_dir_x * tail_half_width;
128 const double tail_end_x = base_center_x + tail_dir_x * tail_half_length;
129 const double tail_end_y = base_center_y + tail_dir_y * tail_half_length;
130
131 cairo_save(cr);
132 cairo_translate(cr, tip_x, tip_y);
133 cairo_scale(cr, size, size);
134
135 // Arrow body: start at the tip, then sweep around the triangular head.
136 cairo_move_to(cr, 0.0, 0.0);
137 cairo_line_to(cr, 0.78, 0.60);
138 cairo_curve_to(cr, curve_ctrl_0_x, curve_ctrl_0_y, curve_ctrl_0_x, curve_ctrl_0_y,
139 0.0, 0.89);
140 cairo_line_to(cr, 0.0, 1.0);
141 cairo_close_path(cr);
142 cairo_fill(cr);
143
144 // Rectangular tail from the center of the arrow base.
145 cairo_move_to(cr, tail_start_x + tail_perp_x, tail_start_y + tail_perp_y);
146 cairo_line_to(cr, tail_end_x + tail_perp_x, tail_end_y + tail_perp_y);
147 cairo_line_to(cr, tail_end_x - tail_perp_x, tail_end_y - tail_perp_y);
148 cairo_line_to(cr, tail_start_x - tail_perp_x, tail_start_y - tail_perp_y);
149 cairo_close_path(cr);
150 cairo_fill(cr);
151
152 cairo_restore(cr);
153}
154
167static void _draw_plus_sign(cairo_t *cr, float x, float y, float size, float line_width_scale)
168{
169 const float base_line_width = cairo_get_line_width(cr);
170 cairo_set_line_width(cr, base_line_width * line_width_scale);
171
172 cairo_move_to(cr, x, y - size);
173 cairo_line_to(cr, x, y + size);
174 cairo_move_to(cr, x - size, y);
175 cairo_line_to(cr, x + size, y);
176
177 cairo_stroke(cr);
178 cairo_set_line_width(cr, base_line_width);
179}
180
181void dtgtk_cairo_paint_empty(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
182{
183 PREAMBLE(1, 1, 0, 0)
184 cairo_stroke(cr);
185 FINISH
186}
187
188void dtgtk_cairo_paint_color(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
189{
190 PREAMBLE(1, 1, 0, 0)
191
192 cairo_translate(cr, x, y);
193 cairo_scale(cr, w, h);
194 cairo_rectangle(cr, 0.1, 0.1, 0.8, 0.8);
195 cairo_fill(cr);
196 cairo_set_source_rgba(cr, 0, 0, 0, 0.6);
197 cairo_stroke(cr);
198
199 FINISH
200}
201
202void dtgtk_cairo_paint_presets(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
203{
204 PREAMBLE(1, 1, 0, 0)
205
206 cairo_move_to(cr, 0.1, 0.1);
207 cairo_line_to(cr, 0.9, 0.1);
208 cairo_move_to(cr, 0.1, 0.5);
209 cairo_line_to(cr, 0.9, 0.5);
210 cairo_move_to(cr, 0.1, 0.9);
211 cairo_line_to(cr, 0.9, 0.9);
212 cairo_stroke(cr);
213
214 FINISH
215}
216
217static void _draw_triangle(cairo_t *cr, const gint flags) // create triangle for both following icons
218{
219 /* initialize rotation and flip matrices */
220 cairo_matrix_t hflip_matrix;
221 cairo_matrix_init(&hflip_matrix, -1, 0, 0, 1, 1, 0);
222
223 double C = cosf(-(M_PI / 2.0f)), S = sinf(-(M_PI / 2.0f)); // -90 degrees
224 C = flags & CPF_DIRECTION_DOWN ? cosf(-(M_PI * 1.5f)) : C;
225 S = flags & CPF_DIRECTION_DOWN ? sinf(-(M_PI * 1.5f)) : S;
226 cairo_matrix_t rotation_matrix;
227 cairo_matrix_init(&rotation_matrix, C, S, -S, C, 0.5 - C * 0.5 + S * 0.5, 0.5 - S * 0.5 - C * 0.5);
228
229 /* scale and transform*/
231 cairo_transform(cr, &rotation_matrix);
232 else if(flags & CPF_DIRECTION_LEFT) // Flip x transformation
233 cairo_transform(cr, &hflip_matrix);
234
235 cairo_move_to(cr, 0.05, 0.5);
236 cairo_line_to(cr, 0.05, 0.1);
237 cairo_line_to(cr, 0.45, 0.5);
238 cairo_line_to(cr, 0.05, 0.9);
239 cairo_line_to(cr, 0.05, 0.5);
240}
241
242void dtgtk_cairo_paint_triangle(cairo_t *cr, gint x, int y, gint w, gint h, gint flags, void *data)
243{
244 PREAMBLE(1, 1, 0, 0)
245
247 cairo_stroke(cr);
248
249 FINISH
250}
251
252void dtgtk_cairo_paint_solid_triangle(cairo_t *cr, gint x, int y, gint w, gint h, gint flags, void *data)
253{
254 PREAMBLE(1, 1, 0, 0)
255
257 cairo_stroke_preserve(cr);
258 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
259 cairo_fill(cr);
260
261 FINISH
262}
263
264void dtgtk_cairo_paint_arrow(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
265{
266 PREAMBLE(1, 1, 0, 0)
267
268 cairo_matrix_t hflip_matrix;
269 cairo_matrix_init(&hflip_matrix, -1, 0, 0, 1, 1, 0);
270
271 double C = cosf(-(M_PI / 2.0)), S = sinf(-(M_PI / 2.0)); // -90 degrees
272 C = flags & CPF_DIRECTION_UP ? cosf(-(M_PI * 1.5f)) : C;
273 S = flags & CPF_DIRECTION_UP ? sinf(-(M_PI * 1.5f)) : S;
274 cairo_matrix_t rotation_matrix;
275 cairo_matrix_init(&rotation_matrix,
276 C, S, -S, C,
277 0.5 - C * 0.5 + S * 0.5,
278 0.5 - S * 0.5 - C * 0.5);
279
281 cairo_transform(cr, &rotation_matrix);
282 else if(flags & CPF_DIRECTION_RIGHT) // Flip x transformation
283 cairo_transform(cr, &hflip_matrix);
284
285 cairo_move_to(cr, 0.25, 0.1);
286 cairo_line_to(cr, 0.75, 0.5);
287 cairo_line_to(cr, 0.25, 0.9);
288 cairo_stroke(cr);
289
290 FINISH
291}
292
293void dtgtk_cairo_paint_solid_arrow(cairo_t *cr, gint x, int y, gint w, gint h, gint flags, void *data)
294{
295 PREAMBLE(1, 1, 0, 0)
296
297 /* initialize rotation and flip matrices */
298 cairo_matrix_t hflip_matrix;
299 cairo_matrix_init(&hflip_matrix, -1, 0, 0, 1, 1, 0);
300
301 double C = cosf(-(M_PI / 2.0f)), S = sinf(-(M_PI / 2.0f)); // -90 degrees
302 C = flags & CPF_DIRECTION_DOWN ? cosf(-(M_PI * 1.5f)) : C;
303 S = flags & CPF_DIRECTION_DOWN ? sinf(-(M_PI * 1.5f)) : S;
304 cairo_matrix_t rotation_matrix;
305 cairo_matrix_init(&rotation_matrix, C, S, -S, C, 0.5 - C * 0.5 + S * 0.5, 0.5 - S * 0.5 - C * 0.5);
306
307 /* scale and transform*/
309 cairo_transform(cr, &rotation_matrix);
310 else if(flags & CPF_DIRECTION_LEFT) // Flip x transformation
311 cairo_transform(cr, &hflip_matrix);
312
313 cairo_move_to(cr, 0.2, 0.1);
314 cairo_line_to(cr, 0.9, 0.5);
315 cairo_line_to(cr, 0.2, 0.9);
316 cairo_fill(cr);
317
318 FINISH
319}
320
321void dtgtk_cairo_paint_line_arrow(cairo_t *cr, gint x, int y, gint w, gint h, gint flags, void *data)
322{
323 PREAMBLE(1, 1, 0, 0)
324
325 cairo_move_to(cr, 0.1, 0.5);
326 cairo_line_to(cr, 0.9, 0.5);
327 cairo_stroke(cr);
328
329 /* initialize flip matrices */
330 cairo_matrix_t hflip_matrix;
331 cairo_matrix_init(&hflip_matrix, -1, 0, 0, 1, 1, 0);
332
333 /* scale and transform*/
334 if(flags & CPF_DIRECTION_LEFT) // Flip x transformation
335 cairo_transform(cr, &hflip_matrix);
336
337 cairo_move_to(cr, 0.4, 0.1);
338 cairo_line_to(cr, 0.0, 0.5);
339 cairo_line_to(cr, 0.4, 0.9);
340 cairo_fill(cr);
341
342 FINISH
343}
344
345void dtgtk_cairo_paint_sortby(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
346{
347 PREAMBLE(1, 1.2, 0, 0)
348
349 cairo_move_to(cr, 0.1, 0.05);
350 cairo_line_to(cr, 0.1, 0.95);
351 cairo_move_to(cr, 0.0, 0.80);
352 cairo_line_to(cr, 0.1, 0.95);
353 cairo_line_to(cr, 0.2, 0.80);
354 cairo_stroke(cr);
355
357 {
358 cairo_move_to(cr, 0.35, 0.05);
359 cairo_line_to(cr, 0.45, 0.05);
360 cairo_move_to(cr, 0.35, 0.35);
361 cairo_line_to(cr, 0.65, 0.35);
362 cairo_move_to(cr, 0.35, 0.65);
363 cairo_line_to(cr, 0.85, 0.65);
364 cairo_move_to(cr, 0.35, 0.95);
365 cairo_line_to(cr, 1.00, 0.95);
366 }
367 else
368 {
369 cairo_move_to(cr, 0.35, 0.05);
370 cairo_line_to(cr, 1.00, 0.05);
371 cairo_move_to(cr, 0.35, 0.35);
372 cairo_line_to(cr, 0.85, 0.35);
373 cairo_move_to(cr, 0.35, 0.65);
374 cairo_line_to(cr, 0.65, 0.65);
375 cairo_move_to(cr, 0.35, 0.95);
376 cairo_line_to(cr, 0.45, 0.95);
377 }
378 cairo_stroke(cr);
379
380 FINISH
381}
382
383void dtgtk_cairo_paint_flip(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
384{
385 PREAMBLE(1, 1, 0, 0)
386
387 double C = cosf(-1.570796327f), S = sinf(-1.570796327f);
388 cairo_matrix_t rotation_matrix;
389 cairo_matrix_init(&rotation_matrix, C, S, -S, C, 0.5 - C * 0.5 + S * 0.5, 0.5 - S * 0.5 - C * 0.5);
390
391 if((flags & CPF_DIRECTION_UP)) // Rotate -90 degrees
392 cairo_transform(cr, &rotation_matrix);
393
394 cairo_move_to(cr, 0.05, 0.4);
395 cairo_line_to(cr, 0.05, 0);
396 cairo_line_to(cr, 0.95, 0.4);
397 cairo_line_to(cr, 0.05, 0.4);
398 cairo_fill_preserve(cr);
399 cairo_stroke(cr);
400
401 cairo_move_to(cr, 0.05, 0.6);
402 cairo_line_to(cr, 0.05, 1.0);
403 cairo_line_to(cr, 0.95, 0.6);
404 cairo_line_to(cr, 0.05, 0.6);
405 cairo_stroke(cr);
406
407 FINISH
408}
409
410void dtgtk_cairo_paint_reset(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
411{
412 PREAMBLE(1, 1, 0, 0)
413
414 cairo_arc(cr, 0.5, 0.5, 0.46, 0, 6.2832);
415 cairo_move_to(cr, 0.5, 0.32);
416 cairo_line_to(cr, 0.5, 0.68);
417 cairo_stroke(cr);
418
419 FINISH
420}
421
422void dtgtk_cairo_paint_store(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
423{
424 PREAMBLE(1, 1, 0, 0)
425
426 cairo_move_to(cr, 0.275, 0.1);
427 cairo_line_to(cr, 0.1, 0.1);
428 cairo_line_to(cr, 0.1, 0.9);
429 cairo_line_to(cr, 0.9, 0.9);
430 cairo_line_to(cr, 0.9, 0.175);
431 cairo_line_to(cr, 0.825, 0.1);
432 cairo_line_to(cr, 0.825, 0.5);
433 cairo_line_to(cr, 0.275, 0.5);
434 cairo_line_to(cr, 0.275, 0.1);
435
436 cairo_stroke(cr);
437 cairo_rectangle(cr, 0.5, 0.025, 0.17, 0.275);
438 cairo_fill(cr);
439 cairo_stroke(cr);
440
441 FINISH
442}
443
444void dtgtk_cairo_paint_switch(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
445{
446 PREAMBLE(1, 1, 0, 0)
447
448 cairo_arc(cr, 0.5, 0.5, 0.46, (-50 * 3.145 / 180), (230 * 3.145 / 180));
449 cairo_move_to(cr, 0.5, 0.0);
450 cairo_line_to(cr, 0.5, 0.5);
451 cairo_stroke(cr);
452
453 FINISH
454}
455
456void dtgtk_cairo_paint_module_switch(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
457{
458 PREAMBLE(1, 1, 0, 0)
459
460 const gboolean prelight = flags & CPF_PRELIGHT;
461 const double bar_w = prelight ? 0.76 : 0.16;
462 const double bar_x = 0.5 - bar_w * 0.5;
463 const double bar_y = 0.08;
464 const double bar_h = 0.84;
465 const double radius = bar_w * 0.5;
466
467 cairo_new_sub_path(cr);
468 cairo_arc(cr, bar_x + bar_w - radius, bar_y + radius, radius, -M_PI / 2.0, 0.0);
469 cairo_arc(cr, bar_x + bar_w - radius, bar_y + bar_h - radius, radius, 0.0, M_PI / 2.0);
470 cairo_arc(cr, bar_x + radius, bar_y + bar_h - radius, radius, M_PI / 2.0, M_PI);
471 cairo_arc(cr, bar_x + radius, bar_y + radius, radius, M_PI, 3.0 * M_PI / 2.0);
472 cairo_close_path(cr);
473 cairo_fill(cr);
474
475 FINISH
476}
477
478void dtgtk_cairo_paint_module_switch_on(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
479{
480 PREAMBLE(1, 1, 0, 0)
481
482 const double dot_radius = 0.09;
483
484 cairo_arc(cr, 0.5, 0.5, dot_radius, 0.0, 2.0 * M_PI);
485 cairo_fill(cr);
486
487 FINISH
488}
489
490void dtgtk_cairo_paint_switch_inactive(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
491{
492 PREAMBLE(1, .3f, 0, 0)
493
494 cairo_arc(cr, 0.5, 0.5, 0.46, (-50 * 3.145 / 180), (230 * 3.145 / 180));
495 cairo_move_to(cr, 0.5, 0.0);
496 cairo_line_to(cr, 0.5, 0.5);
497 cairo_stroke(cr);
498
499 FINISH
500}
501
502void dtgtk_cairo_paint_switch_on(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
503{
504 PREAMBLE(1, 1, 0, 0)
505
506 cairo_arc(cr, 0.5, 0.5, 0.50, 0, 2 * M_PI);
507 cairo_stroke(cr);
508
509 cairo_arc(cr, 0.5, 0.5, 0.30, 0, 2 * M_PI);
510 cairo_fill(cr);
511
512 FINISH
513}
514
515void dtgtk_cairo_paint_switch_off(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
516{
517 PREAMBLE(1, 1, 0, 0)
518
519 cairo_arc(cr, 0.5, 0.5, 0.50, 0, 2 * M_PI);
520 cairo_stroke(cr);
521
522 FINISH
523}
524
525void dtgtk_cairo_paint_switch_deprecated(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
526{
527 PREAMBLE(1, 1, 0, 0)
528
529 cairo_move_to(cr, 0.1, 0.1);
530 cairo_line_to(cr, 0.9, 0.9);
531 cairo_move_to(cr, 0.1, 0.9);
532 cairo_line_to(cr, 0.9, 0.1);
533 cairo_stroke(cr);
534
535 FINISH
536}
537
538void dtgtk_cairo_paint_plus(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
539{
540 dtgtk_cairo_paint_plusminus(cr, x, y, w, h, flags | CPF_ACTIVE, data);
541}
542
543void dtgtk_cairo_paint_plusminus(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
544{
545 PREAMBLE(1, 1, 0, 0)
546
547 cairo_arc(cr, 0.5, 0.5, 0.45, 0, 2 * M_PI);
548 cairo_fill(cr);
549 cairo_set_source_rgba(cr, 0.2, 0.2, 0.2, 1.0);
550
551 if((flags & CPF_ACTIVE))
552 {
553 cairo_move_to(cr, 0.5, 0.25);
554 cairo_line_to(cr, 0.5, 0.75);
555 cairo_move_to(cr, 0.25, 0.5);
556 cairo_line_to(cr, 0.75, 0.5);
557 cairo_stroke(cr);
558 }
559 else
560 {
561 cairo_move_to(cr, 0.25, 0.5);
562 cairo_line_to(cr, 0.75, 0.5);
563 cairo_stroke(cr);
564 }
565
566 cairo_identity_matrix(cr);
567
568 FINISH
569}
570
571void dtgtk_cairo_paint_square_plus(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
572{
573 PREAMBLE(1, 1, 0, 0)
574
576 cairo_fill(cr);
577
578 cairo_set_source_rgba(cr, 0.2, 0.2, 0.2, 1.0);
579 cairo_move_to(cr, 0.5, 0.25);
580 cairo_line_to(cr, 0.5, 0.75);
581 cairo_move_to(cr, 0.25, 0.5);
582 cairo_line_to(cr, 0.75, 0.5);
583 cairo_stroke(cr);
584
585 FINISH
586}
587
588void dtgtk_cairo_paint_sorting(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
589{
590 PREAMBLE(1, 1, 0, 0)
591
592 cairo_move_to(cr, 0.4, 0.1);
593 cairo_line_to(cr, 0.4, 0.9);
594 cairo_line_to(cr, 0.2, 0.7);
595 cairo_move_to(cr, 0.6, 0.9);
596 cairo_line_to(cr, 0.6, 0.1);
597 cairo_line_to(cr, 0.8, 0.3);
598 cairo_stroke(cr);
599
600 FINISH
601}
602
603void dtgtk_cairo_paint_plus_simple(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
604{
605 PREAMBLE(1, 1, 0, 0)
606
607 cairo_move_to(cr, 0.5, 0.1);
608 cairo_line_to(cr, 0.5, 0.9);
609 cairo_move_to(cr, 0.1, 0.5);
610 cairo_line_to(cr, 0.9, 0.5);
611 cairo_stroke(cr);
612
613 FINISH
614}
615
616void dtgtk_cairo_paint_minus_simple(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
617{
618 PREAMBLE(1, 1, 0, 0)
619
620 cairo_move_to(cr, 0.1, 0.5);
621 cairo_line_to(cr, 0.9, 0.5);
622 cairo_stroke(cr);
623
624 FINISH
625}
626
627void dtgtk_cairo_paint_multiply_small(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
628{
629 PREAMBLE(1, 1, 0, 0)
630
631 cairo_move_to(cr, 0.3, 0.3);
632 cairo_line_to(cr, 0.7, 0.7);
633 cairo_move_to(cr, 0.7, 0.3);
634 cairo_line_to(cr, 0.3, 0.7);
635 cairo_stroke(cr);
636
637 FINISH
638}
639
640void dtgtk_cairo_paint_treelist(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
641{
642 PREAMBLE(1, 1, 0, 0)
643
644 cairo_move_to(cr, 0.05, 0.05);
645 cairo_line_to(cr, 0.125, 0.05);
646 cairo_move_to(cr, 0.25, 0.35);
647 cairo_line_to(cr, 0.325, 0.35);
648 cairo_move_to(cr, 0.45, 0.65);
649 cairo_line_to(cr, 0.525, 0.65);
650 cairo_move_to(cr, 0.25, 0.95);
651 cairo_line_to(cr, 0.325, 0.95);
652 cairo_stroke(cr);
653
654 cairo_move_to(cr, 0.35, 0.05);
655 cairo_line_to(cr, 0.95, 0.05);
656 cairo_move_to(cr, 0.55, 0.35);
657 cairo_line_to(cr, 0.95, 0.35);
658 cairo_move_to(cr, 0.75, 0.65);
659 cairo_line_to(cr, 0.95, 0.65);
660 cairo_move_to(cr, 0.55, 0.95);
661 cairo_line_to(cr, 0.95, 0.95);
662 cairo_stroke(cr);
663
664 FINISH
665}
666
667void dtgtk_cairo_paint_invert(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
668{
669 PREAMBLE(0.95, 1, 0, 0)
670
671 cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
672 cairo_arc(cr, 0.5, 0.5, 0.46, 0, 2.0 * M_PI);
673 cairo_stroke(cr);
674 cairo_arc(cr, 0.5, 0.5, 0.46, 3.0 * M_PI / 2.0, M_PI / 2.0);
675 cairo_fill(cr);
676
677 FINISH
678}
679
680void dtgtk_cairo_paint_masks_edit(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
681{
682 PREAMBLE(1, 1, 0, 0)
683
684 // Draw in a SOURCE group so overlapping strokes don't accumulate alpha.
685 const cairo_operator_t prev_operator = cairo_get_operator(cr);
686 cairo_push_group(cr);
687 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
688
689 // Curve line
690 cairo_move_to(cr, 1., 0.4);
691 cairo_curve_to(cr, 0.9, -0.1, 0.4, 0.1, 0., 0.5);
692 cairo_stroke(cr);
693 // Node
694 cairo_arc(cr, 0.35, 0.20, 0.1, 0, 2 * M_PI);
695 cairo_fill(cr);
696 // Cursor arrow
697 _paint_cursor_arrow(cr, 0.4, 0.35, 0.7);
698
699 cairo_pop_group_to_source(cr);
700 cairo_set_operator(cr, prev_operator);
701 cairo_paint(cr);
702
703 FINISH
704}
705
706void dtgtk_cairo_paint_masks_circle(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
707{
708 PREAMBLE(1, 1, 0, 0)
709
710 // Draw in a SOURCE group so overlapping strokes don't accumulate alpha.
711 const cairo_operator_t prev_operator = cairo_get_operator(cr);
712 cairo_push_group(cr);
713 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
714
715 cairo_arc(cr, 0.5, 0.5, 0.5, 0, 2.0 * M_PI);
716 cairo_stroke(cr);
717
718 // Add a center control node
719 cairo_arc(cr, 0.5, 0.5, 0.075, 0, 2 * M_PI);
720 cairo_fill(cr);
721
722 // Add an edge control node
723 cairo_arc(cr, 1., 0.5, 0.075, 0, 2 * M_PI);
724 cairo_fill(cr);
725
726 cairo_pop_group_to_source(cr);
727 cairo_set_operator(cr, prev_operator);
728 cairo_paint(cr);
729
730 FINISH
731}
732
741void dtgtk_cairo_paint_masks_ellipse(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
742{
743 PREAMBLE(1, 1, 0, 0)
744
745 // Draw in a SOURCE group so overlapping strokes don't accumulate alpha.
746
747 const cairo_operator_t prev_operator = cairo_get_operator(cr);
748 cairo_push_group(cr);
749 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
750
751 const double scale_x = 0.95 / sqrt(2.0);
752 const double scale_y = 0.95;
753 // Pick the radius so the rotated ellipse's axis-aligned bbox has half-extent 0.5.
754 const double radius = sqrt(0.5 / (scale_x * scale_x + scale_y * scale_y));
755
756 cairo_save(cr);
757 cairo_translate(cr, 0.5, 0.5);
758 cairo_rotate(cr, M_PI_4);
759 cairo_scale(cr, scale_x, scale_y);
760 cairo_arc(cr, 0.0, 0.0, radius, 0.0, 2.0 * M_PI);
761 cairo_restore(cr);
762 cairo_stroke(cr);
763
764 // Add a center control node
765 cairo_arc(cr, 0.5, 0.5, 0.075, 0, 2 * M_PI);
766 cairo_fill(cr);
767
768 // Add an edge control node
769 const double c = M_SQRT1_2; // 1/sqrt(2)
770
771 const double major_x = 0.5 + scale_y * radius * c;
772 const double major_y = 0.5 - scale_y * radius * c;
773 cairo_arc(cr, major_x, major_y, 0.075, 0, 2 * M_PI);
774 cairo_fill(cr);
775
776 const double minor_x = 0.5 + scale_x * radius * c;
777 const double minor_y = 0.5 + scale_x * radius * c;
778 cairo_arc(cr, minor_x, minor_y, 0.075, 0, 2 * M_PI);
779 cairo_fill(cr);
780
781 cairo_pop_group_to_source(cr);
782 cairo_set_operator(cr, prev_operator);
783 cairo_paint(cr);
784
785 FINISH
786}
787
788void dtgtk_cairo_paint_masks_gradient(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
789{
790 PREAMBLE(1, 1, 0, 0)
791
792 cairo_save(cr);
793
794 cairo_pattern_t *src = cairo_get_source(cr);
795 double r = 0.7, g = 0.7, b = 0.7, a = 1.0;
796 if(cairo_pattern_get_rgba(src, &r, &g, &b, &a) != CAIRO_STATUS_SUCCESS)
797 {
798 /* fallback */
799 r = g = b = 0.7;
800 a = 1.0;
801 }
802
803 cairo_pattern_t *pat = cairo_pattern_create_linear(0.0, 1.0, 1.0, 0.0);
804 cairo_pattern_add_color_stop_rgba(pat, 0.33, r, g, b, 0.3);
805 cairo_pattern_add_color_stop_rgba(pat, 0.66, r, g, b, 0.);
806 cairo_rectangle(cr, 0.0, 0.0, 1, 1);
807 cairo_set_source(cr, pat);
808 cairo_fill(cr);
809 cairo_pattern_destroy(pat);
810 cairo_restore(cr);
811
812
813 const double line_width = cairo_get_line_width(cr);
814 const double thick_width = line_width * 2.;
815 const double triangle_size = 0.4;
816 const double triangle_width = 0.66 * triangle_size;
817 const double triangle_height = triangle_size;
818
819 // Angle pointed by the triangle tip (radians).
820 const double angle = -M_PI_4;
821 const double half_width = triangle_width * 0.5;
822 const double tip_x = cos(angle);
823 const double tip_y = sin(angle);
824 const double base_x = -tip_y;
825 const double base_y = tip_x;
826
827 // Offset center so the triangle centroid stays at (0.5, 0.5).
828 const double center_x = 0.5 - triangle_height * tip_x / 3.0;
829 const double center_y = 0.5 - triangle_height * tip_y / 3.0;
830
831 cairo_move_to(cr, center_x - half_width * base_x, center_y - half_width * base_y);
832 cairo_line_to(cr, center_x + half_width * base_x, center_y + half_width * base_y);
833 cairo_line_to(cr, center_x + triangle_height * tip_x, center_y + triangle_height * tip_y);
834 cairo_close_path(cr);
835
836
837 cairo_fill(cr);
838
839 // Clip to avoid lines to bleed outside of the gradient
840 cairo_rectangle(cr, 0.0, 0.0, 1, 1);
841 cairo_clip(cr);
842
843 double pattern[2] = {0.1f, 0.2f};
844 cairo_set_dash(cr, pattern, 2, 0);
845
846 cairo_move_to(cr, 0.5, 0.);
847 cairo_line_to(cr, 1., 0.5);
848
849 cairo_move_to(cr, 0., 0.5);
850 cairo_line_to(cr, 0.5, 1.);
851
852 cairo_set_line_width(cr, thick_width);
853 cairo_stroke(cr);
854
855 FINISH
856}
857
858void dtgtk_cairo_paint_masks_polygon(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
859{
860 PREAMBLE(1, 1, 0, 0)
861
862 // Draw in a SOURCE group so overlapping strokes don't accumulate alpha.
863 const cairo_operator_t prev_operator = cairo_get_operator(cr);
864 cairo_push_group(cr);
865 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
866
867 const double nodes[5][2] =
868 {
869 {0.075, 0.50},
870 {0.375, 0.10},
871 {0.925, 0.30},
872 {0.75, 0.883},
873 {0.225, 0.925}
874 };
875
876 const int points_type[5] = {1, 0, 1, 1, 1}; // 0 for line, 1 for curve
877
878 cairo_move_to(cr, nodes[0][0], nodes[0][1]);
879 cairo_line_to(cr, nodes[1][0], nodes[1][1]);
880 cairo_line_to(cr, nodes[2][0], nodes[2][1]);
881 cairo_curve_to(cr, 0.95, 0.60, 0.75, 0.90, nodes[3][0], nodes[3][1]);
882 cairo_curve_to(cr, 0.60, 0.7, 0.5, 0.75, nodes[4][0], nodes[4][1]);
883 cairo_curve_to(cr, 0.05, 0.70, 0.05, 0.80, nodes[0][0], nodes[0][1]);
884 cairo_stroke(cr);
885
886 for (int i = 0; i < 5; i++)
887 {
888 const float radius = 0.075;
889 if(!points_type[i])
890 {
891 const float length = radius * 0.7071f;
892 cairo_rectangle(cr, nodes[i][0] - length, nodes[i][1] - length, 2 * length, 2 * length);
893 }
894 else
895 cairo_arc(cr, nodes[i][0], nodes[i][1], radius, 0, 2 * M_PI);
896 cairo_fill_preserve(cr);
897 cairo_stroke(cr);
898 }
899
900 cairo_pop_group_to_source(cr);
901 cairo_set_operator(cr, prev_operator);
902 cairo_paint(cr);
903
904 FINISH
905}
906
907void dtgtk_cairo_paint_masks_vertgradient(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
908{
909 PREAMBLE(1, 1, 0, 0)
910
911 cairo_rectangle(cr, 0.1, 0.1, 0.9, 0.9);
912 cairo_stroke_preserve(cr);
913 cairo_pattern_t *pat = NULL;
914 pat = cairo_pattern_create_linear(0.1, 0.5, 0.9, 0.5);
915 cairo_pattern_add_color_stop_rgba(pat, 0.1, 0.6, 0.6, 0.6, 0.9);
916 cairo_pattern_add_color_stop_rgba(pat, 1.0, 0.2, 0.2, 0.2, 0.9);
917 cairo_rectangle(cr, 0.1, 0.1, 0.8, 0.8);
918 cairo_set_source(cr, pat);
919 cairo_fill(cr);
920 cairo_pattern_destroy(pat);
921
922 FINISH
923}
924
925void dtgtk_cairo_paint_masks_brush_and_inverse(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
926{
927 PREAMBLE(1, 1, 0, 0)
928
929 cairo_arc(cr, 0.5, 0.5, 0.4, 0, 2.0 * M_PI);
930 cairo_stroke(cr);
931 cairo_arc(cr, 0.5, 0.5, 0.4, 3.0 * M_PI / 2.0, M_PI / 2.0);
932 cairo_fill(cr);
933
934 cairo_move_to(cr, -0.05, 1.0);
935 cairo_arc_negative(cr, 0.25, 0.85, 0.15, 0.5 * M_PI, 1.12 * M_PI);
936 cairo_arc(cr, -0.236, 0.72, 0.35, 0.08 * M_PI, 0.26 * M_PI);
937 cairo_close_path(cr);
938 cairo_fill(cr);
939
940 cairo_set_line_width(cr, 0.01);
941 cairo_arc(cr, 0.98, 0.0, 0.055, 1.2 * M_PI, 0.2 * M_PI);
942 cairo_arc(cr, 0.48, 0.72, 0.09, 0.2 * M_PI, 1.2 * M_PI);
943 cairo_close_path(cr);
944 cairo_stroke(cr);
945
946 FINISH
947}
948
949void dtgtk_cairo_paint_masks_brush(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
950{
951 PREAMBLE(1, 1, 0, 0)
952
953 // Draw in a SOURCE group so overlapping strokes don't accumulate alpha.
954 const cairo_operator_t prev_operator = cairo_get_operator(cr);
955 cairo_push_group(cr);
956 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
957
958 //_draw_shape_plus_sign(cr);
959
960 const double nodes[3][2] = {{0.1, 0.90},
961 {0.5, 0.5},
962 {0.9, 0.1}};
963
964 cairo_move_to(cr, nodes[0][0], nodes[0][1]);
965 cairo_curve_to(cr, 0.00, 0.75, 0.1, 0.18, nodes[1][0], nodes[1][1]);
966 cairo_curve_to(cr, 0.82, 0.7, 0.8, 0.2, nodes[2][0], nodes[2][1]);
967 cairo_stroke(cr);
968
969 for(int i = 0; i < 3; i++)
970 {
971 cairo_arc(cr, nodes[i][0], nodes[i][1], 0.075, 0, 2 * M_PI);
972 cairo_fill_preserve(cr);
973 cairo_stroke(cr);
974 }
975
976 //cairo_rectangle(cr, 0.0, 0.0, 1, 1);
977 //cairo_stroke(cr);
978
979 cairo_pop_group_to_source(cr);
980 cairo_set_operator(cr, prev_operator);
981 cairo_paint(cr);
982
983 FINISH
984}
985
986void dtgtk_cairo_paint_masks_uniform(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
987{
988 PREAMBLE(0.95, 1, 0, 0)
989
990 cairo_arc(cr, 0.5, 0.5, 0.5, -M_PI, M_PI);
991 cairo_stroke(cr);
992
993 FINISH
994}
995
996void dtgtk_cairo_paint_masks_drawn(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
997{
998 PREAMBLE(0.9, 1, 0, 0)
999
1000 // main cylinder
1001 cairo_move_to(cr, 1.0, 1.0);
1002 cairo_line_to(cr, 0.9, 0.7);
1003 cairo_line_to(cr, 0.2, 0.0);
1004 cairo_line_to(cr, 0.0, 0.2);
1005 cairo_line_to(cr, 0.7, 0.9);
1006 cairo_line_to(cr, 1.0, 1.0);
1007 cairo_stroke(cr);
1008
1009 // line
1010 cairo_move_to(cr, 0.8, 0.8);
1011 cairo_line_to(cr, 0.15, 0.15);
1012 cairo_stroke(cr);
1013
1014 // junction
1015 cairo_move_to(cr, 0.9, 0.7);
1016 cairo_line_to(cr, 0.7, 0.9);
1017 cairo_stroke(cr);
1018
1019 // tip
1020 cairo_move_to(cr, 1.05, 1.05);
1021 cairo_line_to(cr, 0.95, 0.95);
1022 cairo_stroke(cr);
1023
1024 FINISH
1025}
1026
1029void _gradient_arc(cairo_t *cr, double lw, int nb_steps, double x_center, double y_center, double radius,
1030 double angle_from, double angle_to, double color_from, double color_to, double alpha)
1031{
1032 cairo_set_line_width(cr, lw);
1033
1034 double *portions = malloc(sizeof(double) * (1 + nb_steps));
1035
1036 // note: cairo angles seems to be shifted by M_PI relatively to the unit circle
1037 angle_from = angle_from + M_PI;
1038 angle_to = angle_to + M_PI;
1039 double step = (angle_to - angle_from) / nb_steps;
1040 for(int i = 0; i < nb_steps; i++) portions[i] = angle_from + i * step;
1041 portions[nb_steps] = angle_to;
1042
1043 for(int i = 0; i < nb_steps; i++)
1044 {
1045 double color = color_from + i * (color_to - color_from) / nb_steps;
1046 cairo_set_source_rgba(cr, color, color, color, alpha);
1047 cairo_arc(cr, x_center, y_center, radius, portions[i], portions[i + 1]);
1048 cairo_stroke(cr);
1049 }
1050 dt_free(portions);
1051}
1052
1053void dtgtk_cairo_paint_masks_parametric(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1054{
1055 PREAMBLE(0.95, 1, 0, 0)
1056
1057 cairo_pattern_t *p = cairo_get_source (cr);
1058 double r, g, b, a;
1059 double start;
1060 cairo_pattern_get_rgba (p, &r, &g, &b, &a);
1061
1062 start = ((flags & CPF_PRELIGHT) && (r < 0.5)) ? 0.8 : r / 4.0;
1063 _gradient_arc(cr, 0.125, 16, 0.5, 0.5, 0.5, -M_PI / 3.0, M_PI + M_PI / 3.0, start, r, a);
1064
1065 // draw one tick up right
1066 cairo_move_to(cr, 1, 0.2);
1067 cairo_line_to(cr, 1.2, 0.2);
1068 cairo_line_to(cr, 1.1, 0.0);
1069 cairo_fill(cr);
1070 // draw another tick center right
1071 cairo_move_to(cr, 1.1, 0.6);
1072 cairo_line_to(cr, 1.325, 0.55);
1073 cairo_line_to(cr, 1.275, 0.75);
1074 cairo_fill(cr);
1075
1076 FINISH
1077}
1078
1079void dtgtk_cairo_paint_masks_drawn_and_parametric(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags,
1080 void *data)
1081{
1082 PREAMBLE(1.05, 1, -0.1, -0.05)
1083
1084 cairo_pattern_t *p = cairo_get_source (cr);
1085 double r, g, b, a;
1086 double start;
1087 cairo_pattern_get_rgba (p, &r, &g, &b, &a);
1088
1089 start = ((flags & CPF_PRELIGHT) && (r < 0.5)) ? 0.8 : r / 4.0;
1090 cairo_save(cr);
1091 _gradient_arc(cr, 0.125, 16, 0.75, 0.6, 0.4, -M_PI / 3.0, M_PI + M_PI / 3.0, start, r, a);
1092
1093 // draw one tick up right
1094 cairo_move_to(cr, 1.2, 0.35);
1095 cairo_line_to(cr, 1.35, 0.35);
1096 cairo_line_to(cr, 1.275, 0.15);
1097 cairo_fill(cr);
1098 // draw another tick center right
1099 cairo_move_to(cr, 1.25, 0.7);
1100 cairo_line_to(cr, 1.4, 0.6);
1101 cairo_line_to(cr, 1.4, 0.8);
1102 cairo_fill(cr);
1103 cairo_restore(cr);
1104
1105 cairo_scale(cr, 0.8, 0.8);
1106 cairo_translate(cr, 0.05, -0.05);
1107
1108 // main cylinder
1109 cairo_move_to(cr, 1.0, 1.0);
1110 cairo_line_to(cr, 0.9, 0.7);
1111 cairo_line_to(cr, 0.2, 0.0);
1112 cairo_line_to(cr, 0.0, 0.2);
1113 cairo_line_to(cr, 0.7, 0.9);
1114 cairo_line_to(cr, 1.0, 1.0);
1115 cairo_stroke(cr);
1116
1117 // line
1118 cairo_move_to(cr, 0.8, 0.8);
1119 cairo_line_to(cr, 0.25, 0.25);
1120 cairo_stroke(cr);
1121
1122 // junction
1123 cairo_move_to(cr, 0.9, 0.7);
1124 cairo_line_to(cr, 0.7, 0.9);
1125 cairo_stroke(cr);
1126
1127 // tip
1128 cairo_move_to(cr, 1.05, 1.05);
1129 cairo_line_to(cr, 0.95, 0.95);
1130 cairo_stroke(cr);
1131
1132 FINISH
1133}
1134
1135void dtgtk_cairo_paint_masks_raster(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1136{
1137 PREAMBLE(1, 1, 0, 0)
1138
1139 cairo_arc(cr, 0.5, 0.5, 0.5, 0, 2 * M_PI);
1140 cairo_clip(cr);
1141 cairo_new_path(cr);
1142
1143 for(int i = 0; i < 4; i++)
1144 for(int j = 0; j < 4; j++)
1145 if((i + j) % 2)
1146 {
1147 cairo_rectangle(cr, i / 4.0, j / 4.0, 1.0 / 4.0, 1.0 / 4.0);
1148 cairo_fill(cr);
1149 }
1150
1151 FINISH
1152}
1153
1154void dtgtk_cairo_paint_masks_multi(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1155{
1156 PREAMBLE(1, 1, 0, 0)
1157
1158 cairo_arc(cr, 0.3, 0.3, 0.3, 0, 6.2832);
1159 cairo_stroke(cr);
1160 cairo_move_to(cr, 0.0, 1.0);
1161 cairo_curve_to(cr, 0.0, 0.5, 1.0, 0.6, 1.0, 0.0);
1162 cairo_stroke(cr);
1163
1164 FINISH
1165}
1166
1167void dtgtk_cairo_paint_masks_inverse(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1168{
1169 PREAMBLE(1, 1, 0, 0)
1170
1171 cairo_arc(cr, 0.5, 0.5, 0.46, 0, 2.0 * M_PI);
1172 cairo_stroke(cr);
1173 cairo_arc(cr, 0.5, 0.5, 0.46, 3.0 * M_PI / 2.0, M_PI / 2.0);
1174 cairo_fill(cr);
1175
1176 FINISH
1177}
1178
1179void dtgtk_cairo_paint_masks_union(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1180{
1181 // note : as the icon is not square, we don't want PREAMBLE macro
1182 // we want 2 round of radius R that intersect in the middle,
1183 // so the width needs R + R*0.8 + R*0.8 + R = R*3.6
1184 // with a safety belt of 5% to be sure the stroke is draw inside the area
1185 const float r = fminf(w / 3.6, h / 2.0) * 0.95;
1186 const float padding_left = (w - r * 3.6) / 2.0;
1187 cairo_arc(cr, padding_left + r, h / 2.0, r, 0, 2.0 * M_PI);
1188 cairo_arc(cr, padding_left + r * 2.6, h / 2.0, r, 0, 2.0 * M_PI);
1189 cairo_fill(cr);
1190}
1191
1192void dtgtk_cairo_paint_masks_intersection(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1193{
1194 // note : as the icon is not square, we don't want PREAMBLE macro
1195 // we want 2 round of radius R that intersect in the middle,
1196 // so the width needs R + R*0.8 + R*0.8 + R = R*3.6
1197 // with a safety belt of *0.95 to be sure the stroke is draw inside the area
1198 const float r = fminf(w / 3.6, h / 2.0) * 0.95;
1199 const float padding_left = (w - r * 3.6) / 2.0;
1200
1201 // we draw the outline of the 2 circles
1202 cairo_save(cr);
1203 cairo_set_line_width(cr, cairo_get_line_width(cr) * 0.5);
1204 cairo_arc(cr, padding_left + r, h / 2.0, r, 0, 2.0 * M_PI);
1205 cairo_stroke(cr);
1206 cairo_arc(cr, padding_left + r * 2.6, h / 2.0, r, 0, 2.0 * M_PI);
1207 cairo_stroke(cr);
1208 cairo_restore(cr);
1209
1210 // we draw the intersection of the 2 circles we slightly different radius so they are more visible
1211 cairo_push_group(cr);
1212 cairo_arc(cr, padding_left + r * 1.3, h / 2.0, r * 0.85, 0, 2.0 * M_PI);
1213 cairo_fill(cr);
1214 cairo_set_operator(cr, CAIRO_OPERATOR_IN);
1215 cairo_arc(cr, padding_left + r * 2.3, h / 2.0, r * 0.85, 0, 2.0 * M_PI);
1216 cairo_fill(cr);
1217 cairo_pop_group_to_source(cr);
1218 cairo_paint(cr);
1219}
1220
1221void dtgtk_cairo_paint_masks_difference(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1222{
1223 // note : as the icon is not square, we don't want PREAMBLE macro
1224 // we want 2 round of radius R that intersect in the middle,
1225 // so the width needs R + R*0.8 + R*0.8 + R = R*3.6
1226 // with a safety belt of *0.95 to be sure the stroke is draw inside the area
1227 const float r = fminf(w / 3.6, h / 2.0) * 0.95;
1228 const float padding_left = (w - r * 3.6) / 2.0;
1229
1230 // we draw and fill the first circle
1231 cairo_arc(cr, padding_left + r, h / 2.0, r, 0, 2.0 * M_PI);
1232 cairo_fill(cr);
1233
1234 // then erase the second circle
1235 cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
1236 cairo_arc(cr, padding_left + r * 2.6, h / 2.0, r, 0, 2.0 * M_PI);
1237 cairo_fill(cr);
1238
1239 // last we draw the outline of the second circle
1240 cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
1241 cairo_set_line_width(cr, cairo_get_line_width(cr) * 0.5);
1242 cairo_arc(cr, padding_left + r * 2.6, h / 2.0, r, 0, 2.0 * M_PI);
1243 cairo_stroke(cr);
1244}
1245
1246void dtgtk_cairo_paint_masks_exclusion(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1247{
1248 // note : as the icon is not square, we don't want PREAMBLE macro
1249 // we want 2 round of radius R that intersect in the middle,
1250 // so the width needs R + R*0.8 + R*0.8 + R = R*3.6
1251 // with a safety belt of *0.95 to be sure the stroke is draw inside the area
1252 const float r = fminf(w / 3.6, h / 2.0) * 0.95;
1253 const float padding_left = (w - r * 3.6) / 2.0;
1254
1255 // we draw the first circle without the excluded area
1256 cairo_save(cr);
1257 cairo_set_line_width(cr, cairo_get_line_width(cr) * 0.5);
1258 cairo_arc(cr, padding_left + r, h / 2.0, r, 0, 2.0 * M_PI);
1259 cairo_fill(cr);
1260 cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
1261 cairo_arc(cr, padding_left + r * 2.3, h / 2.0, r * 0.85, 0, 2.0 * M_PI);
1262 cairo_fill(cr);
1263 cairo_restore(cr);
1264
1265 // same for the second circle
1266 cairo_push_group(cr);
1267 cairo_arc(cr, padding_left + r * 2.6, h / 2.0, r, 0, 2.0 * M_PI);
1268 cairo_fill(cr);
1269 cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
1270 cairo_arc(cr, padding_left + r * 1.3, h / 2.0, r * 0.85, 0, 2.0 * M_PI);
1271 cairo_fill(cr);
1272 cairo_pop_group_to_source(cr);
1273 cairo_paint(cr);
1274}
1275void dtgtk_cairo_paint_masks_used(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1276{
1277 PREAMBLE(1, 1, 0, 0)
1278
1279 cairo_arc(cr, 0.5, 0.5, 0.35, 0, 2.0 * M_PI);
1280 cairo_move_to(cr, 0.5, 0.15);
1281 cairo_line_to(cr, 0.5, 0.5);
1282 cairo_stroke(cr);
1283
1284 FINISH
1285}
1286
1287void dtgtk_cairo_paint_eye(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1288{
1289 dtgtk_cairo_paint_eye_toggle(cr, x, y, w, h, flags & ~CPF_ACTIVE, data);
1290}
1291
1292void dtgtk_cairo_paint_eye_toggle(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1293{
1294 PREAMBLE(1, 1, 0, 0)
1295
1296 cairo_save(cr);
1297 const double offset = 0.17;
1298 // Top
1299 cairo_arc(cr, 0.5, 0.5 + 0.3, 0.6, (1.0 + offset) * M_PI, (2.0 - offset) * M_PI);
1300 // Bottom
1301 cairo_arc(cr, 0.5, 0.5 - 0.3, 0.6, offset * M_PI, (1.0 - offset) * M_PI);
1302 cairo_close_path(cr);
1303 cairo_clip_preserve(cr);
1304
1305 // Iris
1306 const double iris_y = 0.45;
1307 cairo_arc(cr, 0.5, iris_y, 0.30, 0, 2 * M_PI);
1308 cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
1309 cairo_fill(cr);
1310 cairo_arc(cr, 0.5, iris_y, 0.10, 0, 2 * M_PI);
1311 cairo_fill(cr);
1312
1313 cairo_restore(cr);
1314
1315 if((flags & CPF_ACTIVE))
1316 {
1317 cairo_move_to(cr, 0.1, 0.9);
1318 cairo_line_to(cr, 0.9, 0.1);
1319 cairo_stroke(cr);
1320 }
1321
1322 FINISH
1323}
1324
1325void dtgtk_cairo_paint_timer(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1326{
1327 PREAMBLE(1, 1, 0, 0)
1328
1329 cairo_arc(cr, 0.5, 0.5, 0.5, (-80 * 3.145 / 180), (150 * 3.145 / 180));
1330 cairo_line_to(cr, 0.5, 0.5);
1331 cairo_stroke(cr);
1332
1333 FINISH
1334}
1335
1336void dtgtk_cairo_paint_grid(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1337{
1338 PREAMBLE(1, 1, 0, 0)
1339
1341
1342 // then create grid lines
1343 cairo_move_to(cr, 0.35, 0.15);
1344 cairo_line_to(cr, 0.35, 0.85);
1345 cairo_stroke(cr);
1346
1347 cairo_move_to(cr, 0.65, 0.15);
1348 cairo_line_to(cr, 0.65, 0.85);
1349 cairo_stroke(cr);
1350
1351 cairo_move_to(cr, 0.15, 0.35);
1352 cairo_line_to(cr, 0.85, 0.35);
1353 cairo_stroke(cr);
1354
1355 cairo_move_to(cr, 0.15, 0.65);
1356 cairo_line_to(cr, 0.85, 0.65);
1357 cairo_stroke(cr);
1358
1359 FINISH
1360}
1361
1362void dtgtk_cairo_paint_focus_peaking(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1363{
1364 PREAMBLE(1.2, 1, 0, 0)
1365
1366 // stigmometer aka split focusing screen aka Dodin's prism
1367 cairo_arc(cr, 0.5, 0.5, 0.2, 0, 2. * M_PI);
1368 cairo_move_to(cr, 0.3, 0.5);
1369 cairo_line_to(cr, 0.7, 0.5);
1370 cairo_stroke(cr);
1371
1372 // corners
1373 const double center = 0.5;
1374 const double width = 1.;
1375 const double height = width * 3. / 4.;
1376 const double offset_h = height / 2.;
1377 const double offset_w = width / 2.;
1378
1379 const double tick_length = 0.2;
1380 const double radius = 0.1;
1381
1382 const double left = center - offset_w;
1383 const double right = center + offset_w;
1384 const double top = center - offset_h;
1385 const double bottom = center + offset_h;
1386
1387 const double degrees = M_PI / 180.0;
1388
1390 cairo_move_to(cr, left, top + tick_length);
1391 cairo_arc (cr, left + radius, top + radius, radius, 180 * degrees, 270 * degrees);
1392 cairo_line_to(cr, left + tick_length, top);
1393 cairo_stroke(cr);
1394
1395 // south west
1396 cairo_move_to(cr, left + tick_length, bottom);
1397 cairo_arc (cr, left + radius, bottom - radius, radius, 90 * degrees, 180 * degrees);
1398 cairo_line_to(cr, left, bottom - tick_length);
1399 cairo_stroke(cr);
1400
1401 // south east
1402 cairo_move_to(cr, right, bottom - tick_length);
1403 cairo_arc (cr, right - radius, bottom - radius, radius, 0 * degrees, 90 * degrees);
1404 cairo_line_to(cr, right - tick_length, bottom);
1405 cairo_stroke(cr);
1406
1407 // north east
1408 cairo_move_to(cr, right - tick_length, top);
1409 cairo_arc (cr, right - radius, top + radius, radius, -90 * degrees, 0 * degrees);
1410 cairo_line_to(cr, right, top + tick_length);
1411 cairo_stroke(cr);
1412
1413 FINISH
1414}
1415
1416void dtgtk_cairo_paint_camera(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1417{
1418 PREAMBLE(1, 1, 0, 0)
1419
1420 // lens
1421 cairo_arc(cr, 0.5, 0.5, 0.2, 0, 2. * M_PI);
1422 cairo_stroke(cr);
1423 cairo_arc(cr, 0.5, 0.5, 0.1, M_PI, M_PI+M_PI_2);
1424 cairo_stroke(cr);
1425
1426 // body
1427
1428 cairo_move_to(cr, 0, 0.25);
1429 cairo_line_to(cr, 0, 0.85);
1430 cairo_line_to(cr, 0.95, 0.85);
1431 cairo_line_to(cr, 0.95, 0.25);
1432 cairo_line_to(cr, 0.75, 0.25);
1433 cairo_line_to(cr, 0.65, 0.15);
1434 cairo_line_to(cr, 0.35, 0.15);
1435 cairo_line_to(cr, 0.25, 0.25);
1436 cairo_close_path(cr);
1437 cairo_stroke(cr);
1438
1439 FINISH
1440}
1441
1442void dtgtk_cairo_paint_histogram_scope(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1443{
1444 PREAMBLE(1, 1, 0, 0)
1445
1446 cairo_move_to(cr, 0.0, 1.0);
1447 cairo_curve_to(cr, 0.3, 1.0, 0.3, 0.0, 0.5, 0.0);
1448 cairo_curve_to(cr, 0.7, 0.0, 0.7, 1.0, 1.0, 1.0);
1449 cairo_fill(cr);
1450
1451 FINISH
1452}
1453
1454void dtgtk_cairo_paint_waveform_scope(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1455{
1456 PREAMBLE(1, 1, 0, 0)
1457
1458 cairo_pattern_t *p_src = cairo_get_source(cr);
1459 double r, g, b, a;
1460 cairo_pattern_get_rgba(p_src, &r, &g, &b, &a);
1461
1462 cairo_pattern_t *pat;
1463 pat = cairo_pattern_create_linear(0.0, 0.0, 0.0, 1.0);
1464
1465 cairo_pattern_add_color_stop_rgba(pat, 0.0, r, g, b, a * 0.0);
1466 cairo_pattern_add_color_stop_rgba(pat, 0.1, r, g, b, a * 0.1);
1467 cairo_pattern_add_color_stop_rgba(pat, 0.5, r, g, b, a * 1.0);
1468 cairo_pattern_add_color_stop_rgba(pat, 0.6, r, g, b, a * 1.0);
1469 cairo_pattern_add_color_stop_rgba(pat, 1.0, r, g, b, a * 0.2);
1470
1471 cairo_rectangle(cr, 0.0, 0.0, 0.3, 0.9);
1472 cairo_set_source(cr, pat);
1473 cairo_fill(cr);
1474
1475 cairo_save(cr);
1476 cairo_scale(cr, 1.0, -1.0);
1477 cairo_translate(cr, 0.0, -1.0);
1478 cairo_rectangle(cr, 0.25, 0.0, 0.5, 1.0);
1479 cairo_set_source(cr, pat);
1480 cairo_fill(cr);
1481 cairo_restore(cr);
1482
1483 cairo_rectangle(cr, 0.7, 0.0, 0.3, 0.9);
1484 cairo_set_source(cr, pat);
1485 cairo_fill(cr);
1486
1487 cairo_pattern_destroy(pat);
1488
1489 FINISH
1490}
1491
1492void dtgtk_cairo_paint_vectorscope(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1493{
1494 PREAMBLE(1, 1, 0, 0)
1495
1496 cairo_move_to(cr, 0.0, 0.3);
1497 cairo_curve_to(cr, 0.1, 0.0, 0.7, 0.3, 1.0, 0.7);
1498 cairo_curve_to(cr, 0.9, 0.8, 0.1, 0.8, 0.0, 0.3);
1499 cairo_fill(cr);
1500
1501 FINISH
1502}
1503
1504void dtgtk_cairo_paint_linear_scale(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1505{
1506 PREAMBLE(1, 1, 0, 0)
1507
1508 cairo_move_to(cr, 0.0, 1.0);
1509 cairo_line_to(cr, 1.0, 0.0);
1510 cairo_stroke(cr);
1511
1512 FINISH
1513}
1514
1515void dtgtk_cairo_paint_logarithmic_scale(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1516{
1517 PREAMBLE(1, 1, 0, 0)
1518
1519 cairo_move_to(cr, 0.0, 1.0);
1520 cairo_curve_to(cr, 0.0, 0.33, 0.66, 0.0, 1.0, 0.0);
1521 cairo_stroke(cr);
1522
1523 FINISH
1524}
1525
1526void dtgtk_cairo_paint_waveform_overlaid(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1527{
1528 PREAMBLE(1, 1, 0, 0)
1529
1530 cairo_pattern_t *p_src = cairo_get_source(cr);
1531 double r, g, b, a;
1532 cairo_pattern_get_rgba(p_src, &r, &g, &b, &a);
1533
1534 cairo_pattern_t *pat;
1535 pat = cairo_pattern_create_linear(0.0, 0.0, 0.0, 1.0);
1536
1537 cairo_pattern_add_color_stop_rgba(pat, 0.0, r, g * 0.7, b * 0.9, a * 0.2);
1538 cairo_pattern_add_color_stop_rgba(pat, 0.4, r * 0.9, g, b * 0.9, a * 0.8);
1539 cairo_pattern_add_color_stop_rgba(pat, 0.7, r, g * 0.9, b, a * 1.0);
1540 cairo_pattern_add_color_stop_rgba(pat, 1.0, r * 0.7, g * 0.5, b, a * 0.2);
1541
1542 cairo_rectangle(cr, 0.0, 0.15, 1.0, 0.7);
1543 cairo_set_source(cr, pat);
1544 cairo_fill(cr);
1545
1546 cairo_pattern_destroy(pat);
1547
1548 FINISH
1549}
1550
1551void dtgtk_cairo_paint_rgb_parade(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1552{
1553 PREAMBLE(1, 1, 0, 0)
1554
1555 cairo_pattern_t *pat;
1556
1557 pat = cairo_pattern_create_linear(0.0, 0.0, 0.0, 1.0);
1558 cairo_pattern_add_color_stop_rgba(pat, 0.0, 0.8, 0.3, 0.3, 0.2);
1559 cairo_pattern_add_color_stop_rgba(pat, 0.4, 0.8, 0.3, 0.3, 0.7);
1560 cairo_pattern_add_color_stop_rgba(pat, 1.0, 0.8, 0.3, 0.3, 0.3);
1561 cairo_rectangle(cr, 0.0, 0.1, 1.0/3.0, 0.7);
1562 cairo_set_source(cr, pat);
1563 cairo_fill(cr);
1564 cairo_pattern_destroy(pat);
1565
1566 pat = cairo_pattern_create_linear(0.0, 0.0, 0.0, 1.0);
1567 cairo_pattern_add_color_stop_rgba(pat, 0.0, 0.4, 0.8, 0.4, 0.1);
1568 cairo_pattern_add_color_stop_rgba(pat, 0.6, 0.4, 0.8, 0.4, 0.8);
1569 cairo_pattern_add_color_stop_rgba(pat, 1.0, 0.4, 0.8, 0.4, 0.4);
1570 cairo_rectangle(cr, 1.0/3.0, 0.2, 1.0/3.0, 0.7);
1571 cairo_set_source(cr, pat);
1572 cairo_fill(cr);
1573 cairo_pattern_destroy(pat);
1574
1575 pat = cairo_pattern_create_linear(0.0, 0.0, 0.0, 1.0);
1576 cairo_pattern_add_color_stop_rgba(pat, 0.0, 0.4, 0.4, 0.8, 0.4);
1577 cairo_pattern_add_color_stop_rgba(pat, 0.5, 0.4, 0.4, 0.8, 0.9);
1578 cairo_pattern_add_color_stop_rgba(pat, 1.0, 0.4, 0.4, 0.8, 0.5);
1579 cairo_rectangle(cr, 2.0/3.0, 0.1, 1.0/3.0, 0.7);
1580 cairo_set_source(cr, pat);
1581 cairo_fill(cr);
1582 cairo_pattern_destroy(pat);
1583
1584 FINISH
1585}
1586
1587void dtgtk_cairo_paint_luv(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1588{
1589 PREAMBLE(1, 1, 0, 0)
1590
1591 // FIXME: change icon to "u*v*"
1592 cairo_move_to(cr, 0.0, 0.0);
1593 cairo_line_to(cr, 0.0, 1.0);
1594 cairo_line_to(cr, 0.7, 1.0);
1595 cairo_stroke(cr);
1596
1597 cairo_move_to(cr, 0.5, 0.0);
1598 cairo_curve_to(cr, 0.5, 0.4, 1.0, 0.4, 1.0, 0.0);
1599 cairo_stroke(cr);
1600
1601 cairo_move_to(cr, 0.5, 0.5);
1602 cairo_line_to(cr, 0.75, 0.8);
1603 cairo_line_to(cr, 1.0, 0.5);
1604 cairo_stroke(cr);
1605
1606 FINISH
1607}
1608
1609void dtgtk_cairo_paint_jzazbz(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1610{
1611 PREAMBLE(1, 1, 0, 0)
1612
1613 // FIXME: change icon to "AzBz" or just "z"
1614 cairo_move_to(cr, 0.4, 0.0);
1615 cairo_curve_to(cr, 0.45, 1.0, 0.1, 1.0, 0.0, 0.8);
1616 cairo_stroke(cr);
1617
1618 cairo_move_to(cr, 0.6, 0.5);
1619 cairo_line_to(cr, 1.0, 0.5);
1620 cairo_line_to(cr, 0.6, 1.0);
1621 cairo_line_to(cr, 1.0, 1.0);
1622 cairo_stroke(cr);
1623
1624 FINISH
1625}
1626
1627void dtgtk_cairo_paint_ryb(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1628{
1629 PREAMBLE(1.2, 1, -0.05, -0.05)
1630
1631 cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 0.8);
1632 cairo_arc(cr, 0.5, 0.5, 0.5, -0.83333 * M_PI, -0.16667 * M_PI);
1633 cairo_line_to(cr, 0.5, 0.5);
1634 cairo_close_path(cr);
1635 cairo_fill(cr);
1636 cairo_stroke(cr);
1637
1638 cairo_set_source_rgba(cr, 1.0, 1.0, 0.0, 0.8);
1639 cairo_arc(cr, 0.5, 0.5, 0.5, 0.5 * M_PI, -0.83333 * M_PI);
1640 cairo_line_to(cr, 0.5, 0.5);
1641 cairo_close_path(cr);
1642 cairo_fill(cr);
1643 cairo_stroke(cr);
1644
1645 cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 0.8);
1646 cairo_arc(cr, 0.5, 0.5, 0.5, -0.16667 * M_PI, 0.5 * M_PI);
1647 cairo_line_to(cr, 0.5, 0.5);
1648 cairo_close_path(cr);
1649 cairo_fill(cr);
1650 cairo_stroke(cr);
1651
1652 FINISH
1653}
1654
1655void dtgtk_cairo_paint_filmstrip(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1656{
1657 gdouble sw = 0.6;
1658 gdouble bend = 0.3;
1659
1660 PREAMBLE(1, 1, 0, 0)
1661
1662 cairo_scale(cr, 0.7, 0.7);
1663 cairo_translate(cr, 0.15, 0.15);
1664
1665 /* s curve left */
1666 cairo_move_to(cr, 0.0, 1.0);
1667 cairo_curve_to(cr, 0.0, 0.0 + bend, (1.0 - sw), 1.0 - bend, (1.0 - sw), 0.0);
1668 cairo_stroke(cr);
1669
1670 /* s curve down */
1671 cairo_move_to(cr, 1.0, 0.0);
1672 cairo_curve_to(cr, 1.0, 1.0 - bend, sw, 0.0 + bend, sw, 1.0);
1673 cairo_stroke(cr);
1674
1675 /* filmstrip start,stop and divider */
1676 cairo_move_to(cr, 0, 1.0);
1677 cairo_line_to(cr, sw, 1.0);
1678 cairo_stroke(cr);
1679 cairo_move_to(cr, 1 - sw, 0.0);
1680 cairo_line_to(cr, 1.0, 0.0);
1681 cairo_stroke(cr);
1682
1683 cairo_move_to(cr, 1 - sw, 0.5);
1684 cairo_line_to(cr, sw, 0.5);
1685 cairo_stroke(cr);
1686
1687 FINISH
1688}
1689
1690void dtgtk_cairo_paint_directory(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1691{
1692 PREAMBLE(1, 1, 0, 0);
1693
1694 const double degrees = M_PI / 180.0;
1695
1696 cairo_new_sub_path (cr);
1697 cairo_arc (cr, 0.85, 0.35, 0.1, -90 * degrees, 0 * degrees);
1698 cairo_arc (cr, 0.8, 0.75, 0.1, 0 * degrees, 90 * degrees);
1699 cairo_arc (cr, 0.2, 0.75, 0.1, 90 * degrees, 180 * degrees);
1700 cairo_arc (cr, 0.15, 0.35, 0.1, 180 * degrees, 270 * degrees);
1701 cairo_close_path (cr);
1702 cairo_stroke(cr);
1703
1704 cairo_move_to(cr, 0.1, 0.3);
1705 cairo_arc (cr, 0.2, 0.15, 0.1, 180 * degrees, 270 * degrees);
1706 cairo_arc (cr, 0.45, 0.15, 0.1, -90 * degrees, 0 * degrees);
1707 cairo_curve_to(cr, 0.6, 0.15, 0.75, 0.25, 0.9, 0.25);
1708 cairo_fill(cr);
1709
1710 FINISH
1711}
1712
1713void dtgtk_cairo_paint_refresh(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1714{
1715 PREAMBLE(1, 1, 0, 0)
1716
1717 if(flags & 1)
1718 {
1719 cairo_translate(cr, 1, 0);
1720 cairo_scale(cr, -1, 1);
1721 }
1722
1723 cairo_move_to(cr, 0.65, 0.1);
1724 cairo_line_to(cr, 0.5, 0.2);
1725 cairo_line_to(cr, 0.65, 0.3);
1726 cairo_stroke(cr);
1727
1728 cairo_arc(cr, 0.5, 0.5, 0.35, (-80 * 3.145 / 180), (220 * 3.145 / 180));
1729 cairo_stroke(cr);
1730
1731 FINISH
1732}
1733
1734void dtgtk_cairo_paint_perspective(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1735{
1736 PREAMBLE(1, 1, 0, 0)
1737
1738 if((flags & 3) == 1)
1739 {
1740 cairo_move_to(cr, 0.1, 0.9);
1741 cairo_line_to(cr, 0.3, 0.1);
1742 cairo_line_to(cr, 0.7, 0.1);
1743 cairo_line_to(cr, 0.9, 0.9);
1744 cairo_line_to(cr, 0.1, 0.9);
1745 cairo_stroke(cr);
1746 }
1747 else if((flags & 3) == 2)
1748 {
1749 cairo_move_to(cr, 0.1, 0.9);
1750 cairo_line_to(cr, 0.9, 0.7);
1751 cairo_line_to(cr, 0.9, 0.3);
1752 cairo_line_to(cr, 0.1, 0.1);
1753 cairo_line_to(cr, 0.1, 0.9);
1754 cairo_stroke(cr);
1755 }
1756 else if((flags & 3) == 3)
1757 {
1758 cairo_move_to(cr, 0.1, 0.9);
1759 cairo_line_to(cr, 0.9, 0.7);
1760 cairo_line_to(cr, 0.8, 0.2);
1761 cairo_line_to(cr, 0.3, 0.1);
1762 cairo_line_to(cr, 0.1, 0.9);
1763 cairo_stroke(cr);
1764 }
1765
1766 FINISH
1767}
1768
1769void dtgtk_cairo_paint_structure(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1770{
1771 PREAMBLE(1, 1, 0, 0)
1772
1773 cairo_move_to(cr, 0.1, 0.1);
1774 cairo_line_to(cr, 0.0, 0.9);
1775 cairo_stroke(cr);
1776 cairo_move_to(cr, 0.366, 0.1);
1777 cairo_line_to(cr, 0.33, 0.9);
1778 cairo_stroke(cr);
1779 cairo_move_to(cr, 0.633, 0.1);
1780 cairo_line_to(cr, 0.66, 0.9);
1781 cairo_stroke(cr);
1782 cairo_move_to(cr, 0.9, 0.1);
1783 cairo_line_to(cr, 1.0, 0.9);
1784 cairo_stroke(cr);
1785
1786 FINISH
1787}
1788
1789void dtgtk_cairo_paint_draw_structure(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1790{
1791 PREAMBLE(1, 1, 0, 0)
1792
1793 cairo_move_to(cr, 0.1, 0.1);
1794 cairo_line_to(cr, 0.1, 0.9);
1795 cairo_line_to(cr, 0.9, 0.9);
1796 cairo_line_to(cr, 0.9, 0.1);
1797 cairo_line_to(cr, 0.1, 0.1);
1798 cairo_stroke(cr);
1799
1800 cairo_arc(cr, 0.1, 0.1, 0.1, 0.0, 2 * M_PI);
1801 cairo_stroke(cr);
1802 cairo_arc(cr, 0.1, 0.9, 0.1, 0.0, 2 * M_PI);
1803 cairo_stroke(cr);
1804 cairo_arc(cr, 0.9, 0.9, 0.1, 0.0, 2 * M_PI);
1805 cairo_stroke(cr);
1806 cairo_arc(cr, 0.9, 0.1, 0.1, 0.0, 2 * M_PI);
1807 cairo_stroke(cr);
1808
1809 FINISH
1810}
1811
1812void dtgtk_cairo_paint_cancel(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1813{
1814 PREAMBLE(1, 1, 0, 0)
1815
1816 cairo_move_to(cr, 0.85, 0.15);
1817 cairo_line_to(cr, 0.15, 0.85);
1818 cairo_move_to(cr, 0.15, 0.15);
1819 cairo_line_to(cr, 0.85, 0.85);
1820 cairo_stroke(cr);
1821
1822 FINISH
1823}
1824
1825void dtgtk_cairo_paint_aspectflip(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1826{
1827 PREAMBLE(1, 1, 0, 0)
1828
1829 if(flags & 1)
1830 {
1831 cairo_translate(cr, 0, 1);
1832 cairo_scale(cr, 1, -1);
1833 }
1834
1835 cairo_move_to(cr, 0.65, 0.0);
1836 cairo_line_to(cr, 0.5, 0.05);
1837 cairo_line_to(cr, 0.6, 0.25);
1838 cairo_stroke(cr);
1839
1840 cairo_arc(cr, 0.5, 0.5, 0.45, (-80 * 3.145 / 180), (220 * 3.145 / 180));
1841 cairo_stroke(cr);
1842
1843 FINISH
1844}
1845
1846void dtgtk_cairo_paint_styles(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1847{
1848 PREAMBLE(0.5 * 1.1, 1, 0.5 + 0.06, 0.5 -0.10)
1849
1850 cairo_arc(cr, 0.250, 0.45, 0.5, 0.0, 2.0 * M_PI);
1851 cairo_stroke(cr);
1852 cairo_arc(cr, -0.58, 0.65, 0.30, 0.0, 2.0 * M_PI);
1853 cairo_stroke(cr);
1854 cairo_arc(cr, -0.38, -0.27, 0.4, 0.0, 2.0 * M_PI);
1855 cairo_stroke(cr);
1856
1857 /* if its a popup menu */
1858 if(flags)
1859 {
1860 cairo_move_to(cr, 0.475, -0.93);
1861 cairo_line_to(cr, 0.15, -0.20);
1862 cairo_line_to(cr, 0.85, -0.20);
1863 cairo_fill(cr);
1864 }
1865
1866 FINISH
1867}
1868
1869void dtgtk_cairo_paint_label(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1870{
1871 PREAMBLE(1, 1, 0, 0)
1872
1873 cairo_push_group(cr);
1874
1875 double r = 0.4;
1876
1877 /* fill base color */
1878 cairo_arc(cr, 0.5, 0.5, r, 0.0, 2.0 * M_PI);
1879
1880 const dt_colorlabels_enum color = (flags & 7);
1881
1882 if(color < DT_COLORLABELS_LAST)
1883 {
1885 }
1886 else
1887 {
1888 cairo_set_line_width(cr, 0.1);
1889 cairo_set_source_rgb(cr, 0.9, 0.9, 0.9);
1890 cairo_move_to(cr, 0.15, 0.85);
1891 cairo_line_to(cr, 0.85, 0.15);
1892 cairo_stroke(cr);
1893
1894 // then erase some parts around cross line
1895 cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
1896 cairo_set_line_width(cr, 0.05);
1897 cairo_move_to(cr, 0.1, 0.78);
1898 cairo_line_to(cr, 0.78, 0.15);
1899 cairo_move_to(cr, 0.20, 0.9);
1900 cairo_line_to(cr, 0.92, 0.15);
1901 cairo_set_source_rgba(cr, 0, 1.0, 0, 1.0);
1902 cairo_stroke(cr);
1903 }
1904 cairo_fill(cr);
1905
1906 cairo_pop_group_to_source(cr);
1907 cairo_paint(cr);
1908
1909 FINISH
1910}
1911
1912void dtgtk_cairo_paint_label_sel(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1913{
1914 PREAMBLE(1., 1, 0, 0)
1915
1916 const double r = 0.5;
1917 const dt_colorlabels_enum color = (flags & 7);
1918
1919 if(color < DT_COLORLABELS_LAST)
1920 {
1921 GdkRGBA rgba = darktable.bauhaus->colorlabels[color];
1922 cairo_set_source_rgba(cr, rgba.red, rgba.green, rgba.blue, .7);
1923 }
1924 else
1925 {
1926 cairo_set_source_rgba(cr, 0.75, 0.75, 0.75, 1.0);
1927 }
1928
1929 /* then improve hover effect for same blue icon */
1930 if(flags & CPF_PRELIGHT)
1931 {
1932 cairo_set_line_width(cr, 1.2 * cairo_get_line_width(cr));
1933 }
1934
1936 {
1937 cairo_arc(cr, 0.5, 0.5, r, 0.0, 2.0 * M_PI);
1938 cairo_fill(cr);
1939 }
1940 else
1941 {
1942 cairo_arc(cr, 0.5, 0.5, r, 0.0, 2.0 * M_PI);
1943 cairo_stroke(cr);
1944 }
1945
1946 FINISH
1947}
1948
1949void dtgtk_cairo_paint_reject(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1950{
1951 PREAMBLE(0.95, 1, 0, 0)
1952
1953 // the reject icon
1954 cairo_arc(cr, 0.5, 0.5, 0.5, 0.0, 2.0 * M_PI);
1955 cairo_move_to(cr, 0.7, 0.3);
1956 cairo_line_to(cr, 0.3, 0.7);
1957 cairo_move_to(cr, 0.3, 0.3);
1958 cairo_line_to(cr, 0.7, 0.7);
1959
1961 {
1962 // that means the image is rejected, so we draw the cross in red bold
1963 cairo_set_source_rgb(cr, 1.0, 0, 0);
1964 }
1965
1966 cairo_stroke(cr);
1967
1968 FINISH
1969}
1970
1971void dtgtk_cairo_paint_remove(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1972{
1973 PREAMBLE(0.95, 1, 0, 0)
1974
1975 // the reject icon
1977 cairo_fill(cr);
1978
1979 cairo_set_source_rgba(cr, 0.2, 0.2, 0.2, 0.8);
1980 cairo_move_to(cr, 0.7, 0.3);
1981 cairo_line_to(cr, 0.3, 0.7);
1982 cairo_move_to(cr, 0.3, 0.3);
1983 cairo_line_to(cr, 0.7, 0.7);
1984 cairo_stroke(cr);
1985
1986 FINISH
1987}
1988
1989void dtgtk_cairo_paint_star(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
1990{
1991 PREAMBLE(1, 1, 0, 0)
1992
1993 // we create the path
1994 dt_draw_star(cr, 1 / 2., 1. / 2., 1. / 2., 1. / 5.);
1995
1996 // we fill the star if needed (mouseover or activated)
1997 if(data)
1998 {
1999 GdkRGBA *bgc = (GdkRGBA *)data; // the inner star color is defined in data
2000 double r, g, b, a;
2001 if(cairo_pattern_get_rgba(cairo_get_source(cr), &r, &g, &b, &a) == CAIRO_STATUS_SUCCESS)
2002 {
2003 cairo_set_source_rgba(cr, bgc->red, bgc->green, bgc->blue, bgc->alpha);
2004 cairo_fill_preserve(cr);
2005 cairo_set_source_rgba(cr, r, g, b, a);
2006 }
2007 }
2008
2009 cairo_stroke(cr);
2010
2011 FINISH
2012}
2013
2014void dtgtk_cairo_paint_unratestar(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2015{
2016 PREAMBLE(1, 1, 0, 0)
2017
2018 cairo_push_group(cr);
2019
2020 // we create the path
2021 dt_draw_star(cr, 1 / 2., 1. / 2., 1. / 2., 1. / 5.);
2022
2023 // we fill the star if needed (mouseover or activated)
2024 if(data)
2025 {
2026 GdkRGBA *bgc = (GdkRGBA *)data; // the inner star color is defined in data
2027 double r, g, b, a;
2028 if(cairo_pattern_get_rgba(cairo_get_source(cr), &r, &g, &b, &a) == CAIRO_STATUS_SUCCESS)
2029 {
2030 cairo_set_source_rgba(cr, bgc->red, bgc->green, bgc->blue, bgc->alpha);
2031 cairo_fill_preserve(cr);
2032 cairo_set_source_rgba(cr, r, g, b, a);
2033 }
2034 }
2035
2036 // we create the cross line
2037 cairo_move_to(cr, 0.05, 0.95);
2038 cairo_line_to(cr, 0.85, 0.0);
2039 cairo_stroke(cr);
2040
2041 // then erase some parts around cross line
2042 cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
2043 cairo_set_line_width(cr, cairo_get_line_width(cr) * 0.7);
2044 cairo_move_to(cr, 0.0, 0.88);
2045 cairo_line_to(cr, 0.78, 0.0);
2046 cairo_move_to(cr, 0.10, 1.0);
2047 cairo_line_to(cr, 0.92, 0.0);
2048 cairo_set_source_rgba(cr, 0, 1.0, 0, 1.0);
2049 cairo_stroke(cr);
2050
2051 cairo_pop_group_to_source(cr);
2052 cairo_paint(cr);
2053
2054 FINISH
2055}
2056
2057void dtgtk_cairo_paint_local_copy(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2058{
2059 PREAMBLE(1, 1, 0, 0)
2060 cairo_arc(cr, 0.5, 0.5, 0.25, 0, 2 * M_PI);
2061
2062 if(flags & CPF_ACTIVE)
2063 {
2064 cairo_stroke(cr);
2065 }
2066 else
2067 {
2068 cairo_fill(cr);
2069 }
2070
2071 FINISH
2072}
2073
2074void dtgtk_cairo_paint_altered(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2075{
2076 PREAMBLE(0.5, 1, 0.5, 0.5)
2077
2078 cairo_push_group(cr);
2079
2080 const float r = 1.;
2081 cairo_arc(cr, 0, 0, r, 0, 2.0f * M_PI);
2082
2084 cairo_fill(cr);
2085 else
2086 cairo_stroke(cr);
2087
2089 {
2090 cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
2091 cairo_set_source_rgb(cr, 0.45, 0.45, 0.45);
2092 }
2093
2094 const float dx = r * cosf(M_PI / 8.0f), dy = r * sinf(M_PI / 8.0f);
2095 cairo_move_to(cr, - dx, - dy);
2096 cairo_curve_to(cr, 0, -2.0 * dy, 0, 2.0 * dy, dx, dy);
2097 cairo_move_to(cr, -.2 * dx, .8 * dy);
2098 cairo_line_to(cr, -.8 * dx, .8 * dy);
2099 cairo_move_to(cr, .2 * dx, -.8 * dy);
2100 cairo_line_to(cr, .8 * dx, -.8 * dy);
2101 cairo_move_to(cr, .5 * dx, -.8 * dy - .3 * dx);
2102 cairo_line_to(cr, .5 * dx, -.8 * dy + .3 * dx);
2103 cairo_stroke(cr);
2104
2105 cairo_pop_group_to_source(cr);
2106 cairo_paint(cr);
2107
2108 FINISH
2109}
2110
2111void dtgtk_cairo_paint_unaltered(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2112{
2113 PREAMBLE(0.5, 1, 0.5, 0.5)
2114
2115 cairo_push_group(cr);
2116
2117 const float r = 1.;
2118 cairo_arc(cr, 0, 0, r, 0, 2.0f * M_PI);
2119
2121 cairo_fill(cr);
2122 else
2123 cairo_stroke(cr);
2124
2126 {
2127 cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR);
2128 cairo_set_source_rgb(cr, 0.45, 0.45, 0.45);
2129 }
2130
2131 cairo_move_to(cr, -1, 0);
2132 cairo_line_to(cr, 1, -0);
2133 cairo_stroke(cr);
2134
2135 cairo_pop_group_to_source(cr);
2136 cairo_paint(cr);
2137
2138 FINISH
2139}
2140
2141
2142void dtgtk_cairo_paint_audio(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2143{
2144 PREAMBLE(1, 1, 0, 0)
2145
2146 cairo_rectangle(cr, 0.05, 0.4, 0.2, 0.2);
2147 cairo_move_to(cr, 0.25, 0.6);
2148 cairo_line_to(cr, 0.45, 0.77);
2149 cairo_line_to(cr, 0.45, 0.23);
2150 cairo_line_to(cr, 0.25, 0.4);
2151
2152 cairo_new_sub_path(cr);
2153 cairo_arc(cr, 0.2, 0.5, 0.45, -(35.0 / 180.0) * M_PI, (35.0 / 180.0) * M_PI);
2154 cairo_new_sub_path(cr);
2155 cairo_arc(cr, 0.2, 0.5, 0.6, -(35.0 / 180.0) * M_PI, (35.0 / 180.0) * M_PI);
2156 cairo_new_sub_path(cr);
2157 cairo_arc(cr, 0.2, 0.5, 0.75, -(35.0 / 180.0) * M_PI, (35.0 / 180.0) * M_PI);
2158
2159 cairo_stroke(cr);
2160
2161 FINISH
2162}
2163
2164void dtgtk_cairo_paint_label_flower(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2165{
2166 PREAMBLE(1, 1, 0, 0)
2167
2168 const float r = 0.18;
2169
2170 if(flags & (1 << DT_COLORLABELS_RED))
2171 {
2172 cairo_arc(cr, r, r, r, 0, 2.0f * M_PI);
2174 cairo_fill(cr);
2175 }
2176
2177 if(flags & (1 << DT_COLORLABELS_YELLOW))
2178 {
2179 cairo_arc(cr, 1.0 - r, r, r, 0, 2.0f * M_PI);
2181 cairo_fill(cr);
2182 }
2183
2184 if(flags & (1 << DT_COLORLABELS_GREEN))
2185 {
2186 cairo_arc(cr, 0.5, 0.5, r, 0, 2.0f * M_PI);
2188 cairo_fill(cr);
2189 }
2190
2191 if(flags & (1 << DT_COLORLABELS_BLUE))
2192 {
2193 cairo_arc(cr, r, 1.0 - r, r, 0, 2.0f * M_PI);
2195 cairo_fill(cr);
2196 }
2197
2198 if(flags & (1 << DT_COLORLABELS_PURPLE))
2199 {
2200 cairo_arc(cr, 1.0 - r, 1.0 - r, r, 0, 2.0f * M_PI);
2202 cairo_fill(cr);
2203 }
2204
2205 FINISH
2206}
2207
2208void dtgtk_cairo_paint_colorpicker(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2209{
2210 PREAMBLE(1, 1, -0.05, 0.05)
2211
2212 // Draw in a SOURCE group so overlapping strokes don't accumulate alpha.
2213 const cairo_operator_t prev_operator = cairo_get_operator(cr);
2214 cairo_push_group(cr);
2215 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
2216
2217 if(flags & CPF_ALTER)
2218 {
2219 // plus sign
2220 _draw_plus_sign(cr, 0.18f, 0.18f, 0.18f, 1.0f);
2221 }
2222
2223 cairo_translate(cr, 0.5, 0.5);
2224 cairo_rotate(cr, M_PI * 0.2973);
2225 cairo_scale(cr, 1.04, 1.04);
2226 cairo_translate(cr, -0.5, -0.5);
2227 cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND);
2228
2229 // Shaft
2230 const float top_width = 0.25f;
2231 const float top_height = 0.15f;
2232 const float bottom_width = top_width * 1.5f;
2233 const float bottom_height = 0.13f;
2234
2235 const float x1 = 0.5f - top_width * 0.5f;
2236 const float y1 = 0.0f;
2237
2238 cairo_rectangle(cr, x1, y1, top_width, top_height);
2239 cairo_arc(cr, 0.5f, 0.0, top_width * 0.5, -M_PI, 0);
2240
2241 // Bottom rectangle with rounded top corners
2242 const float x3 = 0.5f - bottom_width * 0.5f;
2243 const float y3 = top_height;
2244 const float x4 = 0.5f + bottom_width * 0.5f;
2245 const float y4 = top_height + bottom_height;
2246 const float radius = 0.035f;
2247
2248 cairo_move_to(cr, x3 + radius, y3);
2249 cairo_line_to(cr, x4 - radius, y3);
2250 cairo_arc(cr, x4 - radius, y3 + radius, radius, -M_PI / 2, 0);
2251 cairo_line_to(cr, x4, y4);
2252 cairo_line_to(cr, x3, y4);
2253 cairo_line_to(cr, x3, y3 + radius);
2254 cairo_arc(cr, x3 + radius, y3 + radius, radius, M_PI, 3 * M_PI / 2);
2255 cairo_close_path(cr);
2256 cairo_fill(cr);
2257
2258 // Tube and tip
2259 const float tube_width = 0.2f - 0.07f;
2260 const float x5 = 0.5f - tube_width * 0.5f;
2261 const float x6 = 0.5f + tube_width * 0.5f;
2262
2263 // Liquid level
2264 const float center_y = 0.6f;
2265 const float offset_y = 0.088f;
2266 const float stem_start_y = y4 + 0.05f;
2267
2268 const float tip_radius = 0.0125f;
2269 const float tip_base = 0.85f;
2270 const float tip_shoulder = 0.95f;
2271 const float tip_y = 1.0f - tip_radius;
2272 const float tip_x_left = 0.5f - tip_radius;
2273 const float tip_x_right = 0.5f + tip_radius;
2274
2275 cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
2276 cairo_set_line_width(cr, 0.03);
2277
2278 // Tube sides
2279 cairo_move_to(cr, x5, stem_start_y);
2280 cairo_line_to(cr, x5, center_y + offset_y);
2281 cairo_move_to(cr, x6, stem_start_y);
2282 cairo_line_to(cr, x6, center_y - offset_y);
2283 cairo_stroke(cr);
2284
2285 // Liquid
2286 cairo_move_to(cr, x5, center_y + offset_y);
2287 cairo_line_to(cr, x5, tip_base);
2288 cairo_line_to(cr, tip_x_left, tip_shoulder);
2289 cairo_line_to(cr, tip_x_left, tip_y);
2290 cairo_line_to(cr, tip_x_right, tip_y);
2291 cairo_line_to(cr, tip_x_right, tip_shoulder);
2292 cairo_line_to(cr, x6, tip_base);
2293 cairo_line_to(cr, x6, center_y - offset_y);
2294 cairo_close_path(cr);
2295 cairo_stroke_preserve(cr);
2296 cairo_fill(cr);
2297
2298 cairo_arc(cr, 0.5f, 1.0f - tip_radius, tip_radius, 0, M_PI);
2299 cairo_fill(cr);
2300
2301 cairo_pop_group_to_source(cr);
2302 cairo_set_operator(cr, prev_operator);
2303 cairo_paint(cr);
2304
2305 FINISH
2306}
2307
2308void dtgtk_cairo_paint_colorpicker_set_values(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2309{
2310 PREAMBLE(1, 1, 0, 0.05)
2311
2312 /* draw pipette */
2313
2314 // drop
2315 cairo_move_to(cr, 0., 1. - 0.0);
2316 cairo_line_to(cr, 0.08, 1. - 0.15);
2317 cairo_line_to(cr, 0.16, 1. - 0.0);
2318 cairo_arc(cr, 0.08, 1. - 0.15 + 0.1926, 0.090666667, -0.49, 3.63);
2319 cairo_fill(cr);
2320
2321 // plus sign
2322 cairo_move_to(cr, 0.18, 0.00);
2323 cairo_line_to(cr, 0.18, 0.36);
2324 cairo_stroke(cr);
2325 cairo_move_to(cr, 0.00, 0.18);
2326 cairo_line_to(cr, 0.36, 0.18);
2327 cairo_stroke(cr);
2328
2329 // cross line
2330 cairo_set_line_width(cr, 0.15);
2331 cairo_move_to(cr, 0.48, 1. - 0.831);
2332 cairo_line_to(cr, 0.739, 1. - 0.482);
2333
2334 // shaft
2335 cairo_move_to(cr, 0.124, 1. - 0.297);
2336 cairo_line_to(cr, 0.823, 1. - 0.814);
2337 cairo_stroke(cr);
2338
2339 // end
2340 cairo_set_line_width(cr, 0.35);
2341 cairo_move_to(cr, 0.823, 1. - 0.814);
2342 cairo_line_to(cr, 0.648, 1. - 0.685);
2343 cairo_stroke(cr);
2344
2345 FINISH
2346}
2347
2348void dtgtk_cairo_paint_showmask(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2349{
2350 PREAMBLE(1, 1, 0, 0)
2351
2352 /* draw circle */
2353 cairo_arc(cr, 0.5, 0.5, 0.35, -M_PI, M_PI);
2354
2355 /* draw rectangle */
2356 cairo_rectangle(cr, 0.0, 0.0, 1.0, 1.0);
2357 cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
2358 cairo_fill(cr);
2359 cairo_stroke(cr);
2360
2361 FINISH
2362}
2363
2364void dtgtk_cairo_paint_preferences(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2365{
2366 PREAMBLE(0.5 * 0.95, 1, 0.5, 0.5)
2367
2368 cairo_rotate(cr, M_PI / 12.);
2369
2370 const float big_r = 1.f;
2371 const float tin_r = 0.8f;
2372
2373 for(int i = 0; i < 12; i++)
2374 {
2375 const float radius = (i % 2 == 0) ? big_r : tin_r;
2376 cairo_arc(cr, 0.0, 0.0, radius, i * M_PI / 6., (i + 1) * M_PI / 6.);
2377 }
2378 cairo_close_path(cr);
2379 cairo_stroke(cr);
2380
2381 cairo_arc(cr, 0.0, 0.0, 0.3, 0, 2. * M_PI);
2382 cairo_stroke(cr);
2383
2384 FINISH
2385}
2386
2387void dtgtk_cairo_paint_overlays(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2388{
2389 PREAMBLE(0.5 * 1.03, 1, 0.5, 0.5)
2390
2391 dt_draw_star(cr, 0.0, 0.0, 1., 1.0/2.5);
2392 cairo_stroke(cr);
2393
2394 FINISH
2395}
2396
2397void dtgtk_cairo_paint_help(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2398{
2399 PREAMBLE(0.5 * 0.97, 1, 0.5, 0.5)
2400
2401 cairo_arc(cr, 0.0, -0.5, 0.4, - M_PI, 0.25 * M_PI);
2402 cairo_arc_negative(cr, 0.7, 0.4, 0.7, -0.75 * M_PI, - M_PI);
2403 cairo_stroke(cr);
2404 cairo_arc(cr, 0.0, 0.85, 0.05, 0.0, 2.0 * M_PI);
2405 cairo_stroke(cr);
2406
2407 FINISH
2408}
2409
2410void dtgtk_cairo_paint_grouping(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2411{
2412 PREAMBLE(1.15, 1, 0, 0)
2413
2414 cairo_move_to(cr, 0.30, 0.15);
2415 cairo_line_to(cr, 0.95, 0.15);
2416 cairo_line_to(cr, 0.95, 0.65);
2417 cairo_move_to(cr, 0.20, 0.25);
2418 cairo_line_to(cr, 0.85, 0.25);
2419 cairo_line_to(cr, 0.85, 0.75);
2420 cairo_stroke(cr);
2421 if(flags & CPF_ACTIVE)
2422 {
2423 cairo_rectangle(cr, 0.05, 0.35, 0.7, 0.5);
2424 cairo_fill(cr);
2425 }
2426 else
2427 {
2428 cairo_rectangle(cr, 0.05, 0.35, 0.7, 0.5);
2429 cairo_stroke(cr);
2430 }
2431
2432 FINISH
2433}
2434
2435void dtgtk_cairo_paint_alignment(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2436{
2437 PREAMBLE(1, 1, 0, 0)
2438
2439 switch(flags >> (int)log2(CPF_SPECIAL_FLAG))
2440 {
2441 case 1: // Top left
2442 cairo_move_to(cr, 0.9, 0.1);
2443 cairo_line_to(cr, 0.1, 0.1);
2444 cairo_line_to(cr, 0.1, 0.9);
2445 break;
2446
2447 case 2: // Top center
2448 cairo_move_to(cr, 0.1, 0.1);
2449 cairo_line_to(cr, 0.9, 0.1);
2450 break;
2451
2452 case 4: // Top right
2453 cairo_move_to(cr, 0.1, 0.1);
2454 cairo_line_to(cr, 0.9, 0.1);
2455 cairo_line_to(cr, 0.9, 0.9);
2456 break;
2457
2458 case 8: // left
2459 cairo_move_to(cr, 0.1, 0.1);
2460 cairo_line_to(cr, 0.1, 0.9);
2461 break;
2462
2463 case 16: // center
2464 cairo_move_to(cr, 0.1, 0.5);
2465 cairo_line_to(cr, 0.9, 0.5);
2466 cairo_move_to(cr, 0.5, 0.1);
2467 cairo_line_to(cr, 0.5, 0.9);
2468 break;
2469
2470 case 32: // right
2471 cairo_move_to(cr, 0.9, 0.1);
2472 cairo_line_to(cr, 0.9, 0.9);
2473 break;
2474
2475 case 64: // bottom left
2476 cairo_move_to(cr, 0.9, 0.9);
2477 cairo_line_to(cr, 0.1, 0.9);
2478 cairo_line_to(cr, 0.1, 0.1);
2479 break;
2480
2481 case 128: // bottom center
2482 cairo_move_to(cr, 0.1, 0.9);
2483 cairo_line_to(cr, 0.9, 0.9);
2484 break;
2485
2486 case 256: // bottom right
2487 cairo_move_to(cr, 0.1, 0.9);
2488 cairo_line_to(cr, 0.9, 0.9);
2489 cairo_line_to(cr, 0.9, 0.1);
2490 break;
2491 }
2492 cairo_stroke(cr);
2493
2494 FINISH
2495}
2496
2497void dtgtk_cairo_paint_text_label(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2498{
2499 PREAMBLE(1, 1, 0, 0)
2500
2501 // draw an A
2502 cairo_move_to(cr, 0.1, 1.);
2503 cairo_line_to(cr, 0.5, 0.);
2504 cairo_line_to(cr, 0.9, 1.);
2505
2506 cairo_move_to(cr, 0.25, 0.6);
2507 cairo_line_to(cr, 0.75, 0.6);
2508 cairo_stroke(cr);
2509
2510 FINISH
2511}
2512
2513
2514void dtgtk_cairo_paint_or(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2515{
2516 PREAMBLE(1, 1, 0, 0)
2517
2518 cairo_move_to(cr, 0.1, 0.3);
2519 cairo_curve_to(cr, 0.1, 1.1, 0.9, 1.1, 0.9, 0.3);
2520 cairo_stroke(cr);
2521
2522 FINISH
2523}
2524
2525void dtgtk_cairo_paint_and(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2526{
2527 PREAMBLE(1, 1, 0, 0)
2528
2529 cairo_move_to(cr, 0.1, 0.9);
2530 cairo_curve_to(cr, 0.1, 0.1, 0.9, 0.1, 0.9, 0.9);
2531 cairo_stroke(cr);
2532
2533 FINISH
2534}
2535
2536void dtgtk_cairo_paint_andnot(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2537{
2538 PREAMBLE(1, 1, 0, 0)
2539
2540 cairo_move_to(cr, 0.1, 0.1);
2541 cairo_line_to(cr, 0.9, 0.9);
2542 cairo_stroke(cr);
2543
2544 FINISH
2545}
2546
2547void dtgtk_cairo_paint_dropdown(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2548{
2549 PREAMBLE(1, 1, 0, 0)
2550
2551 cairo_move_to(cr, 0.1, 0.3);
2552 cairo_line_to(cr, 0.5, 0.7);
2553 cairo_line_to(cr, 0.9, 0.3);
2554 cairo_stroke(cr);
2555
2556 FINISH
2557}
2558
2559void dtgtk_cairo_paint_bracket(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2560{
2561 PREAMBLE(1, 1, 0, 0)
2562
2563 cairo_rectangle(cr, 0.05, 0.05, 0.45, 0.45);
2564 cairo_stroke(cr);
2565 cairo_set_line_width(cr, 0.025);
2566 cairo_rectangle(cr, 0.55, 0.05, 0.45, 0.45);
2567 cairo_stroke(cr);
2568 cairo_set_line_width(cr, 0.05);
2569 cairo_rectangle(cr, 0.05, 0.55, 0.45, 0.45);
2570 cairo_stroke(cr);
2571 cairo_set_line_width(cr, 0.1);
2572 cairo_rectangle(cr, 0.55, 0.55, 0.45, 0.45);
2573 cairo_stroke(cr);
2574
2575 FINISH
2576}
2577
2578void dtgtk_cairo_paint_lock(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2579{
2580 PREAMBLE(1, 1, 0, 0)
2581
2582 // Adding the lock body
2583 cairo_rectangle(cr, 0.25, 0.5, .5, .45);
2584 cairo_fill(cr);
2585
2586 // Adding the lock shank
2587 cairo_translate(cr, .5, .5);
2588 cairo_scale(cr, .2, .4);
2589 cairo_arc(cr, 0, 0, 1, M_PI, 0);
2590 cairo_stroke(cr);
2591
2592 FINISH
2593}
2594
2595void dtgtk_cairo_paint_check_mark(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2596{
2597 PREAMBLE(1, 1, 0, 0)
2598
2599 cairo_move_to(cr, 0.20, 0.45);
2600 cairo_line_to(cr, 0.45, 0.90);
2601 cairo_line_to(cr, 0.90, 0.20);
2602 cairo_stroke(cr);
2603
2604 FINISH
2605}
2606
2607void dtgtk_cairo_paint_overexposed(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2608{
2609 PREAMBLE(1, 1, 0, 0)
2610
2611 /* the triangle */
2612 cairo_move_to(cr, 1.0, 0);
2613 cairo_line_to(cr, 0, 1.0);
2614 cairo_line_to(cr, 1.0, 1.0);
2615 cairo_fill(cr);
2616
2617 /* outer rect */
2619 cairo_stroke(cr);
2620
2621 FINISH
2622}
2623
2624
2625void dtgtk_cairo_paint_bulb(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2626{
2627 PREAMBLE(1, 1, 0, 0)
2628
2629 const float icon_scale = 1.0 / 1.16;
2630 const float line_width = 0.1 * icon_scale;
2631 const float glass_radius = 0.4 * icon_scale;
2632 const float glass_y = glass_radius;
2633 const float screw_y = glass_y + 0.46 * icon_scale;
2634 const float nib_radius = 2.0 * line_width;
2635 const float nib_y = 1.0 - nib_radius;
2636
2637 // glass
2638 cairo_arc_negative(cr, 0.5, glass_y, glass_radius, 1., M_PI - 1.);
2639 cairo_close_path(cr);
2640
2641 if(flags & CPF_ACTIVE)
2642 {
2643 cairo_stroke_preserve(cr);
2644 cairo_fill(cr);
2645 }
2646 else
2647 {
2648 cairo_stroke(cr);
2649 cairo_arc(cr, 0.5, glass_y, 0.5 * glass_radius, -M_PI / 3., -M_PI / 6.);
2650 cairo_stroke(cr);
2651 }
2652
2653 // screw
2654 cairo_move_to(cr, 0.5 - 1.7 * line_width, screw_y);
2655 cairo_line_to(cr, 0.5 + 1.7 * line_width, screw_y);
2656 cairo_stroke(cr);
2657
2658 // nib
2659 cairo_arc(cr, 0.5, nib_y, nib_radius, 0, M_PI);
2660 cairo_fill(cr);
2661
2662 FINISH
2663}
2664
2665
2666void dtgtk_cairo_paint_rawoverexposed(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2667{
2668 PREAMBLE(1, 1, 0, 0)
2669
2670 cairo_save(cr);
2671
2672 const float alpha = (flags & CPF_ACTIVE ? 1.0 : 0.4);
2673
2674 // draw 4 CFA-like colored squares
2675 cairo_set_source_rgba(cr, 0.3, 0.3, 0.3, alpha); // red
2676 cairo_rectangle(cr, 0, 0, 0.5, 0.5);
2677 cairo_fill(cr);
2678
2679 cairo_set_source_rgba(cr, 0.6, 0.6, 0.6, alpha); // green
2680 cairo_rectangle(cr, 0.5, 0, 0.5, 0.5);
2681 cairo_fill(cr);
2682
2683 cairo_set_source_rgba(cr, 0.6, 0.6, 0.6, alpha); // green
2684 cairo_rectangle(cr, 0, 0.5, 0.5, 0.5);
2685 cairo_fill(cr);
2686
2687 cairo_set_source_rgba(cr, 0.1, 0.1, 0.1, alpha); // blue
2688 cairo_rectangle(cr, 0.5, 0.5, 0.5, 0.5);
2689 cairo_fill(cr);
2690
2691 cairo_restore(cr);
2692
2693 /* outer rect */
2695 cairo_stroke(cr);
2696
2697 FINISH
2698}
2699
2700void dtgtk_cairo_paint_gamut_check(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2701{
2702 PREAMBLE(1.15, 1, 0, -0.05)
2703
2704 // the triangle
2705 cairo_move_to(cr, 0.0, 1 - 0.067);
2706 cairo_line_to(cr, 0.5, 1 - 0.933);
2707 cairo_line_to(cr, 1.0, 1 - 0.067);
2708 cairo_close_path(cr);
2709
2710 // exclamation mark
2711 // the dot
2712 cairo_new_sub_path(cr);
2713 cairo_move_to(cr, 0.42, 1 - 0.11);
2714 cairo_line_to(cr, 0.42, 1 - 0.25);
2715 cairo_line_to(cr, 0.58, 1 - 0.25);
2716 cairo_line_to(cr, 0.58, 1 - 0.11);
2717 cairo_close_path(cr);
2718
2719 // the line
2720 cairo_new_sub_path(cr);
2721 cairo_move_to(cr, 0.447, 1 - 0.29);
2722 cairo_line_to(cr, 0.415, 1 - 0.552);
2723 cairo_line_to(cr, 0.415, 1 - 0.683);
2724 cairo_line_to(cr, 0.585, 1 - 0.683);
2725 cairo_line_to(cr, 0.585, 1 - 0.552);
2726 cairo_line_to(cr, 0.552, 1 - 0.29);
2727 cairo_close_path(cr);
2728
2729 cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
2730 cairo_fill(cr);
2731
2732 FINISH
2733}
2734
2735void dtgtk_cairo_paint_softproof(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2736{
2737 PREAMBLE(1, 1, 0, 0)
2738
2739 // Keep proportions and center it horizontally while fitting that extent in 0..1.
2740 const float icon_scale = 1.0 / 1.08;
2741 cairo_translate(cr, 0.5 - 0.5 * icon_scale, 0.08 * icon_scale);
2742 cairo_scale(cr, icon_scale, icon_scale);
2743
2744 // the horse shoe
2745 cairo_move_to(cr, 0.30, 1 - 0.0);
2746 cairo_curve_to(cr, 0.14, 1 - 0.09, 0.03, 1 - 0.88, 0.18, 1 - 1);
2747 cairo_curve_to(cr, 0.32, 1 - 1.08, 0.69, 1 - 0.63, 0.97, 1 - 0.32);
2748 cairo_close_path(cr);
2749
2750 // triangle
2751 cairo_new_sub_path(cr);
2752 cairo_move_to(cr, 0.28, 1 - 0.07);
2753 cairo_line_to(cr, 0.37, 1 - 0.75);
2754 cairo_line_to(cr, 0.82, 1 - 0.42);
2755 cairo_close_path(cr);
2756
2757 cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
2758 cairo_fill(cr);
2759
2760 FINISH
2761}
2762
2763void dtgtk_cairo_paint_display(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2764{
2765 PREAMBLE(1, 1, 0, 0)
2766
2767 const double inset = 0.5 * cairo_get_line_width(cr);
2768 const double icon_min = inset;
2769 const double icon_max = 1.0 - inset;
2770 const double icon_size = icon_max - icon_min;
2771 const double screen_bottom = icon_min + 0.75 * icon_size;
2772
2773 cairo_rectangle(cr, icon_min, icon_min, icon_size, 0.75 * icon_size);
2774 cairo_move_to(cr, 0.5, screen_bottom);
2775 cairo_line_to(cr, 0.5, icon_max);
2776 cairo_move_to(cr, icon_min + 0.3 * icon_size, icon_max);
2777 cairo_line_to(cr, icon_min + 0.7 * icon_size, icon_max);
2778 cairo_stroke(cr);
2779
2780 FINISH
2781}
2782
2783void dtgtk_cairo_paint_rect_landscape(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2784{
2785 PREAMBLE(1, 1, 0, 0)
2786
2787 cairo_move_to(cr, 0.0, 0.3);
2788 cairo_line_to(cr, 1.0, 0.3);
2789 cairo_line_to(cr, 1.0, 0.7);
2790 cairo_line_to(cr, 0.0, 0.7);
2791 cairo_line_to(cr, 0.0, 0.3);
2792 cairo_stroke(cr);
2793
2794 FINISH
2795}
2796
2797void dtgtk_cairo_paint_rect_portrait(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2798{
2799 PREAMBLE(1, 1, 0, 0)
2800
2801 cairo_move_to(cr, 0.3, 0.0);
2802 cairo_line_to(cr, 0.7, 0.0);
2803 cairo_line_to(cr, 0.7, 1.0);
2804 cairo_line_to(cr, 0.3, 1.0);
2805 cairo_line_to(cr, 0.3, 0.0);
2806 cairo_stroke(cr);
2807
2808 FINISH
2809}
2810
2811void dtgtk_cairo_paint_polygon(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2812{
2813 PREAMBLE(1, 1, 0, 0)
2814
2815 cairo_move_to(cr, 0.0, 0.3);
2816 cairo_line_to(cr, 0.7, 0.0);
2817 cairo_line_to(cr, 0.5, 0.5);
2818 cairo_line_to(cr, 1.0, 0.6);
2819 cairo_line_to(cr, 0.6, 1.0);
2820 cairo_line_to(cr, 0.3, 0.8);
2821 cairo_line_to(cr, 0.0, 0.3);
2822 cairo_stroke(cr);
2823
2824 FINISH
2825}
2826
2827void dtgtk_cairo_paint_zoom(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2828{
2829 PREAMBLE(1, 1, 0, 0)
2830
2831 /* draw magnifying glass */
2832
2833 // handle
2834 cairo_move_to(cr, 0.9, 1.0 - 0.1);
2835 cairo_line_to(cr, 0.65, 1.0 - 0.35);
2836 cairo_stroke(cr);
2837
2838 // lens
2839 cairo_arc(cr, 0.35, 1.0 - 0.65, 0.3, -M_PI, M_PI);
2840 cairo_stroke(cr);
2841
2842 FINISH
2843}
2844
2845void dtgtk_cairo_paint_multiinstance(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2846{
2847 PREAMBLE(1, 1, 0, 0)
2848
2849 cairo_rectangle(cr, 0.35, 0.35, 0.6, 0.6);
2850 cairo_stroke(cr);
2851 cairo_rectangle(cr, 0.05, 0.05, 0.9, 0.9);
2852 cairo_rectangle(cr, 0.85, 0.25, -0.65, 0.65);
2853 cairo_clip(cr);
2854 cairo_rectangle(cr, 0.05, 0.05, 0.6, 0.6);
2855 cairo_stroke_preserve(cr);
2856 cairo_fill(cr);
2857
2858 FINISH
2859}
2860
2861void dtgtk_cairo_paint_modulegroup_active(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2862{
2863 PREAMBLE(1.1, 1, 0, 0)
2864
2865 cairo_arc(cr, 0.5, 0.5, 0.40, (-50 * 3.145 / 180), (230 * 3.145 / 180));
2866 cairo_move_to(cr, 0.5, 0.05);
2867 cairo_line_to(cr, 0.5, 0.40);
2868 cairo_stroke(cr);
2869
2870 FINISH
2871}
2872
2873void dtgtk_cairo_paint_modulegroup_favorites(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2874{
2875 PREAMBLE(1.2, 1, 0, 0)
2876
2877 const float r1 = 0.2;
2878 const float r2 = 0.4;
2879 const float d = 2.0 * M_PI * 0.1f;
2880 const float dx[10] = { sinf(0.0), sinf(d), sinf(2 * d), sinf(3 * d), sinf(4 * d),
2881 sinf(5 * d), sinf(6 * d), sinf(7 * d), sinf(8 * d), sinf(9 * d) };
2882 const float dy[10] = { cosf(0.0), cosf(d), cosf(2 * d), cosf(3 * d), cosf(4 * d),
2883 cosf(5 * d), cosf(6 * d), cosf(7 * d), cosf(8 * d), cosf(9 * d) };
2884 cairo_move_to(cr, 0.5 + r1 * dx[0], 0.5 - r1 * dy[0]);
2885 for(int k = 1; k < 10; k++)
2886 if(k & 1)
2887 cairo_line_to(cr, 0.5 + r2 * dx[k], 0.5 - r2 * dy[k]);
2888 else
2889 cairo_line_to(cr, 0.5 + r1 * dx[k], 0.5 - r1 * dy[k]);
2890 cairo_close_path(cr);
2891 cairo_stroke(cr);
2892
2893 FINISH
2894}
2895
2896void dtgtk_cairo_paint_modulegroup_basics(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2897{
2898 PREAMBLE(1.1, 1, 0, 0)
2899
2900 // the colors
2901 double r, g, b, a;
2902 cairo_pattern_get_rgba(cairo_get_source(cr), &r, &g, &b, &a);
2903 double na = a * 0.7;
2904 // the stroke width
2905 double sw = cairo_get_line_width(cr);
2906
2907 // background sliders
2908 cairo_set_source_rgba(cr, r, g, b, na);
2909 cairo_set_line_width(cr, sw * 1.2);
2910 cairo_move_to(cr, 0.1, 0.2);
2911 cairo_line_to(cr, 0.9, 0.2);
2912 cairo_stroke(cr);
2913 cairo_move_to(cr, 0.1, 0.55);
2914 cairo_line_to(cr, 0.9, 0.55);
2915 cairo_stroke(cr);
2916 cairo_move_to(cr, 0.1, 0.9);
2917 cairo_line_to(cr, 0.9, 0.9);
2918 cairo_stroke(cr);
2919
2920 // foreground sliders
2921 cairo_set_source_rgba(cr, r, g, b, a);
2922 cairo_set_line_width(cr, sw);
2923 cairo_move_to(cr, 0.1, 0.2);
2924 cairo_line_to(cr, 0.6, 0.2);
2925 cairo_stroke(cr);
2926 cairo_move_to(cr, 0.9, 0.55);
2927 cairo_line_to(cr, 0.3, 0.55);
2928 cairo_stroke(cr);
2929 cairo_move_to(cr, 0.1, 0.9);
2930 cairo_line_to(cr, 0.4, 0.9);
2931 cairo_stroke(cr);
2932
2933 // cursors
2934 cairo_move_to(cr, 0.70, 0.0);
2935 cairo_line_to(cr, 0.81, 0.30);
2936 cairo_line_to(cr, 0.59, 0.30);
2937 cairo_close_path(cr);
2938 cairo_fill(cr);
2939 cairo_move_to(cr, 0.2, 0.35);
2940 cairo_line_to(cr, 0.31, 0.65);
2941 cairo_line_to(cr, 0.09, 0.65);
2942 cairo_close_path(cr);
2943 cairo_fill(cr);
2944 cairo_move_to(cr, 0.55, 0.70);
2945 cairo_line_to(cr, 0.66, 1.0);
2946 cairo_line_to(cr, 0.44, 1.0);
2947 cairo_close_path(cr);
2948 cairo_fill(cr);
2949
2950 FINISH
2951}
2952
2953void dtgtk_cairo_paint_modulegroup_basic(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2954{
2955 PREAMBLE(1.1, 1, 0, 0)
2956
2957 /* draw circle */
2958 cairo_arc(cr, 0.5, 0.5, 0.40, -M_PI, M_PI);
2959 cairo_stroke(cr);
2960
2961 FINISH
2962}
2963
2964void dtgtk_cairo_paint_modulegroup_tone(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2965{
2966 PREAMBLE(1.1, 1, 0, 0)
2967
2968 /* draw circle */
2969 cairo_arc(cr, 0.5, 0.5, 0.40, -M_PI, M_PI);
2970 cairo_stroke(cr);
2971
2972 /* fill circle */
2973 cairo_pattern_t *pat = NULL;
2974 pat = cairo_pattern_create_linear(0, 0, 1, 0);
2975 cairo_pattern_add_color_stop_rgba(pat, 0, 1, 1, 1, 1);
2976 cairo_pattern_add_color_stop_rgba(pat, 1, 1, 1, 1, 0);
2977 cairo_set_source(cr, pat);
2978 cairo_arc(cr, 0.5, 0.5, 0.40, -M_PI, M_PI);
2979 cairo_fill(cr);
2980 cairo_pattern_destroy(pat);
2981
2982 FINISH
2983}
2984
2985void dtgtk_cairo_paint_modulegroup_color(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
2986{
2987 PREAMBLE(1.1, 1, 0, 0)
2988
2989 /* draw circle */
2990 cairo_arc(cr, 0.5, 0.5, 0.40, -M_PI, M_PI);
2991 cairo_stroke(cr);
2992
2993 /* fill circle */
2994 float a = 0.6;
2995 cairo_pattern_t *pat = NULL;
2996 pat = cairo_pattern_create_linear(0, 0, 1, 0);
2997 cairo_pattern_add_color_stop_rgba(pat, 0.0, 1, 0, 0, a);
2998 cairo_pattern_add_color_stop_rgba(pat, 0.1, 1, 0, 0, a);
2999 cairo_pattern_add_color_stop_rgba(pat, 0.5, 0, 1, 0, a);
3000 cairo_pattern_add_color_stop_rgba(pat, 0.9, 0, 0, 1, a);
3001 cairo_pattern_add_color_stop_rgba(pat, 1.0, 0, 0, 1, a);
3002 cairo_set_source(cr, pat);
3003 cairo_arc(cr, 0.5, 0.5, 0.40, -M_PI, M_PI);
3004 cairo_fill(cr);
3005 cairo_pattern_destroy(pat);
3006
3007 FINISH
3008}
3009
3010void dtgtk_cairo_paint_modulegroup_correct(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3011{
3012 PREAMBLE(1.1, 1, 0, 0)
3013
3014 /* draw circle */
3015 cairo_arc(cr, 0.42, 0.5, 0.40, 0, M_PI);
3016 cairo_stroke(cr);
3017 cairo_arc(cr, 0.58, 0.5, 0.40, M_PI, 0);
3018 cairo_stroke(cr);
3019
3020 FINISH
3021}
3022
3023void dtgtk_cairo_paint_modulegroup_effect(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3024{
3025 PREAMBLE(1.1, 1, 0, 0)
3026
3027 /* draw circle */
3028 cairo_arc(cr, 0.5, 0.5, 0.40, -M_PI, M_PI);
3029 cairo_stroke(cr);
3030
3031 /* sparkles */
3032
3033 cairo_move_to(cr, 0.378, 0.502);
3034 cairo_line_to(cr, 0.522, 0.549);
3035 cairo_line_to(cr, 0.564, 0.693);
3036 cairo_line_to(cr, 0.653, 0.569);
3037 cairo_line_to(cr, 0.802, 0.573);
3038 cairo_line_to(cr, 0.712, 0.449);
3039 cairo_line_to(cr, 0.762, 0.308);
3040 cairo_line_to(cr, 0.618, 0.356);
3041 cairo_line_to(cr, 0.500, 0.264);
3042 cairo_line_to(cr, 0.500, 0.417);
3043 cairo_close_path(cr);
3044
3045 cairo_move_to(cr, 0.269, 0.717);
3046 cairo_line_to(cr, 0.322, 0.735);
3047 cairo_line_to(cr, 0.337, 0.787);
3048 cairo_line_to(cr, 0.370, 0.742);
3049 cairo_line_to(cr, 0.424, 0.743);
3050 cairo_line_to(cr, 0.391, 0.698);
3051 cairo_line_to(cr, 0.409, 0.646);
3052 cairo_line_to(cr, 0.357, 0.664);
3053 cairo_line_to(cr, 0.314, 0.630);
3054 cairo_line_to(cr, 0.314, 0.686);
3055
3056 cairo_move_to(cr, 0.217, 0.366);
3057 cairo_line_to(cr, 0.271, 0.384);
3058 cairo_line_to(cr, 0.286, 0.437);
3059 cairo_line_to(cr, 0.319, 0.391);
3060 cairo_line_to(cr, 0.374, 0.393);
3061 cairo_line_to(cr, 0.341, 0.347);
3062 cairo_line_to(cr, 0.360, 0.295);
3063 cairo_line_to(cr, 0.306, 0.312);
3064 cairo_line_to(cr, 0.263, 0.279);
3065 cairo_line_to(cr, 0.263, 0.335);
3066
3067 cairo_close_path(cr);
3068
3069 cairo_stroke(cr);
3070
3071 FINISH
3072}
3073
3074void dtgtk_cairo_paint_modulegroup_grading(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3075{
3076 PREAMBLE(1.2, 1, 0, 0)
3077
3078 /* draw circle */
3079 cairo_arc(cr, 0.5, 0.5, 0.40, -M_PI, M_PI);
3080 cairo_stroke_preserve(cr);
3081 cairo_clip(cr);
3082
3083 /* fill circle */
3084 float a = 0.6;
3085 cairo_pattern_t *pat = NULL;
3086 pat = cairo_pattern_create_linear(0, 0, 1, 0);
3087 cairo_pattern_add_color_stop_rgba(pat, 0.00, 1, 0, 0, a);
3088 cairo_pattern_add_color_stop_rgba(pat, 0.10, 1, 0, 0, a);
3089 cairo_pattern_add_color_stop_rgba(pat, 0.40, 1, 1, 0, a);
3090 cairo_pattern_add_color_stop_rgba(pat, 0.50, 0, 1, 0, a);
3091 cairo_pattern_add_color_stop_rgba(pat, 0.60, 0, 1, 1, a);
3092 cairo_pattern_add_color_stop_rgba(pat, 0.90, 0, 0, 1, a);
3093 cairo_pattern_add_color_stop_rgba(pat, 1.00, 0, 0, 1, a);
3094 cairo_set_source(cr, pat);
3095 cairo_arc(cr, 0.5, 0.5, 0.40, -M_PI, M_PI);
3096 cairo_fill(cr);
3097 cairo_pattern_destroy(pat);
3098
3099 pat = cairo_pattern_create_linear(0, 0, 0, 1);
3100 cairo_pattern_add_color_stop_rgba(pat, 0.0, 1, 1, 1, a);
3101 cairo_pattern_add_color_stop_rgba(pat, 0.5, 0.5, 0.5, 0.5, a);
3102 cairo_pattern_add_color_stop_rgba(pat, 1.0, 0, 0, 0, a);
3103 cairo_set_source(cr, pat);
3104 cairo_arc(cr, 0.5, 0.5, 0.40, -M_PI, M_PI);
3105
3106 cairo_set_operator(cr, CAIRO_OPERATOR_ADD);
3107 cairo_fill_preserve(cr);
3108 cairo_set_operator(cr, CAIRO_OPERATOR_MULTIPLY);
3109 cairo_fill(cr);
3110
3111 cairo_pattern_destroy(pat);
3112
3113 FINISH
3114}
3115
3116void dtgtk_cairo_paint_modulegroup_technical(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3117{
3118 PREAMBLE(1.2, 1, 0, 0)
3119
3120 /* draw circle */
3121 cairo_arc(cr, 0.5, 0.5, 0.4, -M_PI, M_PI);
3122 cairo_stroke(cr);
3123
3124 /* draw thin lens */
3125 cairo_arc(cr, 0.05, 0.5, 0.55, -0.6107259643892086, 0.6107259643892086);
3126 cairo_arc(cr, 0.95, 0.5, 0.55, 2.5308666892005847, 3.7523186179790016);
3127 cairo_fill(cr);
3128
3129 /* draw the rays */
3130 cairo_move_to(cr, 0.3, 0.3);
3131 cairo_line_to(cr, 0.5, 0.3);
3132 cairo_line_to(cr, 0.8, 0.5);
3133 cairo_stroke(cr);
3134
3135 cairo_move_to(cr, 0.25, 0.5);
3136 cairo_line_to(cr, 0.80, 0.5);
3137 cairo_stroke(cr);
3138
3139 cairo_move_to(cr, 0.3, 0.7);
3140 cairo_line_to(cr, 0.5, 0.7);
3141 cairo_line_to(cr, 0.80, 0.5);
3142 cairo_stroke(cr);
3143
3144 FINISH
3145}
3146
3147void dtgtk_cairo_paint_map_pin(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3148{
3149 PREAMBLE(1, 1, 0, 0)
3150
3151 cairo_move_to(cr, 0.2, 0.0);
3152 cairo_line_to(cr, 0.0, 1.0);
3153 cairo_line_to(cr, 0.7, 0.0);
3154 cairo_close_path(cr);
3155 cairo_fill(cr);
3156
3157 FINISH
3158}
3159
3160void dtgtk_cairo_paint_tool_clone(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3161{
3162 PREAMBLE(1, 1, 0, 0)
3163
3164 cairo_arc(cr, 0.65, 0.35, 0.35, 0, 2 * M_PI);
3165 cairo_stroke(cr);
3166
3167 cairo_arc(cr, 0.35, 0.65, 0.35, 0, 2 * M_PI);
3168 cairo_stroke(cr);
3169
3170 FINISH
3171}
3172
3173void dtgtk_cairo_paint_tool_heal(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3174{
3175 PREAMBLE(1, 1, 0, 0)
3176
3177 cairo_set_line_width(cr, 0.01);
3178 cairo_move_to(cr, 0.35, 0.1);
3179 cairo_rel_line_to(cr, 0.3, 0.0);
3180 cairo_rel_line_to(cr, 0.0, 0.25);
3181 cairo_rel_line_to(cr, 0.25, 0.0);
3182 cairo_rel_line_to(cr, 0.0, 0.3);
3183 cairo_rel_line_to(cr, -0.25, 0.0);
3184 cairo_rel_line_to(cr, 0.0, 0.25);
3185 cairo_rel_line_to(cr, -0.3, 0.0);
3186 cairo_rel_line_to(cr, 0.0, -0.25);
3187 cairo_rel_line_to(cr, -0.25, 0.0);
3188 cairo_rel_line_to(cr, 0.0, -0.3);
3189 cairo_rel_line_to(cr, 0.25, 0.0);
3190 cairo_close_path(cr);
3191
3192 cairo_rectangle(cr, 0., 0., 1., 1.);
3193
3194 cairo_set_fill_rule(cr, CAIRO_FILL_RULE_EVEN_ODD);
3195 cairo_fill(cr);
3196 cairo_stroke(cr);
3197
3198 FINISH
3199}
3200
3201void dtgtk_cairo_paint_tool_fill(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3202{
3203 PREAMBLE(1.08, 1, 0, 0)
3204
3205 cairo_move_to(cr, 0.1, 0.1);
3206 cairo_line_to(cr, 0.2, 0.1);
3207 cairo_line_to(cr, 0.2, 0.9);
3208 cairo_line_to(cr, 0.8, 0.9);
3209 cairo_line_to(cr, 0.8, 0.1);
3210 cairo_line_to(cr, 0.9, 0.1);
3211 cairo_stroke(cr);
3212 cairo_rectangle(cr, 0.2, 0.4, .6, .5);
3213 cairo_fill(cr);
3214 cairo_stroke(cr);
3215
3216 FINISH
3217}
3218
3219void dtgtk_cairo_paint_tool_blur(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3220{
3221 PREAMBLE(1.1, 1, 0, 0)
3222
3223 cairo_move_to(cr, 0.5, 0.1);
3224 cairo_arc(cr, 0.5, 0.65, 0.28, -0.2 * M_PI, 1.2 * M_PI);
3225 cairo_close_path(cr);
3226 cairo_stroke(cr);
3227 cairo_set_line_width(cr, 0.1);
3228 cairo_arc(cr, 0.5, 0.65, 0.13, 0.65 * M_PI, 1.2 * M_PI);
3229 cairo_stroke(cr);
3230
3231 FINISH
3232}
3233
3234void dtgtk_cairo_paint_paste_forms(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3235{
3236 PREAMBLE(1, 1, 0, 0)
3237
3238 cairo_move_to(cr, 0.1, 0.6);
3239 cairo_line_to(cr, 0.9, 0.6);
3240 cairo_line_to(cr, 0.5, 1.0);
3241 cairo_close_path(cr);
3242 cairo_fill(cr);
3243 cairo_stroke(cr);
3244
3245 cairo_move_to(cr, 0.4, 0.0);
3246 cairo_line_to(cr, 0.6, 0.0);
3247 cairo_line_to(cr, 0.6, 0.6);
3248 cairo_line_to(cr, 0.4, 0.6);
3249 cairo_fill(cr);
3250 cairo_stroke(cr);
3251
3252 FINISH
3253}
3254
3255void dtgtk_cairo_paint_cut_forms(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3256{
3257 PREAMBLE(1, 1, 0, -0.07)
3258
3259 cairo_set_line_width(cr, 0.1);
3260 if(flags & CPF_ACTIVE)
3261 {
3262 cairo_move_to(cr, 0.11, 0.25);
3263 cairo_line_to(cr, 0.89, 0.75);
3264 cairo_move_to(cr, 0.25, 0.11);
3265 cairo_line_to(cr, 0.75, 0.89);
3266 cairo_stroke(cr);
3267
3268 cairo_arc(cr, 0.89, 0.53, 0.17, 0, 2 * M_PI);
3269 cairo_stroke(cr);
3270
3271 cairo_arc(cr, 0.53, 0.89, 0.17, 0, 2 * M_PI);
3272 cairo_stroke(cr);
3273 }
3274 else
3275 {
3276 cairo_move_to(cr, 0.01, 0.35);
3277 cairo_line_to(cr, 0.99, 0.65);
3278 cairo_move_to(cr, 0.35, 0.01);
3279 cairo_line_to(cr, 0.65, 0.99);
3280 cairo_stroke(cr);
3281
3282 cairo_arc(cr, 0.89, 0.53, 0.17, 0, 2 * M_PI);
3283 cairo_stroke(cr);
3284
3285 cairo_arc(cr, 0.53, 0.89, 0.17, 0, 2 * M_PI);
3286 cairo_stroke(cr);
3287 }
3288
3289 FINISH
3290}
3291
3292void dtgtk_cairo_paint_display_wavelet_scale(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3293{
3294 PREAMBLE(0.93, 1, 0, 0)
3295
3296 if(flags & CPF_ACTIVE)
3297 {
3298 float x1 = 0.2f;
3299 float y1 = 1.f;
3300
3301 cairo_move_to(cr, x1, y1);
3302
3303 const int steps = 4;
3304 const float delta = 1. / (float)steps;
3305 for(int i = 0; i < steps; i++)
3306 {
3307 y1 -= delta;
3308 cairo_line_to(cr, x1, y1);
3309 x1 += delta;
3310 if(x1 > .9) x1 = .9;
3311 cairo_line_to(cr, x1, y1);
3312 }
3313 cairo_stroke(cr);
3314
3315 cairo_set_line_width(cr, 0.1);
3316 cairo_rectangle(cr, 0., 0., 1., 1.);
3317 cairo_stroke(cr);
3318 }
3319 else
3320 {
3321 cairo_move_to(cr, 0.08, 1.);
3322 cairo_curve_to(cr, 0.4, 0.05, 0.6, 0.05, 1., 1.);
3323 cairo_line_to(cr, 0.08, 1.);
3324 cairo_fill(cr);
3325
3326 cairo_set_line_width(cr, 0.1);
3327 cairo_rectangle(cr, 0., 0., 1., 1.);
3328 cairo_stroke(cr);
3329 }
3330
3331 FINISH
3332}
3333
3334void dtgtk_cairo_paint_auto_levels(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3335{
3336 PREAMBLE(1, 1, 0, 0)
3337
3338 cairo_move_to(cr, .1, 0.3);
3339 cairo_line_to(cr, .1, 1.);
3340 cairo_stroke(cr);
3341
3342 cairo_move_to(cr, .5, 0.1);
3343 cairo_line_to(cr, .5, 1.);
3344 cairo_stroke(cr);
3345
3346 cairo_move_to(cr, .9, 0.3);
3347 cairo_line_to(cr, .9, 1.);
3348 cairo_stroke(cr);
3349
3350 cairo_move_to(cr, 0., 1.0);
3351 cairo_line_to(cr, 1.0, 1.0);
3352 cairo_stroke(cr);
3353
3354 FINISH
3355}
3356
3357void _compass_star(cairo_t *cr, double cx, double cy, double size)
3358{
3359 const double a = size / 2.0;
3360 const double b = size / 10.0;
3361
3362 cairo_move_to(cr, cx, cy - a);
3363 cairo_line_to(cr, cx + b, cy - b);
3364 cairo_line_to(cr, cx + a, cy);
3365 cairo_line_to(cr, cx + b, cy + b);
3366 cairo_line_to(cr, cx, cy + a);
3367 cairo_line_to(cr, cx - b, cy + b);
3368 cairo_line_to(cr, cx - a, cy);
3369 cairo_line_to(cr, cx - b, cy - b);
3370 cairo_close_path(cr);
3371 cairo_fill(cr);
3372}
3373
3374void dtgtk_cairo_paint_compass_star(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3375{
3376 PREAMBLE(1, 1, 0 , 0)
3377
3378 _compass_star(cr, .5, .5, 1.);
3379
3380 FINISH
3381}
3382
3383void dtgtk_cairo_paint_wand(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3384{
3385 PREAMBLE(1, 1, 0, 0)
3386
3387 // the wand
3388 cairo_move_to(cr, 1., .85);
3389 cairo_line_to(cr, .85, 1.);
3390 cairo_line_to(cr, .2, .35);
3391 cairo_line_to(cr, .35, .2);
3392 cairo_close_path(cr);
3393 //cairo_stroke_preserve(cr);
3394 cairo_fill_preserve(cr);
3395 cairo_line_to(cr, .15, 0);
3396 cairo_line_to(cr, 0, .15);
3397 cairo_line_to(cr, .2, .35);
3398 cairo_stroke(cr);
3399
3400 // the magic
3401 _compass_star(cr, .5, .1, .25);
3402 _compass_star(cr, .2, .65, .4);
3403 _compass_star(cr, .75, .25, .5);
3404
3405 FINISH
3406}
3407
3408void dtgtk_cairo_paint_lt_mode_grid(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3409{
3410 PREAMBLE(1.4, 1, 0, 0)
3411
3412 cairo_rectangle(cr, 0.05, 0.2, 0.9, 0.6);
3413 cairo_move_to(cr, 0.06, 0.5);
3414 cairo_line_to(cr, 0.94, 0.5);
3415 cairo_move_to(cr, 0.35, 0.21);
3416 cairo_line_to(cr, 0.35, 0.79);
3417 cairo_move_to(cr, 0.65, 0.21);
3418 cairo_line_to(cr, 0.65, 0.79);
3419 cairo_stroke(cr);
3420
3421 cairo_set_line_width(cr, 0.08);
3422 cairo_rectangle(cr, 0.35, 0.5, 0.3, 0.3);
3423 cairo_stroke(cr);
3424
3425 FINISH
3426}
3427
3428void dtgtk_cairo_paint_lt_mode_zoom(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3429{
3430 PREAMBLE(1.4, 1, 0, 0)
3431
3432 cairo_rectangle(cr, 0.3, 0.2, 0.5, 0.34);
3433
3434 cairo_move_to(cr, 0, 0.2);
3435 cairo_line_to(cr, 0.2, 0.2);
3436 cairo_line_to(cr, 0.2, 0.54);
3437 cairo_line_to(cr, 0, 0.54);
3438
3439 cairo_move_to(cr, 1, 0.2);
3440 cairo_line_to(cr, 0.9, 0.2);
3441 cairo_line_to(cr, 0.9, 0.54);
3442 cairo_line_to(cr, 1, 0.54);
3443
3444 cairo_move_to(cr, 0, 0.65);
3445 cairo_line_to(cr, 0.2, 0.65);
3446 cairo_line_to(cr, 0.2, 0.8);
3447
3448 cairo_move_to(cr, 0.3, 0.8);
3449 cairo_line_to(cr, 0.3, 0.65);
3450 cairo_line_to(cr, 0.8, 0.65);
3451 cairo_line_to(cr, 0.8, 0.8);
3452
3453 cairo_stroke(cr);
3454
3455 FINISH
3456}
3457
3458void dtgtk_cairo_paint_lt_mode_culling_fixed(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3459{
3460 PREAMBLE(1.4, 1, 0, 0)
3461
3462 cairo_rectangle(cr, 0.16, 0.22, 0.31, 0.56);
3463 cairo_rectangle(cr, 0.53, 0.22, 0.31, 0.56);
3464 cairo_stroke(cr);
3465
3466 cairo_move_to(cr, 0.11, 0.4);
3467 cairo_line_to(cr, 0, 0.5);
3468 cairo_line_to(cr, 0.11, 0.6);
3469 cairo_fill(cr);
3470
3471 cairo_move_to(cr, 0.89, 0.4);
3472 cairo_line_to(cr, 1, 0.5);
3473 cairo_line_to(cr, 0.89, 0.6);
3474 cairo_fill(cr);
3475
3476// draw X
3477 cairo_move_to(cr, 0.22, 0.36);
3478 cairo_line_to(cr, 0.40, 0.64);
3479 cairo_move_to(cr, 0.22, 0.64);
3480 cairo_line_to(cr, 0.40, 0.36);
3481
3482// draw Y
3483 cairo_move_to(cr, 0.59, 0.36);
3484 cairo_line_to(cr, 0.68, 0.5);
3485 cairo_line_to(cr, 0.77, 0.36);
3486 cairo_move_to(cr, 0.68, 0.5);
3487 cairo_line_to(cr, 0.68, 0.64);
3488
3489 cairo_stroke(cr);
3490
3491 FINISH
3492}
3493
3494void dtgtk_cairo_paint_lt_mode_culling_dynamic(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3495{
3496 PREAMBLE(1.4, 1, 0, 0)
3497
3498 cairo_rectangle(cr, 0.16, 0.22, 0.31, 0.56);
3499 cairo_rectangle(cr, 0.53, 0.22, 0.31, 0.56);
3500 cairo_stroke(cr);
3501
3502// draw X
3503 cairo_move_to(cr, 0.22, 0.36);
3504 cairo_line_to(cr, 0.40, 0.64);
3505 cairo_move_to(cr, 0.22, 0.64);
3506 cairo_line_to(cr, 0.40, 0.36);
3507
3508// draw Y
3509 cairo_move_to(cr, 0.59, 0.36);
3510 cairo_line_to(cr, 0.68, 0.5);
3511 cairo_line_to(cr, 0.77, 0.36);
3512 cairo_move_to(cr, 0.68, 0.5);
3513 cairo_line_to(cr, 0.68, 0.64);
3514
3515 cairo_stroke(cr);
3516
3517 FINISH
3518}
3519
3520void dtgtk_cairo_paint_lt_mode_fullpreview(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3521{
3522 PREAMBLE(1.4, 1, 0, 0)
3523
3524 cairo_rectangle(cr, 0.07, 0.22, 0.86, 0.56);
3525 cairo_stroke(cr);
3526
3527 cairo_move_to(cr, 0.19, 0.29);
3528 cairo_line_to(cr, 0.19, 0.43);
3529 cairo_line_to(cr, 0.33, 0.29);
3530 cairo_fill(cr);
3531
3532 cairo_move_to(cr, 0.19, 0.71);
3533 cairo_line_to(cr, 0.19, 0.57);
3534 cairo_line_to(cr, 0.33, 0.71);
3535 cairo_fill(cr);
3536
3537 cairo_move_to(cr, 0.81, 0.71);
3538 cairo_line_to(cr, 0.81, 0.57);
3539 cairo_line_to(cr, 0.67, 0.71);
3540 cairo_fill(cr);
3541
3542 cairo_move_to(cr, 0.81, 0.29);
3543 cairo_line_to(cr, 0.81, 0.43);
3544 cairo_line_to(cr, 0.67, 0.29);
3545 cairo_fill(cr);
3546
3547 cairo_move_to(cr, 0.27, 0.37);
3548 cairo_line_to(cr, 0.30, 0.40);
3549 cairo_move_to(cr, 0.27, 0.63);
3550 cairo_line_to(cr, 0.30, 0.60);
3551 cairo_move_to(cr, 0.73, 0.63);
3552 cairo_line_to(cr, 0.70, 0.60);
3553 cairo_move_to(cr, 0.73, 0.37);
3554 cairo_line_to(cr, 0.70, 0.40);
3555 cairo_stroke(cr);
3556
3557 FINISH
3558}
3559
3560void dtgtk_cairo_paint_link(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3561{
3562 PREAMBLE(1, 1, 0, 0)
3563
3564 cairo_set_line_width(cr, .1);
3565
3566 //arrow
3567 cairo_move_to(cr, .5, .5);
3568 cairo_line_to(cr, 1., 0.);
3569 cairo_stroke(cr);
3570 cairo_move_to(cr, .65, 0.);
3571 cairo_line_to(cr, 1., 0.);
3572 cairo_line_to(cr, 1., .35);
3573 cairo_stroke(cr);
3574
3575 //rounded rectangle
3576 cairo_move_to(cr, .8, .6);
3577 cairo_line_to(cr, .8, .85);
3578 cairo_arc (cr, .65, .85, .15, 0., .5 * M_PI);
3579 cairo_line_to(cr, .15, 1.);
3580 cairo_arc (cr, .15, .85, .15, .5 * M_PI, M_PI);
3581 cairo_line_to(cr, 0., .35);
3582 cairo_arc (cr, .15, .35, .15, M_PI, 1.5 * M_PI);
3583 cairo_line_to(cr, .4, .2);
3584 cairo_stroke(cr);
3585
3586 FINISH
3587}
3588
3589void dtgtk_cairo_paint_shortcut(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3590{
3591 PREAMBLE(1.15, 1, 0, 0)
3592
3593 //keyboard outline
3594 cairo_set_line_width(cr, .05);
3595 cairo_set_line_join(cr, CAIRO_LINE_JOIN_ROUND);
3596
3597 cairo_move_to(cr, .9, .27);
3598 cairo_line_to(cr, .1, .27);
3599 cairo_line_to(cr, .1, .73);
3600 cairo_line_to(cr, .9, .73);
3601 cairo_line_to(cr, .9, .27);
3602
3603 cairo_stroke(cr);
3604
3605 //keyboard buttons
3606
3607 const double cr_linewidth=.04;
3608 const int toprow_keycount = 7;
3609
3610 cairo_set_line_width(cr, cr_linewidth);
3611 cairo_set_line_join(cr, CAIRO_LINE_JOIN_MITER);
3612 cairo_set_line_cap(cr, CAIRO_LINE_CAP_ROUND);
3613
3614 const double kheight = .73-.27;
3615 const double kwidth = .9 - .1;
3616 const double rspace = (kheight - cr_linewidth*3.)/4.;
3617 const double keylength = (kwidth-(cr_linewidth*2.0))/((double)toprow_keycount+((double)toprow_keycount/0.9));
3618 const double keyspace = keylength / 0.9;
3619 const double spacelength = kwidth / 2.0;
3620
3621 // top row
3622 double keyrowwidth = keylength * toprow_keycount + keyspace*(toprow_keycount-1);
3623 double rowstartpos = .1 + (kwidth - keyrowwidth)/2;
3624 for(int i=0; i < 7; i++)
3625 {
3626 cairo_move_to(cr, rowstartpos + i*(keylength+keyspace), .27+rspace+cr_linewidth);
3627 cairo_line_to(cr, rowstartpos + i*(keylength+keyspace)+keylength, .27+rspace+cr_linewidth);
3628 }
3629
3630 // middle row
3631 keyrowwidth = keylength * (toprow_keycount-1) + keyspace*(toprow_keycount-2);
3632 rowstartpos = .1 + (kwidth - keyrowwidth)/2;
3633 for(int i=0; i < 6; i++)
3634 {
3635 cairo_move_to(cr, rowstartpos + i*(keylength+keyspace), .27+(rspace+cr_linewidth)*2);
3636 cairo_line_to(cr, rowstartpos + i*(keylength+keyspace)+keylength, .27+(rspace+cr_linewidth)*2);
3637 }
3638
3639 // 3rd (space) row
3640 keyrowwidth = spacelength;
3641 rowstartpos = .1 + (kwidth - keyrowwidth)/2;
3642 cairo_move_to(cr, rowstartpos , .27+(rspace+cr_linewidth)*3);
3643 cairo_line_to(cr, rowstartpos + spacelength, .27+(rspace+cr_linewidth)*3);
3644
3645 cairo_stroke(cr);
3646
3647 FINISH
3648}
3649
3650void dtgtk_cairo_paint_pin(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3651{
3652 PREAMBLE(1, 1, 0, 0)
3653
3654 // the needle
3655 cairo_move_to(cr, 0.5, 0.5);
3656 cairo_line_to(cr, 0, 1.0);
3657 cairo_stroke(cr);
3658
3659 // the main part
3660 cairo_move_to(cr, 0.13, 0.45);
3661 cairo_line_to(cr, 0.57, 0.88);
3662 cairo_line_to(cr, 0.67, 0.34);
3663 cairo_close_path(cr);
3664 cairo_fill(cr);
3665 cairo_move_to(cr, 0.61, 0);
3666 cairo_line_to(cr, 1.0, 0.4);
3667 cairo_line_to(cr, 0.34, 0.66);
3668 cairo_close_path(cr);
3669 cairo_fill(cr);
3670
3671 FINISH
3672}
3673
3674void dtgtk_cairo_paint_link_chain(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3675{
3676 PREAMBLE(1, 1, 0, 0)
3677
3678 const double radius = 0.20;
3679 const double offset = 0.24;
3680 const double height = (radius + offset) * 2.0;
3681 const double scale_y = 1 / height;
3682 const double angle = M_PI / 4.0;
3683
3684 cairo_translate(cr, 0.5, 0.5);
3685 cairo_rotate(cr, angle);
3686 cairo_scale(cr, 1, scale_y);
3687
3688 cairo_new_sub_path(cr);
3689 cairo_arc(cr, 0.0, -offset + 0.08, radius, 0, 1 * M_PI);
3690 cairo_arc(cr, 0.0, -offset - 0.08, radius, 1 * M_PI, 2 * M_PI);
3691 cairo_close_path(cr);
3692
3693 cairo_new_sub_path(cr);
3694 cairo_arc(cr, 0.0, offset + 0.08, radius, 0, 1 * M_PI);
3695 cairo_arc(cr, 0.0, offset - 0.08, radius, 1 * M_PI, 2 * M_PI);
3696 cairo_close_path(cr);
3697
3698 cairo_stroke(cr);
3699
3700 FINISH
3701}
3702
3710void dtgtk_cairo_paint_flowchart(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
3711{
3712 PREAMBLE(1, 1, 0, 0)
3713
3714 // Draw in a SOURCE group so overlapping strokes don't accumulate alpha.
3715 const cairo_operator_t prev_operator = cairo_get_operator(cr);
3716 cairo_push_group(cr);
3717 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
3718
3719 cairo_set_line_cap(cr, CAIRO_LINE_CAP_SQUARE);
3720
3721 const double width = 0.25;
3722 const double height = 0.25;
3723 const double margin = 0.05;
3724
3725 // Rectangle positions and dimensions
3726 const double left = margin;
3727 const double top = margin;
3728 const double right = 1.0 - margin - width;
3729 const double bottom = 1.0 - margin - height;
3730 const double center_x = margin + width * 0.5;
3731 const double half_width = width * 0.5;
3732
3733 // Draw rectangles forming flowchart boxes
3734 cairo_rectangle(cr, left, top, width, height);
3735 cairo_rectangle(cr, right, top, width, height);
3736 cairo_rectangle(cr, left, bottom, width, height);
3737
3738 // Draw vertical connector line
3739 cairo_move_to(cr, center_x, bottom);
3740 cairo_line_to(cr, center_x, top + height);
3741
3742 // Draw curved connector to right box
3743 cairo_move_to(cr, center_x, 0.5);
3744 cairo_curve_to(cr, right + half_width, 0.5, right + half_width, 0.5, right + half_width, margin + height);
3745
3746 cairo_stroke(cr);
3747
3748 cairo_pop_group_to_source(cr);
3749 cairo_set_operator(cr, prev_operator);
3750 cairo_paint(cr);
3751
3752 FINISH
3753}
3754
3755void dtgtk_liquify_cairo_paint_node_tool(cairo_t *cr, const gint x, const gint y, const gint w, const gint h,
3756 const gint flags, void *data)
3757{
3758 PREAMBLE(1, 1, 0, 0);
3759 cairo_arc(cr, 0.5, 0.5, 0.2, 0, 2 * M_PI);
3760 cairo_stroke(cr);
3761 FINISH;
3762}
3763
3764void dtgtk_liquify_cairo_paint_line_tool(cairo_t *cr, const gint x, const gint y, const gint w, const gint h,
3765 const gint flags, void *data)
3766{
3767 PREAMBLE(1, 1, 0, 0);
3768 cairo_move_to(cr, 0.1, 0.9);
3769 cairo_line_to(cr, 0.9, 0.1);
3770 cairo_stroke(cr);
3771 FINISH;
3772}
3773
3774void dtgtk_liquify_cairo_paint_curve_tool(cairo_t *cr, const gint x, const gint y, const gint w, const gint h,
3775 const gint flags, void *data)
3776{
3777 PREAMBLE(1, 1, 0, 0);
3778 cairo_move_to(cr, 0.1, 0.9);
3779 cairo_curve_to(cr, 0.1, 0.5, 0.5, 0.1, 0.9, 0.1);
3780 cairo_stroke(cr);
3781 FINISH;
3782}
3783
3784// clang-format off
3785// modelines: These editor modelines have been set for all relevant files by tools/update_modelines.py
3786// vim: shiftwidth=2 expandtab tabstop=2 cindent
3787// kate: tab-indents: off; indent-width 2; replace-tabs on; indent-mode cstyle; remove-trailing-spaces modified;
3788// clang-format on
static void set_color(cairo_t *cr, GdkRGBA color)
Definition bauhaus.h:446
int width
Definition bilateral.h:1
int height
Definition bilateral.h:1
static const dt_aligned_pixel_simd_t const dt_adaptation_t const float p
@ DT_COLORLABELS_PURPLE
Definition colorlabels.h:45
@ DT_COLORLABELS_GREEN
Definition colorlabels.h:43
@ DT_COLORLABELS_YELLOW
Definition colorlabels.h:42
@ DT_COLORLABELS_BLUE
Definition colorlabels.h:44
@ DT_COLORLABELS_LAST
Definition colorlabels.h:46
@ DT_COLORLABELS_RED
Definition colorlabels.h:41
enum dt_colorlables_enum dt_colorlabels_enum
static const float const float C
const float top
const float delta
#define S(V, params)
darktable_t darktable
Definition darktable.c:181
#define dt_free(ptr)
Definition darktable.h:456
static void dt_draw_star(cairo_t *cr, float x, float y, float r1, float r2)
Definition draw.h:120
void dtgtk_cairo_paint_help(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_lt_mode_culling_dynamic(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_empty(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_circle(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_raster(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_bulb(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_modulegroup_basic(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_inverse(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_modulegroup_grading(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_paste_forms(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_local_copy(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_remove(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_brush(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_minus_simple(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_difference(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_module_switch_on(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_zoom(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_refresh(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_overexposed(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_bracket(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_ellipse(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
Paint a 45 deg-rotated ellipse that touches the unit square boundaries.
void dtgtk_cairo_paint_masks_gradient(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_andnot(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_dropdown(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_plusminus(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_audio(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_polygon(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_camera(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_switch(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_lt_mode_grid(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_label_sel(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_switch_on(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_or(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_pin(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_structure(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_compass_star(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_draw_structure(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_rect_portrait(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_liquify_cairo_paint_curve_tool(cairo_t *cr, const gint x, const gint y, const gint w, const gint h, const gint flags, void *data)
void dtgtk_cairo_paint_label_flower(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_modulegroup_favorites(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_gamut_check(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_presets(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_line_arrow(cairo_t *cr, gint x, int y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_showmask(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_modulegroup_correct(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_cut_forms(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_triangle(cairo_t *cr, gint x, int y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_tool_heal(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_uniform(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_modulegroup_tone(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_directory(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_tool_blur(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_auto_levels(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_lock(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_text_label(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_treelist(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_lt_mode_zoom(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_map_pin(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_tool_clone(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_union(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_styles(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_liquify_cairo_paint_line_tool(cairo_t *cr, const gint x, const gint y, const gint w, const gint h, const gint flags, void *data)
void dtgtk_cairo_paint_overlays(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_sortby(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_lt_mode_culling_fixed(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_colorpicker(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_multiinstance(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_filmstrip(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_vectorscope(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_plus(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_flip(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_reject(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_switch_deprecated(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_switch_inactive(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_square_plus(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_grid(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_drawn(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_brush_and_inverse(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_linear_scale(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_flowchart(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
Paint the flowchart icon using normalized 0..1 coordinates.
void dtgtk_cairo_paint_modulegroup_technical(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_exclusion(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_module_switch(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_check_mark(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
static void _rounded_rectangle(cairo_t *cr)
Definition dtgtk/paint.c:76
void dtgtk_cairo_paint_alignment(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_and(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_rawoverexposed(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_solid_triangle(cairo_t *cr, gint x, int y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_cancel(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
static void _draw_plus_sign(cairo_t *cr, float x, float y, float size, float line_width_scale)
Draw a plus sign centered at the given position.
void dtgtk_liquify_cairo_paint_node_tool(cairo_t *cr, const gint x, const gint y, const gint w, const gint h, const gint flags, void *data)
void _gradient_arc(cairo_t *cr, double lw, int nb_steps, double x_center, double y_center, double radius, double angle_from, double angle_to, double color_from, double color_to, double alpha)
void dtgtk_cairo_paint_eye_toggle(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_luv(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_modulegroup_effect(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_rect_landscape(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_perspective(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_colorpicker_set_values(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_reset(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_eye(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_multi(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_modulegroup_active(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_lt_mode_fullpreview(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_ryb(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_aspectflip(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
#define FINISH
Definition dtgtk/paint.c:73
void dtgtk_cairo_paint_star(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_plus_simple(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_solid_arrow(cairo_t *cr, gint x, int y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_modulegroup_color(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_display_wavelet_scale(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_unaltered(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_altered(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_drawn_and_parametric(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_unratestar(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_label(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_store(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_tool_fill(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_rgb_parade(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_polygon(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_waveform_overlaid(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_focus_peaking(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_jzazbz(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_logarithmic_scale(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_intersection(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_arrow(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_vertgradient(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_timer(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_multiply_small(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_shortcut(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_switch_off(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_sorting(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
#define M_PI
Definition dtgtk/paint.c:59
void dtgtk_cairo_paint_modulegroup_basics(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_softproof(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_link_chain(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_wand(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_display(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_grouping(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_parametric(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_preferences(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_invert(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void _compass_star(cairo_t *cr, double cx, double cy, double size)
static void _paint_cursor_arrow(cairo_t *cr, const double tip_x, const double tip_y, const double size)
Paint the cursor arrow using the arrow tip position and a uniform size.
static void _draw_triangle(cairo_t *cr, const gint flags)
void dtgtk_cairo_paint_color(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_waveform_scope(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_histogram_scope(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
#define PREAMBLE(scaling, line_scaling, x_offset, y_offset)
Definition dtgtk/paint.c:62
void dtgtk_cairo_paint_masks_used(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_masks_edit(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
void dtgtk_cairo_paint_link(cairo_t *cr, gint x, gint y, gint w, gint h, gint flags, void *data)
@ CPF_SPECIAL_FLAG
Definition dtgtk/paint.h:71
@ CPF_DIRECTION_LEFT
Definition dtgtk/paint.h:63
@ CPF_ALTER
Definition dtgtk/paint.h:70
@ CPF_DIRECTION_UP
Definition dtgtk/paint.h:61
@ CPF_DIRECTION_RIGHT
Definition dtgtk/paint.h:64
@ CPF_DIRECTION_DOWN
Definition dtgtk/paint.h:62
@ CPF_PRELIGHT
Definition dtgtk/paint.h:68
@ CPF_ACTIVE
Definition dtgtk/paint.h:67
static const float x
float *const restrict const size_t k
size_t size
Definition mipmap_cache.c:3
dt_mipmap_buffer_dsc_flags flags
Definition mipmap_cache.c:4
#define lw
Definition retouch.c:1055
const float r
struct dt_bauhaus_t * bauhaus
Definition darktable.h:778
GdkRGBA colorlabels[DT_COLORLABELS_LAST]
Definition bauhaus.h:284
typedef double((*spd)(unsigned long int wavelength, double TempK))