1
#define __SP_FILL_STYLE_C__
4
* \brief Fill style widget
7
* Lauris Kaplinski <lauris@kaplinski.com>
8
* Frank Felfe <innerspace@iname.com>
10
* Copyright (C) 1999-2002 authors
11
* Copyright (C) 2001-2002 Ximian, Inc.
13
* Released under GNU GPL, read the file 'COPYING' for more information
16
#define noSP_FS_VERBOSE
21
#include <gtk/gtksignal.h>
22
#include <gtk/gtkmisc.h>
23
#include <gtk/gtklabel.h>
24
#include <gtk/gtkhbox.h>
25
#include <gtk/gtkoptionmenu.h>
26
#include <gtk/gtkmenuitem.h>
27
#include <gtk/gtkhbox.h>
28
#include <gtk/gtklabel.h>
29
#include <gtk/gtkoptionmenu.h>
30
#include <gtk/gtkmenuitem.h>
32
#include <libnr/nr-values.h>
34
#include <libart_lgpl/art_svp.h>
35
#include <libart_lgpl/art_svp_wind.h>
37
#include <libnr/nr-values.h>
39
#include <libart_lgpl/art_svp.h>
40
#include <libart_lgpl/art_svp_wind.h>
42
#include "../helper/sp-intl.h"
43
#include "../helper/window.h"
44
#include "../svg/svg.h"
45
#include "../svg/stringstream.h"
46
#include "../widgets/sp-widget.h"
47
#include "../sp-gradient.h"
48
#include "../widgets/paint-selector.h"
50
#include "../gradient-chemistry.h"
51
#include "../document.h"
52
#include "../desktop-handles.h"
53
#include "../selection.h"
54
#include "../sp-item.h"
55
#include "../inkscape.h"
57
#include "fill-style.h"
61
static void sp_fill_style_widget_construct ( SPWidget *spw,
62
SPPaintSelector *psel );
64
static void sp_fill_style_widget_modify_selection ( SPWidget *spw,
65
SPSelection *selection,
67
SPPaintSelector *psel );
69
static void sp_fill_style_widget_change_selection ( SPWidget *spw,
70
SPSelection *selection,
71
SPPaintSelector *psel );
73
static void sp_fill_style_widget_attr_changed ( SPWidget *spw,
76
const gchar *newval );
78
static void sp_fill_style_widget_update ( SPWidget *spw,
81
static void sp_fill_style_widget_update_repr ( SPWidget *spw,
84
static void sp_fill_style_widget_paint_mode_changed ( SPPaintSelector *psel,
85
SPPaintSelectorMode mode,
88
static void sp_fill_style_widget_paint_dragged ( SPPaintSelector *psel,
91
static void sp_fill_style_widget_paint_changed ( SPPaintSelector *psel,
94
static void sp_fill_style_widget_fill_rule_activate ( GtkWidget *w, SPWidget *spw);
96
static void sp_fill_style_get_average_color_rgba ( const GSList *objects,
99
static void sp_fill_style_get_average_color_cmyka ( const GSList *objects,
102
static SPPaintSelectorMode
103
sp_fill_style_determine_paint_selector_mode ( SPStyle *style );
105
static GtkWidget *dialog = NULL;
111
sp_fill_style_dialog_destroy (GtkObject *object, gpointer data)
116
} // end of sp_fill_style_dialog_destroy()
121
sp_fill_style_dialog (void)
128
dialog = sp_window_new (_("Fill style"), TRUE);
129
g_signal_connect ( G_OBJECT (dialog), "destroy",
130
G_CALLBACK (sp_fill_style_dialog_destroy), NULL );
132
fs = sp_fill_style_widget_new ();
133
gtk_widget_show (fs);
134
gtk_container_add (GTK_CONTAINER (dialog), fs);
136
gtk_widget_show (dialog);
140
} // end of sp_fill_style_dialog()
146
sp_fill_style_widget_new (void)
148
GtkWidget *spw, *vb, *psel, *hb, *l, *om, *m, *mi;
150
spw = sp_widget_new_global (INKSCAPE);
152
vb = gtk_vbox_new (FALSE, 0);
153
gtk_widget_show (vb);
154
gtk_container_add (GTK_CONTAINER (spw), vb);
156
psel = sp_paint_selector_new ();
157
gtk_widget_show (psel);
158
gtk_box_pack_start (GTK_BOX (vb), psel, TRUE, TRUE, 0);
159
g_object_set_data (G_OBJECT (spw), "paint-selector", psel);
161
g_signal_connect ( G_OBJECT (psel), "mode_changed",
162
G_CALLBACK (sp_fill_style_widget_paint_mode_changed),
165
g_signal_connect ( G_OBJECT (psel), "dragged",
166
G_CALLBACK (sp_fill_style_widget_paint_dragged),
169
g_signal_connect ( G_OBJECT (psel), "changed",
170
G_CALLBACK (sp_fill_style_widget_paint_changed),
173
hb = gtk_hbox_new (FALSE, 4);
174
gtk_widget_show (hb);
175
gtk_box_pack_start (GTK_BOX (vb), hb, FALSE, FALSE, 0);
177
l = gtk_label_new (_("Fill Rule"));
179
gtk_misc_set_alignment (GTK_MISC (l), 1.0, 0.5);
180
gtk_box_pack_start (GTK_BOX (hb), l, TRUE, TRUE, 0);
182
om = gtk_option_menu_new ();
183
gtk_widget_show (om);
184
gtk_box_pack_start (GTK_BOX (hb), om, FALSE, FALSE, 0);
185
g_object_set_data (G_OBJECT (spw), "fill-rule", om);
187
/* 0 - nonzero 1 - evenodd */
191
mi = gtk_menu_item_new_with_label ("nonzero");
192
gtk_widget_show (mi);
193
gtk_menu_append (GTK_MENU (m), mi);
194
g_object_set_data ( G_OBJECT (mi), "fill-rule",
196
g_signal_connect ( G_OBJECT (mi), "activate",
197
G_CALLBACK (sp_fill_style_widget_fill_rule_activate),
199
mi = gtk_menu_item_new_with_label ("evenodd");
200
gtk_widget_show (mi);
201
gtk_menu_append (GTK_MENU (m), mi);
202
g_object_set_data (G_OBJECT (mi), "fill-rule", (void *)"evenodd");
203
g_signal_connect ( G_OBJECT (mi), "activate",
204
G_CALLBACK (sp_fill_style_widget_fill_rule_activate),
207
gtk_option_menu_set_menu (GTK_OPTION_MENU (om), m);
209
g_signal_connect ( G_OBJECT (spw), "construct",
210
G_CALLBACK (sp_fill_style_widget_construct), psel);
212
g_signal_connect ( G_OBJECT (spw), "modify_selection",
213
G_CALLBACK (sp_fill_style_widget_modify_selection), psel);
215
g_signal_connect ( G_OBJECT (spw), "change_selection",
216
G_CALLBACK (sp_fill_style_widget_change_selection), psel);
218
g_signal_connect ( G_OBJECT (spw), "attr_changed",
219
G_CALLBACK (sp_fill_style_widget_attr_changed), psel);
221
sp_fill_style_widget_update (SP_WIDGET (spw),
222
SP_ACTIVE_DESKTOP ? SP_DT_SELECTION (SP_ACTIVE_DESKTOP) : NULL);
226
} // end of sp_fill_style_widget_new()
231
sp_fill_style_widget_system_color_set ( GtkWidget *widget,
236
SPPaintSelector *psel;
238
psel = SP_PAINT_SELECTOR( g_object_get_data (G_OBJECT (widget),
241
switch (psel->mode) {
242
case SP_PAINT_SELECTOR_MODE_COLOR_RGB:
244
case SP_PAINT_SELECTOR_MODE_COLOR_CMYK:
245
sp_paint_selector_system_color_set (psel, color, opacity);
252
} // end of sp_fill_style_widget_system_color_set()
257
sp_fill_style_widget_construct ( SPWidget *spw, SPPaintSelector *psel )
261
g_print ( "Fill style widget constructed: inkscape %p repr %p\n",
262
spw->inkscape, spw->repr );
266
sp_fill_style_widget_update ( spw,
267
SP_ACTIVE_DESKTOP ? SP_DT_SELECTION (SP_ACTIVE_DESKTOP) : NULL );
269
} else if (spw->repr) {
271
sp_fill_style_widget_update_repr ( spw, spw->repr );
275
} // end of sp_fill_style_widget_construct()
281
sp_fill_style_widget_modify_selection ( SPWidget *spw,
282
SPSelection *selection,
284
SPPaintSelector *psel )
287
if (flags & ( SP_OBJECT_MODIFIED_FLAG |
288
SP_OBJECT_PARENT_MODIFIED_FLAG |
289
SP_OBJECT_STYLE_MODIFIED_FLAG) )
291
sp_fill_style_widget_update (spw, selection);
294
} // end of sp_fill_style_widget_modify_selection()
299
sp_fill_style_widget_change_selection ( SPWidget *spw,
300
SPSelection *selection,
301
SPPaintSelector *psel )
304
sp_fill_style_widget_update (spw, selection);
306
} // end of sp_fill_style_widget_change_selection()
311
sp_fill_style_widget_attr_changed ( SPWidget *spw, const gchar *key,
312
const gchar *oldval, const gchar *newval )
315
if (!strcmp (key, "style")) {
316
/* This sounds interesting */
317
sp_fill_style_widget_update_repr (spw, spw->repr);
320
} // end of sp_fill_style_widget_attr_changed();
325
sp_fill_style_widget_update ( SPWidget *spw, SPSelection *sel )
328
SPPaintSelector *psel;
330
SPPaintSelectorMode pselmode;
331
const GSList *objects, *l;
336
SPLinearGradient *lg;
337
SPRadialGradient *rg;
342
if (g_object_get_data (G_OBJECT (spw), "update"))
345
g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (TRUE));
347
psel = SP_PAINT_SELECTOR (g_object_get_data ( G_OBJECT (spw),
350
if (!sel || sp_selection_is_empty (sel)) {
351
/* No objects, set empty */
352
sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_EMPTY);
353
g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (FALSE));
357
objects = sp_selection_item_list (sel);
358
object = SP_OBJECT (objects->data);
360
(SPPaintSelectorMode)sp_fill_style_determine_paint_selector_mode
361
(SP_OBJECT_STYLE (object));
363
for (l = objects->next; l != NULL; l = l->next) {
364
SPPaintSelectorMode nextmode;
366
sp_fill_style_determine_paint_selector_mode
367
(SP_OBJECT_STYLE (l->data));
369
if (nextmode != pselmode) {
370
/* Multiple styles */
371
sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_MULTIPLE);
372
g_object_set_data ( G_OBJECT (spw), "update",
373
GINT_TO_POINTER (FALSE));
379
g_print ("FillStyleWidget: paint selector mode %d\n", pselmode);
384
case SP_PAINT_SELECTOR_MODE_NONE:
385
/* No paint at all */
386
sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_NONE);
389
case SP_PAINT_SELECTOR_MODE_COLOR_RGB:
390
sp_paint_selector_set_mode ( psel,
391
SP_PAINT_SELECTOR_MODE_COLOR_RGB);
392
sp_fill_style_get_average_color_rgba (objects, c);
393
sp_color_set_rgb_float (&color, c[0], c[1], c[2]);
394
sp_paint_selector_set_color_alpha (psel, &color, c[3]);
397
case SP_PAINT_SELECTOR_MODE_COLOR_CMYK:
398
sp_paint_selector_set_mode ( psel,
399
SP_PAINT_SELECTOR_MODE_COLOR_CMYK);
400
sp_fill_style_get_average_color_cmyka (objects, c);
401
sp_color_set_cmyk_float (&color, c[0], c[1], c[2], c[3]);
402
sp_paint_selector_set_color_alpha (psel, &color, c[4]);
405
case SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR:
406
object = SP_OBJECT (objects->data);
407
/* We know that all objects have lineargradient fill style */
409
sp_gradient_get_vector ( SP_GRADIENT
410
(SP_OBJECT_STYLE_FILL_SERVER
414
for (l = objects->next; l != NULL; l = l->next) {
416
next = SP_OBJECT (l->data);
418
if (sp_gradient_get_vector ( SP_GRADIENT
419
(SP_OBJECT_STYLE_FILL_SERVER
423
/* Multiple vectors */
424
sp_paint_selector_set_mode ( psel,
425
SP_PAINT_SELECTOR_MODE_MULTIPLE);
427
g_object_set_data ( G_OBJECT (spw), "update",
428
GINT_TO_POINTER (FALSE));
435
/* TODO: Probably we should set multiple mode here too */
436
sp_paint_selector_set_gradient_linear (psel, vector);
437
sp_selection_bbox_document (sel, &fbb);
438
sp_paint_selector_set_gradient_bbox ( psel, fbb.x0, fbb.y0,
441
/* TODO: This is plain wrong */
442
lg = SP_LINEARGRADIENT (SP_OBJECT_STYLE_FILL_SERVER (object));
443
sp_item_invoke_bbox (SP_ITEM (object), &fbb, NULL, TRUE);
444
sp_item_i2doc_affine (SP_ITEM (object), &fctm);
445
sp_gradient_get_gs2d_matrix_f ( SP_GRADIENT (lg), &fctm, &fbb,
447
sp_paint_selector_set_gradient_gs2d_matrix_f (psel, &gs2d);
448
sp_paint_selector_set_gradient_properties (psel,
449
SP_GRADIENT_UNITS (lg),
450
SP_GRADIENT_SPREAD (lg));
452
sp_paint_selector_set_lgradient_position ( psel, lg->x1.computed,
458
case SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL:
459
object = SP_OBJECT (objects->data);
461
/* We know that all objects have radialgradient fill style */
463
sp_gradient_get_vector ( SP_GRADIENT
464
(SP_OBJECT_STYLE_FILL_SERVER
468
for (l = objects->next; l != NULL; l = l->next) {
470
next = SP_OBJECT (l->data);
471
if (sp_gradient_get_vector ( SP_GRADIENT
472
(SP_OBJECT_STYLE_FILL_SERVER
476
/* Multiple vectors */
477
sp_paint_selector_set_mode ( psel,
478
SP_PAINT_SELECTOR_MODE_MULTIPLE);
479
g_object_set_data ( G_OBJECT (spw),
480
"update", GINT_TO_POINTER (FALSE) );
486
/* TODO: Probably we should set multiple mode here too */
487
sp_paint_selector_set_gradient_radial (psel, vector);
488
sp_selection_bbox_document (sel, &fbb);
489
sp_paint_selector_set_gradient_bbox ( psel, fbb.x0, fbb.y0,
492
/* TODO: This is plain wrong */
493
rg = SP_RADIALGRADIENT (SP_OBJECT_STYLE_FILL_SERVER (object));
494
sp_item_invoke_bbox (SP_ITEM (object), &fbb, NULL, TRUE);
495
sp_item_i2doc_affine (SP_ITEM (object), &fctm);
496
sp_gradient_get_gs2d_matrix_f ( SP_GRADIENT (rg), &fctm,
498
sp_paint_selector_set_gradient_gs2d_matrix_f (psel, &gs2d);
499
sp_paint_selector_set_gradient_properties (psel,
500
SP_GRADIENT_UNITS (rg),
501
SP_GRADIENT_SPREAD (rg));
503
sp_paint_selector_set_rgradient_position ( psel,
513
sp_paint_selector_set_mode ( psel,
514
SP_PAINT_SELECTOR_MODE_MULTIPLE );
519
fillrule = GTK_WIDGET(g_object_get_data (G_OBJECT (spw), "fill-rule"));
520
gtk_option_menu_set_history ( GTK_OPTION_MENU (fillrule),
522
(object)->fill_rule.computed == ART_WIND_RULE_NONZERO) ? 0 : 1);
524
g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (FALSE));
526
} // end of sp_fill_style_widget_update()
531
sp_fill_style_widget_update_repr (SPWidget *spw, SPRepr *repr)
534
SPPaintSelector *psel;
536
SPPaintSelectorMode pselmode;
541
if (g_object_get_data (G_OBJECT (spw), "update"))
544
g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (TRUE));
547
g_print ("FillStyleWidget: Set update flag\n");
549
psel = SP_PAINT_SELECTOR(g_object_get_data ( G_OBJECT (spw),
552
style = sp_style_new ();
553
sp_style_read_from_repr (style, repr);
555
pselmode = sp_fill_style_determine_paint_selector_mode (style);
558
g_print ("FillStyleWidget: paint selector mode %d\n", pselmode);
562
case SP_PAINT_SELECTOR_MODE_NONE:
563
/* No paint at all */
564
sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_NONE);
567
case SP_PAINT_SELECTOR_MODE_COLOR_RGB:
568
sp_paint_selector_set_mode (psel, SP_PAINT_SELECTOR_MODE_COLOR_RGB);
569
sp_color_get_rgb_floatv (&style->fill.value.color, c);
570
c[3] = SP_SCALE24_TO_FLOAT (style->fill_opacity.value);
571
sp_color_set_rgb_float (&color, c[0], c[1], c[2]);
572
sp_paint_selector_set_color_alpha (psel, &color, c[3]);
575
case SP_PAINT_SELECTOR_MODE_COLOR_CMYK:
576
sp_paint_selector_set_mode ( psel,
577
SP_PAINT_SELECTOR_MODE_COLOR_CMYK);
578
sp_color_get_cmyk_floatv (&style->fill.value.color, c);
579
c[4] = SP_SCALE24_TO_FLOAT (style->fill_opacity.value);
580
sp_color_set_cmyk_float (&color, c[0], c[1], c[2], c[3]);
581
sp_paint_selector_set_color_alpha (psel, &color, c[4]);
584
case SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR:
591
fillrule = GTK_WIDGET(g_object_get_data (G_OBJECT (spw), "fill-rule"));
592
gtk_option_menu_set_history ( GTK_OPTION_MENU (fillrule),
593
(style->fill_rule.computed == ART_WIND_RULE_NONZERO) ? 0 : 1);
595
sp_style_unref (style);
597
g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (FALSE));
600
g_print ("FillStyleWidget: Cleared update flag\n");
603
} // end of sp_fill_style_widget_update_repr()
608
sp_fill_style_widget_paint_mode_changed ( SPPaintSelector *psel,
609
SPPaintSelectorMode mode,
613
if (g_object_get_data (G_OBJECT (spw), "update"))
616
/* TODO: Does this work? */
617
/* TODO: Not really, here we have to get old color back from object */
618
/* Instead of relying on paint widget having meaningful colors set */
619
sp_fill_style_widget_paint_changed (psel, spw);
621
} // end of sp_fill_style_widget_paint_mode_changed()
626
sp_fill_style_widget_paint_dragged (SPPaintSelector *psel, SPWidget *spw)
628
const GSList *items, *i;
633
if (!spw->inkscape) return;
634
if (g_object_get_data (G_OBJECT (spw), "update")) return;
635
g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (TRUE));
637
g_print ("FillStyleWidget: paint dragged\n");
639
switch (psel->mode) {
640
case SP_PAINT_SELECTOR_MODE_EMPTY:
641
case SP_PAINT_SELECTOR_MODE_MULTIPLE:
642
case SP_PAINT_SELECTOR_MODE_NONE:
643
g_warning ( "file %s: line %d: Paint %d should not emit 'dragged'",
644
__FILE__, __LINE__, psel->mode );
647
case SP_PAINT_SELECTOR_MODE_COLOR_RGB:
648
case SP_PAINT_SELECTOR_MODE_COLOR_CMYK:
649
sp_paint_selector_get_color_alpha (psel, &color, &alpha);
650
items = sp_widget_get_item_list (spw);
651
for (i = items; i != NULL; i = i->next) {
652
sp_style_set_fill_color_alpha ( SP_OBJECT_STYLE (i->data),
653
&color, alpha, TRUE, TRUE);
657
case SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR:
658
vector = sp_paint_selector_get_gradient_vector (psel);
659
vector = sp_gradient_ensure_vector_normalized (vector);
660
items = sp_widget_get_item_list (spw);
661
for (i = items; i != NULL; i = i->next) {
663
lg = sp_item_force_fill_lineargradient_vector ( SP_ITEM
666
sp_paint_selector_write_lineargradient ( psel,
667
SP_LINEARGRADIENT (lg),
672
case SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL:
673
vector = sp_paint_selector_get_gradient_vector (psel);
674
vector = sp_gradient_ensure_vector_normalized (vector);
675
items = sp_widget_get_item_list (spw);
677
for (i = items; i != NULL; i = i->next) {
679
rg = sp_item_force_fill_radialgradient_vector ( SP_ITEM
682
sp_paint_selector_write_radialgradient ( psel,
683
SP_RADIALGRADIENT (rg),
689
g_warning ( "file %s: line %d: Paint selector should not be in "
691
__FILE__, __LINE__, psel->mode);
696
g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (FALSE));
698
} // end of sp_fill_style_widget_paint_dragged()
703
sp_fill_style_widget_paint_changed ( SPPaintSelector *psel,
707
const GSList *items, *i, *r;
716
Inkscape::SVGOStringStream osalpha, oscolour;
719
if (g_object_get_data (G_OBJECT (spw), "update")) return;
720
g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (TRUE));
723
g_print ("FillStyleWidget: paint changed\n");
728
if (!SP_WIDGET_DOCUMENT (spw)) {
729
g_object_set_data ( G_OBJECT (spw), "update",
730
GINT_TO_POINTER (FALSE) );
734
items = sp_widget_get_item_list (spw);
735
for (i = items; i != NULL; i = i->next) {
736
reprs = g_slist_prepend (reprs, SP_OBJECT_REPR (i->data));
739
reprs = g_slist_prepend (NULL, spw->repr);
743
switch (psel->mode) {
745
case SP_PAINT_SELECTOR_MODE_EMPTY:
746
case SP_PAINT_SELECTOR_MODE_MULTIPLE:
747
g_warning ( "file %s: line %d: Paint %d should not emit 'changed'",
748
__FILE__, __LINE__, psel->mode);
751
case SP_PAINT_SELECTOR_MODE_NONE:
752
css = sp_repr_css_attr_new ();
753
sp_repr_css_set_property (css, "fill", "none");
754
for (r = reprs; r != NULL; r = r->next) {
755
sp_repr_css_change_recursive ((SPRepr *) r->data, css, "style");
756
sp_repr_set_attr_recursive ( (SPRepr *) r->data,
757
"sodipodi:fill-cmyk", NULL);
759
sp_repr_css_attr_unref (css);
760
if (spw->inkscape) sp_document_done (SP_WIDGET_DOCUMENT (spw));
763
case SP_PAINT_SELECTOR_MODE_COLOR_RGB:
764
css = sp_repr_css_attr_new ();
765
sp_paint_selector_get_color_alpha (psel, &color, &alpha);
766
rgba = sp_color_get_rgba32_falpha (&color, alpha);
767
sp_svg_write_color (b, 64, rgba);
768
sp_repr_css_set_property (css, "fill", b);
770
sp_repr_css_set_property (css, "fill-opacity", osalpha.str().c_str());
771
for (r = reprs; r != NULL; r = r->next) {
772
sp_repr_set_attr_recursive ( (SPRepr *) r->data,
773
"sodipodi:fill-cmyk", NULL);
774
sp_repr_css_change_recursive ((SPRepr *) r->data, css, "style");
776
sp_repr_css_attr_unref (css);
777
if (spw->inkscape) sp_document_done (SP_WIDGET_DOCUMENT (spw));
780
case SP_PAINT_SELECTOR_MODE_COLOR_CMYK:
781
css = sp_repr_css_attr_new ();
782
sp_paint_selector_get_color_alpha (psel, &color, &alpha);
783
rgba = sp_color_get_rgba32_falpha (&color, alpha);
784
sp_svg_write_color (b, 64, rgba);
785
sp_repr_css_set_property (css, "fill", b);
787
sp_repr_css_set_property (css, "fill-opacity", osalpha.str().c_str());
788
sp_color_get_cmyk_floatv (&color, cmyk);
789
oscolour << "(" << cmyk[0] << " " << cmyk[1] << " " << cmyk[2] << " " << cmyk[3] << ")";
791
for (r = reprs; r != NULL; r = r->next) {
792
sp_repr_set_attr_recursive ( (SPRepr *) r->data,
793
"sodipodi:fill-cmyk", oscolour.str().c_str() );
794
sp_repr_css_change_recursive ((SPRepr *) r->data, css, "style");
796
sp_repr_css_attr_unref (css);
797
if (spw->inkscape) sp_document_done (SP_WIDGET_DOCUMENT (spw));
800
case SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR:
803
vector = sp_paint_selector_get_gradient_vector (psel);
806
/* No vector in paint selector should mean that we just
809
vector = sp_document_default_gradient_vector
810
(SP_WIDGET_DOCUMENT (spw));
812
for (i = items; i != NULL; i = i->next) {
813
sp_item_force_fill_lineargradient_vector
814
(SP_ITEM (i->data), vector );
818
vector = sp_gradient_ensure_vector_normalized (vector);
819
for (i = items; i != NULL; i = i->next) {
821
lg = sp_item_force_fill_lineargradient_vector
822
(SP_ITEM (i->data), vector );
823
sp_paint_selector_write_lineargradient ( psel,
824
SP_LINEARGRADIENT (lg), SP_ITEM (i->data));
825
sp_object_invoke_write ( SP_OBJECT (lg),
827
SP_OBJECT_WRITE_EXT );
830
sp_document_done (SP_WIDGET_DOCUMENT (spw));
834
case SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL:
838
vector = sp_paint_selector_get_gradient_vector (psel);
841
/* No vector in paint selector should mean that we just
844
vector = sp_document_default_gradient_vector
845
(SP_WIDGET_DOCUMENT (spw));
847
for (i = items; i != NULL; i = i->next) {
848
sp_item_force_fill_radialgradient_vector
849
(SP_ITEM (i->data), vector );
853
vector = sp_gradient_ensure_vector_normalized (vector);
854
for (i = items; i != NULL; i = i->next) {
856
rg = sp_item_force_fill_radialgradient_vector
857
(SP_ITEM (i->data), vector);
858
sp_paint_selector_write_radialgradient (psel,
859
SP_RADIALGRADIENT (rg), SP_ITEM (i->data));
860
sp_object_invoke_write ( SP_OBJECT (rg),
862
SP_OBJECT_WRITE_EXT );
866
sp_document_done (SP_WIDGET_DOCUMENT (spw));
872
g_warning ( "file %s: line %d: Paint selector should not be in "
874
__FILE__, __LINE__, psel->mode );
878
g_slist_free (reprs);
880
g_object_set_data (G_OBJECT (spw), "update", GINT_TO_POINTER (FALSE));
883
} // end of sp_fill_style_widget_paint_changed()
888
sp_fill_style_widget_fill_rule_activate (GtkWidget *w, SPWidget *spw)
891
const GSList *items, *i, *r;
895
if (g_object_get_data (G_OBJECT (spw), "update"))
900
items = sp_widget_get_item_list (spw);
902
for (i = items; i != NULL; i = i->next) {
903
reprs = g_slist_prepend (reprs, SP_OBJECT_REPR (i->data));
908
reprs = g_slist_prepend (NULL, spw->repr);
912
css = sp_repr_css_attr_new ();
913
sp_repr_css_set_property ( css, "fill-rule",
914
(const gchar *)g_object_get_data (G_OBJECT (w),
917
for (r = reprs; r != NULL; r = r->next) {
918
sp_repr_css_change_recursive ((SPRepr *) r->data, css, "style");
921
sp_repr_css_attr_unref (css);
924
sp_document_done (SP_WIDGET_DOCUMENT (spw));
926
g_slist_free (reprs);
928
} // end of sp_fill_style_widget_fill_rule_activate()
934
sp_fill_style_get_average_color_rgba (const GSList *objects, gfloat *c)
947
object = SP_OBJECT (objects->data);
948
if (object->style->fill.type == SP_PAINT_TYPE_COLOR) {
949
sp_color_get_rgb_floatv (&object->style->fill.value.color, d);
953
c[3] += SP_SCALE24_TO_FLOAT (object->style->fill_opacity.value);
956
objects = objects->next;
964
} // end of sp_fill_style_get_average_color_rgba()
969
sp_fill_style_get_average_color_cmyka (const GSList *objects, gfloat *c)
983
object = SP_OBJECT (objects->data);
984
if (object->style->fill.type == SP_PAINT_TYPE_COLOR) {
985
sp_color_get_cmyk_floatv (&object->style->fill.value.color, d);
990
c[4] += SP_SCALE24_TO_FLOAT (object->style->fill_opacity.value);
993
objects = objects->next;
1002
} // end of sp_fill_style_get_average_color_cmyka()
1007
static SPPaintSelectorMode
1008
sp_fill_style_determine_paint_selector_mode (SPStyle *style)
1010
SPColorSpaceType cstype;
1012
switch (style->fill.type) {
1014
case SP_PAINT_TYPE_NONE:
1015
return SP_PAINT_SELECTOR_MODE_NONE;
1017
case SP_PAINT_TYPE_COLOR:
1018
cstype = sp_color_get_colorspace_type (&style->fill.value.color);
1021
case SP_COLORSPACE_TYPE_RGB:
1022
return SP_PAINT_SELECTOR_MODE_COLOR_RGB;
1023
case SP_COLORSPACE_TYPE_CMYK:
1024
return SP_PAINT_SELECTOR_MODE_COLOR_CMYK;
1026
g_warning ( "file %s: line %d: Unknown colorspace type %d",
1027
__FILE__, __LINE__, cstype );
1028
return SP_PAINT_SELECTOR_MODE_NONE;
1031
case SP_PAINT_TYPE_PAINTSERVER:
1033
if (SP_IS_LINEARGRADIENT (SP_STYLE_FILL_SERVER (style))) {
1035
return SP_PAINT_SELECTOR_MODE_GRADIENT_LINEAR;
1037
} else if (SP_IS_RADIALGRADIENT (SP_STYLE_FILL_SERVER (style))) {
1039
return SP_PAINT_SELECTOR_MODE_GRADIENT_RADIAL;
1042
g_warning ( "file %s: line %d: Unknown paintserver",
1043
__FILE__, __LINE__ );
1044
return SP_PAINT_SELECTOR_MODE_NONE;
1048
g_warning ( "file %s: line %d: Unknown paint type %d",
1049
__FILE__, __LINE__, style->fill.type );
1053
return SP_PAINT_SELECTOR_MODE_NONE;
1055
} // end of sp_fill_style_determine_paint_selector_mode()
1062
c-file-style:"stroustrup"
1063
c-file-offsets:((innamespace . 0)(inline-open . 0))
1064
indent-tabs-mode:nil
1068
// vim: filetype=c++:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :