1 /* Helpers.c generated by valac, the Vala compiler
2 * generated from Helpers.vala, do not modify */
5 Copyright 2009 by Hans Baier
11 using std::min; using std::max;
14 #include "gtkmm2ext/prolooks-helpers.h"
16 static gpointer cairo_color_parent_class = NULL;
17 static gpointer prolooks_hsl_parent_class = NULL;
18 static gpointer prolooks_hsv_parent_class = NULL;
20 CairoColor* cairo_color_construct (GType object_type, double red, double green, double blue, double alpha) {
22 self = (CairoColor*) g_type_create_instance (object_type);
23 cairo_color_set_red (self, red);
24 cairo_color_set_green (self, green);
25 cairo_color_set_blue (self, blue);
26 cairo_color_set_alpha (self, alpha);
31 CairoColor* cairo_color_new (double red, double green, double blue, double alpha) {
32 return cairo_color_construct (CAIRO_TYPE_COLOR, red, green, blue, alpha);
36 CairoColor* cairo_color_copy (CairoColor* self) {
37 CairoColor* result = NULL;
38 g_return_val_if_fail (self != NULL, NULL);
39 result = cairo_color_new (self->priv->_red, self->priv->_green, self->priv->_blue, self->priv->_alpha);
44 CairoColor* cairo_color_construct_from_string (GType object_type, const char* webcolor) {
46 g_return_val_if_fail (webcolor != NULL, NULL);
47 self = (CairoColor*) g_type_create_instance (object_type);
48 cairo_color_set_from_string (self, webcolor);
53 CairoColor* cairo_color_new_from_string (const char* webcolor) {
54 return cairo_color_construct_from_string (CAIRO_TYPE_COLOR, webcolor);
58 CairoColor* cairo_color_shade (CairoColor* self, double shade_factor) {
59 CairoColor* result = NULL;
61 g_return_val_if_fail (self != NULL, NULL);
62 hsl = prolooks_hsl_new ();
63 prolooks_hsl_from_cairo_color (hsl, self);
64 prolooks_hsl_set_lightness (hsl, fmin (prolooks_hsl_get_lightness (hsl) * shade_factor, 1.0));
65 prolooks_hsl_set_lightness (hsl, fmax (prolooks_hsl_get_lightness (hsl), 0.0));
66 prolooks_hsl_set_saturation (hsl, fmin (prolooks_hsl_get_saturation (hsl) * shade_factor, 1.0));
67 prolooks_hsl_set_saturation (hsl, fmax (prolooks_hsl_get_saturation (hsl), 0.0));
68 result = prolooks_hsl_to_cairo_color (hsl);
69 _prolooks_hsl_unref0 (hsl);
74 void cairo_color_set_to (CairoColor* self, CairoColor* a_color) {
75 g_return_if_fail (self != NULL);
76 g_return_if_fail (a_color != NULL);
77 cairo_color_set_red (self, a_color->priv->_red);
78 cairo_color_set_green (self, a_color->priv->_green);
79 cairo_color_set_blue (self, a_color->priv->_blue);
80 cairo_color_set_alpha (self, a_color->priv->_alpha);
84 void cairo_color_set_as_source_in (CairoColor* self, cairo_t* cr) {
85 g_return_if_fail (self != NULL);
86 g_return_if_fail (cr != NULL);
87 cairo_set_source_rgba (cr, self->priv->_red, self->priv->_green, self->priv->_blue, self->priv->_alpha);
91 void cairo_color_add_color_stop_to (CairoColor* self, cairo_pattern_t* p, double offset) {
92 g_return_if_fail (self != NULL);
93 g_return_if_fail (p != NULL);
94 cairo_pattern_add_color_stop_rgba (p, offset, self->priv->_red, self->priv->_green, self->priv->_blue, self->priv->_alpha);
98 void cairo_color_set_from_string (CairoColor* self, const char* webcolor) {
101 GdkColor _tmp0_ = {0,0,0,0};
102 g_return_if_fail (self != NULL);
103 g_return_if_fail (webcolor != NULL);
104 cairo_color_set_to (self, _tmp2_ = prolooks_gdk_color_to_cairo ((_tmp1_ = (prolooks_color_from_string (webcolor, &_tmp0_), _tmp0_), &_tmp1_)));
105 _cairo_color_unref0 (_tmp2_);
109 double cairo_color_get_red (CairoColor* self) {
111 g_return_val_if_fail (self != NULL, 0.0);
112 result = self->priv->_red;
117 void cairo_color_set_red (CairoColor* self, double value) {
118 g_return_if_fail (self != NULL);
119 self->priv->_red = value;
123 double cairo_color_get_green (CairoColor* self) {
125 g_return_val_if_fail (self != NULL, 0.0);
126 result = self->priv->_green;
131 void cairo_color_set_green (CairoColor* self, double value) {
132 g_return_if_fail (self != NULL);
133 self->priv->_green = value;
137 double cairo_color_get_blue (CairoColor* self) {
139 g_return_val_if_fail (self != NULL, 0.0);
140 result = self->priv->_blue;
145 void cairo_color_set_blue (CairoColor* self, double value) {
146 g_return_if_fail (self != NULL);
147 self->priv->_blue = value;
151 double cairo_color_get_alpha (CairoColor* self) {
153 g_return_val_if_fail (self != NULL, 0.0);
154 result = self->priv->_alpha;
159 void cairo_color_set_alpha (CairoColor* self, double value) {
160 g_return_if_fail (self != NULL);
161 self->priv->_alpha = value;
165 static void cairo_value_color_init (GValue* value) {
166 value->data[0].v_pointer = NULL;
170 static void cairo_value_color_free_value (GValue* value) {
171 if (value->data[0].v_pointer) {
172 cairo_color_unref (value->data[0].v_pointer);
177 static void cairo_value_color_copy_value (const GValue* src_value, GValue* dest_value) {
178 if (src_value->data[0].v_pointer) {
179 dest_value->data[0].v_pointer = cairo_color_ref (src_value->data[0].v_pointer);
181 dest_value->data[0].v_pointer = NULL;
186 static gpointer cairo_value_color_peek_pointer (const GValue* value) {
187 return value->data[0].v_pointer;
191 static gchar* cairo_value_color_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
192 (void) n_collect_values;
193 (void) collect_flags;
194 if (collect_values[0].v_pointer) {
196 object = (CairoColor*)collect_values[0].v_pointer;
197 if (object->parent_instance.g_class == NULL) {
198 return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
199 } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
200 return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
202 value->data[0].v_pointer = cairo_color_ref (object);
204 value->data[0].v_pointer = NULL;
210 static gchar* cairo_value_color_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
211 CairoColor** object_p;
212 (void) n_collect_values;
213 object_p = (CairoColor**)collect_values[0].v_pointer;
215 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME ((GValue*)value));
217 if (!value->data[0].v_pointer) {
219 } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
220 *object_p = (CairoColor*)value->data[0].v_pointer;
222 *object_p = (CairoColor*)cairo_color_ref (value->data[0].v_pointer);
228 GParamSpec* cairo_param_spec_color (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
229 CairoParamSpecColor* spec;
230 g_return_val_if_fail (g_type_is_a (object_type, CAIRO_TYPE_COLOR), NULL);
231 spec = (CairoParamSpecColor*)g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
232 G_PARAM_SPEC (spec)->value_type = object_type;
233 return G_PARAM_SPEC (spec);
237 gpointer cairo_value_get_color (const GValue* value) {
238 g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE ((GValue*)value, CAIRO_TYPE_COLOR), NULL);
239 return value->data[0].v_pointer;
243 void cairo_value_set_color (GValue* value, gpointer v_object) {
245 g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, CAIRO_TYPE_COLOR));
246 old = (CairoColor*)value->data[0].v_pointer;
248 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, CAIRO_TYPE_COLOR));
249 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
250 value->data[0].v_pointer = v_object;
251 cairo_color_ref (value->data[0].v_pointer);
253 value->data[0].v_pointer = NULL;
256 cairo_color_unref (old);
261 void cairo_value_take_color (GValue* value, gpointer v_object) {
263 g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, CAIRO_TYPE_COLOR));
264 old = (CairoColor*)value->data[0].v_pointer;
266 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, CAIRO_TYPE_COLOR));
267 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
268 value->data[0].v_pointer = v_object;
270 value->data[0].v_pointer = NULL;
273 cairo_color_unref (old);
277 static void cairo_color_finalize (CairoColor* obj) {
279 self = CAIRO_COLOR (obj);
282 static void cairo_color_class_init (CairoColorClass * klass) {
283 cairo_color_parent_class = g_type_class_peek_parent (klass);
284 CAIRO_COLOR_CLASS (klass)->finalize = cairo_color_finalize;
285 g_type_class_add_private (klass, sizeof (CairoColorPrivate));
289 static void cairo_color_instance_init (CairoColor * self) {
290 self->priv = CAIRO_COLOR_GET_PRIVATE (self);
296 GType cairo_color_get_type (void) {
297 static volatile gsize cairo_color_type_id__volatile = 0;
298 if (g_once_init_enter (&cairo_color_type_id__volatile)) {
299 static const GTypeValueTable g_define_type_value_table = { cairo_value_color_init, cairo_value_color_free_value, cairo_value_color_copy_value, cairo_value_color_peek_pointer, "p", cairo_value_color_collect_value, "p", cairo_value_color_lcopy_value };
300 static const GTypeInfo g_define_type_info = { sizeof (CairoColorClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) cairo_color_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (CairoColor), 0, (GInstanceInitFunc) cairo_color_instance_init, &g_define_type_value_table };
301 static const GTypeFundamentalInfo g_define_type_fundamental_info = { (GTypeFundamentalFlags)(G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
302 GType cairo_color_type_id;
303 cairo_color_type_id = g_type_register_fundamental (g_type_fundamental_next (), "CairoColor", &g_define_type_info, &g_define_type_fundamental_info, (GTypeFlags)0);
304 g_once_init_leave (&cairo_color_type_id__volatile, cairo_color_type_id);
306 return cairo_color_type_id__volatile;
310 gpointer cairo_color_ref (gpointer instance) {
312 self = (CairoColor*)instance;
313 g_atomic_int_inc (&self->ref_count);
318 void cairo_color_unref (gpointer instance) {
320 self = (CairoColor*)instance;
321 if (g_atomic_int_dec_and_test (&self->ref_count)) {
322 CAIRO_COLOR_GET_CLASS (self)->finalize (self);
323 g_type_free_instance ((GTypeInstance *) self);
328 GType prolooks_button_state_get_type (void) {
329 static volatile gsize prolooks_button_state_type_id__volatile = 0;
330 if (g_once_init_enter (&prolooks_button_state_type_id__volatile)) {
331 static const GEnumValue values[] = {{PROLOOKS_BUTTON_STATE_NORMAL, "PROLOOKS_BUTTON_STATE_NORMAL", "normal"}, {PROLOOKS_BUTTON_STATE_PRESSED, "PROLOOKS_BUTTON_STATE_PRESSED", "pressed"}, {0, NULL, NULL}};
332 GType prolooks_button_state_type_id;
333 prolooks_button_state_type_id = g_enum_register_static ("ProlooksButtonState", values);
334 g_once_init_leave (&prolooks_button_state_type_id__volatile, prolooks_button_state_type_id);
336 return prolooks_button_state_type_id__volatile;
340 GType prolooks_button_type_get_type (void) {
341 static volatile gsize prolooks_button_type_type_id__volatile = 0;
342 if (g_once_init_enter (&prolooks_button_type_type_id__volatile)) {
343 static const GEnumValue values[] = {{PROLOOKS_BUTTON_TYPE_PRESS_BUTTON, "PROLOOKS_BUTTON_TYPE_PRESS_BUTTON", "press-button"}, {PROLOOKS_BUTTON_TYPE_TOGGLE_BUTTON, "PROLOOKS_BUTTON_TYPE_TOGGLE_BUTTON", "toggle-button"}, {0, NULL, NULL}};
344 GType prolooks_button_type_type_id;
345 prolooks_button_type_type_id = g_enum_register_static ("ProlooksButtonType", values);
346 g_once_init_leave (&prolooks_button_type_type_id__volatile, prolooks_button_type_type_id);
348 return prolooks_button_type_type_id__volatile;
352 void prolooks_set_line_width_from_device (cairo_t* cr) {
355 g_return_if_fail (cr != NULL);
358 cairo_device_to_user (cr, &ux, &uy);
362 cairo_set_line_width (cr, ux);
366 void prolooks_color_from_string (const char* webcolor, GdkColor* result) {
367 GdkColor color = {0,0,0,0};
368 g_return_if_fail (webcolor != NULL);
369 gdk_color_parse (webcolor, &color);
375 char* prolooks_color_to_string (const GdkColor* color) {
378 scale = G_MAXUINT16 / G_MAXUINT8;
379 result = g_strdup_printf ("#%02x%02x%02x", (guint) ((*color).red / scale), (guint) ((*color).green / scale), (guint) ((*color).blue / scale));
384 CairoColor* prolooks_cairo_color_from_string (const char* webcolor) {
385 CairoColor* result = NULL;
387 GdkColor _tmp0_ = {0,0,0,0};
388 g_return_val_if_fail (webcolor != NULL, NULL);
389 result = prolooks_gdk_color_to_cairo ((_tmp1_ = (prolooks_color_from_string (webcolor, &_tmp0_), _tmp0_), &_tmp1_));
394 void prolooks_set_source_color (cairo_t* cr, const GdkColor* color, double alpha) {
395 g_return_if_fail (cr != NULL);
396 cairo_set_source_rgba (cr, ((double) (*color).red) / ((double) G_MAXUINT16), ((double) (*color).green) / ((double) G_MAXUINT16), ((double) (*color).blue) / ((double) G_MAXUINT16), alpha);
400 void prolooks_gdk_color_to_cairo_color (const GdkColor* color, double* red, double* green, double* blue) {
401 *red = ((double) (*color).red) / ((double) G_MAXUINT16);
402 *green = ((double) (*color).green) / ((double) G_MAXUINT16);
403 *blue = ((double) (*color).blue) / ((double) G_MAXUINT16);
407 CairoColor* prolooks_gdk_color_to_cairo (const GdkColor* color) {
408 CairoColor* result = NULL;
415 prolooks_gdk_color_to_cairo_color (color, &r, &g, &b);
416 result = cairo_color_new (r, g, b, 1.0);
421 void prolooks_cairo_color_to_gdk (CairoColor* cairo_color, GdkColor* result) {
422 GdkColor color = {0,0,0,0};
423 g_return_if_fail (cairo_color != NULL);
424 memset (&color, 0, sizeof (GdkColor));
425 color.red = (guint16) (cairo_color_get_red (cairo_color) * ((double) G_MAXUINT16));
426 color.green = (guint16) (cairo_color_get_green (cairo_color) * ((double) G_MAXUINT16));
427 color.blue = (guint16) (cairo_color_get_blue (cairo_color) * ((double) G_MAXUINT16));
433 void prolooks_set_source_color_string (cairo_t* cr, const char* color, double alpha) {
435 GdkColor _tmp0_ = {0,0,0,0};
436 g_return_if_fail (cr != NULL);
437 g_return_if_fail (color != NULL);
438 prolooks_set_source_color (cr, (_tmp1_ = (prolooks_color_from_string (color, &_tmp0_), _tmp0_), &_tmp1_), alpha);
442 void prolooks_add_color_stop (cairo_pattern_t* p, double offset, const GdkColor* color, double alpha) {
443 g_return_if_fail (p != NULL);
444 cairo_pattern_add_color_stop_rgba (p, offset, ((double) (*color).red) / ((double) G_MAXUINT16), ((double) (*color).green) / ((double) G_MAXUINT16), ((double) (*color).blue) / ((double) G_MAXUINT16), alpha);
448 void prolooks_add_color_stop_str (cairo_pattern_t* p, double offset, const char* color, double alpha) {
450 GdkColor _tmp0_ = {0,0,0,0};
451 g_return_if_fail (p != NULL);
452 g_return_if_fail (color != NULL);
453 prolooks_add_color_stop (p, offset, (_tmp1_ = (prolooks_color_from_string (color, &_tmp0_), _tmp0_), &_tmp1_), alpha);
457 cairo_pattern_t* prolooks_create_gradient (double x1, double y1, double x2, double y2, const GdkColor* start, const GdkColor* stop, double alpha_start, double alpha_stop) {
458 cairo_pattern_t* result = NULL;
459 cairo_pattern_t* gradient;
460 gradient = cairo_pattern_create_linear (x1, y1, x2, y2);
461 prolooks_add_color_stop (gradient, (double) 0, start, alpha_start);
462 prolooks_add_color_stop (gradient, (double) 1, stop, alpha_stop);
468 cairo_pattern_t* prolooks_create_gradient_str (double x1, double y1, double x2, double y2, const char* start, const char* stop, double alpha_start, double alpha_stop) {
469 cairo_pattern_t* result = NULL;
472 GdkColor _tmp1_ = {0,0,0,0};
473 GdkColor _tmp0_ = {0,0,0,0};
474 g_return_val_if_fail (start != NULL, NULL);
475 g_return_val_if_fail (stop != NULL, NULL);
476 result = prolooks_create_gradient (x1, y1, x2, y2, (_tmp2_ = (prolooks_color_from_string (start, &_tmp0_), _tmp0_), &_tmp2_), (_tmp3_ = (prolooks_color_from_string (stop, &_tmp1_), _tmp1_), &_tmp3_), alpha_start, alpha_stop);
481 void prolooks_rounded_rect (cairo_t* cr, double x, double y, double w, double h, double radius_x, double radius_y) {
482 double ARC_TO_BEZIER;
485 g_return_if_fail (cr != NULL);
486 ARC_TO_BEZIER = 0.55228475;
487 if (radius_x > (w - radius_x)) {
490 if (radius_y > (h - radius_y)) {
493 c1 = ARC_TO_BEZIER * radius_x;
494 c2 = ARC_TO_BEZIER * radius_y;
496 cairo_move_to (cr, x + radius_x, y);
497 cairo_rel_line_to (cr, w - (2 * radius_x), 0.0);
498 cairo_rel_curve_to (cr, c1, 0.0, radius_x, c2, radius_x, radius_y);
499 cairo_rel_line_to (cr, (double) 0, h - (2 * radius_y));
500 cairo_rel_curve_to (cr, 0.0, c2, c1 - radius_x, radius_y, -radius_x, radius_y);
501 cairo_rel_line_to (cr, (-w) + (2 * radius_x), (double) 0);
502 cairo_rel_curve_to (cr, -c1, (double) 0, -radius_x, -c2, -radius_x, -radius_y);
503 cairo_rel_line_to (cr, (double) 0, (-h) + (2 * radius_y));
504 cairo_rel_curve_to (cr, 0.0, -c2, radius_x - c1, -radius_y, radius_x, -radius_y);
505 cairo_close_path (cr);
509 void prolooks_background_gradient (cairo_t* cr, double w, double h) {
510 GdkColor background_gradient_start = {0,0,0,0};
511 GdkColor background_gradient_stop = {0,0,0,0};
512 cairo_pattern_t* background_gradient;
513 g_return_if_fail (cr != NULL);
514 gdk_color_parse ("#bebdc2", &background_gradient_start);
515 gdk_color_parse ("#b1b4b9", &background_gradient_stop);
516 cairo_rectangle (cr, (double) 0, (double) 0, w, h);
517 background_gradient = cairo_pattern_create_linear ((double) 0, (double) 0, (double) 0, h);
518 prolooks_add_color_stop (background_gradient, (double) 0, &background_gradient_start, 1.0);
519 prolooks_add_color_stop (background_gradient, (double) 1, &background_gradient_stop, 1.0);
520 cairo_set_source (cr, background_gradient);
522 _cairo_pattern_destroy0 (background_gradient);
526 double prolooks_modula (double number, double divisor) {
528 result = (((gint) number) % ((gint) divisor)) + (number - ((gint) number));
533 char* prolooks_hsl_to_string (ProlooksHSL* self) {
535 g_return_val_if_fail (self != NULL, NULL);
536 result = g_strdup_printf ("HSL (%f, %f, %f)", self->priv->_hue, self->priv->_saturation, self->priv->_lightness);
541 CairoColor* prolooks_hsl_to_cairo_color (ProlooksHSL* self) {
542 CairoColor* result = NULL;
553 g_return_val_if_fail (self != NULL, NULL);
554 hue_shift = (_tmp0_ = g_new0 (double, 3), _tmp0_);
555 color_shift = (_tmp1_ = g_new0 (double, 3), _tmp1_);
556 if (self->priv->_lightness <= 0.5) {
557 m2 = self->priv->_lightness * (1 + self->priv->_saturation);
559 m2 = (self->priv->_lightness + self->priv->_saturation) - (self->priv->_lightness * self->priv->_saturation);
561 m1 = (2 * self->priv->_lightness) - m2;
562 hue_shift[0] = self->priv->_hue + 120;
563 hue_shift[1] = self->priv->_hue;
564 hue_shift[2] = self->priv->_hue - 120;
565 color_shift[0] = color_shift[1] = color_shift[2] = self->priv->_lightness;
566 if (self->priv->_saturation == 0) {
585 m3 = prolooks_modula (m3, (double) 360);
588 m3 = 360 - prolooks_modula (fabs (m3), (double) 360);
592 color_shift[i] = m1 + (((m2 - m1) * m3) / 60.0);
598 color_shift[i] = m1 + (((m2 - m1) * (240 - m3)) / 60.0);
606 color = cairo_color_new (color_shift[0], color_shift[1], color_shift[2], 1.0);
608 hue_shift = (g_free (hue_shift), NULL);
609 color_shift = (g_free (color_shift), NULL);
614 void prolooks_hsl_to_gdk_color (ProlooksHSL* self, GdkColor* result) {
615 GdkColor _tmp1_ = {0,0,0,0};
618 g_return_if_fail (self != NULL);
619 *result = (_tmp2_ = (prolooks_cairo_color_to_gdk (_tmp0_ = prolooks_hsl_to_cairo_color (self), &_tmp1_), _tmp1_), _cairo_color_unref0 (_tmp0_), _tmp2_);
624 void prolooks_hsl_from_gdk_color (ProlooksHSL* self, const GdkColor* color) {
626 g_return_if_fail (self != NULL);
627 prolooks_hsl_from_cairo_color (self, _tmp0_ = prolooks_gdk_color_to_cairo (color));
628 _cairo_color_unref0 (_tmp0_);
632 void prolooks_hsl_from_cairo_color (ProlooksHSL* self, CairoColor* color) {
639 g_return_if_fail (self != NULL);
640 g_return_if_fail (color != NULL);
641 red = cairo_color_get_red (color);
642 green = cairo_color_get_green (color);
643 blue = cairo_color_get_blue (color);
667 prolooks_hsl_set_lightness (self, (max + min) / 2.0);
668 if (fabs (max - min) < 0.0001) {
669 prolooks_hsl_set_hue (self, 0.0);
670 prolooks_hsl_set_saturation (self, 0.0);
672 if (self->priv->_lightness <= 0.5) {
673 prolooks_hsl_set_saturation (self, (max - min) / (max + min));
675 prolooks_hsl_set_saturation (self, (max - min) / ((2.0 - max) - min));
679 prolooks_hsl_set_hue (self, (green - blue) / delta);
682 prolooks_hsl_set_hue (self, 2.0 + ((blue - red) / delta));
685 prolooks_hsl_set_hue (self, 4.0 + ((red - green) / delta));
689 prolooks_hsl_set_hue (self, self->priv->_hue * 60.0);
690 if (self->priv->_hue < 0.0) {
691 prolooks_hsl_set_hue (self, self->priv->_hue + 360.0);
697 ProlooksHSL* prolooks_hsl_construct (GType object_type) {
699 self = (ProlooksHSL*) g_type_create_instance (object_type);
704 ProlooksHSL* prolooks_hsl_new (void) {
705 return prolooks_hsl_construct (PROLOOKS_TYPE_HSL);
709 double prolooks_hsl_get_hue (ProlooksHSL* self) {
711 g_return_val_if_fail (self != NULL, 0.0);
712 result = self->priv->_hue;
717 void prolooks_hsl_set_hue (ProlooksHSL* self, double value) {
718 g_return_if_fail (self != NULL);
719 self->priv->_hue = value;
723 double prolooks_hsl_get_saturation (ProlooksHSL* self) {
725 g_return_val_if_fail (self != NULL, 0.0);
726 result = self->priv->_saturation;
731 void prolooks_hsl_set_saturation (ProlooksHSL* self, double value) {
732 g_return_if_fail (self != NULL);
733 self->priv->_saturation = value;
737 double prolooks_hsl_get_lightness (ProlooksHSL* self) {
739 g_return_val_if_fail (self != NULL, 0.0);
740 result = self->priv->_lightness;
745 void prolooks_hsl_set_lightness (ProlooksHSL* self, double value) {
746 g_return_if_fail (self != NULL);
747 self->priv->_lightness = value;
751 static void prolooks_value_hsl_init (GValue* value) {
752 value->data[0].v_pointer = NULL;
756 static void prolooks_value_hsl_free_value (GValue* value) {
757 if (value->data[0].v_pointer) {
758 prolooks_hsl_unref (value->data[0].v_pointer);
763 static void prolooks_value_hsl_copy_value (const GValue* src_value, GValue* dest_value) {
764 if (src_value->data[0].v_pointer) {
765 dest_value->data[0].v_pointer = prolooks_hsl_ref (src_value->data[0].v_pointer);
767 dest_value->data[0].v_pointer = NULL;
772 static gpointer prolooks_value_hsl_peek_pointer (const GValue* value) {
773 return value->data[0].v_pointer;
777 static gchar* prolooks_value_hsl_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
778 (void) n_collect_values;
779 (void) collect_flags;
780 if (collect_values[0].v_pointer) {
782 object = (ProlooksHSL*)collect_values[0].v_pointer;
783 if (object->parent_instance.g_class == NULL) {
784 return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
785 } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
786 return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
788 value->data[0].v_pointer = prolooks_hsl_ref (object);
790 value->data[0].v_pointer = NULL;
796 static gchar* prolooks_value_hsl_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
797 ProlooksHSL** object_p;
798 (void) n_collect_values;
799 object_p = (ProlooksHSL**)collect_values[0].v_pointer;
801 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME ((GValue*)value));
803 if (!value->data[0].v_pointer) {
805 } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
806 *object_p = (ProlooksHSL*)value->data[0].v_pointer;
808 *object_p = (ProlooksHSL*)prolooks_hsl_ref (value->data[0].v_pointer);
814 GParamSpec* prolooks_param_spec_hsl (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
815 ProlooksParamSpecHSL* spec;
816 g_return_val_if_fail (g_type_is_a (object_type, PROLOOKS_TYPE_HSL), NULL);
817 spec = (ProlooksParamSpecHSL*)g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
818 G_PARAM_SPEC (spec)->value_type = object_type;
819 return G_PARAM_SPEC (spec);
823 gpointer prolooks_value_get_hsl (const GValue* value) {
824 g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE ((GValue*)value, PROLOOKS_TYPE_HSL), NULL);
825 return value->data[0].v_pointer;
829 void prolooks_value_set_hsl (GValue* value, gpointer v_object) {
831 g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, PROLOOKS_TYPE_HSL));
832 old = (ProlooksHSL*)value->data[0].v_pointer;
834 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, PROLOOKS_TYPE_HSL));
835 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
836 value->data[0].v_pointer = v_object;
837 prolooks_hsl_ref (value->data[0].v_pointer);
839 value->data[0].v_pointer = NULL;
842 prolooks_hsl_unref (old);
847 void prolooks_value_take_hsl (GValue* value, gpointer v_object) {
849 g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, PROLOOKS_TYPE_HSL));
850 old = (ProlooksHSL*)value->data[0].v_pointer;
852 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, PROLOOKS_TYPE_HSL));
853 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
854 value->data[0].v_pointer = v_object;
856 value->data[0].v_pointer = NULL;
859 prolooks_hsl_unref (old);
863 static void prolooks_hsl_finalize (ProlooksHSL* obj) {
865 self = PROLOOKS_HSL (obj);
868 static void prolooks_hsl_class_init (ProlooksHSLClass * klass) {
869 prolooks_hsl_parent_class = g_type_class_peek_parent (klass);
870 PROLOOKS_HSL_CLASS (klass)->finalize = prolooks_hsl_finalize;
871 g_type_class_add_private (klass, sizeof (ProlooksHSLPrivate));
875 static void prolooks_hsl_instance_init (ProlooksHSL * self) {
876 self->priv = PROLOOKS_HSL_GET_PRIVATE (self);
882 GType prolooks_hsl_get_type (void) {
883 static volatile gsize prolooks_hsl_type_id__volatile = 0;
884 if (g_once_init_enter (&prolooks_hsl_type_id__volatile)) {
885 static const GTypeValueTable g_define_type_value_table = { prolooks_value_hsl_init, prolooks_value_hsl_free_value, prolooks_value_hsl_copy_value, prolooks_value_hsl_peek_pointer, "p", prolooks_value_hsl_collect_value, "p", prolooks_value_hsl_lcopy_value };
886 static const GTypeInfo g_define_type_info = { sizeof (ProlooksHSLClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) prolooks_hsl_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ProlooksHSL), 0, (GInstanceInitFunc) prolooks_hsl_instance_init, &g_define_type_value_table };
887 static const GTypeFundamentalInfo g_define_type_fundamental_info = { (GTypeFundamentalFlags)(G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
888 GType prolooks_hsl_type_id;
889 prolooks_hsl_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ProlooksHSL", &g_define_type_info, &g_define_type_fundamental_info, (GTypeFlags)0);
890 g_once_init_leave (&prolooks_hsl_type_id__volatile, prolooks_hsl_type_id);
892 return prolooks_hsl_type_id__volatile;
896 gpointer prolooks_hsl_ref (gpointer instance) {
898 self = (ProlooksHSL*)instance;
899 g_atomic_int_inc (&self->ref_count);
904 void prolooks_hsl_unref (gpointer instance) {
906 self = (ProlooksHSL*)instance;
907 if (g_atomic_int_dec_and_test (&self->ref_count)) {
908 PROLOOKS_HSL_GET_CLASS (self)->finalize (self);
909 g_type_free_instance ((GTypeInstance *) self);
914 char* prolooks_hsv_to_string (ProlooksHSV* self) {
916 g_return_val_if_fail (self != NULL, NULL);
917 result = g_strdup_printf ("HSV (%f, %f, %f)", self->priv->_hue, self->priv->_saturation, self->priv->_value);
922 ProlooksHSV* prolooks_hsv_construct_for_gdk_color (GType object_type, const GdkColor* color) {
924 self = (ProlooksHSV*) g_type_create_instance (object_type);
925 prolooks_hsv_from_gdk_color (self, color);
930 ProlooksHSV* prolooks_hsv_new_for_gdk_color (const GdkColor* color) {
931 return prolooks_hsv_construct_for_gdk_color (PROLOOKS_TYPE_HSV, color);
935 ProlooksHSV* prolooks_hsv_construct_for_cairo_color (GType object_type, CairoColor* color) {
937 g_return_val_if_fail (color != NULL, NULL);
938 self = (ProlooksHSV*) g_type_create_instance (object_type);
939 prolooks_hsv_from_cairo_color (self, color);
944 ProlooksHSV* prolooks_hsv_new_for_cairo_color (CairoColor* color) {
945 return prolooks_hsv_construct_for_cairo_color (PROLOOKS_TYPE_HSV, color);
949 CairoColor* prolooks_hsv_to_cairo_color (ProlooksHSV* self) {
950 CairoColor* result = NULL;
960 g_return_val_if_fail (self != NULL, NULL);
964 hi = (gint) prolooks_modula (floor (self->priv->_hue / 60.0), (double) 6);
965 f = (self->priv->_hue / 60.0) - floor (self->priv->_hue / 60.0);
966 p = self->priv->_value * (1.0 - self->priv->_saturation);
967 q = self->priv->_value * (1.0 - (f * self->priv->_saturation));
968 t = self->priv->_value * (1.0 - ((1.0 - f) * self->priv->_saturation));
972 r = self->priv->_value;
980 g = self->priv->_value;
987 g = self->priv->_value;
995 b = self->priv->_value;
1002 b = self->priv->_value;
1007 r = self->priv->_value;
1017 color = cairo_color_new (r, g, b, 1.0);
1023 void prolooks_hsv_to_gdk_color (ProlooksHSV* self, GdkColor* result) {
1024 GdkColor _tmp1_ = {0,0,0,0};
1027 g_return_if_fail (self != NULL);
1028 *result = (_tmp2_ = (prolooks_cairo_color_to_gdk (_tmp0_ = prolooks_hsv_to_cairo_color (self), &_tmp1_), _tmp1_), _cairo_color_unref0 (_tmp0_), _tmp2_);
1033 void prolooks_hsv_from_gdk_color (ProlooksHSV* self, const GdkColor* color) {
1035 g_return_if_fail (self != NULL);
1036 prolooks_hsv_from_cairo_color (self, _tmp0_ = prolooks_gdk_color_to_cairo (color));
1037 _cairo_color_unref0 (_tmp0_);
1041 void prolooks_hsv_from_cairo_color (ProlooksHSV* self, CairoColor* color) {
1048 g_return_if_fail (self != NULL);
1049 g_return_if_fail (color != NULL);
1050 red = cairo_color_get_red (color);
1051 green = cairo_color_get_green (color);
1052 blue = cairo_color_get_blue (color);
1076 prolooks_hsv_set_value (self, max);
1077 if (fabs (max - min) < 0.0001) {
1078 prolooks_hsv_set_hue (self, 0.0);
1079 prolooks_hsv_set_saturation (self, 0.0);
1082 prolooks_hsv_set_saturation (self, (double) 0);
1084 prolooks_hsv_set_saturation (self, (max - min) / max);
1088 prolooks_hsv_set_hue (self, (green - blue) / delta);
1091 prolooks_hsv_set_hue (self, 2.0 + ((blue - red) / delta));
1094 prolooks_hsv_set_hue (self, 4.0 + ((red - green) / delta));
1098 prolooks_hsv_set_hue (self, self->priv->_hue * 60.0);
1099 if (self->priv->_hue < 0.0) {
1100 prolooks_hsv_set_hue (self, self->priv->_hue + 360.0);
1106 ProlooksHSV* prolooks_hsv_construct (GType object_type) {
1108 self = (ProlooksHSV*) g_type_create_instance (object_type);
1113 ProlooksHSV* prolooks_hsv_new (void) {
1114 return prolooks_hsv_construct (PROLOOKS_TYPE_HSV);
1118 double prolooks_hsv_get_hue (ProlooksHSV* self) {
1120 g_return_val_if_fail (self != NULL, 0.0);
1121 result = self->priv->_hue;
1126 void prolooks_hsv_set_hue (ProlooksHSV* self, double value) {
1127 g_return_if_fail (self != NULL);
1128 self->priv->_hue = value;
1132 double prolooks_hsv_get_saturation (ProlooksHSV* self) {
1134 g_return_val_if_fail (self != NULL, 0.0);
1135 result = self->priv->_saturation;
1140 void prolooks_hsv_set_saturation (ProlooksHSV* self, double value) {
1141 g_return_if_fail (self != NULL);
1142 self->priv->_saturation = value;
1146 double prolooks_hsv_get_value (ProlooksHSV* self) {
1148 g_return_val_if_fail (self != NULL, 0.0);
1149 result = self->priv->_value;
1154 void prolooks_hsv_set_value (ProlooksHSV* self, double value) {
1155 g_return_if_fail (self != NULL);
1156 self->priv->_value = value;
1160 static void prolooks_value_hsv_init (GValue* value) {
1161 value->data[0].v_pointer = NULL;
1165 static void prolooks_value_hsv_free_value (GValue* value) {
1166 if (value->data[0].v_pointer) {
1167 prolooks_hsv_unref (value->data[0].v_pointer);
1172 static void prolooks_value_hsv_copy_value (const GValue* src_value, GValue* dest_value) {
1173 if (src_value->data[0].v_pointer) {
1174 dest_value->data[0].v_pointer = prolooks_hsv_ref (src_value->data[0].v_pointer);
1176 dest_value->data[0].v_pointer = NULL;
1181 static gpointer prolooks_value_hsv_peek_pointer (const GValue* value) {
1182 return value->data[0].v_pointer;
1186 static gchar* prolooks_value_hsv_collect_value (GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1187 (void) collect_flags;
1188 (void) n_collect_values;
1189 if (collect_values[0].v_pointer) {
1190 ProlooksHSV* object;
1191 object = (ProlooksHSV*)collect_values[0].v_pointer;
1192 if (object->parent_instance.g_class == NULL) {
1193 return g_strconcat ("invalid unclassed object pointer for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1194 } else if (!g_value_type_compatible (G_TYPE_FROM_INSTANCE (object), G_VALUE_TYPE (value))) {
1195 return g_strconcat ("invalid object type `", g_type_name (G_TYPE_FROM_INSTANCE (object)), "' for value type `", G_VALUE_TYPE_NAME (value), "'", NULL);
1197 value->data[0].v_pointer = prolooks_hsv_ref (object);
1199 value->data[0].v_pointer = NULL;
1205 static gchar* prolooks_value_hsv_lcopy_value (const GValue* value, guint n_collect_values, GTypeCValue* collect_values, guint collect_flags) {
1206 ProlooksHSV** object_p;
1207 (void) n_collect_values;
1208 object_p = (ProlooksHSV**)collect_values[0].v_pointer;
1210 return g_strdup_printf ("value location for `%s' passed as NULL", G_VALUE_TYPE_NAME ((GValue*)value));
1212 if (!value->data[0].v_pointer) {
1214 } else if (collect_flags & G_VALUE_NOCOPY_CONTENTS) {
1215 *object_p = (ProlooksHSV*)value->data[0].v_pointer;
1217 *object_p = (ProlooksHSV*)prolooks_hsv_ref (value->data[0].v_pointer);
1223 GParamSpec* prolooks_param_spec_hsv (const gchar* name, const gchar* nick, const gchar* blurb, GType object_type, GParamFlags flags) {
1224 ProlooksParamSpecHSV* spec;
1225 g_return_val_if_fail (g_type_is_a (object_type, PROLOOKS_TYPE_HSV), NULL);
1226 spec = (ProlooksParamSpecHSV*)g_param_spec_internal (G_TYPE_PARAM_OBJECT, name, nick, blurb, flags);
1227 G_PARAM_SPEC (spec)->value_type = object_type;
1228 return G_PARAM_SPEC (spec);
1232 gpointer prolooks_value_get_hsv (const GValue* value) {
1233 g_return_val_if_fail (G_TYPE_CHECK_VALUE_TYPE ((GValue*) value, PROLOOKS_TYPE_HSV), NULL);
1234 return value->data[0].v_pointer;
1238 void prolooks_value_set_hsv (GValue* value, gpointer v_object) {
1240 g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, PROLOOKS_TYPE_HSV));
1241 old = (ProlooksHSV*)value->data[0].v_pointer;
1243 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, PROLOOKS_TYPE_HSV));
1244 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1245 value->data[0].v_pointer = v_object;
1246 prolooks_hsv_ref (value->data[0].v_pointer);
1248 value->data[0].v_pointer = NULL;
1251 prolooks_hsv_unref (old);
1256 void prolooks_value_take_hsv (GValue* value, gpointer v_object) {
1258 g_return_if_fail (G_TYPE_CHECK_VALUE_TYPE (value, PROLOOKS_TYPE_HSV));
1259 old = (ProlooksHSV*)value->data[0].v_pointer;
1261 g_return_if_fail (G_TYPE_CHECK_INSTANCE_TYPE (v_object, PROLOOKS_TYPE_HSV));
1262 g_return_if_fail (g_value_type_compatible (G_TYPE_FROM_INSTANCE (v_object), G_VALUE_TYPE (value)));
1263 value->data[0].v_pointer = v_object;
1265 value->data[0].v_pointer = NULL;
1268 prolooks_hsv_unref (old);
1272 static void prolooks_hsv_finalize (ProlooksHSV* obj) {
1274 self = PROLOOKS_HSV (obj);
1277 static void prolooks_hsv_class_init (ProlooksHSVClass * klass) {
1278 prolooks_hsv_parent_class = g_type_class_peek_parent (klass);
1279 PROLOOKS_HSV_CLASS (klass)->finalize = prolooks_hsv_finalize;
1280 g_type_class_add_private (klass, sizeof (ProlooksHSVPrivate));
1284 static void prolooks_hsv_instance_init (ProlooksHSV * self) {
1285 self->priv = PROLOOKS_HSV_GET_PRIVATE (self);
1286 self->ref_count = 1;
1289 GType prolooks_hsv_get_type (void) {
1290 static volatile gsize prolooks_hsv_type_id__volatile = 0;
1291 if (g_once_init_enter (&prolooks_hsv_type_id__volatile)) {
1292 static const GTypeValueTable g_define_type_value_table = { prolooks_value_hsv_init, prolooks_value_hsv_free_value, prolooks_value_hsv_copy_value, prolooks_value_hsv_peek_pointer, "p", prolooks_value_hsv_collect_value, "p", prolooks_value_hsv_lcopy_value };
1293 static const GTypeInfo g_define_type_info = { sizeof (ProlooksHSVClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) prolooks_hsv_class_init, (GClassFinalizeFunc) NULL, NULL, sizeof (ProlooksHSV), 0, (GInstanceInitFunc) prolooks_hsv_instance_init, &g_define_type_value_table };
1294 static const GTypeFundamentalInfo g_define_type_fundamental_info = { (GTypeFundamentalFlags)(G_TYPE_FLAG_CLASSED | G_TYPE_FLAG_INSTANTIATABLE | G_TYPE_FLAG_DERIVABLE | G_TYPE_FLAG_DEEP_DERIVABLE) };
1295 GType prolooks_hsv_type_id;
1296 prolooks_hsv_type_id = g_type_register_fundamental (g_type_fundamental_next (), "ProlooksHSV", &g_define_type_info, &g_define_type_fundamental_info, (GTypeFlags)0);
1297 g_once_init_leave (&prolooks_hsv_type_id__volatile, prolooks_hsv_type_id);
1299 return prolooks_hsv_type_id__volatile;
1303 gpointer prolooks_hsv_ref (gpointer instance) {
1305 self = (ProlooksHSV*)instance;
1306 g_atomic_int_inc (&self->ref_count);
1311 void prolooks_hsv_unref (gpointer instance) {
1313 self = (ProlooksHSV*)instance;
1314 if (g_atomic_int_dec_and_test (&self->ref_count)) {
1315 PROLOOKS_HSV_GET_CLASS (self)->finalize (self);
1316 g_type_free_instance ((GTypeInstance *) self);
1321 void prolooks_shade_color (const GdkColor* orig, double shade_ratio, GdkColor* result) {
1323 GdkColor _tmp0_ = {0,0,0,0};
1325 HSL = prolooks_hsl_new ();
1326 prolooks_hsl_from_gdk_color (HSL, orig);
1327 prolooks_hsl_set_lightness (HSL, fmin (prolooks_hsl_get_lightness (HSL) * shade_ratio, 1.0));
1328 prolooks_hsl_set_lightness (HSL, fmax (prolooks_hsl_get_lightness (HSL), 0.0));
1329 prolooks_hsl_set_saturation (HSL, fmin (prolooks_hsl_get_saturation (HSL) * shade_ratio, 1.0));
1330 prolooks_hsl_set_saturation (HSL, fmax (prolooks_hsl_get_saturation (HSL), 0.0));
1331 _result_ = (prolooks_hsl_to_gdk_color (HSL, &_tmp0_), _tmp0_);
1333 _prolooks_hsl_unref0 (HSL);
1338 GdkPixbuf* prolooks_cairo_image_surface_to_pixbuf (cairo_surface_t* surface) {
1339 GdkPixbuf* result = NULL;
1342 g_return_val_if_fail (surface != NULL, NULL);
1343 if (cairo_image_surface_get_format (surface) != CAIRO_FORMAT_ARGB32) {
1347 knob_data = (_tmp0_ = cairo_image_surface_get_data (surface), _tmp0_);
1363 if (!(i < (cairo_image_surface_get_height (surface) * cairo_image_surface_get_stride (surface)))) {
1366 r = knob_data[i + 0];
1367 g = knob_data[i + 1];
1368 b = knob_data[i + 2];
1369 a = knob_data[i + 3];
1370 knob_data[i + 0] = b;
1371 knob_data[i + 1] = g;
1372 knob_data[i + 2] = r;
1373 knob_data[i + 3] = a;
1377 result = gdk_pixbuf_new_from_data (knob_data, GDK_COLORSPACE_RGB, TRUE, 8, cairo_image_surface_get_width (surface), cairo_image_surface_get_height (surface), cairo_image_surface_get_stride (surface), NULL, NULL);