Merge lp:~penginsbacon/inkscape/fill-n-stroke-cppify into lp:~inkscape.dev/inkscape/trunk

Proposed by Tomasz Boczkowski
Status: Superseded
Proposed branch: lp:~penginsbacon/inkscape/fill-n-stroke-cppify
Merge into: lp:~inkscape.dev/inkscape/trunk
Diff against target: 10178 lines (+3899/-4073)
45 files modified
src/desktop-style.cpp (+2/-2)
src/extension/internal/cairo-render-context.cpp (+8/-9)
src/extension/internal/emf-print.cpp (+4/-4)
src/extension/internal/wmf-print.cpp (+2/-2)
src/extension/param/color.cpp (+32/-41)
src/extension/param/color.h (+7/-2)
src/extension/param/parameter.cpp (+5/-2)
src/knot-holder-entity.cpp (+9/-9)
src/selection-chemistry.cpp (+5/-5)
src/sp-item.cpp (+4/-4)
src/sp-pattern.cpp (+387/-402)
src/sp-pattern.h (+98/-65)
src/ui/CMakeLists.txt (+14/-0)
src/ui/Makefile_insert (+2/-0)
src/ui/dialog/objects.cpp (+17/-20)
src/ui/dialog/objects.h (+6/-3)
src/ui/dialog/tags.cpp (+1/-1)
src/ui/selected-color.cpp (+163/-0)
src/ui/selected-color.h (+96/-0)
src/ui/widget/Makefile_insert (+12/-0)
src/ui/widget/color-entry.cpp (+104/-0)
src/ui/widget/color-entry.h (+53/-0)
src/ui/widget/color-icc-selector.cpp (+586/-620)
src/ui/widget/color-icc-selector.h (+41/-35)
src/ui/widget/color-notebook.cpp (+226/-673)
src/ui/widget/color-notebook.h (+61/-82)
src/ui/widget/color-picker.cpp (+31/-41)
src/ui/widget/color-picker.h (+5/-3)
src/ui/widget/color-scales.cpp (+594/-677)
src/ui/widget/color-scales.h (+66/-56)
src/ui/widget/color-slider.cpp (+611/-727)
src/ui/widget/color-slider.h (+99/-49)
src/ui/widget/color-wheel-selector.cpp (+239/-285)
src/ui/widget/color-wheel-selector.h (+75/-56)
src/widgets/CMakeLists.txt (+0/-10)
src/widgets/Makefile_insert (+0/-10)
src/widgets/fill-style.cpp (+4/-6)
src/widgets/gradient-selector.cpp (+4/-0)
src/widgets/gradient-vector.cpp (+58/-24)
src/widgets/paint-selector.cpp (+75/-67)
src/widgets/paint-selector.h (+14/-5)
src/widgets/sp-color-selector.cpp (+6/-1)
src/widgets/sp-color-selector.h (+8/-0)
src/widgets/swatch-selector.cpp (+58/-70)
src/widgets/swatch-selector.h (+7/-5)
To merge this branch: bzr merge lp:~penginsbacon/inkscape/fill-n-stroke-cppify
Reviewer Review Type Date Requested Status
Tavmjong Bah Needs Fixing
Review via email: mp+258120@code.launchpad.net

This proposal supersedes a proposal from 2015-04-26.

This proposal has been superseded by a proposal from 2015-05-17.

Description of the change

This branch merges the c++-sification effort from GSOC 2014 project.

Refactored classes are related to fill'n'stroke dialog. The list includes:
SPColorSelector
SPColorWheelSelector
SPColorICCSelector
SPColorScales
SPNotebook
SPColorSlider

SPPattern

To post a comment you must log in.
Revision history for this message
Tavmjong Bah (tavmjong-free) wrote : Posted in a previous version of this proposal

Mostly looks good. We reviewed the first 5000 lines (the view was truncated there). Saw a bunch of minor white space issues. Reviewed at hackfest.

We are really looking forward to getting this in for 0.92!

review: Needs Fixing (code)
Revision history for this message
Tavmjong Bah (tavmjong-free) wrote :

Bugs:

1. Crash when selecting an object with a gradient and then clicking the solid color icon.

2. Color selection dialog doesn't remember last open tab (always opens in HSL even if RGB was last used tab).

3. First time dialog opened, there is an extra row in the RGB and HSL tabs.

At least #1 needs fixing before the code can be checked in.

review: Needs Fixing
14080. By Tomasz Boczkowski

merged trunk

14081. By Tomasz Boczkowski

Using MODE_SOLID_COLOR in paint selector instead of duplicated MODE_COLOR_RGB and MODE_COLOR_CMYK

14082. By Tomasz Boczkowski

fixed crash in paint selector when changing from gradient to solid color

14083. By Tomasz Boczkowski

merged trunk

14084. By Tomasz Boczkowski

fixed color selector not remembering it's last open tab

14085. By Tomasz Boczkowski

merged trunk

Revision history for this message
Tomasz Boczkowski (penginsbacon) wrote :

I've fixed the bugs #1 and #2 in fill-n-stroke-cppify branch.
I cannot reproduce #3 on my computer. Could you please send me a screenshot?

On Sun, May 3, 2015 at 9:32 PM, Tavmjong Bah <email address hidden> wrote:

> Review: Needs Fixing
>
> Bugs:
>
> 1. Crash when selecting an object with a gradient and then clicking the
> solid color icon.
>
> 2. Color selection dialog doesn't remember last open tab (always opens in
> HSL even if RGB was last used tab).
>
> 3. First time dialog opened, there is an extra row in the RGB and HSL tabs.
>
> At least #1 needs fixing before the code can be checked in.
>
>
> --
>
> https://code.launchpad.net/~penginsbacon/inkscape/fill-n-stroke-cppify/+merge/258120
> You are the owner of lp:~penginsbacon/inkscape/fill-n-stroke-cppify.
>

Revision history for this message
su_v (suv-lp) wrote :

On 2015-05-12 24:42 (+0200), Tomasz Boczkowski wrote:
>> 3. First time dialog opened, there is an extra row in the RGB and
>> HSL tabs.
>
> I cannot reproduce #3 on my computer. Could you please send me a
> screenshot?

Steps to reproduce:
1) launch branch build with default (new) prefs
2) draw a rectangle
3) open Fill & Stroke

--> there's an additional color slider below the regular ones.

Screenshot:
https://www.dropbox.com/sh/b1h0t3fb0heuzc3/AAACYs48cTYY6FeXKiz_j19ga?dl=0

Does not happen if nothing is selected when opening Fill & Stroke for the first time in the current session.

Revision history for this message
su_v (suv-lp) wrote :

Another regression (reproduced with r14085):
Steps to reproduce:
1) launch branch build with default (new) prefs
2) draw a rect
3) draw an ellipse
4) group ellipse (Ctrl+G)
5) deselect everything (<esc>)
6) open fill&stroke dialog
7) select rect
--> fill shows blue paint as expected
8) select group
--> fill shows 'Paint is undefined' as expected
9) select again the rectangle
--> fill shows solid white paint (incorrect)

Seems to be triggered after having selected an object with undefined style property (can be reproduced e.g. with clones, and with stroke paint, too).

14086. By Tomasz Boczkowski

merged trunk

14087. By Tomasz Boczkowski

fixed: color scales - extra row in RGB mode

14088. By Tomasz Boczkowski

fixed: color scales - updating color when switched from undefined

14089. By Tomasz Boczkowski

fixed: color icc selector - extra rows on startup

Unmerged revisions

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'src/desktop-style.cpp'
--- src/desktop-style.cpp 2015-05-16 12:50:10 +0000
+++ src/desktop-style.cpp 2015-05-17 11:43:43 +0000
@@ -576,8 +576,8 @@
576 return QUERY_STYLE_MULTIPLE_DIFFERENT; // different kind of server576 return QUERY_STYLE_MULTIPLE_DIFFERENT; // different kind of server
577 }577 }
578578
579 SPPattern *pat = pattern_getroot (pattern);579 SPPattern *pat = SP_PATTERN (server)->rootPattern();
580 SPPattern *pat_res = pattern_getroot (pattern_res);580 SPPattern *pat_res = SP_PATTERN (server_res)->rootPattern();
581 if (pat_res != pat) {581 if (pat_res != pat) {
582 return QUERY_STYLE_MULTIPLE_DIFFERENT; // different pattern roots582 return QUERY_STYLE_MULTIPLE_DIFFERENT; // different pattern roots
583 }583 }
584584
=== modified file 'src/extension/internal/cairo-render-context.cpp'
--- src/extension/internal/cairo-render-context.cpp 2015-05-08 13:46:25 +0000
+++ src/extension/internal/cairo-render-context.cpp 2015-05-17 11:43:43 +0000
@@ -1008,17 +1008,16 @@
1008 ps2user = Geom::identity();1008 ps2user = Geom::identity();
1009 pcs2dev = Geom::identity();1009 pcs2dev = Geom::identity();
10101010
1011 double x = pattern_x(pat);1011 double x = pat->x();
1012 double y = pattern_y(pat);1012 double y = pat->y();
1013 double width = pattern_width(pat);1013 double width = pat->width();
1014 double height = pattern_height(pat);1014 double height = pat->height();
1015 double bbox_width_scaler;1015 double bbox_width_scaler;
1016 double bbox_height_scaler;1016 double bbox_height_scaler;
10171017
1018 TRACE(("%f x %f pattern\n", width, height));1018 TRACE(("%f x %f pattern\n", width, height));
10191019
1020 if (pbox && pattern_patternUnits(pat) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) {1020 if (pbox && pat->patternUnits() == SPPattern::UNITS_OBJECTBOUNDINGBOX) {
1021 //Geom::Affine bbox2user (pbox->x1 - pbox->x0, 0.0, 0.0, pbox->y1 - pbox->y0, pbox->x0, pbox->y0);
1022 bbox_width_scaler = pbox->width();1021 bbox_width_scaler = pbox->width();
1023 bbox_height_scaler = pbox->height();1022 bbox_height_scaler = pbox->height();
1024 ps2user[4] = x * bbox_width_scaler + pbox->left();1023 ps2user[4] = x * bbox_width_scaler + pbox->left();
@@ -1031,13 +1030,13 @@
1031 }1030 }
10321031
1033 // apply pattern transformation1032 // apply pattern transformation
1034 Geom::Affine pattern_transform(pattern_patternTransform(pat));1033 Geom::Affine pattern_transform(pat->getTransform());
1035 ps2user *= pattern_transform;1034 ps2user *= pattern_transform;
1036 Geom::Point ori (ps2user[4], ps2user[5]);1035 Geom::Point ori (ps2user[4], ps2user[5]);
10371036
1038 // create pattern contents coordinate system1037 // create pattern contents coordinate system
1039 if (pat->viewBox_set) {1038 if (pat->viewBox_set) {
1040 Geom::Rect view_box = *pattern_viewBox(pat);1039 Geom::Rect view_box = *pat->viewbox();
10411040
1042 double x, y, w, h;1041 double x, y, w, h;
1043 x = 0;1042 x = 0;
@@ -1050,7 +1049,7 @@
1050 pcs2dev[3] = h / view_box.height();1049 pcs2dev[3] = h / view_box.height();
1051 pcs2dev[4] = x - view_box.left() * pcs2dev[0];1050 pcs2dev[4] = x - view_box.left() * pcs2dev[0];
1052 pcs2dev[5] = y - view_box.top() * pcs2dev[3];1051 pcs2dev[5] = y - view_box.top() * pcs2dev[3];
1053 } else if (pbox && pattern_patternContentUnits(pat) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) {1052 } else if (pbox && pat->patternContentUnits() == SPPattern::UNITS_OBJECTBOUNDINGBOX) {
1054 pcs2dev[0] = pbox->width();1053 pcs2dev[0] = pbox->width();
1055 pcs2dev[3] = pbox->height();1054 pcs2dev[3] = pbox->height();
1056 }1055 }
10571056
=== modified file 'src/extension/internal/emf-print.cpp'
--- src/extension/internal/emf-print.cpp 2015-04-27 18:49:22 +0000
+++ src/extension/internal/emf-print.cpp 2015-05-17 11:43:43 +0000
@@ -388,8 +388,8 @@
388 } else if (SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style))) { // must be paint-server388 } else if (SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style))) { // must be paint-server
389 SPPaintServer *paintserver = style->fill.value.href->getObject();389 SPPaintServer *paintserver = style->fill.value.href->getObject();
390 SPPattern *pat = SP_PATTERN(paintserver);390 SPPattern *pat = SP_PATTERN(paintserver);
391 double dwidth = pattern_width(pat);391 double dwidth = pat->width();
392 double dheight = pattern_height(pat);392 double dheight = pat->height();
393 width = dwidth;393 width = dwidth;
394 height = dheight;394 height = dheight;
395 brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor);395 brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor);
@@ -573,8 +573,8 @@
573 if (SP_IS_PATTERN(SP_STYLE_STROKE_SERVER(style))) { // must be paint-server573 if (SP_IS_PATTERN(SP_STYLE_STROKE_SERVER(style))) { // must be paint-server
574 SPPaintServer *paintserver = style->stroke.value.href->getObject();574 SPPaintServer *paintserver = style->stroke.value.href->getObject();
575 SPPattern *pat = SP_PATTERN(paintserver);575 SPPattern *pat = SP_PATTERN(paintserver);
576 double dwidth = pattern_width(pat);576 double dwidth = pat->width();
577 double dheight = pattern_height(pat);577 double dheight = pat->height();
578 width = dwidth;578 width = dwidth;
579 height = dheight;579 height = dheight;
580 brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor);580 brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor);
581581
=== modified file 'src/extension/internal/wmf-print.cpp'
--- src/extension/internal/wmf-print.cpp 2015-04-27 18:49:22 +0000
+++ src/extension/internal/wmf-print.cpp 2015-05-17 11:43:43 +0000
@@ -380,8 +380,8 @@
380 } else if (SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style))) { // must be paint-server380 } else if (SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style))) { // must be paint-server
381 SPPaintServer *paintserver = style->fill.value.href->getObject();381 SPPaintServer *paintserver = style->fill.value.href->getObject();
382 SPPattern *pat = SP_PATTERN(paintserver);382 SPPattern *pat = SP_PATTERN(paintserver);
383 double dwidth = pattern_width(pat);383 double dwidth = pat->width();
384 double dheight = pattern_height(pat);384 double dheight = pat->height();
385 width = dwidth;385 width = dwidth;
386 height = dheight;386 height = dheight;
387 brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor);387 brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor);
388388
=== modified file 'src/extension/param/color.cpp'
--- src/extension/param/color.cpp 2015-04-27 23:38:31 +0000
+++ src/extension/param/color.cpp 2015-05-17 11:43:43 +0000
@@ -24,41 +24,37 @@
24#include "color.h"24#include "color.h"
2525
26#include <color.h>26#include <color.h>
27#include "widgets/sp-color-selector.h"27#include "ui/widget/color-notebook.h"
28#include "widgets/sp-color-notebook.h"
29#include "preferences.h"28#include "preferences.h"
3029
31
32namespace Inkscape {30namespace Inkscape {
33namespace Extension {31namespace Extension {
3432
35void sp_color_param_changed(SPColorSelector *csel, GObject *cp);
36
37
38ParamColor::~ParamColor(void)33ParamColor::~ParamColor(void)
39{34{
4035 _color_changed.disconnect();
41}36}
4237
43guint32 ParamColor::set( guint32 in, SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/ )38guint32 ParamColor::set( guint32 in, SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/ )
44{39{
45 _value = in;40 _color_changed.block(true);
41 _color.setValue(in);
42 _color_changed.block(false);
4643
47 gchar * prefname = this->pref_name();44 gchar * prefname = this->pref_name();
48 std::string value;45 std::string value;
49 string(value);46 string(value);
50 47
51 Inkscape::Preferences *prefs = Inkscape::Preferences::get();48 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
52 prefs->setString(extension_pref_root + prefname, value);49 prefs->setString(extension_pref_root + prefname, value);
53 g_free(prefname);50 g_free(prefname);
5451
55 return _value;52 return in;
56}53}
5754
58ParamColor::ParamColor(const gchar *name, const gchar *guitext, const gchar *desc, const Parameter::_scope_t scope,55ParamColor::ParamColor (const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, bool gui_hidden, const gchar * gui_tip, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml) :
59 bool gui_hidden, const gchar *gui_tip, Inkscape::Extension::Extension *ext,56 Parameter(name, guitext, desc, scope, gui_hidden, gui_tip, ext),
60 Inkscape::XML::Node *xml)57 _changeSignal(0)
61 : Parameter(name, guitext, desc, scope, gui_hidden, gui_tip, ext), _value(0), _changeSignal(0)
62{58{
63 const char * defaulthex = NULL;59 const char * defaulthex = NULL;
64 if (xml->firstChild() != NULL)60 if (xml->firstChild() != NULL)
@@ -72,51 +68,46 @@
72 if (!paramval.empty())68 if (!paramval.empty())
73 defaulthex = paramval.data();69 defaulthex = paramval.data();
7470
75 if (defaulthex)71 if (defaulthex) {
76 _value = atoi(defaulthex);72 _color.setValue(atoi(defaulthex));
73 }
74 _color_changed = _color.signal_changed.connect(sigc::mem_fun(this, &ParamColor::_onColorChanged));
75
77}76}
7877
79void ParamColor::string(std::string &string) const78void ParamColor::string(std::string &string) const
80{79{
81 char str[16];80 char str[16];
82 sprintf(str, "%i", _value);81 snprintf(str, 16, "%i", _color.value());
83 string += str;82 string += str;
84}83}
8584
86Gtk::Widget *ParamColor::get_widget( SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/, sigc::signal<void> * changeSignal )85Gtk::Widget *ParamColor::get_widget( SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/, sigc::signal<void> * changeSignal )
87{86{
88 if (_gui_hidden) return NULL;87 using Inkscape::UI::Widget::ColorNotebook;
88
89 if (_gui_hidden) return NULL;
8990
90 _changeSignal = new sigc::signal<void>(*changeSignal);91 _changeSignal = new sigc::signal<void>(*changeSignal);
91 Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false, 4));
92 SPColorSelector* spColorSelector = (SPColorSelector*)sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK);
9392
94 ColorSelector* colorSelector = spColorSelector->base;93 if (_color.value() < 1) {
95 if (_value < 1) {94 _color_changed.block(true);
96 _value = 0xFF000000;95 _color.setValue(0xFF000000);
96 _color_changed.block(false);
97 }97 }
98 SPColor *color = new SPColor( _value );98
99 float alpha = (_value & 0xff) / 255.0F;99 Gtk::HBox *hbox = Gtk::manage(new Gtk::HBox(false, 4));
100 colorSelector->setColorAlpha(*color, alpha);100 Gtk::Widget *selector = Gtk::manage(new ColorNotebook(_color));
101101 hbox->pack_start (*selector, true, true, 0);
102 hbox->pack_start (*Glib::wrap(&spColorSelector->vbox), true, true, 0);102 selector->show();
103 g_signal_connect(G_OBJECT(spColorSelector), "changed", G_CALLBACK(sp_color_param_changed), (void*)this);
104
105 gtk_widget_show(GTK_WIDGET(spColorSelector));
106 hbox->show();103 hbox->show();
107104 return hbox;
108 return dynamic_cast<Gtk::Widget *>(hbox);
109}105}
110106
111void sp_color_param_changed(SPColorSelector *csel, GObject *obj)107void ParamColor::_onColorChanged()
112{108{
113 const SPColor color = csel->base->getColor();109 if (_changeSignal)
114 float alpha = csel->base->getAlpha();110 _changeSignal->emit();
115
116 ParamColor* ptr = reinterpret_cast<ParamColor*>(obj);
117 ptr->set(color.toRGBA32( alpha ), NULL, NULL);
118
119 ptr->_changeSignal->emit();
120}111}
121112
122}; /* namespace Extension */113}; /* namespace Extension */
123114
=== modified file 'src/extension/param/color.h'
--- src/extension/param/color.h 2012-02-29 01:16:51 +0000
+++ src/extension/param/color.h 2015-05-17 11:43:43 +0000
@@ -9,6 +9,7 @@
9 */9 */
1010
11#include "parameter.h"11#include "parameter.h"
12#include "ui/selected-color.h"
1213
13class SPDocument;14class SPDocument;
1415
@@ -25,14 +26,17 @@
2526
26class ParamColor : public Parameter {27class ParamColor : public Parameter {
27private:28private:
28 guint32 _value;29 void _onColorChanged();
30
31 Inkscape::UI::SelectedColor _color;
32 sigc::connection _color_changed;
29public:33public:
30 ParamColor(const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, bool gui_hidden, const gchar * gui_tip, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml);34 ParamColor(const gchar * name, const gchar * guitext, const gchar * desc, const Parameter::_scope_t scope, bool gui_hidden, const gchar * gui_tip, Inkscape::Extension::Extension * ext, Inkscape::XML::Node * xml);
3135
32 virtual ~ParamColor(void);36 virtual ~ParamColor(void);
3337
34 /** Returns \c _value, with a \i const to protect it. */38 /** Returns \c _value, with a \i const to protect it. */
35 guint32 get( SPDocument const * /*doc*/, Inkscape::XML::Node const * /*node*/ ) const { return _value; }39 guint32 get( SPDocument const * /*doc*/, Inkscape::XML::Node const * /*node*/ ) const { return _color.value(); }
3640
37 guint32 set (guint32 in, SPDocument * doc, Inkscape::XML::Node * node);41 guint32 set (guint32 in, SPDocument * doc, Inkscape::XML::Node * node);
3842
@@ -44,6 +48,7 @@
44 virtual void string (std::string &string) const;48 virtual void string (std::string &string) const;
4549
46 sigc::signal<void> * _changeSignal;50 sigc::signal<void> * _changeSignal;
51
47}; // class ParamColor52}; // class ParamColor
4853
49} // namespace Extension54} // namespace Extension
5055
=== modified file 'src/extension/param/parameter.cpp'
--- src/extension/param/parameter.cpp 2014-03-27 01:33:44 +0000
+++ src/extension/param/parameter.cpp 2015-05-17 11:43:43 +0000
@@ -15,6 +15,10 @@
15# include "config.h"15# include "config.h"
16#endif16#endif
1717
18#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H
19#include <glibmm/threads.h>
20#endif
21
18#ifdef linux // does the dollar sign need escaping when passed as string parameter?22#ifdef linux // does the dollar sign need escaping when passed as string parameter?
19# define ESCAPE_DOLLAR_COMMANDLINE23# define ESCAPE_DOLLAR_COMMANDLINE
20#endif24#endif
@@ -26,8 +30,7 @@
26#include "document-private.h"30#include "document-private.h"
27#include "sp-object.h"31#include "sp-object.h"
28#include <color.h>32#include <color.h>
29#include "widgets/sp-color-selector.h"33#include "ui/widget/color-notebook.h"
30#include "widgets/sp-color-notebook.h"
3134
32#include "parameter.h"35#include "parameter.h"
33#include "bool.h"36#include "bool.h"
3437
=== modified file 'src/knot-holder-entity.cpp'
--- src/knot-holder-entity.cpp 2014-08-04 16:10:37 +0000
+++ src/knot-holder-entity.cpp 2015-05-17 11:43:43 +0000
@@ -140,19 +140,19 @@
140140
141static gdouble sp_pattern_extract_theta(SPPattern const *pat)141static gdouble sp_pattern_extract_theta(SPPattern const *pat)
142{142{
143 Geom::Affine transf = pat->patternTransform;143 Geom::Affine transf = pat->getTransform();
144 return Geom::atan2(transf.xAxis());144 return Geom::atan2(transf.xAxis());
145}145}
146146
147static Geom::Point sp_pattern_extract_scale(SPPattern const *pat)147static Geom::Point sp_pattern_extract_scale(SPPattern const *pat)
148{148{
149 Geom::Affine transf = pat->patternTransform;149 Geom::Affine transf = pat->getTransform();
150 return Geom::Point( transf.expansionX(), transf.expansionY() );150 return Geom::Point( transf.expansionX(), transf.expansionY() );
151}151}
152152
153static Geom::Point sp_pattern_extract_trans(SPPattern const *pat)153static Geom::Point sp_pattern_extract_trans(SPPattern const *pat)
154{154{
155 return Geom::Point(pat->patternTransform[4], pat->patternTransform[5]);155 return Geom::Point(pat->getTransform()[4], pat->getTransform()[5]);
156}156}
157157
158void158void
@@ -191,7 +191,7 @@
191{191{
192 SPPattern *pat = _fill ? SP_PATTERN(item->style->getFillPaintServer()) : SP_PATTERN(item->style->getStrokePaintServer());192 SPPattern *pat = _fill ? SP_PATTERN(item->style->getFillPaintServer()) : SP_PATTERN(item->style->getStrokePaintServer());
193193
194 gdouble x = pattern_width(pat);194 gdouble x = pat->width();
195 gdouble y = 0;195 gdouble y = 0;
196 Geom::Point delta = Geom::Point(x,y);196 Geom::Point delta = Geom::Point(x,y);
197 Geom::Point scale = sp_pattern_extract_scale(pat);197 Geom::Point scale = sp_pattern_extract_scale(pat);
@@ -240,8 +240,8 @@
240240
241 // Get the new scale from the position of the knotholder241 // Get the new scale from the position of the knotholder
242 Geom::Point d = p_snapped - sp_pattern_extract_trans(pat);242 Geom::Point d = p_snapped - sp_pattern_extract_trans(pat);
243 gdouble pat_x = pattern_width(pat);243 gdouble pat_x = pat->width();
244 gdouble pat_y = pattern_height(pat);244 gdouble pat_y = pat->height();
245 Geom::Scale scl(1);245 Geom::Scale scl(1);
246 if ( state & GDK_CONTROL_MASK ) {246 if ( state & GDK_CONTROL_MASK ) {
247 // if ctrl is pressed: use 1:1 scaling247 // if ctrl is pressed: use 1:1 scaling
@@ -267,10 +267,10 @@
267{267{
268 SPPattern *pat = _fill ? SP_PATTERN(item->style->getFillPaintServer()) : SP_PATTERN(item->style->getStrokePaintServer());268 SPPattern *pat = _fill ? SP_PATTERN(item->style->getFillPaintServer()) : SP_PATTERN(item->style->getStrokePaintServer());
269269
270 gdouble x = pattern_width(pat);270 gdouble x = pat->width();
271 gdouble y = pattern_height(pat);271 gdouble y = pat->height();
272 Geom::Point delta = Geom::Point(x,y);272 Geom::Point delta = Geom::Point(x,y);
273 Geom::Affine a = pat->patternTransform;273 Geom::Affine a = pat->getTransform();
274 a[4] = 0;274 a[4] = 0;
275 a[5] = 0;275 a[5] = 0;
276 delta = delta * a;276 delta = delta * a;
277277
=== modified file 'src/selection-chemistry.cpp'
--- src/selection-chemistry.cpp 2015-05-09 12:59:00 +0000
+++ src/selection-chemistry.cpp 2015-05-17 11:43:43 +0000
@@ -1963,8 +1963,8 @@
1963 }1963 }
19641964
1965 } else if (dynamic_cast<SPPattern *>(sel_server) && dynamic_cast<SPPattern *>(iter_server)) {1965 } else if (dynamic_cast<SPPattern *>(sel_server) && dynamic_cast<SPPattern *>(iter_server)) {
1966 SPPattern *sel_pat = pattern_getroot(dynamic_cast<SPPattern *>(sel_server));1966 SPPattern *sel_pat = dynamic_cast<SPPattern *>(sel_server)->rootPattern();
1967 SPPattern *iter_pat = pattern_getroot(dynamic_cast<SPPattern *>(iter_server));1967 SPPattern *iter_pat = dynamic_cast<SPPattern *>(iter_server)->rootPattern();
1968 if (sel_pat == iter_pat) {1968 if (sel_pat == iter_pat) {
1969 match = true;1969 match = true;
1970 }1970 }
@@ -3312,7 +3312,7 @@
3312 int saved_compensation = prefs->getInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED);3312 int saved_compensation = prefs->getInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED);
3313 prefs->setInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED);3313 prefs->setInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED);
33143314
3315 gchar const *pat_id = pattern_tile(repr_copies, bbox, doc,3315 gchar const *pat_id = SPPattern::produce(repr_copies, bbox, doc,
3316 ( Geom::Affine(Geom::Translate(desktop->dt2doc(Geom::Point(r->min()[Geom::X],3316 ( Geom::Affine(Geom::Translate(desktop->dt2doc(Geom::Point(r->min()[Geom::X],
3317 r->max()[Geom::Y]))))3317 r->max()[Geom::Y]))))
3318 * parent_transform.inverse() ),3318 * parent_transform.inverse() ),
@@ -3390,9 +3390,9 @@
33903390
3391 did = true;3391 did = true;
33923392
3393 SPPattern *pattern = pattern_getroot(basePat);3393 SPPattern *pattern = basePat->rootPattern();
33943394
3395 Geom::Affine pat_transform = pattern_patternTransform(basePat);3395 Geom::Affine pat_transform = basePat->getTransform();
3396 pat_transform *= item->transform;3396 pat_transform *= item->transform;
33973397
3398 for (SPObject *child = pattern->firstChild() ; child != NULL; child = child->next ) {3398 for (SPObject *child = pattern->firstChild() ; child != NULL; child = child->next ) {
33993399
=== modified file 'src/sp-item.cpp'
--- src/sp-item.cpp 2015-05-10 21:55:55 +0000
+++ src/sp-item.cpp 2015-05-17 11:43:43 +0000
@@ -1222,8 +1222,8 @@
1222 SPObject *server = style->getFillPaintServer();1222 SPObject *server = style->getFillPaintServer();
1223 SPPattern *serverPatt = dynamic_cast<SPPattern *>(server);1223 SPPattern *serverPatt = dynamic_cast<SPPattern *>(server);
1224 if ( serverPatt ) {1224 if ( serverPatt ) {
1225 SPPattern *pattern = sp_pattern_clone_if_necessary(this, serverPatt, "fill");1225 SPPattern *pattern = serverPatt->clone_if_necessary(this, "fill");
1226 sp_pattern_transform_multiply(pattern, postmul, set);1226 pattern->transform_multiply(postmul, set);
1227 }1227 }
1228 }1228 }
12291229
@@ -1232,8 +1232,8 @@
1232 SPObject *server = style->getStrokePaintServer();1232 SPObject *server = style->getStrokePaintServer();
1233 SPPattern *serverPatt = dynamic_cast<SPPattern *>(server);1233 SPPattern *serverPatt = dynamic_cast<SPPattern *>(server);
1234 if ( serverPatt ) {1234 if ( serverPatt ) {
1235 SPPattern *pattern = sp_pattern_clone_if_necessary(this, serverPatt, "stroke");1235 SPPattern *pattern = serverPatt->clone_if_necessary(this, "stroke");
1236 sp_pattern_transform_multiply(pattern, postmul, set);1236 pattern->transform_multiply(postmul, set);
1237 }1237 }
1238 }1238 }
1239}1239}
12401240
=== modified file 'src/sp-pattern.cpp'
--- src/sp-pattern.cpp 2015-04-26 09:44:42 +0000
+++ src/sp-pattern.cpp 2015-05-17 11:43:43 +0000
@@ -5,7 +5,7 @@
5 * Lauris Kaplinski <lauris@kaplinski.com>5 * Lauris Kaplinski <lauris@kaplinski.com>
6 * bulia byak <buliabyak@users.sf.net>6 * bulia byak <buliabyak@users.sf.net>
7 * Jon A. Cruz <jon@joncruz.org>7 * Jon A. Cruz <jon@joncruz.org>
8 * Abhishek Sharma 8 * Abhishek Sharma
9 *9 *
10 * Copyright (C) 2002 Lauris Kaplinski10 * Copyright (C) 2002 Lauris Kaplinski
11 *11 *
@@ -13,15 +13,15 @@
13 */13 */
1414
15#ifdef HAVE_CONFIG_H15#ifdef HAVE_CONFIG_H
16# include "config.h"16#include "config.h"
17#endif17#endif
1818
19#include <cstring>19#include <cstring>
20#include <string>20#include <string>
21#include <glibmm.h>21#include <glibmm.h>
22#include <2geom/transforms.h>22#include <2geom/transforms.h>
23#include <sigc++/functors/mem_fun.h>
2324
24#include "macros.h"
25#include "svg/svg.h"25#include "svg/svg.h"
26#include "display/cairo-utils.h"26#include "display/cairo-utils.h"
27#include "display/drawing-context.h"27#include "display/drawing-context.h"
@@ -34,67 +34,61 @@
34#include "style.h"34#include "style.h"
35#include "sp-pattern.h"35#include "sp-pattern.h"
36#include "xml/repr.h"36#include "xml/repr.h"
37#include "display/grayscale.h"37
3838#include "sp-factory.h"
39#include <sigc++/functors/ptr_fun.h>39
40#include <sigc++/adaptors/bind.h>40SPPattern::SPPattern()
4141 : SPPaintServer()
42/*42 , SPViewBox()
43 * Pattern43{
44 */44 this->ref = new SPPatternReference(this);
45static void pattern_ref_changed(SPObject *old_ref, SPObject *ref, SPPattern *pat);45 this->ref->changedSignal().connect(sigc::mem_fun(this, &SPPattern::_onRefChanged));
46static void pattern_ref_modified (SPObject *ref, guint flags, SPPattern *pattern);46
4747 this->_pattern_units = UNITS_OBJECTBOUNDINGBOX;
48SPPattern::SPPattern() : SPPaintServer(), SPViewBox() {48 this->_pattern_units_set = false;
49 this->href = NULL;49
5050 this->_pattern_content_units = UNITS_USERSPACEONUSE;
51 this->ref = new SPPatternReference(this);51 this->_pattern_content_units_set = false;
52 this->ref->changedSignal().connect(sigc::bind(sigc::ptr_fun(pattern_ref_changed), this));52
5353 this->_pattern_transform = Geom::identity();
54 this->patternUnits = SP_PATTERN_UNITS_OBJECTBOUNDINGBOX;54 this->_pattern_transform_set = false;
55 this->patternUnits_set = FALSE;55
5656 this->_x.unset();
57 this->patternContentUnits = SP_PATTERN_UNITS_USERSPACEONUSE;57 this->_y.unset();
58 this->patternContentUnits_set = FALSE;58 this->_width.unset();
5959 this->_height.unset();
60 this->patternTransform = Geom::identity();60}
61 this->patternTransform_set = FALSE;61
6262SPPattern::~SPPattern() {}
63 this->x.unset();63
64 this->y.unset();64void SPPattern::build(SPDocument *doc, Inkscape::XML::Node *repr)
65 this->width.unset();65{
66 this->height.unset();66 SPPaintServer::build(doc, repr);
67}67
6868 this->readAttr("patternUnits");
69SPPattern::~SPPattern() {69 this->readAttr("patternContentUnits");
70}70 this->readAttr("patternTransform");
7171 this->readAttr("x");
72void SPPattern::build(SPDocument* doc, Inkscape::XML::Node* repr) {72 this->readAttr("y");
73 SPPaintServer::build(doc, repr);73 this->readAttr("width");
7474 this->readAttr("height");
75 this->readAttr( "patternUnits" );75 this->readAttr("viewBox");
76 this->readAttr( "patternContentUnits" );76 this->readAttr("preserveAspectRatio");
77 this->readAttr( "patternTransform" );77 this->readAttr("xlink:href");
78 this->readAttr( "x" );78
79 this->readAttr( "y" );79 /* Register ourselves */
80 this->readAttr( "width" );80 doc->addResource("pattern", this);
81 this->readAttr( "height" );81}
82 this->readAttr( "viewBox" );82
83 this->readAttr( "preserveAspectRatio" );83void SPPattern::release()
84 this->readAttr( "xlink:href" );84{
85
86 /* Register ourselves */
87 doc->addResource("pattern", this);
88}
89
90void SPPattern::release() {
91 if (this->document) {85 if (this->document) {
92 // Unregister ourselves86 // Unregister ourselves
93 this->document->removeResource("pattern", this);87 this->document->removeResource("pattern", this);
94 }88 }
9589
96 if (this->ref) {90 if (this->ref) {
97 this->modified_connection.disconnect();91 this->_modified_connection.disconnect();
98 this->ref->detach();92 this->ref->detach();
99 delete this->ref;93 delete this->ref;
100 this->ref = NULL;94 this->ref = NULL;
@@ -103,113 +97,121 @@
103 SPPaintServer::release();97 SPPaintServer::release();
104}98}
10599
106void SPPattern::set(unsigned int key, const gchar* value) {100void SPPattern::set(unsigned int key, const gchar *value)
107 switch (key) {101{
108 case SP_ATTR_PATTERNUNITS:102 switch (key) {
109 if (value) {103 case SP_ATTR_PATTERNUNITS:
110 if (!strcmp (value, "userSpaceOnUse")) {104 if (value) {
111 this->patternUnits = SP_PATTERN_UNITS_USERSPACEONUSE;105 if (!strcmp(value, "userSpaceOnUse")) {
112 } else {106 this->_pattern_units = UNITS_USERSPACEONUSE;
113 this->patternUnits = SP_PATTERN_UNITS_OBJECTBOUNDINGBOX;107 }
114 }108 else {
115109 this->_pattern_units = UNITS_OBJECTBOUNDINGBOX;
116 this->patternUnits_set = TRUE;110 }
117 } else {111
118 this->patternUnits_set = FALSE;112 this->_pattern_units_set = true;
119 }113 }
120114 else {
121 this->requestModified(SP_OBJECT_MODIFIED_FLAG);115 this->_pattern_units_set = false;
122 break;116 }
123117
124 case SP_ATTR_PATTERNCONTENTUNITS:118 this->requestModified(SP_OBJECT_MODIFIED_FLAG);
125 if (value) {119 break;
126 if (!strcmp (value, "userSpaceOnUse")) {120
127 this->patternContentUnits = SP_PATTERN_UNITS_USERSPACEONUSE;121 case SP_ATTR_PATTERNCONTENTUNITS:
128 } else {122 if (value) {
129 this->patternContentUnits = SP_PATTERN_UNITS_OBJECTBOUNDINGBOX;123 if (!strcmp(value, "userSpaceOnUse")) {
130 }124 this->_pattern_content_units = UNITS_USERSPACEONUSE;
131125 }
132 this->patternContentUnits_set = TRUE;126 else {
133 } else {127 this->_pattern_content_units = UNITS_OBJECTBOUNDINGBOX;
134 this->patternContentUnits_set = FALSE;128 }
135 }129
136130 this->_pattern_content_units_set = true;
137 this->requestModified(SP_OBJECT_MODIFIED_FLAG);131 }
138 break;132 else {
139133 this->_pattern_content_units_set = false;
140 case SP_ATTR_PATTERNTRANSFORM: {134 }
141 Geom::Affine t;135
142136 this->requestModified(SP_OBJECT_MODIFIED_FLAG);
143 if (value && sp_svg_transform_read (value, &t)) {137 break;
144 this->patternTransform = t;138
145 this->patternTransform_set = TRUE;139 case SP_ATTR_PATTERNTRANSFORM: {
146 } else {140 Geom::Affine t;
147 this->patternTransform = Geom::identity();141
148 this->patternTransform_set = FALSE;142 if (value && sp_svg_transform_read(value, &t)) {
149 }143 this->_pattern_transform = t;
150144 this->_pattern_transform_set = true;
151 this->requestModified(SP_OBJECT_MODIFIED_FLAG);145 }
152 break;146 else {
153 }147 this->_pattern_transform = Geom::identity();
154 case SP_ATTR_X:148 this->_pattern_transform_set = false;
155 this->x.readOrUnset(value);149 }
156 this->requestModified(SP_OBJECT_MODIFIED_FLAG);150
157 break;151 this->requestModified(SP_OBJECT_MODIFIED_FLAG);
158152 break;
159 case SP_ATTR_Y:153 }
160 this->y.readOrUnset(value);154 case SP_ATTR_X:
161 this->requestModified(SP_OBJECT_MODIFIED_FLAG);155 this->_x.readOrUnset(value);
162 break;156 this->requestModified(SP_OBJECT_MODIFIED_FLAG);
163157 break;
164 case SP_ATTR_WIDTH:158
165 this->width.readOrUnset(value);159 case SP_ATTR_Y:
166 this->requestModified(SP_OBJECT_MODIFIED_FLAG);160 this->_y.readOrUnset(value);
167 break;161 this->requestModified(SP_OBJECT_MODIFIED_FLAG);
168162 break;
169 case SP_ATTR_HEIGHT:163
170 this->height.readOrUnset(value);164 case SP_ATTR_WIDTH:
171 this->requestModified(SP_OBJECT_MODIFIED_FLAG);165 this->_width.readOrUnset(value);
172 break;166 this->requestModified(SP_OBJECT_MODIFIED_FLAG);
173167 break;
174 case SP_ATTR_VIEWBOX:168
175 set_viewBox( value );169 case SP_ATTR_HEIGHT:
170 this->_height.readOrUnset(value);
171 this->requestModified(SP_OBJECT_MODIFIED_FLAG);
172 break;
173
174 case SP_ATTR_VIEWBOX:
175 set_viewBox(value);
176 this->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG);176 this->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG);
177 break;177 break;
178178
179 case SP_ATTR_PRESERVEASPECTRATIO:179 case SP_ATTR_PRESERVEASPECTRATIO:
180 set_preserveAspectRatio( value );180 set_preserveAspectRatio(value);
181 this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG);181 this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG);
182 break;182 break;
183183
184 case SP_ATTR_XLINK_HREF:184 case SP_ATTR_XLINK_HREF:
185 if ( value && this->href && ( strcmp(value, this->href) == 0 ) ) {185 if (value && this->href == value) {
186 /* Href unchanged, do nothing. */186 /* Href unchanged, do nothing. */
187 } else {187 }
188 g_free(this->href);188 else {
189 this->href = NULL;189 this->href.clear();
190190
191 if (value) {191 if (value) {
192 // First, set the href field; it's only used in the "unchanged" check above.192 // First, set the href field; it's only used in the "unchanged" check above.
193 this->href = g_strdup(value);193 this->href = value;
194 // Now do the attaching, which emits the changed signal.194 // Now do the attaching, which emits the changed signal.
195 if (value) {195 if (value) {
196 try {196 try {
197 this->ref->attach(Inkscape::URI(value));197 this->ref->attach(Inkscape::URI(value));
198 } catch (Inkscape::BadURIException &e) {198 }
199 g_warning("%s", e.what());199 catch (Inkscape::BadURIException &e) {
200 this->ref->detach();200 g_warning("%s", e.what());
201 }201 this->ref->detach();
202 } else {202 }
203 this->ref->detach();203 }
204 }204 else {
205 }205 this->ref->detach();
206 }206 }
207 break;207 }
208208 }
209 default:209 break;
210 SPPaintServer::set(key, value);210
211 break;211 default:
212 }212 SPPaintServer::set(key, value);
213 break;
214 }
213}215}
214216
215217
@@ -217,104 +219,90 @@
217219
218/* fixme: We need ::order_changed handler too (Lauris) */220/* fixme: We need ::order_changed handler too (Lauris) */
219221
220static GSList *pattern_getchildren(SPPattern *pat)222void SPPattern::_getChildren(std::list<SPObject *> &l)
221{223{
222 GSList *l = NULL;224 for (SPPattern *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
223
224 for (SPPattern *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
225 if (pat_i->firstChild()) { // find the first one with children225 if (pat_i->firstChild()) { // find the first one with children
226 for (SPObject *child = pat->firstChild() ; child ; child = child->getNext() ) {226 for (SPObject *child = pat_i->firstChild(); child; child = child->getNext()) {
227 l = g_slist_prepend (l, child);227 l.push_back(child);
228 }228 }
229 break; // do not go further up the chain if children are found229 break; // do not go further up the chain if children are found
230 }230 }
231 }231 }
232232}
233 return l;233
234}234void SPPattern::update(SPCtx *ctx, unsigned int flags)
235235{
236void SPPattern::update(SPCtx* ctx, unsigned int flags) {236 typedef std::list<SPObject *>::iterator SPObjectIterator;
237 if (flags & SP_OBJECT_MODIFIED_FLAG) {237
238 flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;238 if (flags & SP_OBJECT_MODIFIED_FLAG) {
239 }239 flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
240240 }
241 flags &= SP_OBJECT_MODIFIED_CASCADE;241
242242 flags &= SP_OBJECT_MODIFIED_CASCADE;
243 GSList *l = pattern_getchildren (this);243
244 l = g_slist_reverse (l);244 std::list<SPObject *> l;
245245 _getChildren(l);
246 while (l) {246
247 SPObject *child = SP_OBJECT (l->data);247 for (SPObjectIterator it = l.begin(); it != l.end(); it++) {
248248 SPObject *child = *it;
249 sp_object_ref (child, NULL);249
250 l = g_slist_remove (l, child);250 sp_object_ref(child, NULL);
251251
252 if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {252 if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
253 child->updateDisplay(ctx, flags);253 child->updateDisplay(ctx, flags);
254 }254 }
255255
256 sp_object_unref (child, NULL);256 sp_object_unref(child, NULL);
257 }257 }
258}258}
259259
260void SPPattern::modified(unsigned int flags) {260void SPPattern::modified(unsigned int flags)
261 if (flags & SP_OBJECT_MODIFIED_FLAG) {261{
262 flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;262 typedef std::list<SPObject *>::iterator SPObjectIterator;
263 }263
264264 if (flags & SP_OBJECT_MODIFIED_FLAG) {
265 flags &= SP_OBJECT_MODIFIED_CASCADE;265 flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
266266 }
267 GSList *l = pattern_getchildren (this);267
268 l = g_slist_reverse (l);268 flags &= SP_OBJECT_MODIFIED_CASCADE;
269269
270 while (l) {270 std::list<SPObject *> l;
271 SPObject *child = SP_OBJECT (l->data);271 _getChildren(l);
272272
273 sp_object_ref (child, NULL);273 for (SPObjectIterator it = l.begin(); it != l.end(); it++) {
274 l = g_slist_remove (l, child);274 SPObject *child = *it;
275275
276 if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {276 sp_object_ref(child, NULL);
277 child->emitModified(flags);277
278 }278 if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
279279 child->emitModified(flags);
280 sp_object_unref (child, NULL);280 }
281 }281
282}282 sp_object_unref(child, NULL);
283283 }
284/**284}
285Gets called when the pattern is reattached to another <pattern>285
286*/286void SPPattern::_onRefChanged(SPObject *old_ref, SPObject *ref)
287static void287{
288pattern_ref_changed(SPObject *old_ref, SPObject *ref, SPPattern *pat)288 if (old_ref) {
289{289 _modified_connection.disconnect();
290 if (old_ref) {290 }
291 pat->modified_connection.disconnect();291
292 }292 if (SP_IS_PATTERN(ref)) {
293293 _modified_connection = ref->connectModified(sigc::mem_fun(this, &SPPattern::_onRefModified));
294 if (SP_IS_PATTERN (ref)) {294 }
295 pat->modified_connection = ref->connectModified(sigc::bind<2>(sigc::ptr_fun(&pattern_ref_modified), pat));295
296 }296 _onRefModified(ref, 0);
297297}
298 pattern_ref_modified (ref, 0, pat);298
299}299void SPPattern::_onRefModified(SPObject * /*ref*/, guint /*flags*/)
300300{
301/**301 requestModified(SP_OBJECT_MODIFIED_FLAG);
302Gets called when the referenced <pattern> is changed
303*/
304static void pattern_ref_modified (SPObject */*ref*/, guint /*flags*/, SPPattern *pattern)
305{
306 if ( SP_IS_OBJECT(pattern) ) {
307 pattern->requestModified(SP_OBJECT_MODIFIED_FLAG);
308 }
309 // Conditional to avoid causing infinite loop if there's a cycle in the href chain.302 // Conditional to avoid causing infinite loop if there's a cycle in the href chain.
310}303}
311304
312305guint SPPattern::_countHrefs(SPObject *o) const
313/**
314Count how many times pat is used by the styles of o and its descendants
315*/
316static guint
317count_pattern_hrefs(SPObject *o, SPPattern *pat)
318{306{
319 if (!o)307 if (!o)
320 return 1;308 return 1;
@@ -322,84 +310,79 @@
322 guint i = 0;310 guint i = 0;
323311
324 SPStyle *style = o->style;312 SPStyle *style = o->style;
325 if (style313 if (style && style->fill.isPaintserver() && SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style)) &&
326 && style->fill.isPaintserver()314 SP_PATTERN(SP_STYLE_FILL_SERVER(style)) == this) {
327 && SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style))315 i++;
328 && SP_PATTERN(SP_STYLE_FILL_SERVER(style)) == pat)
329 {
330 i ++;
331 }316 }
332 if (style317 if (style && style->stroke.isPaintserver() && SP_IS_PATTERN(SP_STYLE_STROKE_SERVER(style)) &&
333 && style->stroke.isPaintserver()318 SP_PATTERN(SP_STYLE_STROKE_SERVER(style)) == this) {
334 && SP_IS_PATTERN(SP_STYLE_STROKE_SERVER(style))319 i++;
335 && SP_PATTERN(SP_STYLE_STROKE_SERVER(style)) == pat)
336 {
337 i ++;
338 }320 }
339321
340 for ( SPObject *child = o->firstChild(); child != NULL; child = child->next ) {322 for (SPObject *child = o->firstChild(); child != NULL; child = child->next) {
341 i += count_pattern_hrefs(child, pat);323 i += _countHrefs(child);
342 }324 }
343325
344 return i;326 return i;
345}327}
346328
347SPPattern *pattern_chain(SPPattern *pattern)329SPPattern *SPPattern::_chain() const
348{330{
349 SPDocument *document = pattern->document;331 Inkscape::XML::Document *xml_doc = document->getReprDoc();
350 Inkscape::XML::Document *xml_doc = document->getReprDoc();
351 Inkscape::XML::Node *defsrepr = document->getDefs()->getRepr();332 Inkscape::XML::Node *defsrepr = document->getDefs()->getRepr();
352333
353 Inkscape::XML::Node *repr = xml_doc->createElement("svg:pattern");334 Inkscape::XML::Node *repr = xml_doc->createElement("svg:pattern");
354 repr->setAttribute("inkscape:collect", "always");335 repr->setAttribute("inkscape:collect", "always");
355 gchar *parent_ref = g_strconcat("#", pattern->getRepr()->attribute("id"), NULL);336 Glib::ustring parent_ref = Glib::ustring::compose("#%1", getRepr()->attribute("id"));
356 repr->setAttribute("xlink:href", parent_ref);337 repr->setAttribute("xlink:href", parent_ref);
357 g_free (parent_ref);
358338
359 defsrepr->addChild(repr, NULL);339 defsrepr->addChild(repr, NULL);
360 const gchar *child_id = repr->attribute("id");340 const gchar *child_id = repr->attribute("id");
361 SPObject *child = document->getObjectById(child_id);341 SPObject *child = document->getObjectById(child_id);
362 g_assert (SP_IS_PATTERN (child));342 g_assert(SP_IS_PATTERN(child));
363343
364 return SP_PATTERN (child);344 return SP_PATTERN(child);
365}345}
366346
367SPPattern *347SPPattern *SPPattern::clone_if_necessary(SPItem *item, const gchar *property)
368sp_pattern_clone_if_necessary (SPItem *item, SPPattern *pattern, const gchar *property)
369{348{
370 if (!pattern->href || pattern->hrefcount > count_pattern_hrefs(item, pattern)) {349 SPPattern *pattern = this;
371 pattern = pattern_chain (pattern);350 if (pattern->href.empty() || pattern->hrefcount > _countHrefs(item)) {
372 gchar *href = g_strconcat("url(#", pattern->getRepr()->attribute("id"), ")", NULL);351 pattern = _chain();
352 Glib::ustring href = Glib::ustring::compose("url(#%1)", pattern->getRepr()->attribute("id"));
373353
374 SPCSSAttr *css = sp_repr_css_attr_new ();354 SPCSSAttr *css = sp_repr_css_attr_new();
375 sp_repr_css_set_property (css, property, href);355 sp_repr_css_set_property(css, property, href.c_str());
376 sp_repr_css_change_recursive(item->getRepr(), css, "style");356 sp_repr_css_change_recursive(item->getRepr(), css, "style");
377 }357 }
378 return pattern;358 return pattern;
379}359}
380360
381void361void SPPattern::transform_multiply(Geom::Affine postmul, bool set)
382sp_pattern_transform_multiply (SPPattern *pattern, Geom::Affine postmul, bool set)
383{362{
384 // this formula is for a different interpretation of pattern transforms as described in (*) in sp-pattern.cpp363 // this formula is for a different interpretation of pattern transforms as described in (*) in sp-pattern.cpp
385 // for it to work, we also need sp_object_read_attr( item, "transform");364 // for it to work, we also need sp_object_read_attr( item, "transform");
386 //pattern->patternTransform = premul * item->transform * pattern->patternTransform * item->transform.inverse() * postmul;365 // pattern->patternTransform = premul * item->transform * pattern->patternTransform * item->transform.inverse() *
366 // postmul;
387367
388 // otherwise the formula is much simpler368 // otherwise the formula is much simpler
389 if (set) {369 if (set) {
390 pattern->patternTransform = postmul;370 _pattern_transform = postmul;
391 } else {371 }
392 pattern->patternTransform = pattern_patternTransform(pattern) * postmul;372 else {
393 }373 _pattern_transform = getTransform() * postmul;
394 pattern->patternTransform_set = TRUE;374 }
375 _pattern_transform_set = true;
395376
396 gchar *c=sp_svg_transform_write(pattern->patternTransform);377 Glib::ustring c = sp_svg_transform_write(_pattern_transform);
397 pattern->getRepr()->setAttribute("patternTransform", c);378 getRepr()->setAttribute("patternTransform", c);
398 g_free(c);
399}379}
400380
401const gchar *pattern_tile(const std::vector<Inkscape::XML::Node*> &reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine transform, Geom::Affine move)381const gchar *SPPattern::produce(const std::vector<Inkscape::XML::Node *> &reprs, Geom::Rect bounds,
382 SPDocument *document, Geom::Affine transform, Geom::Affine move)
402{383{
384 typedef std::vector<Inkscape::XML::Node *>::const_iterator NodePtrIterator;
385
403 Inkscape::XML::Document *xml_doc = document->getReprDoc();386 Inkscape::XML::Document *xml_doc = document->getReprDoc();
404 Inkscape::XML::Node *defsrepr = document->getDefs()->getRepr();387 Inkscape::XML::Node *defsrepr = document->getDefs()->getRepr();
405388
@@ -408,20 +391,19 @@
408 sp_repr_set_svg_double(repr, "width", bounds.dimensions()[Geom::X]);391 sp_repr_set_svg_double(repr, "width", bounds.dimensions()[Geom::X]);
409 sp_repr_set_svg_double(repr, "height", bounds.dimensions()[Geom::Y]);392 sp_repr_set_svg_double(repr, "height", bounds.dimensions()[Geom::Y]);
410393
411 gchar *t=sp_svg_transform_write(transform);394 Glib::ustring t = sp_svg_transform_write(transform);
412 repr->setAttribute("patternTransform", t);395 repr->setAttribute("patternTransform", t);
413 g_free(t);
414396
415 defsrepr->appendChild(repr);397 defsrepr->appendChild(repr);
416 const gchar *pat_id = repr->attribute("id");398 const gchar *pat_id = repr->attribute("id");
417 SPObject *pat_object = document->getObjectById(pat_id);399 SPObject *pat_object = document->getObjectById(pat_id);
418400
419 for (std::vector<Inkscape::XML::Node*>::const_iterator i=reprs.begin();i!=reprs.end();i++){401 for (NodePtrIterator i = reprs.begin(); i != reprs.end(); i++) {
420 Inkscape::XML::Node *node = *i;402 Inkscape::XML::Node *node = *i;
421 SPItem *copy = SP_ITEM(pat_object->appendChildRepr(node));403 SPItem *copy = SP_ITEM(pat_object->appendChildRepr(node));
422404
423 Geom::Affine dup_transform;405 Geom::Affine dup_transform;
424 if (!sp_svg_transform_read (node->attribute("transform"), &dup_transform))406 if (!sp_svg_transform_read(node->attribute("transform"), &dup_transform))
425 dup_transform = Geom::identity();407 dup_transform = Geom::identity();
426 dup_transform *= move;408 dup_transform *= move;
427409
@@ -432,14 +414,15 @@
432 return pat_id;414 return pat_id;
433}415}
434416
435SPPattern *pattern_getroot(SPPattern *pat)417SPPattern *SPPattern::rootPattern()
436{418{
437 for (SPPattern *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {419 for (SPPattern *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
438 if ( pat_i->firstChild() ) { // find the first one with children420 if (pat_i->firstChild()) { // find the first one with children
439 return pat_i;421 return pat_i;
440 }422 }
441 }423 }
442 return pat; // document is broken, we can't get to root; but at least we can return pat which is supposedly a valid pattern424 return this; // document is broken, we can't get to root; but at least we can return pat which is supposedly a valid
425 // pattern
443}426}
444427
445428
@@ -447,73 +430,73 @@
447// Access functions that look up fields up the chain of referenced patterns and return the first one which is set430// Access functions that look up fields up the chain of referenced patterns and return the first one which is set
448// FIXME: all of them must use chase_hrefs the same as in SPGradient, to avoid lockup on circular refs431// FIXME: all of them must use chase_hrefs the same as in SPGradient, to avoid lockup on circular refs
449432
450guint pattern_patternUnits (SPPattern const *pat)433SPPattern::PatternUnits SPPattern::patternUnits() const
451{434{
452 for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {435 for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
453 if (pat_i->patternUnits_set)436 if (pat_i->_pattern_units_set)
454 return pat_i->patternUnits;437 return pat_i->_pattern_units;
455 }438 }
456 return pat->patternUnits;439 return _pattern_units;
457}440}
458441
459guint pattern_patternContentUnits (SPPattern const *pat)442SPPattern::PatternUnits SPPattern::patternContentUnits() const
460{443{
461 for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {444 for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
462 if (pat_i->patternContentUnits_set)445 if (pat_i->_pattern_content_units_set)
463 return pat_i->patternContentUnits;446 return pat_i->_pattern_content_units;
464 }447 }
465 return pat->patternContentUnits;448 return _pattern_content_units;
466}449}
467450
468Geom::Affine const &pattern_patternTransform(SPPattern const *pat)451Geom::Affine const &SPPattern::getTransform() const
469{452{
470 for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {453 for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
471 if (pat_i->patternTransform_set)454 if (pat_i->_pattern_transform_set)
472 return pat_i->patternTransform;455 return pat_i->_pattern_transform;
473 }456 }
474 return pat->patternTransform;457 return _pattern_transform;
475}458}
476459
477gdouble pattern_x (SPPattern const *pat)460gdouble SPPattern::x() const
478{461{
479 for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {462 for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
480 if (pat_i->x._set)463 if (pat_i->_x._set)
481 return pat_i->x.computed;464 return pat_i->_x.computed;
482 }465 }
483 return 0;466 return 0;
484}467}
485468
486gdouble pattern_y (SPPattern const *pat)469gdouble SPPattern::y() const
487{470{
488 for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {471 for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
489 if (pat_i->y._set)472 if (pat_i->_y._set)
490 return pat_i->y.computed;473 return pat_i->_y.computed;
491 }474 }
492 return 0;475 return 0;
493}476}
494477
495gdouble pattern_width (SPPattern const* pat)478gdouble SPPattern::width() const
496{479{
497 for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {480 for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
498 if (pat_i->width._set)481 if (pat_i->_width._set)
499 return pat_i->width.computed;482 return pat_i->_width.computed;
500 }483 }
501 return 0;484 return 0;
502}485}
503486
504gdouble pattern_height (SPPattern const *pat)487gdouble SPPattern::height() const
505{488{
506 for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {489 for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
507 if (pat_i->height._set)490 if (pat_i->_height._set)
508 return pat_i->height.computed;491 return pat_i->_height.computed;
509 }492 }
510 return 0;493 return 0;
511}494}
512495
513Geom::OptRect pattern_viewBox (SPPattern const *pat)496Geom::OptRect SPPattern::viewbox() const
514{497{
515 Geom::OptRect viewbox;498 Geom::OptRect viewbox;
516 for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {499 for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
517 if (pat_i->viewBox_set) {500 if (pat_i->viewBox_set) {
518 viewbox = pat_i->viewBox;501 viewbox = pat_i->viewBox;
519 break;502 break;
@@ -522,10 +505,10 @@
522 return viewbox;505 return viewbox;
523}506}
524507
525static bool pattern_hasItemChildren (SPPattern const *pat)508bool SPPattern::_hasItemChildren() const
526{509{
527 bool hasChildren = false;510 bool hasChildren = false;
528 for (SPObject const *child = pat->firstChild() ; child && !hasChildren ; child = child->getNext() ) {511 for (SPObject const *child = firstChild(); child && !hasChildren; child = child->getNext()) {
529 if (SP_IS_ITEM(child)) {512 if (SP_IS_ITEM(child)) {
530 hasChildren = true;513 hasChildren = true;
531 }514 }
@@ -535,15 +518,16 @@
535518
536bool SPPattern::isValid() const519bool SPPattern::isValid() const
537{520{
538 double tile_width = pattern_width(this);521 double tile_width = width();
539 double tile_height = pattern_height(this);522 double tile_height = height();
540523
541 if (tile_width <= 0 || tile_height <= 0)524 if (tile_width <= 0 || tile_height <= 0)
542 return false;525 return false;
543 return true;526 return true;
544}527}
545528
546cairo_pattern_t* SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &bbox, double opacity) {529cairo_pattern_t *SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &bbox, double opacity)
530{
547531
548 bool needs_opacity = (1.0 - opacity) >= 1e-3;532 bool needs_opacity = (1.0 - opacity) >= 1e-3;
549 bool visible = opacity >= 1e-3;533 bool visible = opacity >= 1e-3;
@@ -557,28 +541,28 @@
557541
558 for (SPPattern *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {542 for (SPPattern *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
559 // find the first one with item children543 // find the first one with item children
560 if (pat_i && SP_IS_OBJECT(pat_i) && pattern_hasItemChildren(pat_i)) {544 if (pat_i && SP_IS_OBJECT(pat_i) && pat_i->_hasItemChildren()) {
561 shown = pat_i;545 shown = pat_i;
562 break; // do not go further up the chain if children are found546 break; // do not go further up the chain if children are found
563 }547 }
564 }548 }
565549
566 if (!shown) {550 if (!shown) {
567 return cairo_pattern_create_rgba(0,0,0,0);551 return cairo_pattern_create_rgba(0, 0, 0, 0);
568 }552 }
569553
570 /* Create drawing for rendering */554 /* Create drawing for rendering */
571 Inkscape::Drawing drawing;555 Inkscape::Drawing drawing;
572 unsigned int dkey = SPItem::display_key_new (1);556 unsigned int dkey = SPItem::display_key_new(1);
573 Inkscape::DrawingGroup *root = new Inkscape::DrawingGroup(drawing);557 Inkscape::DrawingGroup *root = new Inkscape::DrawingGroup(drawing);
574 drawing.setRoot(root);558 drawing.setRoot(root);
575559
576 for (SPObject *child = shown->firstChild(); child != NULL; child = child->getNext() ) {560 for (SPObject *child = shown->firstChild(); child != NULL; child = child->getNext()) {
577 if (SP_IS_ITEM (child)) {561 if (SP_IS_ITEM(child)) {
578 // for each item in pattern, show it on our drawing, add to the group,562 // for each item in pattern, show it on our drawing, add to the group,
579 // and connect to the release signal in case the item gets deleted563 // and connect to the release signal in case the item gets deleted
580 Inkscape::DrawingItem *cai;564 Inkscape::DrawingItem *cai;
581 cai = SP_ITEM(child)->invoke_show (drawing, dkey, SP_ITEM_SHOW_DISPLAY);565 cai = SP_ITEM(child)->invoke_show(drawing, dkey, SP_ITEM_SHOW_DISPLAY);
582 root->appendChild(cai);566 root->appendChild(cai);
583 }567 }
584 }568 }
@@ -591,40 +575,41 @@
591 // * "x", "y", and "patternTransform" transform tile to user space after tile is generated.575 // * "x", "y", and "patternTransform" transform tile to user space after tile is generated.
592576
593 // These functions recursively search up the tree to find the values.577 // These functions recursively search up the tree to find the values.
594 double tile_x = pattern_x(this);578 double tile_x = x();
595 double tile_y = pattern_y(this);579 double tile_y = y();
596 double tile_width = pattern_width(this);580 double tile_width = width();
597 double tile_height = pattern_height(this);581 double tile_height = height();
598 if ( bbox && (pattern_patternUnits(this) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) ) {582 if (bbox && (patternUnits() == UNITS_OBJECTBOUNDINGBOX)) {
599 tile_x *= bbox->width();583 tile_x *= bbox->width();
600 tile_y *= bbox->height();584 tile_y *= bbox->height();
601 tile_width *= bbox->width();585 tile_width *= bbox->width();
602 tile_height *= bbox->height();586 tile_height *= bbox->height();
603 }587 }
604588
605 // Pattern size in pattern space589 // Pattern size in pattern space
606 Geom::Rect pattern_tile = Geom::Rect::from_xywh(0, 0, tile_width, tile_height);590 Geom::Rect pattern_tile = Geom::Rect::from_xywh(0, 0, tile_width, tile_height);
607 591
608 // Content to tile (pattern space)592 // Content to tile (pattern space)
609 Geom::Affine content2ps;593 Geom::Affine content2ps;
610 Geom::OptRect effective_view_box = pattern_viewBox(this);594 Geom::OptRect effective_view_box = viewbox();
611 if (effective_view_box) {595 if (effective_view_box) {
612 // viewBox to pattern server (using SPViewBox) 596 // viewBox to pattern server (using SPViewBox)
613 viewBox = *effective_view_box;597 viewBox = *effective_view_box;
614 c2p.setIdentity();598 c2p.setIdentity();
615 apply_viewbox( pattern_tile );599 apply_viewbox(pattern_tile);
616 content2ps = c2p;600 content2ps = c2p;
617 } else {601 }
602 else {
618603
619 // Content to bbox604 // Content to bbox
620 if (bbox && (pattern_patternContentUnits(this) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) ) {605 if (bbox && (patternContentUnits() == UNITS_OBJECTBOUNDINGBOX)) {
621 content2ps = Geom::Affine(bbox->width(), 0.0, 0.0, bbox->height(), 0,0);606 content2ps = Geom::Affine(bbox->width(), 0.0, 0.0, bbox->height(), 0, 0);
622 }607 }
623 }608 }
624609
625610
626 // Tile (pattern space) to user.611 // Tile (pattern space) to user.
627 Geom::Affine ps2user = Geom::Translate(tile_x,tile_y) * pattern_patternTransform(this);612 Geom::Affine ps2user = Geom::Translate(tile_x, tile_y) * getTransform();
628613
629614
630 // Transform of object with pattern (includes screen scaling)615 // Transform of object with pattern (includes screen scaling)
@@ -644,7 +629,7 @@
644 // to find the optimum tile size for rendering629 // to find the optimum tile size for rendering
645 // c is number of pixels in buffer x and y.630 // c is number of pixels in buffer x and y.
646 // Scale factor of 1.1 is too small... see bug #1251039631 // Scale factor of 1.1 is too small... see bug #1251039
647 Geom::Point c(pattern_tile.dimensions()*ps2user.descrim()*full.descrim()*2.0);632 Geom::Point c(pattern_tile.dimensions() * ps2user.descrim() * full.descrim() * 2.0);
648633
649 // Create drawing surface with size of pattern tile (in pattern space) but with number of pixels634 // Create drawing surface with size of pattern tile (in pattern space) but with number of pixels
650 // based on required resolution (c).635 // based on required resolution (c).
@@ -660,16 +645,16 @@
660 }645 }
661646
662 // TODO: make sure there are no leaks.647 // TODO: make sure there are no leaks.
663 Inkscape::UpdateContext ctx; // UpdateContext is structure with only ctm!648 Inkscape::UpdateContext ctx; // UpdateContext is structure with only ctm!
664 ctx.ctm = content2ps * pattern_surface.drawingTransform();649 ctx.ctm = content2ps * pattern_surface.drawingTransform();
665 dc.transform( pattern_surface.drawingTransform().inverse() );650 dc.transform(pattern_surface.drawingTransform().inverse());
666 drawing.update(Geom::IntRect::infinite(), ctx);651 drawing.update(Geom::IntRect::infinite(), ctx);
667652
668 // Render drawing to pattern_surface via drawing context, this calls root->render653 // Render drawing to pattern_surface via drawing context, this calls root->render
669 // which is really DrawingItem->render().654 // which is really DrawingItem->render().
670 drawing.render(dc, one_tile);655 drawing.render(dc, one_tile);
671 for (SPObject *child = shown->firstChild() ; child != NULL; child = child->getNext() ) {656 for (SPObject *child = shown->firstChild(); child != NULL; child = child->getNext()) {
672 if (SP_IS_ITEM (child)) {657 if (SP_IS_ITEM(child)) {
673 SP_ITEM(child)->invoke_hide(dkey);658 SP_ITEM(child)->invoke_hide(dkey);
674 }659 }
675 }660 }
@@ -685,12 +670,12 @@
685670
686 if (needs_opacity) {671 if (needs_opacity) {
687 dc.popGroupToSource(); // pop raw pattern672 dc.popGroupToSource(); // pop raw pattern
688 dc.paint(opacity); // apply opacity673 dc.paint(opacity); // apply opacity
689 }674 }
690675
691 cairo_pattern_t *cp = cairo_pattern_create_for_surface(pattern_surface.raw());676 cairo_pattern_t *cp = cairo_pattern_create_for_surface(pattern_surface.raw());
692 // Apply transformation to user space. Also compensate for oversampling.677 // Apply transformation to user space. Also compensate for oversampling.
693 ink_cairo_pattern_set_matrix(cp, ps2user.inverse() * pattern_surface.drawingTransform() );678 ink_cairo_pattern_set_matrix(cp, ps2user.inverse() * pattern_surface.drawingTransform());
694679
695 cairo_pattern_set_extend(cp, CAIRO_EXTEND_REPEAT);680 cairo_pattern_set_extend(cp, CAIRO_EXTEND_REPEAT);
696681
697682
=== modified file 'src/sp-pattern.h'
--- src/sp-pattern.h 2015-02-19 03:25:21 +0000
+++ src/sp-pattern.h 2015-05-17 11:43:43 +0000
@@ -1,9 +1,6 @@
1#ifndef SEEN_SP_PATTERN_H1/** @file
2#define SEEN_SP_PATTERN_H
3
4/*
5 * SVG <pattern> implementation2 * SVG <pattern> implementation
6 *3 *//*
7 * Author:4 * Author:
8 * Lauris Kaplinski <lauris@kaplinski.com>5 * Lauris Kaplinski <lauris@kaplinski.com>
9 * Abhishek Sharma6 * Abhishek Sharma
@@ -13,95 +10,131 @@
13 * Released under GNU GPL, read the file 'COPYING' for more information10 * Released under GNU GPL, read the file 'COPYING' for more information
14 */11 */
1512
16#define SP_PATTERN(obj) (dynamic_cast<SPPattern*>((SPObject*)obj))13#ifndef SEEN_SP_PATTERN_H
17#define SP_IS_PATTERN(obj) (dynamic_cast<const SPPattern*>((SPObject*)obj) != NULL)14#define SEEN_SP_PATTERN_H
1815
19class SPPatternReference;16#include <list>
20class SPItem;17#include <stddef.h>
21typedef struct _GSList GSList;18#include <glibmm/ustring.h>
19#include <sigc++/connection.h>
2220
23#include "svg/svg-length.h"21#include "svg/svg-length.h"
24#include "sp-paint-server.h"22#include "sp-paint-server.h"
25#include "uri-references.h"23#include "uri-references.h"
26#include "viewbox.h"24#include "viewbox.h"
2725
28#include <sigc++/connection.h>26class SPPatternReference;
2927class SPItem;
28
29namespace Inkscape {
30namespace XML {
31
32class Node;
33}
34}
35
36#define SP_PATTERN(obj) (dynamic_cast<SPPattern *>((SPObject *)obj))
37#define SP_IS_PATTERN(obj) (dynamic_cast<const SPPattern *>((SPObject *)obj) != NULL)
3038
31class SPPattern : public SPPaintServer, public SPViewBox {39class SPPattern : public SPPaintServer, public SPViewBox {
32public:40public:
33 SPPattern();41 enum PatternUnits { UNITS_USERSPACEONUSE, UNITS_OBJECTBOUNDINGBOX };
34 virtual ~SPPattern();42
43 SPPattern();
44 virtual ~SPPattern();
3545
36 /* Reference (href) */46 /* Reference (href) */
37 char *href;47 Glib::ustring href;
38 SPPatternReference *ref;48 SPPatternReference *ref;
3949
50 gdouble x() const;
51 gdouble y() const;
52 gdouble width() const;
53 gdouble height() const;
54 Geom::OptRect viewbox() const;
55 SPPattern::PatternUnits patternUnits() const;
56 SPPattern::PatternUnits patternContentUnits() const;
57 Geom::Affine const &getTransform() const;
58 SPPattern *rootPattern(); // TODO: const
59
60 SPPattern *clone_if_necessary(SPItem *item, const gchar *property);
61 void transform_multiply(Geom::Affine postmul, bool set);
62
63 /**
64 * @brief create a new pattern in XML tree
65 * @return created pattern id
66 */
67 static const gchar *produce(const std::vector<Inkscape::XML::Node *> &reprs, Geom::Rect bounds,
68 SPDocument *document, Geom::Affine transform, Geom::Affine move);
69
70 bool isValid() const;
71
72 virtual cairo_pattern_t *pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity);
73
74protected:
75 virtual void build(SPDocument *doc, Inkscape::XML::Node *repr);
76 virtual void release();
77 virtual void set(unsigned int key, const gchar *value);
78 virtual void update(SPCtx *ctx, unsigned int flags);
79 virtual void modified(unsigned int flags);
80
81private:
82 bool _hasItemChildren() const;
83 void _getChildren(std::list<SPObject *> &l);
84 SPPattern *_chain() const;
85
86 /**
87 Count how many times pattern is used by the styles of o and its descendants
88 */
89 guint _countHrefs(SPObject *o) const;
90
91 /**
92 Gets called when the pattern is reattached to another <pattern>
93 */
94 void _onRefChanged(SPObject *old_ref, SPObject *ref);
95
96 /**
97 Gets called when the referenced <pattern> is changed
98 */
99 void _onRefModified(SPObject *ref, guint flags);
100
40 /* patternUnits and patternContentUnits attribute */101 /* patternUnits and patternContentUnits attribute */
41 unsigned int patternUnits : 1;102 PatternUnits _pattern_units : 1;
42 unsigned int patternUnits_set : 1;103 bool _pattern_units_set : 1;
43 unsigned int patternContentUnits : 1;104 PatternUnits _pattern_content_units : 1;
44 unsigned int patternContentUnits_set : 1;105 bool _pattern_content_units_set : 1;
45 /* patternTransform attribute */106 /* patternTransform attribute */
46 Geom::Affine patternTransform;107 Geom::Affine _pattern_transform;
47 unsigned int patternTransform_set : 1;108 bool _pattern_transform_set : 1;
48 /* Tile rectangle */109 /* Tile rectangle */
49 SVGLength x;110 SVGLength _x;
50 SVGLength y;111 SVGLength _y;
51 SVGLength width;112 SVGLength _width;
52 SVGLength height;113 SVGLength _height;
53114
54 sigc::connection modified_connection;115 sigc::connection _modified_connection;
55
56 bool isValid() const;
57
58 virtual cairo_pattern_t* pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity);
59
60protected:
61 virtual void build(SPDocument* doc, Inkscape::XML::Node* repr);
62 virtual void release();
63 virtual void set(unsigned int key, const gchar* value);
64 virtual void update(SPCtx* ctx, unsigned int flags);
65 virtual void modified(unsigned int flags);
66};116};
67117
68118
69class SPPatternReference : public Inkscape::URIReference {119class SPPatternReference : public Inkscape::URIReference {
70public:120public:
71 SPPatternReference (SPObject *obj) : URIReference(obj) {}121 SPPatternReference(SPObject *obj)
72 SPPattern *getObject() const {122 : URIReference(obj)
123 {
124 }
125
126 SPPattern *getObject() const
127 {
73 return reinterpret_cast<SPPattern *>(URIReference::getObject());128 return reinterpret_cast<SPPattern *>(URIReference::getObject());
74 }129 }
75130
76protected:131protected:
77 virtual bool _acceptObject(SPObject *obj) const {132 virtual bool _acceptObject(SPObject *obj) const
78 return SP_IS_PATTERN (obj);133 {
134 return SP_IS_PATTERN(obj);
79 }135 }
80};136};
81137
82enum {
83 SP_PATTERN_UNITS_USERSPACEONUSE,
84 SP_PATTERN_UNITS_OBJECTBOUNDINGBOX
85};
86
87unsigned int pattern_users (SPPattern *pattern);
88SPPattern *pattern_chain (SPPattern *pattern);
89SPPattern *sp_pattern_clone_if_necessary (SPItem *item, SPPattern *pattern, const char *property);
90void sp_pattern_transform_multiply (SPPattern *pattern, Geom::Affine postmul, bool set);
91
92const char *pattern_tile (const std::vector<Inkscape::XML::Node*> &reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine transform, Geom::Affine move);
93
94SPPattern *pattern_getroot (SPPattern *pat);
95
96unsigned int pattern_patternUnits (SPPattern const *pat);
97unsigned int pattern_patternContentUnits (SPPattern const *pat);
98Geom::Affine const &pattern_patternTransform(SPPattern const *pat);
99double pattern_x (SPPattern const *pat);
100double pattern_y (SPPattern const *pat);
101double pattern_width (SPPattern const *pat);
102double pattern_height (SPPattern const *pat);
103Geom::OptRect pattern_viewBox (SPPattern const *pat);
104
105#endif // SEEN_SP_PATTERN_H138#endif // SEEN_SP_PATTERN_H
106139
107/*140/*
108141
=== modified file 'src/ui/CMakeLists.txt'
--- src/ui/CMakeLists.txt 2015-05-12 20:23:05 +0000
+++ src/ui/CMakeLists.txt 2015-05-17 11:43:43 +0000
@@ -6,6 +6,7 @@
6 interface.cpp6 interface.cpp
7 object-edit.cpp7 object-edit.cpp
8 previewholder.cpp8 previewholder.cpp
9 selected-color.cpp
9 shape-editor.cpp10 shape-editor.cpp
10 tool-factory.cpp11 tool-factory.cpp
11 tools-switch.cpp12 tools-switch.cpp
@@ -115,8 +116,14 @@
115 widget/anchor-selector.cpp116 widget/anchor-selector.cpp
116 widget/button.cpp117 widget/button.cpp
117 widget/clipmaskicon.cpp118 widget/clipmaskicon.cpp
119 widget/color-entry.cpp
120 widget/color-icc-selector.cpp
121 widget/color-notebook.cpp
118 widget/color-picker.cpp122 widget/color-picker.cpp
119 widget/color-preview.cpp123 widget/color-preview.cpp
124 widget/color-scales.cpp
125 widget/color-slider.cpp
126 widget/color-wheel-selector.cpp
120 widget/dock-item.cpp127 widget/dock-item.cpp
121 widget/dock.cpp128 widget/dock.cpp
122 widget/entity-entry.cpp129 widget/entity-entry.cpp
@@ -175,6 +182,7 @@
175 previewable.h182 previewable.h
176 previewfillable.h183 previewfillable.h
177 previewholder.h184 previewholder.h
185 selected-color.h
178 shape-editor.h186 shape-editor.h
179 tool-factory.h187 tool-factory.h
180 tools-switch.h188 tools-switch.h
@@ -288,8 +296,14 @@
288 widget/anchor-selector.h296 widget/anchor-selector.h
289 widget/attr-widget.h297 widget/attr-widget.h
290 widget/button.h298 widget/button.h
299 widget/color-entry.h
300 widget/color-icc-selector.h
301 widget/color-notebook.h
291 widget/color-picker.h302 widget/color-picker.h
292 widget/color-preview.h303 widget/color-preview.h
304 widget/color-scales.h
305 widget/color-slider.h
306 widget/color-wheel-selector.h
293 widget/combo-enums.h307 widget/combo-enums.h
294 widget/dock-item.h308 widget/dock-item.h
295 widget/dock.h309 widget/dock.h
296310
=== modified file 'src/ui/Makefile_insert'
--- src/ui/Makefile_insert 2015-02-25 01:04:28 +0000
+++ src/ui/Makefile_insert 2015-05-17 11:43:43 +0000
@@ -19,6 +19,8 @@
19 ui/previewfillable.h \19 ui/previewfillable.h \
20 ui/previewholder.cpp \20 ui/previewholder.cpp \
21 ui/previewholder.h \21 ui/previewholder.h \
22 ui/selected-color.h \
23 ui/selected-color.cpp \
22 ui/shape-editor.cpp \24 ui/shape-editor.cpp \
23 ui/shape-editor.h \25 ui/shape-editor.h \
24 ui/tool-factory.cpp \26 ui/tool-factory.cpp \
2527
=== modified file 'src/ui/dialog/objects.cpp'
--- src/ui/dialog/objects.cpp 2015-02-27 02:10:36 +0000
+++ src/ui/dialog/objects.cpp 2015-05-17 11:43:43 +0000
@@ -45,6 +45,7 @@
45#include "style.h"45#include "style.h"
46#include "ui/tools-switch.h"46#include "ui/tools-switch.h"
47#include "ui/icon-names.h"47#include "ui/icon-names.h"
48#include "ui/selected-color.h"
48#include "ui/widget/imagetoggler.h"49#include "ui/widget/imagetoggler.h"
49#include "ui/widget/layertypeicon.h"50#include "ui/widget/layertypeicon.h"
50#include "ui/widget/insertordericon.h"51#include "ui/widget/insertordericon.h"
@@ -53,7 +54,7 @@
53#include "ui/tools/node-tool.h"54#include "ui/tools/node-tool.h"
54#include "ui/tools/tool-base.h"55#include "ui/tools/tool-base.h"
55#include "verbs.h"56#include "verbs.h"
56#include "widgets/sp-color-notebook.h"57#include "ui/widget/color-notebook.h"
57#include "widgets/icon.h"58#include "widgets/icon.h"
58#include "xml/node.h"59#include "xml/node.h"
59#include "xml/node-observer.h"60#include "xml/node-observer.h"
@@ -928,12 +929,12 @@
928 //If the current item is not selected, store only it in the highlight source929 //If the current item is not selected, store only it in the highlight source
929 _storeHighlightTarget(iter);930 _storeHighlightTarget(iter);
930 }931 }
931 if (_colorSelector)932 if (_selectedColor)
932 {933 {
933 //Set up the color selector934 //Set up the color selector
934 SPColor color;935 SPColor color;
935 color.set( row[_model->_colHighlight] );936 color.set( row[_model->_colHighlight] );
936 _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(row[_model->_colHighlight]));937 _selectedColor->setColorAlpha(color, SP_RGBA32_A_F(row[_model->_colHighlight]));
937 }938 }
938 //Show the color selector dialog939 //Show the color selector dialog
939 _colorSelectorDialog.show();940 _colorSelectorDialog.show();
@@ -1440,17 +1441,16 @@
1440 * @param csel Color selector1441 * @param csel Color selector
1441 * @param cp Objects panel1442 * @param cp Objects panel
1442 */1443 */
1443void sp_highlight_picker_color_mod(SPColorSelector *csel, GObject * cp)1444void ObjectsPanel::_highlightPickerColorMod()
1444{1445{
1445 SPColor color;1446 SPColor color;
1446 float alpha = 0;1447 float alpha = 0;
1447 csel->base->getColorAlpha(color, alpha);1448 _selectedColor->colorAlpha(color, alpha);
1449
1448 guint32 rgba = color.toRGBA32( alpha );1450 guint32 rgba = color.toRGBA32( alpha );
1449
1450 ObjectsPanel *ptr = reinterpret_cast<ObjectsPanel *>(cp);
14511451
1452 //Set the highlight color for all items in the _highlight_target (all selected items)1452 //Set the highlight color for all items in the _highlight_target (all selected items)
1453 for (std::vector<SPItem *>::iterator iter = ptr->_highlight_target.begin(); iter != ptr->_highlight_target.end(); ++iter)1453 for (std::vector<SPItem *>::iterator iter = _highlight_target.begin(); iter != _highlight_target.end(); ++iter)
1454 {1454 {
1455 SPItem * target = *iter;1455 SPItem * target = *iter;
1456 target->setHighlightColor(rgba);1456 target->setHighlightColor(rgba);
@@ -1922,18 +1922,16 @@
1922 _colorSelectorDialog.set_title (_("Select Highlight Color"));1922 _colorSelectorDialog.set_title (_("Select Highlight Color"));
1923 _colorSelectorDialog.set_border_width (4);1923 _colorSelectorDialog.set_border_width (4);
1924 _colorSelectorDialog.property_modal() = true;1924 _colorSelectorDialog.property_modal() = true;
1925 _colorSelector = SP_COLOR_SELECTOR(sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK));1925 _selectedColor.reset(new Inkscape::UI::SelectedColor);
1926 Gtk::Widget *color_selector = Gtk::manage(new Inkscape::UI::Widget::ColorNotebook(*_selectedColor));
1926 _colorSelectorDialog.get_vbox()->pack_start (1927 _colorSelectorDialog.get_vbox()->pack_start (
1927 *Glib::wrap(&_colorSelector->vbox), true, true, 0);1928 *color_selector, true, true, 0);
19281929
1929 g_signal_connect(G_OBJECT(_colorSelector), "dragged",1930 _selectedColor->signal_dragged.connect(sigc::mem_fun(*this, &ObjectsPanel::_highlightPickerColorMod));
1930 G_CALLBACK(sp_highlight_picker_color_mod), (void *)this);1931 _selectedColor->signal_released.connect(sigc::mem_fun(*this, &ObjectsPanel::_highlightPickerColorMod));
1931 g_signal_connect(G_OBJECT(_colorSelector), "released",1932 _selectedColor->signal_changed.connect(sigc::mem_fun(*this, &ObjectsPanel::_highlightPickerColorMod));
1932 G_CALLBACK(sp_highlight_picker_color_mod), (void *)this);1933
1933 g_signal_connect(G_OBJECT(_colorSelector), "changed",1934 color_selector->show();
1934 G_CALLBACK(sp_highlight_picker_color_mod), (void *)this);
1935
1936 gtk_widget_show(GTK_WIDGET(_colorSelector));
1937 1935
1938 setDesktop( targetDesktop );1936 setDesktop( targetDesktop );
19391937
@@ -1951,7 +1949,6 @@
1951{1949{
1952 //Close the highlight selection dialog1950 //Close the highlight selection dialog
1953 _colorSelectorDialog.hide();1951 _colorSelectorDialog.hide();
1954 _colorSelector = NULL;
1955 1952
1956 //Set the desktop to null, which will disconnect all object watchers1953 //Set the desktop to null, which will disconnect all object watchers
1957 setDesktop(NULL);1954 setDesktop(NULL);
19581955
=== modified file 'src/ui/dialog/objects.h'
--- src/ui/dialog/objects.h 2015-04-27 23:38:31 +0000
+++ src/ui/dialog/objects.h 2015-05-17 11:43:43 +0000
@@ -16,6 +16,7 @@
16# include <config.h>16# include <config.h>
17#endif17#endif
1818
19#include <boost/scoped_ptr.hpp>
19#include <gtkmm/box.h>20#include <gtkmm/box.h>
20#include <gtkmm/treeview.h>21#include <gtkmm/treeview.h>
21#include <gtkmm/treestore.h>22#include <gtkmm/treestore.h>
@@ -36,6 +37,9 @@
36namespace Inkscape {37namespace Inkscape {
3738
38namespace UI {39namespace UI {
40
41class SelectedColor;
42
39namespace Dialog {43namespace Dialog {
4044
4145
@@ -166,8 +170,7 @@
166 Gtk::Alignment _blur_alignment;170 Gtk::Alignment _blur_alignment;
167171
168 Gtk::Dialog _colorSelectorDialog;172 Gtk::Dialog _colorSelectorDialog;
169 SPColorSelector *_colorSelector;173 boost::scoped_ptr<Inkscape::UI::SelectedColor> _selectedColor;
170
171 174
172 //Methods:175 //Methods:
173 176
@@ -233,7 +236,7 @@
233 236
234 void setupDialog(const Glib::ustring &title);237 void setupDialog(const Glib::ustring &title);
235 238
236 friend void sp_highlight_picker_color_mod(SPColorSelector *csel, GObject *cp);239 void _highlightPickerColorMod();
237240
238};241};
239242
240243
=== modified file 'src/ui/dialog/tags.cpp'
--- src/ui/dialog/tags.cpp 2015-02-27 03:21:48 +0000
+++ src/ui/dialog/tags.cpp 2015-05-17 11:43:43 +0000
@@ -51,7 +51,7 @@
51#include "ui/tools/tool-base.h" //"event-context.h"51#include "ui/tools/tool-base.h" //"event-context.h"
52#include "selection.h"52#include "selection.h"
53//#include "dialogs/dialog-events.h"53//#include "dialogs/dialog-events.h"
54#include "widgets/sp-color-notebook.h"54#include "ui/widget/color-notebook.h"
55#include "style.h"55#include "style.h"
56#include "filter-chemistry.h"56#include "filter-chemistry.h"
57#include "filters/blend.h"57#include "filters/blend.h"
5858
=== added file 'src/ui/selected-color.cpp'
--- src/ui/selected-color.cpp 1970-01-01 00:00:00 +0000
+++ src/ui/selected-color.cpp 2015-05-17 11:43:43 +0000
@@ -0,0 +1,163 @@
1/** @file
2 * Color selected in color selector widget.
3 * This file was created during the refactoring of SPColorSelector
4 *//*
5 * Authors:
6 * bulia byak <buliabyak@users.sf.net>
7 * Jon A. Cruz <jon@joncruz.org>
8 * Tomasz Boczkowski <penginsbacon@gmail.com>
9 *
10 * Copyright (C) 2014 Authors
11 * Released under GNU GPL, read the file 'COPYING' for more information
12 */
13#ifdef HAVE_CONFIG_H
14# include "config.h"
15#endif
16
17#include <glibmm/ustring.h>
18#include <cmath>
19
20#include "svg/svg-icc-color.h"
21#include "ui/selected-color.h"
22
23namespace Inkscape {
24namespace UI {
25
26double const SelectedColor::_EPSILON = 1e-4;
27
28SelectedColor::SelectedColor()
29 : _color(0)
30 , _alpha(1.0)
31 , _held(false)
32 , _virgin(true)
33 , _updating(false)
34{
35
36}
37
38SelectedColor::~SelectedColor() {
39
40}
41
42void SelectedColor::setColor(SPColor const &color)
43{
44 setColorAlpha( color, _alpha);
45}
46
47SPColor SelectedColor::color() const
48{
49 return _color;
50}
51
52void SelectedColor::setAlpha(gfloat alpha)
53{
54 g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );
55 setColorAlpha( _color, alpha);
56}
57
58gfloat SelectedColor::alpha() const
59{
60 return _alpha;
61}
62
63void SelectedColor::setValue(guint32 value)
64{
65 SPColor color(value);
66 gfloat alpha = SP_RGBA32_A_F(value);
67 setColorAlpha(color, alpha);
68}
69
70guint32 SelectedColor::value() const
71{
72 return color().toRGBA32(_alpha);
73}
74
75void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha, bool emit_signal)
76{
77#ifdef DUMP_CHANGE_INFO
78 g_message("SelectedColor::setColorAlpha( this=%p, %f, %f, %f, %s, %f, %s)", this, color.v.c[0], color.v.c[1], color.v.c[2], (color.icc?color.icc->colorProfile.c_str():"<null>"), alpha, (emit_signal?"YES":"no"));
79#endif
80 g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );
81
82 if (_updating) {
83 return;
84 }
85
86#ifdef DUMP_CHANGE_INFO
87 g_message("---- SelectedColor::setColorAlpha virgin:%s !close:%s alpha is:%s",
88 (_virgin?"YES":"no"),
89 (!color.isClose( _color, _EPSILON )?"YES":"no"),
90 ((fabs((_alpha) - (alpha)) >= _EPSILON )?"YES":"no")
91 );
92#endif
93
94 if ( _virgin || !color.isClose( _color, _EPSILON ) ||
95 (fabs((_alpha) - (alpha)) >= _EPSILON )) {
96
97 _virgin = false;
98
99 _color = color;
100 _alpha = alpha;
101
102 if (emit_signal)
103 {
104 _updating = true;
105 if (_held) {
106 signal_dragged.emit();
107 } else {
108 signal_changed.emit();
109 }
110 _updating = false;
111 }
112
113#ifdef DUMP_CHANGE_INFO
114 } else {
115 g_message("++++ SelectedColor::setColorAlpha color:%08x ==> _color:%08X isClose:%s", color.toRGBA32(alpha), _color.toRGBA32(_alpha),
116 (color.isClose( _color, _EPSILON )?"YES":"no"));
117#endif
118 }
119}
120
121void SelectedColor::colorAlpha(SPColor &color, gfloat &alpha) const {
122 color = _color;
123 alpha = _alpha;
124}
125
126void SelectedColor::setHeld(bool held) {
127 if (_updating) {
128 return;
129 }
130 bool grabbed = held && !_held;
131 bool released = !held && _held;
132
133 _held = held;
134
135 _updating = true;
136 if (grabbed) {
137 signal_grabbed.emit();
138 }
139
140 if (released) {
141 signal_released.emit();
142 signal_changed.emit();
143 }
144 _updating = false;
145}
146
147void SelectedColor::preserveICC() {
148 _color.icc = _color.icc ? new SVGICCColor(*_color.icc) : 0;
149}
150
151}
152}
153
154/*
155 Local Variables:
156 mode:c++
157 c-file-style:"stroustrup"
158 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
159 indent-tabs-mode:nil
160 fill-column:99
161 End:
162*/
163// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
0164
=== added file 'src/ui/selected-color.h'
--- src/ui/selected-color.h 1970-01-01 00:00:00 +0000
+++ src/ui/selected-color.h 2015-05-17 11:43:43 +0000
@@ -0,0 +1,96 @@
1/** @file
2 * Color selected in color selector widget.
3 * This file was created during the refactoring of SPColorSelector
4 *//*
5 * Authors:
6 * bulia byak <buliabyak@users.sf.net>
7 * Jon A. Cruz <jon@joncruz.org>
8 * Tomasz Boczkowski <penginsbacon@gmail.com>
9 *
10 * Copyright (C) 2014 Authors
11 * Released under GNU GPL, read the file 'COPYING' for more information
12 */
13#ifndef SEEN_SELECTED_COLOR
14#define SEEN_SELECTED_COLOR
15
16#include <sigc++/signal.h>
17#include "color.h"
18
19namespace Gtk
20{
21 class Widget;
22}
23
24namespace Inkscape {
25namespace UI {
26
27class SelectedColor {
28public:
29 SelectedColor();
30 virtual ~SelectedColor();
31
32 void setColor(SPColor const &color);
33 SPColor color() const;
34
35 void setAlpha(gfloat alpha);
36 gfloat alpha() const;
37
38 void setValue(guint32 value);
39 guint32 value() const;
40
41 void setColorAlpha(SPColor const &color, gfloat alpha, bool emit_signal = true);
42 void colorAlpha(SPColor &color, gfloat &alpha) const;
43
44 void setHeld(bool held);
45
46 void preserveICC();
47
48 sigc::signal<void> signal_grabbed;
49 sigc::signal<void> signal_dragged;
50 sigc::signal<void> signal_released;
51 sigc::signal<void> signal_changed;
52private:
53 // By default, disallow copy constructor and assignment operator
54 SelectedColor(SelectedColor const &obj);
55 SelectedColor& operator=(SelectedColor const &obj);
56
57 SPColor _color;
58 /**
59 * Color alpha value guaranteed to be in [0, 1].
60 */
61 gfloat _alpha;
62
63 bool _held;
64 /**
65 * This flag is true if no color is set yet
66 */
67 bool _virgin;
68
69 bool _updating;
70
71 static double const _EPSILON;
72};
73
74class ColorSelectorFactory {
75public:
76 virtual ~ColorSelectorFactory() {
77 }
78
79 virtual Gtk::Widget* createWidget(SelectedColor &color) const = 0;
80 virtual Glib::ustring modeName() const = 0;
81};
82
83}
84}
85
86#endif
87/*
88 Local Variables:
89 mode:c++
90 c-file-style:"stroustrup"
91 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
92 indent-tabs-mode:nil
93 fill-column:99
94 End:
95*/
96// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
097
=== modified file 'src/ui/widget/Makefile_insert'
--- src/ui/widget/Makefile_insert 2015-05-12 19:43:24 +0000
+++ src/ui/widget/Makefile_insert 2015-05-17 11:43:43 +0000
@@ -6,10 +6,22 @@
6 ui/widget/attr-widget.h \6 ui/widget/attr-widget.h \
7 ui/widget/button.h \7 ui/widget/button.h \
8 ui/widget/button.cpp \8 ui/widget/button.cpp \
9 ui/widget/color-entry.cpp \
10 ui/widget/color-entry.h \
11 ui/widget/color-icc-selector.cpp \
12 ui/widget/color-icc-selector.h \
13 ui/widget/color-notebook.cpp \
14 ui/widget/color-notebook.h \
15 ui/widget/color-wheel-selector.cpp \
16 ui/widget/color-wheel-selector.h \
9 ui/widget/color-picker.cpp \17 ui/widget/color-picker.cpp \
10 ui/widget/color-picker.h \18 ui/widget/color-picker.h \
11 ui/widget/color-preview.cpp \19 ui/widget/color-preview.cpp \
12 ui/widget/color-preview.h \20 ui/widget/color-preview.h \
21 ui/widget/color-slider.cpp \
22 ui/widget/color-slider.h \
23 ui/widget/color-scales.cpp \
24 ui/widget/color-scales.h \
13 ui/widget/combo-enums.h \25 ui/widget/combo-enums.h \
14 ui/widget/dock.h \26 ui/widget/dock.h \
15 ui/widget/dock.cpp \27 ui/widget/dock.cpp \
1628
=== added file 'src/ui/widget/color-entry.cpp'
--- src/ui/widget/color-entry.cpp 1970-01-01 00:00:00 +0000
+++ src/ui/widget/color-entry.cpp 2015-05-17 11:43:43 +0000
@@ -0,0 +1,104 @@
1/** @file
2 * Entry widget for typing color value in css form
3 *//*
4 * Authors:
5 * Tomasz Boczkowski <penginsbacon@gmail.com>
6 *
7 * Copyright (C) 2014 Authors
8 * Released under GNU GPL, read the file 'COPYING' for more information
9 */
10#include <glibmm.h>
11#include <glibmm/i18n.h>
12#include <iomanip>
13
14#include "color-entry.h"
15
16namespace Inkscape {
17namespace UI {
18namespace Widget {
19
20ColorEntry::ColorEntry(SelectedColor &color)
21 : _color(color)
22 , _updating(false)
23{
24 _color_changed_connection = color.signal_changed.connect(sigc::mem_fun(this, &ColorEntry::_onColorChanged));
25 _color_dragged_connection = color.signal_dragged.connect(sigc::mem_fun(this, &ColorEntry::_onColorChanged));
26 _onColorChanged();
27
28 set_max_length(8);
29 set_width_chars(8);
30 set_tooltip_text(_("Hexadecimal RGBA value of the color"));
31}
32
33ColorEntry::~ColorEntry()
34{
35 _color_changed_connection.disconnect();
36 _color_dragged_connection.disconnect();
37}
38
39void ColorEntry::on_changed()
40{
41 if (_updating) {
42 return;
43 }
44
45 Glib::ustring text = get_text();
46 bool changed = false;
47
48 // Coerce the value format to eight hex digits
49 if (!text.empty() && text[0] == '#') {
50 changed = true;
51 text.erase(0, 1);
52 if (text.size() == 6) {
53 // it was a standard RGB hex
54 unsigned int alpha = SP_COLOR_F_TO_U(_color.alpha());
55 text += Glib::ustring::format(std::hex, std::setw(2), std::setfill(L'0'), alpha);
56 }
57 }
58
59 gchar *str = g_strdup(text.c_str());
60 gchar *end = 0;
61 guint64 rgba = g_ascii_strtoull(str, &end, 16);
62 if (end != str) {
63 ptrdiff_t len = end - str;
64 if (len < 8) {
65 rgba = rgba << (4 * (8 - len));
66 }
67 if (changed) {
68 set_text(str);
69 }
70 SPColor color(rgba);
71 _color.setColorAlpha(color, SP_RGBA32_A_F(rgba));
72 }
73 g_free(str);
74}
75
76
77void ColorEntry::_onColorChanged()
78{
79 SPColor color = _color.color();
80 gdouble alpha = _color.alpha();
81
82 guint32 rgba = color.toRGBA32(alpha);
83 Glib::ustring text = Glib::ustring::format(std::hex, std::setw(8), std::setfill(L'0'), rgba);
84
85 Glib::ustring old_text = get_text();
86 if (old_text != text) {
87 _updating = true;
88 set_text(text);
89 _updating = false;
90 }
91}
92}
93}
94}
95/*
96 Local Variables:
97 mode:c++
98 c-file-style:"stroustrup"
99 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
100 indent-tabs-mode:nil
101 fill-column:99
102 End:
103*/
104// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
0105
=== added file 'src/ui/widget/color-entry.h'
--- src/ui/widget/color-entry.h 1970-01-01 00:00:00 +0000
+++ src/ui/widget/color-entry.h 2015-05-17 11:43:43 +0000
@@ -0,0 +1,53 @@
1/** @file
2 * Entry widget for typing color value in css form
3 *//*
4 * Authors:
5 * Tomasz Boczkowski <penginsbacon@gmail.com>
6 *
7 * Copyright (C) 2014 Authors
8 * Released under GNU GPL, read the file 'COPYING' for more information
9 */
10
11#ifndef SEEN_COLOR_ENTRY_H
12#define SEEN_COLOR_ENTRY_H_
13
14#include <gtkmm/entry.h>
15#include "ui/selected-color.h"
16
17namespace Inkscape {
18namespace UI {
19namespace Widget {
20
21class ColorEntry : public Gtk::Entry
22{
23public:
24 ColorEntry(SelectedColor &color);
25 virtual ~ColorEntry();
26
27protected:
28 void on_changed();
29
30private:
31 void _onColorChanged();
32
33 SelectedColor &_color;
34 sigc::connection _color_changed_connection;
35 sigc::connection _color_dragged_connection;
36 bool _updating;
37};
38
39}
40}
41}
42
43#endif
44/*
45 Local Variables:
46 mode:c++
47 c-file-style:"stroustrup"
48 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
49 indent-tabs-mode:nil
50 fill-column:99
51 End:
52*/
53// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
054
=== renamed file 'src/widgets/sp-color-icc-selector.cpp' => 'src/ui/widget/color-icc-selector.cpp'
--- src/widgets/sp-color-icc-selector.cpp 2014-10-08 02:22:03 +0000
+++ src/ui/widget/color-icc-selector.cpp 2015-05-17 11:43:43 +0000
@@ -1,24 +1,26 @@
1#ifdef HAVE_CONFIG_H1#ifdef HAVE_CONFIG_H
2# include "config.h"2#include "config.h"
3#endif3#endif
44
5#include "gradient-vector.h"
6#include <math.h>5#include <math.h>
6#include <gtkmm/adjustment.h>
7#include <glibmm/i18n.h>
8
7#include <gtk/gtk.h>9#include <gtk/gtk.h>
8#include <glibmm/i18n.h>
9#include <map>10#include <map>
10#include <set>11#include <set>
11#include <vector>12#include <vector>
1213
13#include "ui/dialog-events.h"14#include "ui/dialog-events.h"
14#include "sp-color-icc-selector.h"15#include "ui/widget/color-icc-selector.h"
15#include "sp-color-scales.h"16#include "ui/widget/color-scales.h"
16#include "sp-color-slider.h"17#include "ui/widget/color-slider.h"
17#include "svg/svg-icc-color.h"18#include "svg/svg-icc-color.h"
18#include "colorspace.h"19#include "colorspace.h"
19#include "document.h"20#include "document.h"
20#include "inkscape.h"21#include "inkscape.h"
21#include "profile-manager.h"22#include "profile-manager.h"
23#include "widgets/gradient-vector.h"
2224
23#define noDEBUG_LCMS25#define noDEBUG_LCMS
2426
@@ -32,137 +34,32 @@
32#endif // DEBUG_LCMS34#endif // DEBUG_LCMS
33#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)35#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
3436
35
36#ifdef DEBUG_LCMS37#ifdef DEBUG_LCMS
37extern guint update_in_progress;38extern guint update_in_progress;
38#define DEBUG_MESSAGE(key, ...) \39#define DEBUG_MESSAGE(key, ...) \
39{\40 { \
40 Inkscape::Preferences *prefs = Inkscape::Preferences::get();\41 Inkscape::Preferences *prefs = Inkscape::Preferences::get(); \
41 bool dump = prefs->getBool("/options/scislac/" #key);\42 bool dump = prefs->getBool("/options/scislac/" #key); \
42 bool dumpD = prefs->getBool("/options/scislac/" #key "D");\43 bool dumpD = prefs->getBool("/options/scislac/" #key "D"); \
43 bool dumpD2 = prefs->getBool("/options/scislac/" #key "D2");\44 bool dumpD2 = prefs->getBool("/options/scislac/" #key "D2"); \
44 dumpD &&= ( (update_in_progress == 0) || dumpD2 );\45 dumpD && = ((update_in_progress == 0) || dumpD2); \
45 if ( dump )\46 if (dump) { \
46 {\47 g_message(__VA_ARGS__); \
47 g_message( __VA_ARGS__ );\48 } \
48\49 if (dumpD) { \
49 }\50 GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, \
50 if ( dumpD )\51 GTK_BUTTONS_OK, __VA_ARGS__); \
51 {\52 g_signal_connect_swapped(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog); \
52 GtkWidget *dialog = gtk_message_dialog_new(NULL,\53 gtk_widget_show_all(dialog); \
53 GTK_DIALOG_DESTROY_WITH_PARENT, \54 } \
54 GTK_MESSAGE_INFO, \55 }
55 GTK_BUTTONS_OK, \
56 __VA_ARGS__ \
57 );\
58 g_signal_connect_swapped(dialog, "response",\
59 G_CALLBACK(gtk_widget_destroy), \
60 dialog); \
61 gtk_widget_show_all( dialog );\
62 }\
63}
64#endif // DEBUG_LCMS56#endif // DEBUG_LCMS
6557
6658
67
68G_BEGIN_DECLS
69
70static void sp_color_icc_selector_dispose(GObject *object);
71static void sp_color_icc_selector_show_all (GtkWidget *widget);
72static void sp_color_icc_selector_hide(GtkWidget *widget);
73
74G_END_DECLS
75
76/**
77 * Class containing the parts for a single color component's UI presence.
78 */
79class ComponentUI
80{
81public:
82 ComponentUI() :
83 _component(),
84 _adj(0),
85 _slider(0),
86 _btn(0),
87 _label(0),
88 _map(0)
89 {
90 }
91
92 ComponentUI(colorspace::Component const &component) :
93 _component(component),
94 _adj(0),
95 _slider(0),
96 _btn(0),
97 _label(0),
98 _map(0)
99 {
100 }
101
102 colorspace::Component _component;
103 GtkAdjustment *_adj; // Component adjustment
104 GtkWidget *_slider;
105 GtkWidget *_btn; // spinbutton
106 GtkWidget *_label; // Label
107 guchar *_map;
108};
109
110/**
111 * Class that implements the internals of the selector.
112 */
113class ColorICCSelectorImpl
114{
115public:
116
117 ColorICCSelectorImpl( ColorICCSelector *owner);
118
119 ~ColorICCSelectorImpl();
120
121 static void _adjustmentChanged ( GtkAdjustment *adjustment, SPColorICCSelector *cs );
122
123 static void _sliderGrabbed( SPColorSlider *slider, SPColorICCSelector *cs );
124 static void _sliderReleased( SPColorSlider *slider, SPColorICCSelector *cs );
125 static void _sliderChanged( SPColorSlider *slider, SPColorICCSelector *cs );
126
127 static void _profileSelected( GtkWidget* src, gpointer data );
128 static void _fixupHit( GtkWidget* src, gpointer data );
129
130#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
131 void _setProfile( SVGICCColor* profile );
132 void _switchToProfile( gchar const* name );
133#endif
134 void _updateSliders( gint ignore );
135 void _profilesChanged( std::string const & name );
136
137 ColorICCSelector *_owner;
138
139 gboolean _updating : 1;
140 gboolean _dragging : 1;
141
142 guint32 _fixupNeeded;
143 GtkWidget* _fixupBtn;
144 GtkWidget* _profileSel;
145
146 std::vector<ComponentUI> _compUI;
147
148 GtkAdjustment* _adj; // Channel adjustment
149 GtkWidget* _slider;
150 GtkWidget* _sbtn; // Spinbutton
151 GtkWidget* _label; // Label
152
153#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
154 std::string _profileName;
155 Inkscape::ColorProfile* _prof;
156 guint _profChannelCount;
157 gulong _profChangedID;
158#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
159};
160
161#define XPAD 459#define XPAD 4
162#define YPAD 160#define YPAD 1
16361
164namespace62namespace {
165{
16663
167size_t maxColorspaceComponentCount = 0;64size_t maxColorspaceComponentCount = 0;
16865
@@ -187,91 +84,40 @@
187/**84/**
188 * Helper function to handle GTK2/GTK3 attachment #ifdef code.85 * Helper function to handle GTK2/GTK3 attachment #ifdef code.
189 */86 */
190void attachToGridOrTable(GtkWidget *parent,87void attachToGridOrTable(GtkWidget *parent, GtkWidget *child, guint left, guint top, guint width, guint height,
191 GtkWidget *child,88 bool hexpand = false, bool centered = false, guint xpadding = XPAD, guint ypadding = YPAD)
192 guint left,
193 guint top,
194 guint width,
195 guint height,
196 bool hexpand = false,
197 bool centered = false,
198 guint xpadding = XPAD,
199 guint ypadding = YPAD)
200{89{
201#if GTK_CHECK_VERSION(3,0,0)90#if GTK_CHECK_VERSION(3, 0, 0)
202 #if GTK_CHECK_VERSION(3,12,0)91 #if GTK_CHECK_VERSION(3, 12, 0)
203 gtk_widget_set_margin_start( child, xpadding );92 gtk_widget_set_margin_start(child, xpadding);
204 gtk_widget_set_margin_end( child, xpadding );93 gtk_widget_set_margin_end(child, xpadding);
205 #else94 #else
206 gtk_widget_set_margin_left( child, xpadding );95 gtk_widget_set_margin_left(child, xpadding);
207 gtk_widget_set_margin_right( child, xpadding );96 gtk_widget_set_margin_right(child, xpadding);
208 #endif97 #endif
20998
210 gtk_widget_set_margin_top( child, ypadding );99 gtk_widget_set_margin_top(child, ypadding);
211 gtk_widget_set_margin_bottom( child, ypadding );100 gtk_widget_set_margin_bottom(child, ypadding);
212 if (hexpand) {101 if (hexpand) {
213 gtk_widget_set_hexpand(child, TRUE);102 gtk_widget_set_hexpand(child, TRUE);
214 }103 }
215 if (centered) {104 if (centered) {
216 gtk_widget_set_halign( child, GTK_ALIGN_CENTER );105 gtk_widget_set_halign(child, GTK_ALIGN_CENTER);
217 gtk_widget_set_valign( child, GTK_ALIGN_CENTER );106 gtk_widget_set_valign(child, GTK_ALIGN_CENTER);
218 }107 }
219 gtk_grid_attach( GTK_GRID(parent), child, left, top, width, height );108 gtk_grid_attach(GTK_GRID(parent), child, left, top, width, height);
220#else109#else
221 GtkAttachOptions xoptions = centered ? static_cast<GtkAttachOptions>(0) : hexpand ? (GTK_EXPAND | GTK_FILL) : GTK_FILL;110 GtkAttachOptions xoptions =
111 centered ? static_cast<GtkAttachOptions>(0) : hexpand ? (GTK_EXPAND | GTK_FILL) : GTK_FILL;
222 GtkAttachOptions yoptions = centered ? static_cast<GtkAttachOptions>(0) : GTK_FILL;112 GtkAttachOptions yoptions = centered ? static_cast<GtkAttachOptions>(0) : GTK_FILL;
223113
224 gtk_table_attach( GTK_TABLE(parent), child, left, left + width, top, top + height, xoptions, yoptions, xpadding, ypadding );114 gtk_table_attach(GTK_TABLE(parent), child, left, left + width, top, top + height, xoptions, yoptions, xpadding,
115 ypadding);
225#endif116#endif
226}117}
227118
228} // namespace119} // namespace
229120
230G_DEFINE_TYPE(SPColorICCSelector, sp_color_icc_selector, SP_TYPE_COLOR_SELECTOR);
231
232static void sp_color_icc_selector_class_init(SPColorICCSelectorClass *klass)
233{
234 static const gchar* nameset[] = {N_("CMS"), 0};
235 GObjectClass *object_class = G_OBJECT_CLASS(klass);
236 GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass);
237 SPColorSelectorClass *selector_class = SP_COLOR_SELECTOR_CLASS (klass);
238
239 selector_class->name = nameset;
240 selector_class->submode_count = 1;
241
242 object_class->dispose = sp_color_icc_selector_dispose;
243
244 widget_class->show_all = sp_color_icc_selector_show_all;
245 widget_class->hide = sp_color_icc_selector_hide;
246}
247
248
249ColorICCSelector::ColorICCSelector( SPColorSelector* csel )
250 : ColorSelector( csel ),
251 _impl(NULL)
252{
253}
254
255ColorICCSelector::~ColorICCSelector()
256{
257 if (_impl)
258 {
259 delete _impl;
260 _impl = 0;
261 }
262}
263
264void sp_color_icc_selector_init(SPColorICCSelector *cs)
265{
266 SP_COLOR_SELECTOR(cs)->base = new ColorICCSelector( SP_COLOR_SELECTOR(cs) );
267
268 if ( SP_COLOR_SELECTOR(cs)->base )
269 {
270 SP_COLOR_SELECTOR(cs)->base->init();
271 }
272}
273
274
275/*121/*
276icSigRgbData122icSigRgbData
277icSigCmykData123icSigCmykData
@@ -283,32 +129,32 @@
283129
284130
285#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)131#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
286static cmsUInt16Number* getScratch() {132static cmsUInt16Number *getScratch()
133{
287 // bytes per pixel * input channels * width134 // bytes per pixel * input channels * width
288 static cmsUInt16Number* scritch = static_cast<cmsUInt16Number*>(g_new(cmsUInt16Number, 4 * 1024));135 static cmsUInt16Number *scritch = static_cast<cmsUInt16Number *>(g_new(cmsUInt16Number, 4 * 1024));
289136
290 return scritch;137 return scritch;
291}138}
292139
293colorspace::Component::Component() :140colorspace::Component::Component()
294 name(),141 : name()
295 tip(),142 , tip()
296 scale(1)143 , scale(1)
297{144{
298}145}
299146
300colorspace::Component::Component(std::string const &name, std::string const &tip, guint scale) :147colorspace::Component::Component(std::string const &name, std::string const &tip, guint scale)
301 name(name),148 : name(name)
302 tip(tip),149 , tip(tip)
303 scale(scale)150 , scale(scale)
304{151{
305}152}
306153
307std::vector<colorspace::Component> colorspace::getColorSpaceInfo( uint32_t space )154std::vector<colorspace::Component> colorspace::getColorSpaceInfo(uint32_t space)
308{155{
309 static std::map<cmsUInt32Number, std::vector<Component> > sets;156 static std::map<cmsUInt32Number, std::vector<Component> > sets;
310 if (sets.empty())157 if (sets.empty()) {
311 {
312 sets[cmsSigXYZData].push_back(Component("_X", "X", 2)); // TYPE_XYZ_16158 sets[cmsSigXYZData].push_back(Component("_X", "X", 2)); // TYPE_XYZ_16
313 sets[cmsSigXYZData].push_back(Component("_Y", "Y", 1));159 sets[cmsSigXYZData].push_back(Component("_Y", "Y", 1));
314 sets[cmsSigXYZData].push_back(Component("_Z", "Z", 2));160 sets[cmsSigXYZData].push_back(Component("_Z", "Z", 2));
@@ -317,7 +163,7 @@
317 sets[cmsSigLabData].push_back(Component("_a", "a", 256));163 sets[cmsSigLabData].push_back(Component("_a", "a", 256));
318 sets[cmsSigLabData].push_back(Component("_b", "b", 256));164 sets[cmsSigLabData].push_back(Component("_b", "b", 256));
319165
320 //cmsSigLuvData166 // cmsSigLuvData
321167
322 sets[cmsSigYCbCrData].push_back(Component("_Y", "Y", 1)); // TYPE_YCbCr_16168 sets[cmsSigYCbCrData].push_back(Component("_Y", "Y", 1)); // TYPE_YCbCr_16
323 sets[cmsSigYCbCrData].push_back(Component("C_b", "Cb", 1));169 sets[cmsSigYCbCrData].push_back(Component("C_b", "Cb", 1));
@@ -350,8 +196,7 @@
350 sets[cmsSigCmyData].push_back(Component(_("_M:"), _("Magenta"), 1));196 sets[cmsSigCmyData].push_back(Component(_("_M:"), _("Magenta"), 1));
351 sets[cmsSigCmyData].push_back(Component(_("_Y:"), _("Yellow"), 1));197 sets[cmsSigCmyData].push_back(Component(_("_Y:"), _("Yellow"), 1));
352198
353 for (std::map<cmsUInt32Number, std::vector<Component> >::iterator it = sets.begin(); it != sets.end(); ++it)199 for (std::map<cmsUInt32Number, std::vector<Component> >::iterator it = sets.begin(); it != sets.end(); ++it) {
354 {
355 knownColorspaces.insert(it->first);200 knownColorspaces.insert(it->first);
356 maxColorspaceComponentCount = std::max(maxColorspaceComponentCount, it->second.size());201 maxColorspaceComponentCount = std::max(maxColorspaceComponentCount, it->second.size());
357 }202 }
@@ -359,39 +204,148 @@
359204
360 std::vector<Component> target;205 std::vector<Component> target;
361206
362 if (sets.find(space) != sets.end())207 if (sets.find(space) != sets.end()) {
363 {
364 target = sets[space];208 target = sets[space];
365 }209 }
366 return target;210 return target;
367}211}
368212
369213
370std::vector<colorspace::Component> colorspace::getColorSpaceInfo( Inkscape::ColorProfile *prof )214std::vector<colorspace::Component> colorspace::getColorSpaceInfo(Inkscape::ColorProfile *prof)
371{215{
372 return getColorSpaceInfo( asICColorSpaceSig(prof->getColorSpace()) );216 return getColorSpaceInfo(asICColorSpaceSig(prof->getColorSpace()));
373}217}
374218
375#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)219#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
376220
377ColorICCSelectorImpl::ColorICCSelectorImpl(ColorICCSelector *owner) :221namespace Inkscape {
378 _owner(owner),222namespace UI {
379 _updating( FALSE ),223namespace Widget {
380 _dragging( FALSE ),224
381 _fixupNeeded(0),225/**
382 _fixupBtn(0),226 * Class containing the parts for a single color component's UI presence.
383 _profileSel(0),227 */
384 _compUI(),228class ComponentUI {
385 _adj(0),229 public:
386 _slider(0),230 ComponentUI()
387 _sbtn(0),231 : _component()
388 _label(0)232 , _adj(0)
389#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)233 , _slider(0)
390 ,234 , _btn(0)
391 _profileName(),235 , _label(0)
392 _prof(0),236 , _map(0)
393 _profChannelCount(0),237 {
394 _profChangedID(0)238 }
239
240 ComponentUI(colorspace::Component const &component)
241 : _component(component)
242 , _adj(0)
243 , _slider(0)
244 , _btn(0)
245 , _label(0)
246 , _map(0)
247 {
248 }
249
250 colorspace::Component _component;
251 GtkAdjustment *_adj; // Component adjustment
252 Inkscape::UI::Widget::ColorSlider *_slider;
253 GtkWidget *_btn; // spinbutton
254 GtkWidget *_label; // Label
255 guchar *_map;
256};
257
258/**
259 * Class that implements the internals of the selector.
260 */
261class ColorICCSelectorImpl {
262 public:
263 ColorICCSelectorImpl(ColorICCSelector *owner, SelectedColor &color);
264
265 ~ColorICCSelectorImpl();
266
267 static void _adjustmentChanged(GtkAdjustment *adjustment, ColorICCSelectorImpl *cs);
268
269 void _sliderGrabbed();
270 void _sliderReleased();
271 void _sliderChanged();
272
273 static void _profileSelected(GtkWidget *src, gpointer data);
274 static void _fixupHit(GtkWidget *src, gpointer data);
275
276#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
277 void _setProfile(SVGICCColor *profile);
278 void _switchToProfile(gchar const *name);
279#endif
280 void _updateSliders(gint ignore);
281 void _profilesChanged(std::string const &name);
282
283 ColorICCSelector *_owner;
284 SelectedColor &_color;
285
286 gboolean _updating : 1;
287 gboolean _dragging : 1;
288
289 guint32 _fixupNeeded;
290 GtkWidget *_fixupBtn;
291 GtkWidget *_profileSel;
292
293 std::vector<ComponentUI> _compUI;
294
295 GtkAdjustment *_adj; // Channel adjustment
296 Inkscape::UI::Widget::ColorSlider *_slider;
297 GtkWidget *_sbtn; // Spinbutton
298 GtkWidget *_label; // Label
299
300#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
301 std::string _profileName;
302 Inkscape::ColorProfile *_prof;
303 guint _profChannelCount;
304 gulong _profChangedID;
305#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
306};
307
308
309
310const gchar *ColorICCSelector::MODE_NAME = N_("CMS");
311
312ColorICCSelector::ColorICCSelector(SelectedColor &color)
313 : _impl(NULL)
314{
315 _impl = new ColorICCSelectorImpl(this, color);
316 init();
317 color.signal_changed.connect(sigc::mem_fun(this, &ColorICCSelector::_colorChanged));
318 // color.signal_dragged.connect(sigc::mem_fun(this, &ColorICCSelector::_colorChanged));
319}
320
321ColorICCSelector::~ColorICCSelector()
322{
323 if (_impl) {
324 delete _impl;
325 _impl = 0;
326 }
327}
328
329
330
331ColorICCSelectorImpl::ColorICCSelectorImpl(ColorICCSelector *owner, SelectedColor &color)
332 : _owner(owner)
333 , _color(color)
334 , _updating(FALSE)
335 , _dragging(FALSE)
336 , _fixupNeeded(0)
337 , _fixupBtn(0)
338 , _profileSel(0)
339 , _compUI()
340 , _adj(0)
341 , _slider(0)
342 , _sbtn(0)
343 , _label(0)
344#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
345 , _profileName()
346 , _prof(0)
347 , _profChannelCount(0)
348 , _profChangedID(0)
395#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)349#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
396{350{
397}351}
@@ -405,21 +359,12 @@
405359
406void ColorICCSelector::init()360void ColorICCSelector::init()
407{361{
408 if (_impl) delete(_impl);
409 _impl = new ColorICCSelectorImpl(this);
410 gint row = 0;362 gint row = 0;
411363
412 _impl->_updating = FALSE;364 _impl->_updating = FALSE;
413 _impl->_dragging = FALSE;365 _impl->_dragging = FALSE;
414366
415#if GTK_CHECK_VERSION(3,0,0)367 GtkWidget *t = GTK_WIDGET(gobj());
416 GtkWidget *t = gtk_grid_new();
417#else
418 GtkWidget *t = gtk_table_new(5, 3, FALSE);
419#endif
420
421 gtk_widget_show (t);
422 gtk_box_pack_start (GTK_BOX (_csel), t, TRUE, TRUE, 4);
423368
424 _impl->_compUI.clear();369 _impl->_compUI.clear();
425370
@@ -428,50 +373,53 @@
428373
429374
430 _impl->_fixupBtn = gtk_button_new_with_label(_("Fix"));375 _impl->_fixupBtn = gtk_button_new_with_label(_("Fix"));
431 g_signal_connect( G_OBJECT(_impl->_fixupBtn), "clicked", G_CALLBACK(ColorICCSelectorImpl::_fixupHit), (gpointer)_impl );376 g_signal_connect(G_OBJECT(_impl->_fixupBtn), "clicked", G_CALLBACK(ColorICCSelectorImpl::_fixupHit),
432 gtk_widget_set_sensitive( _impl->_fixupBtn, FALSE );377 (gpointer)_impl);
433 gtk_widget_set_tooltip_text( _impl->_fixupBtn, _("Fix RGB fallback to match icc-color() value.") );378 gtk_widget_set_sensitive(_impl->_fixupBtn, FALSE);
434 //gtk_misc_set_alignment( GTK_MISC (_impl->_fixupBtn), 1.0, 0.5 );379 gtk_widget_set_tooltip_text(_impl->_fixupBtn, _("Fix RGB fallback to match icc-color() value."));
435 gtk_widget_show( _impl->_fixupBtn );380 // gtk_misc_set_alignment( GTK_MISC (_impl->_fixupBtn), 1.0, 0.5 );
381 gtk_widget_show(_impl->_fixupBtn);
436382
437 attachToGridOrTable(t, _impl->_fixupBtn, 0, row, 1, 1);383 attachToGridOrTable(t, _impl->_fixupBtn, 0, row, 1, 1);
438384
439 // Combobox and store with 2 columns : label (0) and full name (1)385 // Combobox and store with 2 columns : label (0) and full name (1)
440 GtkListStore *store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING);386 GtkListStore *store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING);
441 _impl->_profileSel = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store));387 _impl->_profileSel = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store));
442388
443 GtkCellRenderer *renderer = gtk_cell_renderer_text_new ();389 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
444 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(_impl->_profileSel), renderer, TRUE);390 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(_impl->_profileSel), renderer, TRUE);
445 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(_impl->_profileSel), renderer, "text", 0, NULL);391 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(_impl->_profileSel), renderer, "text", 0, NULL);
446392
447 GtkTreeIter iter;393 GtkTreeIter iter;
448 gtk_list_store_append (store, &iter);394 gtk_list_store_append(store, &iter);
449 gtk_list_store_set (store, &iter, 0, _("<none>"), 1, _("<none>"), -1);395 gtk_list_store_set(store, &iter, 0, _("<none>"), 1, _("<none>"), -1);
450396
451 gtk_widget_show( _impl->_profileSel );397 gtk_widget_show(_impl->_profileSel);
452 gtk_combo_box_set_active( GTK_COMBO_BOX(_impl->_profileSel), 0 );398 gtk_combo_box_set_active(GTK_COMBO_BOX(_impl->_profileSel), 0);
453399
454 attachToGridOrTable(t, _impl->_profileSel, 1, row, 1, 1);400 attachToGridOrTable(t, _impl->_profileSel, 1, row, 1, 1);
455401
456#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)402#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
457 _impl->_profChangedID = g_signal_connect( G_OBJECT(_impl->_profileSel), "changed", G_CALLBACK(ColorICCSelectorImpl::_profileSelected), (gpointer)_impl );403 _impl->_profChangedID = g_signal_connect(G_OBJECT(_impl->_profileSel), "changed",
404 G_CALLBACK(ColorICCSelectorImpl::_profileSelected), (gpointer)_impl);
458#else405#else
459 gtk_widget_set_sensitive( _impl->_profileSel, false );406 gtk_widget_set_sensitive(_impl->_profileSel, false);
460#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)407#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
461408
462409
463 row++;410 row++;
464411
465 // populate the data for colorspaces and channels:412// populate the data for colorspaces and channels:
466#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)413#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
467 std::vector<colorspace::Component> things = colorspace::getColorSpaceInfo( cmsSigRgbData );414 std::vector<colorspace::Component> things = colorspace::getColorSpaceInfo(cmsSigRgbData);
468#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)415#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
469416
470 for ( size_t i = 0; i < maxColorspaceComponentCount; i++ ) {417 for (size_t i = 0; i < maxColorspaceComponentCount; i++) {
471#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)418#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
472 if (i < things.size()) {419 if (i < things.size()) {
473 _impl->_compUI.push_back(ComponentUI(things[i]));420 _impl->_compUI.push_back(ComponentUI(things[i]));
474 } else {421 }
422 else {
475 _impl->_compUI.push_back(ComponentUI());423 _impl->_compUI.push_back(ComponentUI());
476 }424 }
477425
@@ -482,9 +430,10 @@
482 std::string labelStr = ".";430 std::string labelStr = ".";
483#endif431#endif
484432
485 _impl->_compUI[i]._label = gtk_label_new_with_mnemonic( labelStr.c_str() );433 _impl->_compUI[i]._label = gtk_label_new_with_mnemonic(labelStr.c_str());
486 gtk_misc_set_alignment( GTK_MISC (_impl->_compUI[i]._label), 1.0, 0.5 );434 gtk_misc_set_alignment(GTK_MISC(_impl->_compUI[i]._label), 1.0, 0.5);
487 gtk_widget_show( _impl->_compUI[i]._label );435 gtk_widget_show(_impl->_compUI[i]._label);
436 gtk_widget_set_no_show_all(_impl->_compUI[i]._label, TRUE);
488437
489 attachToGridOrTable(t, _impl->_compUI[i]._label, 0, row, 1, 1);438 attachToGridOrTable(t, _impl->_compUI[i]._label, 0, row, 1, 1);
490439
@@ -493,41 +442,47 @@
493 gdouble step = static_cast<gdouble>(scaleValue) / 100.0;442 gdouble step = static_cast<gdouble>(scaleValue) / 100.0;
494 gdouble page = static_cast<gdouble>(scaleValue) / 10.0;443 gdouble page = static_cast<gdouble>(scaleValue) / 10.0;
495 gint digits = (step > 0.9) ? 0 : 2;444 gint digits = (step > 0.9) ? 0 : 2;
496 _impl->_compUI[i]._adj = GTK_ADJUSTMENT( gtk_adjustment_new( 0.0, 0.0, scaleValue, step, page, page ) );445 _impl->_compUI[i]._adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, scaleValue, step, page, page));
497446
498 // Slider447 // Slider
499 _impl->_compUI[i]._slider = sp_color_slider_new( _impl->_compUI[i]._adj );448 _impl->_compUI[i]._slider =
500#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)449 Gtk::manage(new Inkscape::UI::Widget::ColorSlider(Glib::wrap(_impl->_compUI[i]._adj, true)));
501 gtk_widget_set_tooltip_text( _impl->_compUI[i]._slider, (i < things.size()) ? things[i].tip.c_str() : "" );450#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
502#else451 _impl->_compUI[i]._slider->set_tooltip_text((i < things.size()) ? things[i].tip.c_str() : "");
503 gtk_widget_set_tooltip_text( _impl->_compUI[i]._slider, "." );452#else
504#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)453 _impl->_compUI[i]._slider->set_tooltip_text(".");
505 gtk_widget_show( _impl->_compUI[i]._slider );454#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
506455 _impl->_compUI[i]._slider->show();
507 attachToGridOrTable(t, _impl->_compUI[i]._slider, 1, row, 1, 1, true);456 _impl->_compUI[i]._slider->set_no_show_all();
508457
509 _impl->_compUI[i]._btn = gtk_spin_button_new( _impl->_compUI[i]._adj, step, digits );458 attachToGridOrTable(t, _impl->_compUI[i]._slider->gobj(), 1, row, 1, 1, true);
510#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)459
511 gtk_widget_set_tooltip_text( _impl->_compUI[i]._btn, (i < things.size()) ? things[i].tip.c_str() : "" );460 _impl->_compUI[i]._btn = gtk_spin_button_new(_impl->_compUI[i]._adj, step, digits);
512#else461#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
513 gtk_widget_set_tooltip_text( _impl->_compUI[i]._btn, "." );462 gtk_widget_set_tooltip_text(_impl->_compUI[i]._btn, (i < things.size()) ? things[i].tip.c_str() : "");
514#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)463#else
515 sp_dialog_defocus_on_enter( _impl->_compUI[i]._btn );464 gtk_widget_set_tooltip_text(_impl->_compUI[i]._btn, ".");
516 gtk_label_set_mnemonic_widget( GTK_LABEL(_impl->_compUI[i]._label), _impl->_compUI[i]._btn );465#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
517 gtk_widget_show( _impl->_compUI[i]._btn );466 sp_dialog_defocus_on_enter(_impl->_compUI[i]._btn);
467 gtk_label_set_mnemonic_widget(GTK_LABEL(_impl->_compUI[i]._label), _impl->_compUI[i]._btn);
468 gtk_widget_show(_impl->_compUI[i]._btn);
469 gtk_widget_set_no_show_all(_impl->_compUI[i]._btn, TRUE);
518470
519 attachToGridOrTable(t, _impl->_compUI[i]._btn, 2, row, 1, 1, false, true);471 attachToGridOrTable(t, _impl->_compUI[i]._btn, 2, row, 1, 1, false, true);
520472
521 _impl->_compUI[i]._map = g_new( guchar, 4 * 1024 );473 _impl->_compUI[i]._map = g_new(guchar, 4 * 1024);
522 memset( _impl->_compUI[i]._map, 0x0ff, 1024 * 4 );474 memset(_impl->_compUI[i]._map, 0x0ff, 1024 * 4);
523475
524476
525 // Signals477 // Signals
526 g_signal_connect( G_OBJECT( _impl->_compUI[i]._adj ), "value_changed", G_CALLBACK( ColorICCSelectorImpl::_adjustmentChanged ), _csel );478 g_signal_connect(G_OBJECT(_impl->_compUI[i]._adj), "value_changed",
479 G_CALLBACK(ColorICCSelectorImpl::_adjustmentChanged), _impl);
527480
528 g_signal_connect( G_OBJECT( _impl->_compUI[i]._slider ), "grabbed", G_CALLBACK( ColorICCSelectorImpl::_sliderGrabbed ), _csel );481 _impl->_compUI[i]._slider->signal_grabbed.connect(sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderGrabbed));
529 g_signal_connect( G_OBJECT( _impl->_compUI[i]._slider ), "released", G_CALLBACK( ColorICCSelectorImpl::_sliderReleased ), _csel );482 _impl->_compUI[i]._slider->signal_released.connect(
530 g_signal_connect( G_OBJECT( _impl->_compUI[i]._slider ), "changed", G_CALLBACK( ColorICCSelectorImpl::_sliderChanged ), _csel );483 sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderReleased));
484 _impl->_compUI[i]._slider->signal_value_changed.connect(
485 sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderChanged));
531486
532 row++;487 row++;
533 }488 }
@@ -543,16 +498,14 @@
543 _impl->_adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 255.0, 1.0, 10.0, 10.0));498 _impl->_adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 255.0, 1.0, 10.0, 10.0));
544499
545 // Slider500 // Slider
546 _impl->_slider = sp_color_slider_new(_impl->_adj);501 _impl->_slider = Gtk::manage(new Inkscape::UI::Widget::ColorSlider(Glib::wrap(_impl->_adj, true)));
547 gtk_widget_set_tooltip_text(_impl->_slider, _("Alpha (opacity)"));502 _impl->_slider->set_tooltip_text(_("Alpha (opacity)"));
548 gtk_widget_show(_impl->_slider);503 _impl->_slider->show();
549504
550 attachToGridOrTable(t, _impl->_slider, 1, row, 1, 1, true);505 attachToGridOrTable(t, _impl->_slider->gobj(), 1, row, 1, 1, true);
551506
552 sp_color_slider_set_colors( SP_COLOR_SLIDER( _impl->_slider ),507 _impl->_slider->setColors(SP_RGBA32_F_COMPOSE(1.0, 1.0, 1.0, 0.0), SP_RGBA32_F_COMPOSE(1.0, 1.0, 1.0, 0.5),
553 SP_RGBA32_F_COMPOSE( 1.0, 1.0, 1.0, 0.0 ),508 SP_RGBA32_F_COMPOSE(1.0, 1.0, 1.0, 1.0));
554 SP_RGBA32_F_COMPOSE( 1.0, 1.0, 1.0, 0.5 ),
555 SP_RGBA32_F_COMPOSE( 1.0, 1.0, 1.0, 1.0 ) );
556509
557510
558 // Spinbutton511 // Spinbutton
@@ -565,96 +518,72 @@
565 attachToGridOrTable(t, _impl->_sbtn, 2, row, 1, 1, false, true);518 attachToGridOrTable(t, _impl->_sbtn, 2, row, 1, 1, false, true);
566519
567 // Signals520 // Signals
568 g_signal_connect(G_OBJECT(_impl->_adj), "value_changed", G_CALLBACK(ColorICCSelectorImpl::_adjustmentChanged), _csel);521 g_signal_connect(G_OBJECT(_impl->_adj), "value_changed", G_CALLBACK(ColorICCSelectorImpl::_adjustmentChanged),
569522 _impl);
570 g_signal_connect(G_OBJECT(_impl->_slider), "grabbed", G_CALLBACK(ColorICCSelectorImpl::_sliderGrabbed), _csel);523
571 g_signal_connect(G_OBJECT(_impl->_slider), "released", G_CALLBACK(ColorICCSelectorImpl::_sliderReleased), _csel);524 _impl->_slider->signal_grabbed.connect(sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderGrabbed));
572 g_signal_connect(G_OBJECT(_impl->_slider), "changed", G_CALLBACK(ColorICCSelectorImpl::_sliderChanged), _csel);525 _impl->_slider->signal_released.connect(sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderReleased));
573}526 _impl->_slider->signal_value_changed.connect(sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderChanged));
574527
575static void sp_color_icc_selector_dispose(GObject *object)528 gtk_widget_show(t);
576{529}
577 if (G_OBJECT_CLASS(sp_color_icc_selector_parent_class)->dispose) {530
578 G_OBJECT_CLASS(sp_color_icc_selector_parent_class)->dispose(object);531void ColorICCSelectorImpl::_fixupHit(GtkWidget * /*src*/, gpointer data)
579 }532{
580}533 ColorICCSelectorImpl *self = reinterpret_cast<ColorICCSelectorImpl *>(data);
581534 gtk_widget_set_sensitive(self->_fixupBtn, FALSE);
582static void535 self->_adjustmentChanged(self->_compUI[0]._adj, self);
583sp_color_icc_selector_show_all (GtkWidget *widget)
584{
585 gtk_widget_show (widget);
586}
587
588static void sp_color_icc_selector_hide(GtkWidget *widget)
589{
590 gtk_widget_hide(widget);
591}
592
593GtkWidget *
594sp_color_icc_selector_new (void)
595{
596 SPColorICCSelector *csel;
597
598 csel = static_cast<SPColorICCSelector*>(g_object_new (SP_TYPE_COLOR_ICC_SELECTOR, NULL));
599
600 return GTK_WIDGET (csel);
601}
602
603
604void ColorICCSelectorImpl::_fixupHit( GtkWidget* /*src*/, gpointer data )
605{
606 ColorICCSelectorImpl* self = reinterpret_cast<ColorICCSelectorImpl*>(data);
607 gtk_widget_set_sensitive( self->_fixupBtn, FALSE );
608 self->_adjustmentChanged( self->_compUI[0]._adj, SP_COLOR_ICC_SELECTOR(self->_owner->_csel) );
609}536}
610537
611#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)538#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
612void ColorICCSelectorImpl::_profileSelected( GtkWidget* /*src*/, gpointer data )539void ColorICCSelectorImpl::_profileSelected(GtkWidget * /*src*/, gpointer data)
613{540{
614 ColorICCSelectorImpl* self = reinterpret_cast<ColorICCSelectorImpl*>(data);541 ColorICCSelectorImpl *self = reinterpret_cast<ColorICCSelectorImpl *>(data);
615542
616 GtkTreeIter iter;543 GtkTreeIter iter;
617 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(self->_profileSel), &iter)) {544 if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(self->_profileSel), &iter)) {
618 GtkTreeModel *store = gtk_combo_box_get_model(GTK_COMBO_BOX(self->_profileSel));545 GtkTreeModel *store = gtk_combo_box_get_model(GTK_COMBO_BOX(self->_profileSel));
619 gchar* name = 0;546 gchar *name = 0;
620547
621 gtk_tree_model_get(store, &iter, 1, &name, -1);548 gtk_tree_model_get(store, &iter, 1, &name, -1);
622 self->_switchToProfile( name );549 self->_switchToProfile(name);
623 gtk_widget_set_tooltip_text(self->_profileSel, name );550 gtk_widget_set_tooltip_text(self->_profileSel, name);
624551
625 if ( name ) {552 if (name) {
626 g_free( name );553 g_free(name);
627 }554 }
628 }555 }
629}556}
630#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)557#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
631558
632#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)559#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
633void ColorICCSelectorImpl::_switchToProfile( gchar const* name )560void ColorICCSelectorImpl::_switchToProfile(gchar const *name)
634{561{
635 bool dirty = false;562 bool dirty = false;
636 SPColor tmp( _owner->_color );563 SPColor tmp(_color.color());
637564
638 if ( name ) {565 if (name) {
639 if ( tmp.icc && tmp.icc->colorProfile == name ) {566 if (tmp.icc && tmp.icc->colorProfile == name) {
640#ifdef DEBUG_LCMS567#ifdef DEBUG_LCMS
641 g_message("Already at name [%s]", name );568 g_message("Already at name [%s]", name);
642#endif // DEBUG_LCMS569#endif // DEBUG_LCMS
643 } else {570 }
644#ifdef DEBUG_LCMS571 else {
645 g_message("Need to switch to profile [%s]", name );572#ifdef DEBUG_LCMS
646#endif // DEBUG_LCMS573 g_message("Need to switch to profile [%s]", name);
647 if ( tmp.icc ) {574#endif // DEBUG_LCMS
575 if (tmp.icc) {
648 tmp.icc->colors.clear();576 tmp.icc->colors.clear();
649 } else {577 }
578 else {
650 tmp.icc = new SVGICCColor();579 tmp.icc = new SVGICCColor();
651 }580 }
652 tmp.icc->colorProfile = name;581 tmp.icc->colorProfile = name;
653 Inkscape::ColorProfile* newProf = SP_ACTIVE_DOCUMENT->profileManager->find(name);582 Inkscape::ColorProfile *newProf = SP_ACTIVE_DOCUMENT->profileManager->find(name);
654 if ( newProf ) {583 if (newProf) {
655 cmsHTRANSFORM trans = newProf->getTransfFromSRGB8();584 cmsHTRANSFORM trans = newProf->getTransfFromSRGB8();
656 if ( trans ) {585 if (trans) {
657 guint32 val = _owner->_color.toRGBA32(0);586 guint32 val = _color.color().toRGBA32(0);
658 guchar pre[4] = {587 guchar pre[4] = {
659 static_cast<guchar>(SP_RGBA32_R_U(val)),588 static_cast<guchar>(SP_RGBA32_R_U(val)),
660 static_cast<guchar>(SP_RGBA32_G_U(val)),589 static_cast<guchar>(SP_RGBA32_G_U(val)),
@@ -663,29 +592,31 @@
663#ifdef DEBUG_LCMS592#ifdef DEBUG_LCMS
664 g_message("Shoving in [%02x] [%02x] [%02x]", pre[0], pre[1], pre[2]);593 g_message("Shoving in [%02x] [%02x] [%02x]", pre[0], pre[1], pre[2]);
665#endif // DEBUG_LCMS594#endif // DEBUG_LCMS
666 cmsUInt16Number post[4] = {0,0,0,0};595 cmsUInt16Number post[4] = { 0, 0, 0, 0 };
667 cmsDoTransform( trans, pre, post, 1 );596 cmsDoTransform(trans, pre, post, 1);
668#ifdef DEBUG_LCMS597#ifdef DEBUG_LCMS
669 g_message("got on out [%04x] [%04x] [%04x] [%04x]", post[0], post[1], post[2], post[3]);598 g_message("got on out [%04x] [%04x] [%04x] [%04x]", post[0], post[1], post[2], post[3]);
670#endif // DEBUG_LCMS599#endif // DEBUG_LCMS
671#if HAVE_LIBLCMS1600#if HAVE_LIBLCMS1
672 guint count = _cmsChannelsOf( asICColorSpaceSig(newProf->getColorSpace()) );601 guint count = _cmsChannelsOf(asICColorSpaceSig(newProf->getColorSpace()));
673#elif HAVE_LIBLCMS2602#elif HAVE_LIBLCMS2
674 guint count = cmsChannelsOf( asICColorSpaceSig(newProf->getColorSpace()) );603 guint count = cmsChannelsOf(asICColorSpaceSig(newProf->getColorSpace()));
675#endif604#endif
676605
677 std::vector<colorspace::Component> things = colorspace::getColorSpaceInfo(asICColorSpaceSig(newProf->getColorSpace()));606 std::vector<colorspace::Component> things =
607 colorspace::getColorSpaceInfo(asICColorSpaceSig(newProf->getColorSpace()));
678608
679 for ( guint i = 0; i < count; i++ ) {609 for (guint i = 0; i < count; i++) {
680 gdouble val = (((gdouble)post[i])/65535.0) * (gdouble)((i < things.size()) ? things[i].scale : 1);610 gdouble val =
611 (((gdouble)post[i]) / 65535.0) * (gdouble)((i < things.size()) ? things[i].scale : 1);
681#ifdef DEBUG_LCMS612#ifdef DEBUG_LCMS
682 g_message(" scaled %d by %d to be %f", i, ((i < things.size()) ? things[i].scale : 1), val);613 g_message(" scaled %d by %d to be %f", i, ((i < things.size()) ? things[i].scale : 1), val);
683#endif // DEBUG_LCMS614#endif // DEBUG_LCMS
684 tmp.icc->colors.push_back(val);615 tmp.icc->colors.push_back(val);
685 }616 }
686 cmsHTRANSFORM retrans = newProf->getTransfToSRGB8();617 cmsHTRANSFORM retrans = newProf->getTransfToSRGB8();
687 if ( retrans ) {618 if (retrans) {
688 cmsDoTransform( retrans, post, pre, 1 );619 cmsDoTransform(retrans, post, pre, 1);
689#ifdef DEBUG_LCMS620#ifdef DEBUG_LCMS
690 g_message(" back out [%02x] [%02x] [%02x]", pre[0], pre[1], pre[2]);621 g_message(" back out [%02x] [%02x] [%02x]", pre[0], pre[1], pre[2]);
691#endif // DEBUG_LCMS622#endif // DEBUG_LCMS
@@ -695,30 +626,32 @@
695 }626 }
696 dirty = true;627 dirty = true;
697 }628 }
698 } else {629 }
630 else {
699#ifdef DEBUG_LCMS631#ifdef DEBUG_LCMS
700 g_message("NUKE THE ICC");632 g_message("NUKE THE ICC");
701#endif // DEBUG_LCMS633#endif // DEBUG_LCMS
702 if ( tmp.icc ) {634 if (tmp.icc) {
703 delete tmp.icc;635 delete tmp.icc;
704 tmp.icc = 0;636 tmp.icc = 0;
705 dirty = true;637 dirty = true;
706 _fixupHit( 0, this );638 _fixupHit(0, this);
707 } else {639 }
640 else {
708#ifdef DEBUG_LCMS641#ifdef DEBUG_LCMS
709 g_message("No icc to nuke");642 g_message("No icc to nuke");
710#endif // DEBUG_LCMS643#endif // DEBUG_LCMS
711 }644 }
712 }645 }
713646
714 if ( dirty ) {647 if (dirty) {
715#ifdef DEBUG_LCMS648#ifdef DEBUG_LCMS
716 g_message("+----------------");649 g_message("+----------------");
717 g_message("+ new color is [%s]", tmp.toString().c_str());650 g_message("+ new color is [%s]", tmp.toString().c_str());
718#endif // DEBUG_LCMS651#endif // DEBUG_LCMS
719 _setProfile( tmp.icc );652 _setProfile(tmp.icc);
720 //_adjustmentChanged( _compUI[0]._adj, SP_COLOR_ICC_SELECTOR(_csel) );653 //_adjustmentChanged( _compUI[0]._adj, SP_COLOR_ICC_SELECTOR(_csel) );
721 _owner->setColorAlpha( tmp, _owner->_alpha, true );654 _color.setColor(tmp);
722#ifdef DEBUG_LCMS655#ifdef DEBUG_LCMS
723 g_message("+_________________");656 g_message("+_________________");
724#endif // DEBUG_LCMS657#endif // DEBUG_LCMS
@@ -727,238 +660,257 @@
727#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)660#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
728661
729#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)662#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
730void ColorICCSelectorImpl::_profilesChanged( std::string const & name )663void ColorICCSelectorImpl::_profilesChanged(std::string const &name)
731{664{
732 GtkComboBox* combo = GTK_COMBO_BOX(_profileSel);665 GtkComboBox *combo = GTK_COMBO_BOX(_profileSel);
733666
734 g_signal_handler_block( G_OBJECT(_profileSel), _profChangedID );667 g_signal_handler_block(G_OBJECT(_profileSel), _profChangedID);
735668
736 GtkListStore *store = GTK_LIST_STORE(gtk_combo_box_get_model(combo));669 GtkListStore *store = GTK_LIST_STORE(gtk_combo_box_get_model(combo));
737 gtk_list_store_clear(store);670 gtk_list_store_clear(store);
738671
739 GtkTreeIter iter;672 GtkTreeIter iter;
740 gtk_list_store_append (store, &iter);673 gtk_list_store_append(store, &iter);
741 gtk_list_store_set(store, &iter, 0, _("<none>"), 1, _("<none>"), -1);674 gtk_list_store_set(store, &iter, 0, _("<none>"), 1, _("<none>"), -1);
742675
743 gtk_combo_box_set_active( combo, 0 );676 gtk_combo_box_set_active(combo, 0);
744677
745 int index = 1;678 int index = 1;
746 const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList( "iccprofile" );679 const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList("iccprofile");
747 while ( current ) {680 while (current) {
748 SPObject* obj = SP_OBJECT(current->data);681 SPObject *obj = SP_OBJECT(current->data);
749 Inkscape::ColorProfile* prof = reinterpret_cast<Inkscape::ColorProfile*>(obj);682 Inkscape::ColorProfile *prof = reinterpret_cast<Inkscape::ColorProfile *>(obj);
750683
751 gtk_list_store_append (store, &iter);684 gtk_list_store_append(store, &iter);
752 gtk_list_store_set(store, &iter, 0, gr_ellipsize_text(prof->name, 25).c_str(), 1, prof->name, -1);685 gtk_list_store_set(store, &iter, 0, gr_ellipsize_text(prof->name, 25).c_str(), 1, prof->name, -1);
753686
754 if ( name == prof->name ) {687 if (name == prof->name) {
755 gtk_combo_box_set_active( combo, index );688 gtk_combo_box_set_active(combo, index);
756 gtk_widget_set_tooltip_text(_profileSel, prof->name );689 gtk_widget_set_tooltip_text(_profileSel, prof->name);
757 }690 }
758691
759 index++;692 index++;
760 current = g_slist_next(current);693 current = g_slist_next(current);
761 }694 }
762695
763 g_signal_handler_unblock( G_OBJECT(_profileSel), _profChangedID );696 g_signal_handler_unblock(G_OBJECT(_profileSel), _profChangedID);
764}697}
765#else698#else
766void ColorICCSelectorImpl::_profilesChanged( std::string const & /*name*/ )699void ColorICCSelectorImpl::_profilesChanged(std::string const & /*name*/) {}
700#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
701
702void ColorICCSelector::on_show()
767{703{
704#if GTK_CHECK_VERSION(3, 0, 0)
705 Gtk::Grid::on_show();
706#else
707 Gtk::Table::on_show();
708#endif
709 _colorChanged();
768}710}
769#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
770711
771// Helpers for setting color value712// Helpers for setting color value
772713
773void ColorICCSelector::_colorChanged()714void ColorICCSelector::_colorChanged()
774{715{
775 _impl->_updating = TRUE;716 _impl->_updating = TRUE;
776 //sp_color_icc_set_color( SP_COLOR_ICC( _icc ), &color );717// sp_color_icc_set_color( SP_COLOR_ICC( _icc ), &color );
777718
778#ifdef DEBUG_LCMS719#ifdef DEBUG_LCMS
779 g_message( "/^^^^^^^^^ %p::_colorChanged(%08x:%s)", this,720 g_message("/^^^^^^^^^ %p::_colorChanged(%08x:%s)", this, _impl->_color.color().toRGBA32(_impl->_color.alpha()),
780 _color.toRGBA32(_alpha), ( (_color.icc) ? _color.icc->colorProfile.c_str(): "<null>" )721 ((_impl->_color.color().icc) ? _impl->_color.color().icc->colorProfile.c_str() : "<null>"));
781 );722#endif // DEBUG_LCMS
782#endif // DEBUG_LCMS723
783724#ifdef DEBUG_LCMS
784#ifdef DEBUG_LCMS725 g_message("FLIPPIES!!!! %p '%s'", _impl->_color.color().icc,
785 g_message("FLIPPIES!!!! %p '%s'", _color.icc, (_color.icc ? _color.icc->colorProfile.c_str():"<null>"));726 (_impl->_color.color().icc ? _impl->_color.color().icc->colorProfile.c_str() : "<null>"));
786#endif // DEBUG_LCMS727#endif // DEBUG_LCMS
787728
788 _impl->_profilesChanged( (_color.icc) ? _color.icc->colorProfile : std::string("") );729 _impl->_profilesChanged((_impl->_color.color().icc) ? _impl->_color.color().icc->colorProfile : std::string(""));
789 ColorScales::setScaled( _impl->_adj, _alpha );730 ColorScales::setScaled(_impl->_adj, _impl->_color.alpha());
790731
791#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)732#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
792 _impl->_setProfile( _color.icc );733 _impl->_setProfile(_impl->_color.color().icc);
793 _impl->_fixupNeeded = 0;734 _impl->_fixupNeeded = 0;
794 gtk_widget_set_sensitive( _impl->_fixupBtn, FALSE );735 gtk_widget_set_sensitive(_impl->_fixupBtn, FALSE);
795736
796 if (_impl->_prof) {737 if (_impl->_prof) {
797 if (_impl->_prof->getTransfToSRGB8() ) {738 if (_impl->_prof->getTransfToSRGB8()) {
798 cmsUInt16Number tmp[4];739 cmsUInt16Number tmp[4];
799 for ( guint i = 0; i < _impl->_profChannelCount; i++ ) {740 for (guint i = 0; i < _impl->_profChannelCount; i++) {
800 gdouble val = 0.0;741 gdouble val = 0.0;
801 if ( _color.icc->colors.size() > i ) {742 if (_impl->_color.color().icc->colors.size() > i) {
802 if ( _impl->_compUI[i]._component.scale == 256 ) {743 if (_impl->_compUI[i]._component.scale == 256) {
803 val = (_color.icc->colors[i] + 128.0) / static_cast<gdouble>(_impl->_compUI[i]._component.scale);744 val = (_impl->_color.color().icc->colors[i] + 128.0) /
804 } else {745 static_cast<gdouble>(_impl->_compUI[i]._component.scale);
805 val = _color.icc->colors[i] / static_cast<gdouble>(_impl->_compUI[i]._component.scale);746 }
747 else {
748 val = _impl->_color.color().icc->colors[i] /
749 static_cast<gdouble>(_impl->_compUI[i]._component.scale);
806 }750 }
807 }751 }
808 tmp[i] = val * 0x0ffff;752 tmp[i] = val * 0x0ffff;
809 }753 }
810 guchar post[4] = {0,0,0,0};754 guchar post[4] = { 0, 0, 0, 0 };
811 cmsHTRANSFORM trans = _impl->_prof->getTransfToSRGB8();755 cmsHTRANSFORM trans = _impl->_prof->getTransfToSRGB8();
812 if ( trans ) {756 if (trans) {
813 cmsDoTransform( trans, tmp, post, 1 );757 cmsDoTransform(trans, tmp, post, 1);
814 guint32 other = SP_RGBA32_U_COMPOSE(post[0], post[1], post[2], 255 );758 guint32 other = SP_RGBA32_U_COMPOSE(post[0], post[1], post[2], 255);
815 if ( other != _color.toRGBA32(255) ) {759 if (other != _impl->_color.color().toRGBA32(255)) {
816 _impl->_fixupNeeded = other;760 _impl->_fixupNeeded = other;
817 gtk_widget_set_sensitive( _impl->_fixupBtn, TRUE );761 gtk_widget_set_sensitive(_impl->_fixupBtn, TRUE);
818#ifdef DEBUG_LCMS762#ifdef DEBUG_LCMS
819 g_message("Color needs to change 0x%06x to 0x%06x", _color.toRGBA32(255) >> 8, other >> 8 );763 g_message("Color needs to change 0x%06x to 0x%06x", _color.toRGBA32(255) >> 8, other >> 8);
820#endif // DEBUG_LCMS764#endif // DEBUG_LCMS
821 }765 }
822 }766 }
823 }767 }
824 }768 }
825#else769#else
826 //(void)color;770//(void)color;
827#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)771#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
828 _impl->_updateSliders( -1 );772 _impl->_updateSliders(-1);
829773
830774
831 _impl->_updating = FALSE;775 _impl->_updating = FALSE;
832#ifdef DEBUG_LCMS776#ifdef DEBUG_LCMS
833 g_message( "\\_________ %p::_colorChanged()", this );777 g_message("\\_________ %p::_colorChanged()", this);
834#endif // DEBUG_LCMS778#endif // DEBUG_LCMS
835}779}
836780
837#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)781#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
838void ColorICCSelectorImpl::_setProfile( SVGICCColor* profile )782void ColorICCSelectorImpl::_setProfile(SVGICCColor *profile)
839{783{
840#ifdef DEBUG_LCMS784#ifdef DEBUG_LCMS
841 g_message( "/^^^^^^^^^ %p::_setProfile(%s)", this,785 g_message("/^^^^^^^^^ %p::_setProfile(%s)", this, ((profile) ? profile->colorProfile.c_str() : "<null>"));
842 ( (profile) ? profile->colorProfile.c_str() : "<null>")
843 );
844#endif // DEBUG_LCMS786#endif // DEBUG_LCMS
845 bool profChanged = false;787 bool profChanged = false;
846 if ( _prof && (!profile || (_profileName != profile->colorProfile) ) ) {788 if (_prof && (!profile || (_profileName != profile->colorProfile))) {
847 // Need to clear out the prior one789 // Need to clear out the prior one
848 profChanged = true;790 profChanged = true;
849 _profileName.clear();791 _profileName.clear();
850 _prof = 0;792 _prof = 0;
851 _profChannelCount = 0;793 _profChannelCount = 0;
852 } else if ( profile && !_prof ) {794 }
795 else if (profile && !_prof) {
853 profChanged = true;796 profChanged = true;
854 }797 }
855798
856 for ( size_t i = 0; i < _compUI.size(); i++ ) {799 for (size_t i = 0; i < _compUI.size(); i++) {
857 gtk_widget_hide( _compUI[i]._label );800 gtk_widget_hide(_compUI[i]._label);
858 gtk_widget_hide( _compUI[i]._slider );801 _compUI[i]._slider->hide();
859 gtk_widget_hide( _compUI[i]._btn );802 gtk_widget_hide(_compUI[i]._btn);
860 }803 }
861804
862 if ( profile ) {805 if (profile) {
863 _prof = SP_ACTIVE_DOCUMENT->profileManager->find(profile->colorProfile.c_str());806 _prof = SP_ACTIVE_DOCUMENT->profileManager->find(profile->colorProfile.c_str());
864 if ( _prof && (asICColorProfileClassSig(_prof->getProfileClass()) != cmsSigNamedColorClass) ) {807 if (_prof && (asICColorProfileClassSig(_prof->getProfileClass()) != cmsSigNamedColorClass)) {
865#if HAVE_LIBLCMS1808#if HAVE_LIBLCMS1
866 _profChannelCount = _cmsChannelsOf( asICColorSpaceSig(_prof->getColorSpace()) );809 _profChannelCount = _cmsChannelsOf(asICColorSpaceSig(_prof->getColorSpace()));
867#elif HAVE_LIBLCMS2810#elif HAVE_LIBLCMS2
868 _profChannelCount = cmsChannelsOf( asICColorSpaceSig(_prof->getColorSpace()) );811 _profChannelCount = cmsChannelsOf(asICColorSpaceSig(_prof->getColorSpace()));
869#endif812#endif
870813
871 if ( profChanged ) {814 if (profChanged) {
872 std::vector<colorspace::Component> things = colorspace::getColorSpaceInfo(asICColorSpaceSig(_prof->getColorSpace()));815 std::vector<colorspace::Component> things =
873 for (size_t i = 0; (i < things.size()) && (i < _profChannelCount); ++i)816 colorspace::getColorSpaceInfo(asICColorSpaceSig(_prof->getColorSpace()));
874 {817 for (size_t i = 0; (i < things.size()) && (i < _profChannelCount); ++i) {
875 _compUI[i]._component = things[i];818 _compUI[i]._component = things[i];
876 }819 }
877820
878 for ( guint i = 0; i < _profChannelCount; i++ ) {821 for (guint i = 0; i < _profChannelCount; i++) {
879 gtk_label_set_text_with_mnemonic( GTK_LABEL(_compUI[i]._label), (i < things.size()) ? things[i].name.c_str() : "");822 gtk_label_set_text_with_mnemonic(GTK_LABEL(_compUI[i]._label),
880823 (i < things.size()) ? things[i].name.c_str() : "");
881 gtk_widget_set_tooltip_text( _compUI[i]._slider, (i < things.size()) ? things[i].tip.c_str() : "" );824
882 gtk_widget_set_tooltip_text( _compUI[i]._btn, (i < things.size()) ? things[i].tip.c_str() : "" );825 _compUI[i]._slider->set_tooltip_text((i < things.size()) ? things[i].tip.c_str() : "");
883826 gtk_widget_set_tooltip_text(_compUI[i]._btn, (i < things.size()) ? things[i].tip.c_str() : "");
884 sp_color_slider_set_colors( SP_COLOR_SLIDER(_compUI[i]._slider),827
885 SPColor(0.0, 0.0, 0.0).toRGBA32(0xff),828 _compUI[i]._slider->setColors(SPColor(0.0, 0.0, 0.0).toRGBA32(0xff),
886 SPColor(0.5, 0.5, 0.5).toRGBA32(0xff),829 SPColor(0.5, 0.5, 0.5).toRGBA32(0xff),
887 SPColor(1.0, 1.0, 1.0).toRGBA32(0xff) );830 SPColor(1.0, 1.0, 1.0).toRGBA32(0xff));
888/*831 /*
889 _compUI[i]._adj = GTK_ADJUSTMENT( gtk_adjustment_new( val, 0.0, _fooScales[i], step, page, page ) );832 _compUI[i]._adj = GTK_ADJUSTMENT( gtk_adjustment_new( val, 0.0, _fooScales[i],
890 g_signal_connect( G_OBJECT( _compUI[i]._adj ), "value_changed", G_CALLBACK( _adjustmentChanged ), _csel );833 step, page, page ) );
891834 g_signal_connect( G_OBJECT( _compUI[i]._adj ), "value_changed", G_CALLBACK(
892 sp_color_slider_set_adjustment( SP_COLOR_SLIDER(_compUI[i]._slider), _compUI[i]._adj );835 _adjustmentChanged ), _csel );
893 gtk_spin_button_set_adjustment( GTK_SPIN_BUTTON(_compUI[i]._btn), _compUI[i]._adj );836
894 gtk_spin_button_set_digits( GTK_SPIN_BUTTON(_compUI[i]._btn), digits );837 sp_color_slider_set_adjustment( SP_COLOR_SLIDER(_compUI[i]._slider),
895*/838 _compUI[i]._adj );
896 gtk_widget_show( _compUI[i]._label );839 gtk_spin_button_set_adjustment( GTK_SPIN_BUTTON(_compUI[i]._btn),
897 gtk_widget_show( _compUI[i]._slider );840 _compUI[i]._adj );
898 gtk_widget_show( _compUI[i]._btn );841 gtk_spin_button_set_digits( GTK_SPIN_BUTTON(_compUI[i]._btn), digits );
899 //gtk_adjustment_set_value( _compUI[i]._adj, 0.0 );842 */
900 //gtk_adjustment_set_value( _compUI[i]._adj, val );843 gtk_widget_show(_compUI[i]._label);
844 _compUI[i]._slider->show();
845 gtk_widget_show(_compUI[i]._btn);
846 // gtk_adjustment_set_value( _compUI[i]._adj, 0.0 );
847 // gtk_adjustment_set_value( _compUI[i]._adj, val );
901 }848 }
902 for ( size_t i = _profChannelCount; i < _compUI.size(); i++ ) {849 for (size_t i = _profChannelCount; i < _compUI.size(); i++) {
903 gtk_widget_hide( _compUI[i]._label );850 gtk_widget_hide(_compUI[i]._label);
904 gtk_widget_hide( _compUI[i]._slider );851 _compUI[i]._slider->hide();
905 gtk_widget_hide( _compUI[i]._btn );852 gtk_widget_hide(_compUI[i]._btn);
906 }853 }
907 }854 }
908 } else {855 }
856 else {
909 // Give up for now on named colors857 // Give up for now on named colors
910 _prof = 0;858 _prof = 0;
911 }859 }
912 }860 }
913861
914#ifdef DEBUG_LCMS862#ifdef DEBUG_LCMS
915 g_message( "\\_________ %p::_setProfile()", this );863 g_message("\\_________ %p::_setProfile()", this);
916#endif // DEBUG_LCMS864#endif // DEBUG_LCMS
917}865}
918#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)866#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
919867
920void ColorICCSelectorImpl::_updateSliders( gint ignore )868void ColorICCSelectorImpl::_updateSliders(gint ignore)
921{869{
922#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)870#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
923 if ( _owner->_color.icc )871 if (_color.color().icc) {
924 {872 for (guint i = 0; i < _profChannelCount; i++) {
925 for ( guint i = 0; i < _profChannelCount; i++ ) {
926 gdouble val = 0.0;873 gdouble val = 0.0;
927 if ( _owner->_color.icc->colors.size() > i ) {874 if (_color.color().icc->colors.size() > i) {
928 if ( _compUI[i]._component.scale == 256 ) {875 if (_compUI[i]._component.scale == 256) {
929 val = (_owner->_color.icc->colors[i] + 128.0) / static_cast<gdouble>(_compUI[i]._component.scale);876 val = (_color.color().icc->colors[i] + 128.0) / static_cast<gdouble>(_compUI[i]._component.scale);
930 } else {877 }
931 val = _owner->_color.icc->colors[i] / static_cast<gdouble>(_compUI[i]._component.scale);878 else {
879 val = _color.color().icc->colors[i] / static_cast<gdouble>(_compUI[i]._component.scale);
932 }880 }
933 }881 }
934 gtk_adjustment_set_value( _compUI[i]._adj, val );882 gtk_adjustment_set_value(_compUI[i]._adj, val);
935 }883 }
936884
937 if ( _prof ) {885 if (_prof) {
938 if ( _prof->getTransfToSRGB8() ) {886 if (_prof->getTransfToSRGB8()) {
939 for ( guint i = 0; i < _profChannelCount; i++ ) {887 for (guint i = 0; i < _profChannelCount; i++) {
940 if ( static_cast<gint>(i) != ignore ) {888 if (static_cast<gint>(i) != ignore) {
941 cmsUInt16Number* scratch = getScratch();889 cmsUInt16Number *scratch = getScratch();
942 cmsUInt16Number filler[4] = {0, 0, 0, 0};890 cmsUInt16Number filler[4] = { 0, 0, 0, 0 };
943 for ( guint j = 0; j < _profChannelCount; j++ ) {891 for (guint j = 0; j < _profChannelCount; j++) {
944 filler[j] = 0x0ffff * ColorScales::getScaled( _compUI[j]._adj );892 filler[j] = 0x0ffff * ColorScales::getScaled(_compUI[j]._adj);
945 }893 }
946 894
947 cmsUInt16Number* p = scratch;895 cmsUInt16Number *p = scratch;
948 for ( guint x = 0; x < 1024; x++ ) {896 for (guint x = 0; x < 1024; x++) {
949 for ( guint j = 0; j < _profChannelCount; j++ ) {897 for (guint j = 0; j < _profChannelCount; j++) {
950 if ( j == i ) {898 if (j == i) {
951 *p++ = x * 0x0ffff / 1024;899 *p++ = x * 0x0ffff / 1024;
952 } else {900 }
901 else {
953 *p++ = filler[j];902 *p++ = filler[j];
954 }903 }
955 }904 }
956 }905 }
957 906
958 cmsHTRANSFORM trans = _prof->getTransfToSRGB8();907 cmsHTRANSFORM trans = _prof->getTransfToSRGB8();
959 if ( trans ) {908 if (trans) {
960 cmsDoTransform( trans, scratch, _compUI[i]._map, 1024 );909 cmsDoTransform(trans, scratch, _compUI[i]._map, 1024);
961 sp_color_slider_set_map( SP_COLOR_SLIDER(_compUI[i]._slider), _compUI[i]._map );910 if (_compUI[i]._slider)
911 {
912 _compUI[i]._slider->setMap(_compUI[i]._map);
913 }
962 }914 }
963 }915 }
964 }916 }
@@ -969,15 +921,15 @@
969 (void)ignore;921 (void)ignore;
970#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)922#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
971923
972 guint32 start = _owner->_color.toRGBA32( 0x00 );924 guint32 start = _color.color().toRGBA32(0x00);
973 guint32 mid = _owner->_color.toRGBA32( 0x7f );925 guint32 mid = _color.color().toRGBA32(0x7f);
974 guint32 end = _owner->_color.toRGBA32( 0xff );926 guint32 end = _color.color().toRGBA32(0xff);
975927
976 sp_color_slider_set_colors( SP_COLOR_SLIDER(_slider), start, mid, end );928 _slider->setColors(start, mid, end);
977}929}
978930
979931
980void ColorICCSelectorImpl::_adjustmentChanged( GtkAdjustment *adjustment, SPColorICCSelector *cs )932void ColorICCSelectorImpl::_adjustmentChanged(GtkAdjustment *adjustment, ColorICCSelectorImpl *cs)
981{933{
982// // TODO check this. It looks questionable:934// // TODO check this. It looks questionable:
983// // if a value is entered between 0 and 1 exclusive, normalize it to (int) 0..255 or 0..100935// // if a value is entered between 0 and 1 exclusive, normalize it to (int) 0..255 or 0..100
@@ -986,121 +938,135 @@
986// }938// }
987939
988#ifdef DEBUG_LCMS940#ifdef DEBUG_LCMS
989 g_message( "/^^^^^^^^^ %p::_adjustmentChanged()", cs );941 g_message("/^^^^^^^^^ %p::_adjustmentChanged()", cs);
990#endif // DEBUG_LCMS942#endif // DEBUG_LCMS
991943
992 ColorICCSelector* iccSelector = static_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base);944 ColorICCSelector *iccSelector = cs->_owner;
993 if (iccSelector->_impl->_updating) {945 if (iccSelector->_impl->_updating) {
994 return;946 return;
995 }947 }
996948
997 iccSelector->_impl->_updating = TRUE;949 iccSelector->_impl->_updating = TRUE;
998950
999 gint match = -1;951 gint match = -1;
1000952
1001 SPColor newColor( iccSelector->_color );953 SPColor newColor(iccSelector->_impl->_color.color());
1002 gfloat scaled = ColorScales::getScaled( iccSelector->_impl->_adj );954 gfloat scaled = ColorScales::getScaled(iccSelector->_impl->_adj);
1003 if ( iccSelector->_impl->_adj == adjustment ) {955 if (iccSelector->_impl->_adj == adjustment) {
1004#ifdef DEBUG_LCMS956#ifdef DEBUG_LCMS
1005 g_message("ALPHA");957 g_message("ALPHA");
1006#endif // DEBUG_LCMS958#endif // DEBUG_LCMS
1007 } else {959 }
960 else {
1008#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)961#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
1009 for ( size_t i = 0; i < iccSelector->_impl->_compUI.size(); i++ ) {962 for (size_t i = 0; i < iccSelector->_impl->_compUI.size(); i++) {
1010 if ( iccSelector->_impl->_compUI[i]._adj == adjustment ) {963 if (iccSelector->_impl->_compUI[i]._adj == adjustment) {
1011 match = i;964 match = i;
1012 break;965 break;
1013 }966 }
1014 }967 }
1015 if ( match >= 0 ) {968 if (match >= 0) {
1016#ifdef DEBUG_LCMS969#ifdef DEBUG_LCMS
1017 g_message(" channel %d", match );970 g_message(" channel %d", match);
1018#endif // DEBUG_LCMS971#endif // DEBUG_LCMS
1019 }972 }
1020973
1021974
1022 cmsUInt16Number tmp[4];975 cmsUInt16Number tmp[4];
1023 for ( guint i = 0; i < 4; i++ ) {976 for (guint i = 0; i < 4; i++) {
1024 tmp[i] = ColorScales::getScaled( iccSelector->_impl->_compUI[i]._adj ) * 0x0ffff;977 tmp[i] = ColorScales::getScaled(iccSelector->_impl->_compUI[i]._adj) * 0x0ffff;
1025 }978 }
1026 guchar post[4] = {0,0,0,0};979 guchar post[4] = { 0, 0, 0, 0 };
1027980
1028 cmsHTRANSFORM trans = iccSelector->_impl->_prof->getTransfToSRGB8();981 cmsHTRANSFORM trans = iccSelector->_impl->_prof->getTransfToSRGB8();
1029 if ( trans ) {982 if (trans) {
1030 cmsDoTransform( trans, tmp, post, 1 );983 cmsDoTransform(trans, tmp, post, 1);
1031 }984 }
1032985
1033 SPColor other( SP_RGBA32_U_COMPOSE(post[0], post[1], post[2], 255) );986 SPColor other(SP_RGBA32_U_COMPOSE(post[0], post[1], post[2], 255));
1034 other.icc = new SVGICCColor();987 other.icc = new SVGICCColor();
1035 if ( iccSelector->_color.icc ) {988 if (iccSelector->_impl->_color.color().icc) {
1036 other.icc->colorProfile = iccSelector->_color.icc->colorProfile;989 other.icc->colorProfile = iccSelector->_impl->_color.color().icc->colorProfile;
1037 }990 }
1038991
1039 guint32 prior = iccSelector->_color.toRGBA32(255);992 guint32 prior = iccSelector->_impl->_color.color().toRGBA32(255);
1040 guint32 newer = other.toRGBA32(255);993 guint32 newer = other.toRGBA32(255);
1041994
1042 if ( prior != newer ) {995 if (prior != newer) {
1043#ifdef DEBUG_LCMS996#ifdef DEBUG_LCMS
1044 g_message("Transformed color from 0x%08x to 0x%08x", prior, newer );997 g_message("Transformed color from 0x%08x to 0x%08x", prior, newer);
1045 g_message(" ~~~~ FLIP");998 g_message(" ~~~~ FLIP");
1046#endif // DEBUG_LCMS999#endif // DEBUG_LCMS
1047 newColor = other;1000 newColor = other;
1048 newColor.icc->colors.clear();1001 newColor.icc->colors.clear();
1049 for ( guint i = 0; i < iccSelector->_impl->_profChannelCount; i++ ) {1002 for (guint i = 0; i < iccSelector->_impl->_profChannelCount; i++) {
1050 gdouble val = ColorScales::getScaled( iccSelector->_impl->_compUI[i]._adj );1003 gdouble val = ColorScales::getScaled(iccSelector->_impl->_compUI[i]._adj);
1051 val *= iccSelector->_impl->_compUI[i]._component.scale;1004 val *= iccSelector->_impl->_compUI[i]._component.scale;
1052 if ( iccSelector->_impl->_compUI[i]._component.scale == 256 ) {1005 if (iccSelector->_impl->_compUI[i]._component.scale == 256) {
1053 val -= 128;1006 val -= 128;
1054 }1007 }
1055 newColor.icc->colors.push_back( val );1008 newColor.icc->colors.push_back(val);
1056 }1009 }
1057 }1010 }
1058#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)1011#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
1059 }1012 }
1060 iccSelector->_updateInternals( newColor, scaled, iccSelector->_impl->_dragging );1013 iccSelector->_impl->_color.setColorAlpha(newColor, scaled);
1061 iccSelector->_impl->_updateSliders( match );1014 // iccSelector->_updateInternals( newColor, scaled, iccSelector->_impl->_dragging );
1015 iccSelector->_impl->_updateSliders(match);
10621016
1063 iccSelector->_impl->_updating = FALSE;1017 iccSelector->_impl->_updating = FALSE;
1064#ifdef DEBUG_LCMS1018#ifdef DEBUG_LCMS
1065 g_message( "\\_________ %p::_adjustmentChanged()", cs );1019 g_message("\\_________ %p::_adjustmentChanged()", cs);
1066#endif // DEBUG_LCMS1020#endif // DEBUG_LCMS
1067}1021}
10681022
1069void ColorICCSelectorImpl::_sliderGrabbed( SPColorSlider * /*slider*/, SPColorICCSelector * /*cs*/ )1023void ColorICCSelectorImpl::_sliderGrabbed()
1070{1024{
1071// ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base);1025 // ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base);
1072// if (!iccSelector->_dragging) {1026 // if (!iccSelector->_dragging) {
1073// iccSelector->_dragging = TRUE;1027 // iccSelector->_dragging = TRUE;
1074// iccSelector->_grabbed();1028 // iccSelector->_grabbed();
1075// iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_impl->_adj ), iccSelector->_dragging );1029 // iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_impl->_adj ),
1076// }1030 // iccSelector->_dragging );
1031 // }
1077}1032}
10781033
1079void ColorICCSelectorImpl::_sliderReleased( SPColorSlider * /*slider*/, SPColorICCSelector * /*cs*/ )1034void ColorICCSelectorImpl::_sliderReleased()
1080{1035{
1081// ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base);1036 // ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base);
1082// if (iccSelector->_dragging) {1037 // if (iccSelector->_dragging) {
1083// iccSelector->_dragging = FALSE;1038 // iccSelector->_dragging = FALSE;
1084// iccSelector->_released();1039 // iccSelector->_released();
1085// iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_adj ), iccSelector->_dragging );1040 // iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_adj ),
1086// }1041 // iccSelector->_dragging );
1042 // }
1087}1043}
10881044
1089#ifdef DEBUG_LCMS1045#ifdef DEBUG_LCMS
1090void ColorICCSelectorImpl::_sliderChanged( SPColorSlider *slider, SPColorICCSelector *cs )1046void ColorICCSelectorImpl::_sliderChanged(SPColorSlider *slider, SPColorICCSelector *cs)
1091#else1047#else
1092void ColorICCSelectorImpl::_sliderChanged( SPColorSlider * /*slider*/, SPColorICCSelector * /*cs*/ )1048void ColorICCSelectorImpl::_sliderChanged()
1093#endif // DEBUG_LCMS1049#endif // DEBUG_LCMS
1094{1050{
1095#ifdef DEBUG_LCMS1051#ifdef DEBUG_LCMS
1096 g_message("Changed %p and %p", slider, cs );1052 g_message("Changed %p and %p", slider, cs);
1097#endif // DEBUG_LCMS1053#endif // DEBUG_LCMS
1098// ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base);1054 // ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base);
10991055
1100// iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_adj ), iccSelector->_dragging );1056 // iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_adj ),
1101}1057 // iccSelector->_dragging );
11021058}
11031059
1060Gtk::Widget *ColorICCSelectorFactory::createWidget(Inkscape::UI::SelectedColor &color) const
1061{
1062 Gtk::Widget *w = Gtk::manage(new ColorICCSelector(color));
1063 return w;
1064}
1065
1066Glib::ustring ColorICCSelectorFactory::modeName() const { return gettext(ColorICCSelector::MODE_NAME); }
1067}
1068}
1069}
1104/*1070/*
1105 Local Variables:1071 Local Variables:
1106 mode:c++1072 mode:c++
11071073
=== renamed file 'src/widgets/sp-color-icc-selector.h' => 'src/ui/widget/color-icc-selector.h'
--- src/widgets/sp-color-icc-selector.h 2014-10-08 02:22:03 +0000
+++ src/ui/widget/color-icc-selector.h 2015-05-17 11:43:43 +0000
@@ -1,63 +1,69 @@
1#ifndef SEEN_SP_COLOR_ICC_SELECTOR_H1#ifndef SEEN_SP_COLOR_ICC_SELECTOR_H
2#define SEEN_SP_COLOR_ICC_SELECTOR_H2#define SEEN_SP_COLOR_ICC_SELECTOR_H
33
4#include <glib.h>4#ifdef HAVE_CONFIG_H
5#include "sp-color-selector.h"5#include <config.h>
6#endif
7
8#include <gtkmm/widget.h>
9#if WITH_GTKMM_3_0
10#include <gtkmm/grid.h>
11#else
12#include <gtkmm/table.h>
13#endif
14
15#include "ui/selected-color.h"
616
7namespace Inkscape {17namespace Inkscape {
18
8class ColorProfile;19class ColorProfile;
9}
1020
11struct SPColorICCSelector;21namespace UI {
12struct SPColorICCSelectorClass;22namespace Widget {
1323
14class ColorICCSelectorImpl;24class ColorICCSelectorImpl;
1525
16class ColorICCSelector: public ColorSelector26class ColorICCSelector
17{27#if GTK_CHECK_VERSION(3, 0, 0)
18public:28 : public Gtk::Grid
19 ColorICCSelector( SPColorSelector* csel );29#else
30 : public Gtk::Table
31#endif
32 {
33 public:
34 static const gchar *MODE_NAME;
35
36 ColorICCSelector(SelectedColor &color);
20 virtual ~ColorICCSelector();37 virtual ~ColorICCSelector();
2138
22 virtual void init();39 virtual void init();
2340
24protected:41 protected:
42 void on_show();
43
25 virtual void _colorChanged();44 virtual void _colorChanged();
2645
27 void _recalcColor( gboolean changing );46 void _recalcColor(gboolean changing);
2847
29private:48 private:
30 friend class ColorICCSelectorImpl;49 friend class ColorICCSelectorImpl;
3150
32 // By default, disallow copy constructor and assignment operator51 // By default, disallow copy constructor and assignment operator
33 ColorICCSelector( const ColorICCSelector& obj );52 ColorICCSelector(const ColorICCSelector &obj);
34 ColorICCSelector& operator=( const ColorICCSelector& obj );53 ColorICCSelector &operator=(const ColorICCSelector &obj);
3554
36 ColorICCSelectorImpl *_impl;55 ColorICCSelectorImpl *_impl;
37};56};
3857
3958
4059class ColorICCSelectorFactory : public ColorSelectorFactory {
41#define SP_TYPE_COLOR_ICC_SELECTOR (sp_color_icc_selector_get_type())60 public:
42#define SP_COLOR_ICC_SELECTOR(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_COLOR_ICC_SELECTOR, SPColorICCSelector))61 Gtk::Widget *createWidget(SelectedColor &color) const;
43#define SP_COLOR_ICC_SELECTOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_COLOR_ICC_SELECTOR, SPColorICCSelectorClass))62 Glib::ustring modeName() const;
44#define SP_IS_COLOR_ICC_SELECTOR(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_COLOR_ICC_SELECTOR))63};
45#define SP_IS_COLOR_ICC_SELECTOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_COLOR_ICC_SELECTOR))64}
4665}
47struct SPColorICCSelector {66}
48 SPColorSelector parent;
49};
50
51struct SPColorICCSelectorClass {
52 SPColorSelectorClass parent_class;
53};
54
55GType sp_color_icc_selector_get_type(void);
56
57GtkWidget *sp_color_icc_selector_new(void);
58
59
60
61#endif // SEEN_SP_COLOR_ICC_SELECTOR_H67#endif // SEEN_SP_COLOR_ICC_SELECTOR_H
6268
63/*69/*
6470
=== renamed file 'src/widgets/sp-color-notebook.cpp' => 'src/ui/widget/color-notebook.cpp'
--- src/widgets/sp-color-notebook.cpp 2014-10-08 02:22:03 +0000
+++ src/ui/widget/color-notebook.cpp 2015-05-17 11:43:43 +0000
@@ -1,11 +1,13 @@
1/*1/**
2 * A notebook with RGB, CMYK, CMS, HSL, and Wheel pages2 * @file
3 *3 * A notebook with RGB, CMYK, CMS, HSL, and Wheel pages - implementation
4 * Author:4 */
5/* Authors:
5 * Lauris Kaplinski <lauris@kaplinski.com>6 * Lauris Kaplinski <lauris@kaplinski.com>
6 * bulia byak <buliabyak@users.sf.net>7 * bulia byak <buliabyak@users.sf.net>
8 * Tomasz Boczkowski <penginsbacon@gmail.com> (c++-sification)
7 *9 *
8 * Copyright (C) 2001-2002 Lauris Kaplinski10 * Copyright (C) 2001-2014 Authors
9 *11 *
10 * This code is in public domain12 * This code is in public domain
11 */13 */
@@ -14,7 +16,7 @@
14#define noDUMP_CHANGE_INFO16#define noDUMP_CHANGE_INFO
1517
16#ifdef HAVE_CONFIG_H18#ifdef HAVE_CONFIG_H
17# include "config.h"19#include "config.h"
18#endif20#endif
1921
20#include "widgets/icon.h"22#include "widgets/icon.h"
@@ -22,512 +24,233 @@
22#include <string>24#include <string>
23#include <cstdlib>25#include <cstdlib>
24#include <cstddef>26#include <cstddef>
25#include <gtk/gtk.h>
26#include <glibmm/i18n.h>27#include <glibmm/i18n.h>
28#include <gtkmm/label.h>
29#include <gtkmm/notebook.h>
2730
28#include "ui/dialog-events.h"31#include "preferences.h"
29#include "../preferences.h"32#include "widgets/spw-utilities.h"
30#include "sp-color-notebook.h"
31#include "spw-utilities.h"
32#include "sp-color-scales.h"
33#include "sp-color-icc-selector.h"
34#include "sp-color-wheel-selector.h"
35#include "svg/svg-icc-color.h"33#include "svg/svg-icc-color.h"
36#include "../inkscape.h"34#include "inkscape.h"
37#include "../document.h"35#include "document.h"
38#include "../profile-manager.h"36#include "profile-manager.h"
39#include "color-profile.h"37#include "color-profile.h"
40#include "cms-system.h"38#include "cms-system.h"
39#include "ui/dialog-events.h"
41#include "ui/tools-switch.h"40#include "ui/tools-switch.h"
42#include "ui/tools/tool-base.h"41#include "ui/tools/tool-base.h"
42#include "ui/widget/color-entry.h"
43#include "ui/widget/color-icc-selector.h"
44#include "ui/widget/color-notebook.h"
45#include "ui/widget/color-scales.h"
46#include "ui/widget/color-wheel-selector.h"
4347
44using Inkscape::CMSSystem;48using Inkscape::CMSSystem;
4549
46struct SPColorNotebookTracker {
47 const gchar* name;
48 const gchar* className;
49 GType type;
50 guint submode;
51 gboolean enabledFull;
52 gboolean enabledBrief;
53 SPColorNotebook *backPointer;
54};
55
56static void sp_color_notebook_dispose(GObject *object);
57
58static void sp_color_notebook_show_all (GtkWidget *widget);
59static void sp_color_notebook_hide(GtkWidget *widget);
60
61#define XPAD 450#define XPAD 4
62#define YPAD 151#define YPAD 1
6352
64G_DEFINE_TYPE(SPColorNotebook, sp_color_notebook, SP_TYPE_COLOR_SELECTOR);53namespace Inkscape {
6554namespace UI {
66static void sp_color_notebook_class_init(SPColorNotebookClass *klass)55namespace Widget {
67{56
68 GObjectClass *object_class = reinterpret_cast<GObjectClass *>(klass);57
69 GtkWidgetClass *widget_class = reinterpret_cast<GtkWidgetClass *>(klass);58ColorNotebook::ColorNotebook(SelectedColor &color)
7059#if GTK_CHECK_VERSION(3, 0, 0)
71 object_class->dispose = sp_color_notebook_dispose;60 : Gtk::Grid()
7261#else
73 widget_class->show_all = sp_color_notebook_show_all;62 : Gtk::Table(2, 3, false)
74 widget_class->hide = sp_color_notebook_hide;63#endif
75}64 , _selected_color(color)
7665
77static void66{
78sp_color_notebook_switch_page(GtkNotebook *notebook,67 Page *page;
79 GtkWidget *page,68
80 guint page_num,69 page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_RGB), true);
81 SPColorNotebook *colorbook)70 _available_pages.push_back(page);
82{71 page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_HSV), true);
83 if ( colorbook )72 _available_pages.push_back(page);
84 {73 page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_CMYK), true);
85 ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);74 _available_pages.push_back(page);
86 nb->switchPage( notebook, page, page_num );75 page = new Page(new ColorWheelSelectorFactory, true);
8776 _available_pages.push_back(page);
88 // remember the page we switched to77#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
89 Inkscape::Preferences *prefs = Inkscape::Preferences::get();78 page = new Page(new ColorICCSelectorFactory, true);
90 prefs->setInt("/colorselector/page", page_num);79 _available_pages.push_back(page);
91 }80#endif
92}81
9382 _initUI();
94void ColorNotebook::switchPage(GtkNotebook*,83
95 GtkWidget*,84 _selected_color.signal_changed.connect(sigc::mem_fun(this, &ColorNotebook::_onSelectedColorChanged));
96 guint page_num)85 _selected_color.signal_dragged.connect(sigc::mem_fun(this, &ColorNotebook::_onSelectedColorChanged));
97{86}
98 SPColorSelector* csel;87
99 GtkWidget* widget;88ColorNotebook::~ColorNotebook()
10089{
101 if ( gtk_notebook_get_current_page (GTK_NOTEBOOK (_book)) >= 0 )90 if (_buttons) {
102 {91 delete[] _buttons;
103 csel = getCurrentSelector();92 _buttons = 0;
104 csel->base->getColorAlpha(_color, _alpha);93 }
105 }94}
106 widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (_book), page_num);95
107 if ( widget && SP_IS_COLOR_SELECTOR(widget) )96ColorNotebook::Page::Page(Inkscape::UI::ColorSelectorFactory *selector_factory, bool enabled_full)
108 {97 : selector_factory(selector_factory)
109 csel = SP_COLOR_SELECTOR (widget);98 , enabled_full(enabled_full)
110 csel->base->setColorAlpha( _color, _alpha );99{
111100}
112 // Temporary workaround to undo a spurious GRABBED101
113 _released();102
114 }103void ColorNotebook::_initUI()
115}
116
117static gint sp_color_notebook_menu_handler( GtkWidget *widget, GdkEvent *event )
118{
119 if (event->type == GDK_BUTTON_PRESS)
120 {
121 SPColorSelector* csel = SP_COLOR_SELECTOR(widget);
122 (dynamic_cast<ColorNotebook*>(csel->base))->menuHandler( event );
123
124 /* Tell calling code that we have handled this event; the buck
125 * stops here. */
126 return TRUE;
127 }
128
129 /* Tell calling code that we have not handled this event; pass it on. */
130 return FALSE;
131}
132
133gint ColorNotebook::menuHandler( GdkEvent* event )
134{
135 GdkEventButton *bevent = (GdkEventButton *) event;
136 gtk_menu_popup (GTK_MENU( _popup ), NULL, NULL, NULL, NULL,
137 bevent->button, bevent->time);
138 return TRUE;
139}
140
141static void sp_color_notebook_menuitem_response (GtkMenuItem *menuitem, gpointer user_data)
142{
143 gboolean active = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem));
144 SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (user_data);
145 if ( entry )
146 {
147 if ( active )
148 {
149 (dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(entry->backPointer)->base))->addPage(entry->type, entry->submode);
150 }
151 else
152 {
153 (dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(entry->backPointer)->base))->removePage(entry->type, entry->submode);
154 }
155 }
156}
157
158static void
159sp_color_notebook_init (SPColorNotebook *colorbook)
160{
161 SP_COLOR_SELECTOR(colorbook)->base = new ColorNotebook( SP_COLOR_SELECTOR(colorbook) );
162
163 if ( SP_COLOR_SELECTOR(colorbook)->base )
164 {
165 SP_COLOR_SELECTOR(colorbook)->base->init();
166 }
167}
168
169void ColorNotebook::init()
170{104{
171 guint row = 0;105 guint row = 0;
172 guint i = 0;106
173 guint j = 0;107 Gtk::Notebook *notebook = Gtk::manage(new Gtk::Notebook);
174 GType *selector_types = 0;108 notebook->show();
175 guint selector_type_count = 0;109 notebook->set_show_border(false);
176110 notebook->set_show_tabs(false);
177 /* tempory hardcoding to get types loaded */111 _book = GTK_WIDGET(notebook->gobj());
178 SP_TYPE_COLOR_SCALES;112
179 SP_TYPE_COLOR_WHEEL_SELECTOR;113#if GTK_CHECK_VERSION(3, 0, 0)
180#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
181 SP_TYPE_COLOR_ICC_SELECTOR;
182#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
183
184 /* REJON: Comment out the next line to not use the normal GTK Color
185 wheel. */
186
187// SP_TYPE_COLOR_GTKSELECTOR;
188
189 _updating = FALSE;
190 _updatingrgba = FALSE;
191 _btn = 0;
192 _popup = 0;
193 _trackerList = g_ptr_array_new ();
194
195 _book = gtk_notebook_new ();
196 gtk_widget_show (_book);
197
198 // Dont show the notebook tabs, use radiobuttons instead
199 gtk_notebook_set_show_border (GTK_NOTEBOOK (_book), false);
200 gtk_notebook_set_show_tabs (GTK_NOTEBOOK (_book), false);
201
202 selector_types = g_type_children (SP_TYPE_COLOR_SELECTOR, &selector_type_count);
203
204 for ( i = 0; i < selector_type_count; i++ )
205 {
206 if (!g_type_is_a (selector_types[i], SP_TYPE_COLOR_NOTEBOOK))
207 {
208 guint howmany = 1;
209 gpointer klass = g_type_class_ref (selector_types[i]);
210 if ( klass && SP_IS_COLOR_SELECTOR_CLASS(klass) )
211 {
212 SPColorSelectorClass *ck = SP_COLOR_SELECTOR_CLASS (klass);
213 howmany = MAX (1, ck->submode_count);
214 for ( j = 0; j < howmany; j++ )
215 {
216 SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (malloc(sizeof(SPColorNotebookTracker)));
217 if ( entry )
218 {
219 memset( entry, 0, sizeof(SPColorNotebookTracker) );
220 entry->name = ck->name[j];
221 entry->type = selector_types[i];
222 entry->submode = j;
223 entry->enabledFull = TRUE;
224 entry->enabledBrief = TRUE;
225 entry->backPointer = SP_COLOR_NOTEBOOK(_csel);
226
227 g_ptr_array_add (_trackerList, entry);
228 }
229 }
230 }
231 }
232 }
233
234#if GTK_CHECK_VERSION(3,0,0)
235 _buttonbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);114 _buttonbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2);
236 gtk_box_set_homogeneous(GTK_BOX(_buttonbox), TRUE);115 gtk_box_set_homogeneous(GTK_BOX(_buttonbox), TRUE);
237#else116#else
238 _buttonbox = gtk_hbox_new (TRUE, 2);117 _buttonbox = gtk_hbox_new(TRUE, 2);
239#endif118#endif
240119
241 gtk_widget_show (_buttonbox);120 gtk_widget_show(_buttonbox);
242 _buttons = new GtkWidget *[_trackerList->len];121 _buttons = new GtkWidget *[_available_pages.size()];
243122
244 for ( i = 0; i < _trackerList->len; i++ )123 for (int i = 0; static_cast<size_t>(i) < _available_pages.size(); i++) {
245 {124 _addPage(_available_pages[i]);
246 SPColorNotebookTracker *entry =
247 reinterpret_cast< SPColorNotebookTracker* > (g_ptr_array_index (_trackerList, i));
248 if ( entry )
249 {
250 addPage(entry->type, entry->submode);
251 }
252 }125 }
253126
254#if GTK_CHECK_VERSION(3,0,0)127 sp_set_font_size_smaller(_buttonbox);
255 GtkWidget* table = gtk_grid_new();128
256#else129#if GTK_CHECK_VERSION(3, 0, 0)
257 GtkWidget* table = gtk_table_new(2, 3, FALSE);130 #if GTK_CHECK_VERSION(3, 12, 0)
258#endif
259
260 gtk_widget_show (table);
261
262 gtk_box_pack_start (GTK_BOX (_csel), table, TRUE, TRUE, 0);
263
264 sp_set_font_size_smaller (_buttonbox);
265
266#if GTK_CHECK_VERSION(3,0,0)
267 #if GTK_CHECK_VERSION(3,12,0)
268 gtk_widget_set_margin_start(_buttonbox, XPAD);131 gtk_widget_set_margin_start(_buttonbox, XPAD);
269 gtk_widget_set_margin_end(_buttonbox, XPAD);132 gtk_widget_set_margin_end(_buttonbox, XPAD);
270 #else133 #else
271 gtk_widget_set_margin_left(_buttonbox, XPAD);134 gtk_widget_set_margin_left(_buttonbox, XPAD);
272 gtk_widget_set_margin_right(_buttonbox, XPAD);135 gtk_widget_set_margin_right(_buttonbox, XPAD);
273 #endif136 #endif
274 gtk_widget_set_margin_top(_buttonbox, YPAD);137 gtk_widget_set_margin_top(_buttonbox, YPAD);
275 gtk_widget_set_margin_bottom(_buttonbox, YPAD);138 gtk_widget_set_margin_bottom(_buttonbox, YPAD);
276 gtk_widget_set_hexpand(_buttonbox, TRUE);139 gtk_widget_set_hexpand(_buttonbox, TRUE);
277 gtk_widget_set_valign(_buttonbox, GTK_ALIGN_CENTER);140 gtk_widget_set_valign(_buttonbox, GTK_ALIGN_CENTER);
278 gtk_grid_attach(GTK_GRID(table), _buttonbox, 0, row, 2, 1);141 attach(*Glib::wrap(_buttonbox), 0, row, 2, 1);
279#else142#else
280 gtk_table_attach (GTK_TABLE (table), _buttonbox, 0, 2, row, row + 1,143 attach(*Glib::wrap(_buttonbox), 0, 2, row, row + 1, Gtk::EXPAND | Gtk::FILL, static_cast<Gtk::AttachOptions>(0),
281 static_cast<GtkAttachOptions>(GTK_EXPAND|GTK_FILL),144 XPAD, YPAD);
282 static_cast<GtkAttachOptions>(0),
283 XPAD, YPAD);
284#endif145#endif
285146
286 row++;147 row++;
287148
288#if GTK_CHECK_VERSION(3,0,0)149#if GTK_CHECK_VERSION(3, 0, 0)
289 #if GTK_CHECK_VERSION(3,12,0)150#if GTK_CHECK_VERSION(3, 12, 0)
290 gtk_widget_set_margin_start(_book, XPAD*2);151 gtk_widget_set_margin_start(_book, XPAD * 2);
291 gtk_widget_set_margin_end(_book, XPAD*2);152 gtk_widget_set_margin_end(_book, XPAD * 2);
292 #else153#else
293 gtk_widget_set_margin_left(_book, XPAD*2);154 gtk_widget_set_margin_left(_book, XPAD * 2);
294 gtk_widget_set_margin_right(_book, XPAD*2);155 gtk_widget_set_margin_right(_book, XPAD * 2);
295 #endif156#endif
296 gtk_widget_set_margin_top(_book, YPAD);157 gtk_widget_set_margin_top(_book, YPAD);
297 gtk_widget_set_margin_bottom(_book, YPAD);158 gtk_widget_set_margin_bottom(_book, YPAD);
298 gtk_widget_set_hexpand(_book, TRUE);159 gtk_widget_set_hexpand(_book, TRUE);
299 gtk_widget_set_vexpand(_book, TRUE);160 gtk_widget_set_vexpand(_book, TRUE);
300 gtk_grid_attach(GTK_GRID(table), _book, 0, row, 2, 1);161 attach(*notebook, 0, row, 2, 1);
301#else162#else
302 gtk_table_attach (GTK_TABLE (table), _book, 0, 2, row, row + 1,163 attach(*notebook, 0, 2, row, row + 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, XPAD * 2, YPAD);
303 static_cast<GtkAttachOptions>(GTK_EXPAND|GTK_FILL),
304 static_cast<GtkAttachOptions>(GTK_EXPAND|GTK_FILL),
305 XPAD*2, YPAD);
306#endif164#endif
307165
308 // restore the last active page166 // restore the last active page
309 Inkscape::Preferences *prefs = Inkscape::Preferences::get();167 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
310 _setCurrentPage(prefs->getInt("/colorselector/page", 0));168 _setCurrentPage(prefs->getInt("/colorselector/page", 0));
311
312 {
313 gboolean found = FALSE;
314
315 _popup = gtk_menu_new();
316 GtkMenu *menu = GTK_MENU (_popup);
317
318 for ( i = 0; i < _trackerList->len; i++ )
319 {
320 SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (g_ptr_array_index (_trackerList, i));
321 if ( entry )
322 {
323 GtkWidget *item = gtk_check_menu_item_new_with_label (_(entry->name));
324 gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), entry->enabledFull);
325 gtk_widget_show (item);
326 gtk_menu_shell_append (GTK_MENU_SHELL(menu), item);
327
328 g_signal_connect (G_OBJECT (item), "activate",
329 G_CALLBACK (sp_color_notebook_menuitem_response),
330 reinterpret_cast< gpointer > (entry) );
331 found = TRUE;
332 }
333 }
334
335 GtkWidget *arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE);
336 gtk_widget_show (arrow);
337
338 _btn = gtk_button_new ();
339 gtk_widget_show (_btn);
340 gtk_container_add (GTK_CONTAINER (_btn), arrow);
341
342 GtkWidget *align = gtk_alignment_new (1.0, 0.0, 0.0, 0.0);
343 gtk_widget_show (align);
344 gtk_container_add (GTK_CONTAINER (align), _btn);
345
346 // uncomment to reenable the "show/hide modes" menu,
347 // but first fix it so it remembers its settings in prefs and does not take that much space (entire vertical column!)
348 //gtk_table_attach (GTK_TABLE (table), align, 2, 3, row, row + 1, GTK_FILL, GTK_FILL, XPAD, YPAD);
349
350 g_signal_connect_swapped(G_OBJECT(_btn), "event", G_CALLBACK (sp_color_notebook_menu_handler), G_OBJECT(_csel));
351 if ( !found )
352 {
353 gtk_widget_set_sensitive (_btn, FALSE);
354 }
355 }
356
357 row++;169 row++;
358170
359#if GTK_CHECK_VERSION(3,0,0)171#if GTK_CHECK_VERSION(3, 0, 0)
360 GtkWidget *rgbabox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);172 GtkWidget *rgbabox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
361#else173#else
362 GtkWidget *rgbabox = gtk_hbox_new (FALSE, 0);174 GtkWidget *rgbabox = gtk_hbox_new(FALSE, 0);
363#endif175#endif
364176
365#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)177#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
366 /* Create color management icons */178 /* Create color management icons */
367 _box_colormanaged = gtk_event_box_new ();179 _box_colormanaged = gtk_event_box_new();
368 GtkWidget *colormanaged = gtk_image_new_from_icon_name ("color-management-icon", GTK_ICON_SIZE_SMALL_TOOLBAR);180 GtkWidget *colormanaged = gtk_image_new_from_icon_name("color-management-icon", GTK_ICON_SIZE_SMALL_TOOLBAR);
369 gtk_container_add (GTK_CONTAINER (_box_colormanaged), colormanaged);181 gtk_container_add(GTK_CONTAINER(_box_colormanaged), colormanaged);
370 gtk_widget_set_tooltip_text (_box_colormanaged, _("Color Managed"));182 gtk_widget_set_tooltip_text(_box_colormanaged, _("Color Managed"));
371 gtk_widget_set_sensitive (_box_colormanaged, false);183 gtk_widget_set_sensitive(_box_colormanaged, false);
372 gtk_box_pack_start(GTK_BOX(rgbabox), _box_colormanaged, FALSE, FALSE, 2);184 gtk_box_pack_start(GTK_BOX(rgbabox), _box_colormanaged, FALSE, FALSE, 2);
373185
374 _box_outofgamut = gtk_event_box_new ();186 _box_outofgamut = gtk_event_box_new();
375 GtkWidget *outofgamut = gtk_image_new_from_icon_name ("out-of-gamut-icon", GTK_ICON_SIZE_SMALL_TOOLBAR);187 GtkWidget *outofgamut = gtk_image_new_from_icon_name("out-of-gamut-icon", GTK_ICON_SIZE_SMALL_TOOLBAR);
376 gtk_container_add (GTK_CONTAINER (_box_outofgamut), outofgamut);188 gtk_container_add(GTK_CONTAINER(_box_outofgamut), outofgamut);
377 gtk_widget_set_tooltip_text (_box_outofgamut, _("Out of gamut!"));189 gtk_widget_set_tooltip_text(_box_outofgamut, _("Out of gamut!"));
378 gtk_widget_set_sensitive (_box_outofgamut, false);190 gtk_widget_set_sensitive(_box_outofgamut, false);
379 gtk_box_pack_start(GTK_BOX(rgbabox), _box_outofgamut, FALSE, FALSE, 2);191 gtk_box_pack_start(GTK_BOX(rgbabox), _box_outofgamut, FALSE, FALSE, 2);
380192
381 _box_toomuchink = gtk_event_box_new ();193 _box_toomuchink = gtk_event_box_new();
382 GtkWidget *toomuchink = gtk_image_new_from_icon_name ("too-much-ink-icon", GTK_ICON_SIZE_SMALL_TOOLBAR);194 GtkWidget *toomuchink = gtk_image_new_from_icon_name("too-much-ink-icon", GTK_ICON_SIZE_SMALL_TOOLBAR);
383 gtk_container_add (GTK_CONTAINER (_box_toomuchink), toomuchink);195 gtk_container_add(GTK_CONTAINER(_box_toomuchink), toomuchink);
384 gtk_widget_set_tooltip_text (_box_toomuchink, _("Too much ink!"));196 gtk_widget_set_tooltip_text(_box_toomuchink, _("Too much ink!"));
385 gtk_widget_set_sensitive (_box_toomuchink, false);197 gtk_widget_set_sensitive(_box_toomuchink, false);
386 gtk_box_pack_start(GTK_BOX(rgbabox), _box_toomuchink, FALSE, FALSE, 2);198 gtk_box_pack_start(GTK_BOX(rgbabox), _box_toomuchink, FALSE, FALSE, 2);
387#endif //defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)199#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
388200
389201
390 /* Color picker */202 /* Color picker */
391 GtkWidget *picker = gtk_image_new_from_icon_name ("color-picker", GTK_ICON_SIZE_SMALL_TOOLBAR);203 GtkWidget *picker = gtk_image_new_from_icon_name("color-picker", GTK_ICON_SIZE_SMALL_TOOLBAR);
392 _btn_picker = gtk_button_new ();204 _btn_picker = gtk_button_new();
393 gtk_button_set_relief(GTK_BUTTON(_btn_picker), GTK_RELIEF_NONE);205 gtk_button_set_relief(GTK_BUTTON(_btn_picker), GTK_RELIEF_NONE);
394 gtk_widget_show (_btn);206 gtk_container_add(GTK_CONTAINER(_btn_picker), picker);
395 gtk_container_add (GTK_CONTAINER (_btn_picker), picker);207 gtk_widget_set_tooltip_text(_btn_picker, _("Pick colors from image"));
396 gtk_widget_set_tooltip_text (_btn_picker, _("Pick colors from image"));
397 gtk_box_pack_start(GTK_BOX(rgbabox), _btn_picker, FALSE, FALSE, 2);208 gtk_box_pack_start(GTK_BOX(rgbabox), _btn_picker, FALSE, FALSE, 2);
398 g_signal_connect(G_OBJECT(_btn_picker), "clicked", G_CALLBACK(ColorNotebook::_picker_clicked), _csel);209 g_signal_connect(G_OBJECT(_btn_picker), "clicked", G_CALLBACK(ColorNotebook::_onPickerClicked), this);
399210
400 /* Create RGBA entry and color preview */211 /* Create RGBA entry and color preview */
401 _rgbal = gtk_label_new_with_mnemonic (_("RGBA_:"));212 _rgbal = gtk_label_new_with_mnemonic(_("RGBA_:"));
402 gtk_misc_set_alignment (GTK_MISC (_rgbal), 1.0, 0.5);213 gtk_misc_set_alignment(GTK_MISC(_rgbal), 1.0, 0.5);
403 gtk_box_pack_start(GTK_BOX(rgbabox), _rgbal, TRUE, TRUE, 2);214 gtk_box_pack_start(GTK_BOX(rgbabox), _rgbal, TRUE, TRUE, 2);
404215
405 _rgbae = gtk_entry_new ();216 ColorEntry *rgba_entry = Gtk::manage(new ColorEntry(_selected_color));
406 sp_dialog_defocus_on_enter (_rgbae);217 sp_dialog_defocus_on_enter(GTK_WIDGET(rgba_entry->gobj()));
407 gtk_entry_set_max_length (GTK_ENTRY (_rgbae), 8);218 gtk_box_pack_start(GTK_BOX(rgbabox), GTK_WIDGET(rgba_entry->gobj()), FALSE, FALSE, 0);
408 gtk_entry_set_width_chars (GTK_ENTRY (_rgbae), 8);219 gtk_label_set_mnemonic_widget(GTK_LABEL(_rgbal), GTK_WIDGET(rgba_entry->gobj()));
409 gtk_widget_set_tooltip_text (_rgbae, _("Hexadecimal RGBA value of the color"));
410 gtk_box_pack_start(GTK_BOX(rgbabox), _rgbae, FALSE, FALSE, 0);
411 gtk_label_set_mnemonic_widget (GTK_LABEL(_rgbal), _rgbae);
412220
413 sp_set_font_size_smaller (rgbabox);221 sp_set_font_size_smaller(rgbabox);
414 gtk_widget_show_all (rgbabox);222 gtk_widget_show_all(rgbabox);
415223
416#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)224#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
417 //the "too much ink" icon is initially hidden225 // the "too much ink" icon is initially hidden
418 gtk_widget_hide(GTK_WIDGET(_box_toomuchink));226 gtk_widget_hide(GTK_WIDGET(_box_toomuchink));
419#endif //defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)227#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
420228
421#if GTK_CHECK_VERSION(3,0,0)229#if GTK_CHECK_VERSION(3, 0, 0)
422 #if GTK_CHECK_VERSION(3,12,0)230 #if GTK_CHECK_VERSION(3, 12, 0)
423 gtk_widget_set_margin_start(rgbabox, XPAD);231 gtk_widget_set_margin_start(rgbabox, XPAD);
424 gtk_widget_set_margin_end(rgbabox, XPAD);232 gtk_widget_set_margin_end(rgbabox, XPAD);
425 #else233 #else
426 gtk_widget_set_margin_left(rgbabox, XPAD);234 gtk_widget_set_margin_left(rgbabox, XPAD);
427 gtk_widget_set_margin_right(rgbabox, XPAD);235 gtk_widget_set_margin_right(rgbabox, XPAD);
428 #endif236 #endif
429 gtk_widget_set_margin_top(rgbabox, YPAD);237 gtk_widget_set_margin_top(rgbabox, YPAD);
430 gtk_widget_set_margin_bottom(rgbabox, YPAD);238 gtk_widget_set_margin_bottom(rgbabox, YPAD);
431 gtk_grid_attach(GTK_GRID(table), rgbabox, 0, row, 2, 1);239 attach(*Glib::wrap(rgbabox), 0, row, 2, 1);
432#else240#else
433 gtk_table_attach (GTK_TABLE (table), rgbabox, 0, 2, row, row + 1, GTK_FILL, GTK_SHRINK, XPAD, YPAD);241 attach(*Glib::wrap(rgbabox), 0, 2, row, row + 1, Gtk::FILL, Gtk::SHRINK, XPAD, YPAD);
434#endif242#endif
435243
436#ifdef SPCS_PREVIEW244#ifdef SPCS_PREVIEW
437 _p = sp_color_preview_new (0xffffffff);245 _p = sp_color_preview_new(0xffffffff);
438 gtk_widget_show (_p);246 gtk_widget_show(_p);
439 gtk_table_attach (GTK_TABLE (table), _p, 2, 3, row, row + 1, GTK_FILL, GTK_FILL, XPAD, YPAD);247 attach(*Glib::wrap(_p), 2, 3, row, row + 1, Gtk::FILL, Gtk::FILL, XPAD, YPAD);
440#endif248#endif
441249
442 _switchId = g_signal_connect(G_OBJECT (_book), "switch-page",250 g_signal_connect(G_OBJECT(_book), "switch-page", G_CALLBACK(ColorNotebook::_onPageSwitched), this);
443 G_CALLBACK (sp_color_notebook_switch_page), SP_COLOR_NOTEBOOK(_csel));251}
444252
445 _entryId = g_signal_connect (G_OBJECT (_rgbae), "changed", G_CALLBACK (ColorNotebook::_rgbaEntryChangedHook), _csel);253void ColorNotebook::_onPickerClicked(GtkWidget * /*widget*/, ColorNotebook * /*colorbook*/)
446}
447
448static void sp_color_notebook_dispose(GObject *object)
449{
450 if (G_OBJECT_CLASS(sp_color_notebook_parent_class)->dispose)
451 G_OBJECT_CLASS(sp_color_notebook_parent_class)->dispose(object);
452}
453
454ColorNotebook::~ColorNotebook()
455{
456 if ( _trackerList )
457 {
458 g_ptr_array_free (_trackerList, TRUE);
459 _trackerList = 0;
460 }
461
462 if ( _switchId )
463 {
464 if ( _book )
465 {
466 g_signal_handler_disconnect (_book, _switchId);
467 _switchId = 0;
468 }
469 }
470
471 if ( _buttons )
472 {
473 delete [] _buttons;
474 _buttons = 0;
475 }
476
477}
478
479static void
480sp_color_notebook_show_all (GtkWidget *widget)
481{
482 gtk_widget_show (widget);
483}
484
485static void sp_color_notebook_hide(GtkWidget *widget)
486{
487 gtk_widget_hide(widget);
488}
489
490GtkWidget *sp_color_notebook_new()
491{
492 SPColorNotebook *colorbook = SP_COLOR_NOTEBOOK(g_object_new (SP_TYPE_COLOR_NOTEBOOK, NULL));
493
494 return GTK_WIDGET(colorbook);
495}
496
497ColorNotebook::ColorNotebook( SPColorSelector* csel )
498 : ColorSelector( csel )
499{
500}
501
502SPColorSelector* ColorNotebook::getCurrentSelector()
503{
504 SPColorSelector* csel = NULL;
505 gint current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (_book));
506
507 if ( current_page >= 0 )
508 {
509 GtkWidget* widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (_book), current_page);
510 if ( SP_IS_COLOR_SELECTOR (widget) )
511 {
512 csel = SP_COLOR_SELECTOR (widget);
513 }
514 }
515
516 return csel;
517}
518
519void ColorNotebook::_colorChanged()
520{
521 SPColorSelector* cselPage = getCurrentSelector();
522 if ( cselPage )
523 {
524 cselPage->base->setColorAlpha( _color, _alpha );
525 }
526
527 _updateRgbaEntry( _color, _alpha );
528}
529
530void ColorNotebook::_picker_clicked(GtkWidget * /*widget*/, SPColorNotebook * /*colorbook*/)
531{254{
532 // Set the dropper into a "one click" mode, so it reverts to the previous tool after a click255 // Set the dropper into a "one click" mode, so it reverts to the previous tool after a click
533 Inkscape::Preferences *prefs = Inkscape::Preferences::get();256 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
@@ -535,283 +258,113 @@
535 Inkscape::UI::Tools::sp_toggle_dropper(SP_ACTIVE_DESKTOP);258 Inkscape::UI::Tools::sp_toggle_dropper(SP_ACTIVE_DESKTOP);
536}259}
537260
538void ColorNotebook::_rgbaEntryChangedHook(GtkEntry *entry, SPColorNotebook *colorbook)261void ColorNotebook::_onButtonClicked(GtkWidget *widget, ColorNotebook *nb)
539{262{
540 (dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base))->_rgbaEntryChanged( entry );263 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) {
541}264 return;
542265 }
543void ColorNotebook::_rgbaEntryChanged(GtkEntry* entry)266
544{267 for (gint i = 0; i < gtk_notebook_get_n_pages(GTK_NOTEBOOK(nb->_book)); i++) {
545 if (_updating) return;268 if (nb->_buttons[i] == widget) {
546 if (_updatingrgba) return;269 gtk_notebook_set_current_page(GTK_NOTEBOOK(nb->_book), i);
547270 }
548 const gchar *t = gtk_entry_get_text( entry );271 }
549272}
550 if (t) {273
551 Glib::ustring text = t;274void ColorNotebook::_onSelectedColorChanged() { _updateICCButtons(); }
552 bool changed = false;275
553 if (!text.empty() && text[0] == '#') {276void ColorNotebook::_onPageSwitched(GtkNotebook *notebook, GtkWidget *page, guint page_num, ColorNotebook *colorbook)
554 changed = true;277{
555 text.erase(0,1);278 if (colorbook->get_visible()) {
556 if (text.size() == 6) {279 // remember the page we switched to
557 // it was a standard RGB hex280 Inkscape::Preferences *prefs = Inkscape::Preferences::get();
558 unsigned int alph = SP_COLOR_F_TO_U(_alpha);281 prefs->setInt("/colorselector/page", page_num);
559 gchar* tmp = g_strdup_printf("%02x", alph);282 }
560 text += tmp;283}
561 g_free(tmp);284
562 }
563 }
564 gchar* str = g_strdup(text.c_str());
565 gchar* end = 0;
566 guint64 rgba = g_ascii_strtoull( str, &end, 16 );
567 if ( end != str ) {
568 ptrdiff_t len = end - str;
569 if ( len < 8 ) {
570 rgba = rgba << ( 4 * ( 8 - len ) );
571 }
572 _updatingrgba = TRUE;
573 if ( changed ) {
574 gtk_entry_set_text( entry, str );
575 }
576 SPColor color( rgba );
577 setColorAlpha( color, SP_RGBA32_A_F(rgba), true );
578 _updatingrgba = FALSE;
579 }
580 g_free(str);
581 }
582}
583285
584// TODO pass in param so as to avoid the need for SP_ACTIVE_DOCUMENT286// TODO pass in param so as to avoid the need for SP_ACTIVE_DOCUMENT
585void ColorNotebook::_updateRgbaEntry( const SPColor& color, gfloat alpha )287void ColorNotebook::_updateICCButtons()
586{288{
587 g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) );289 SPColor color = _selected_color.color();
290 gfloat alpha = _selected_color.alpha();
291
292 g_return_if_fail((0.0 <= alpha) && (alpha <= 1.0));
588293
589#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)294#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
590 /* update color management icon*/295 /* update color management icon*/
591 gtk_widget_set_sensitive (_box_colormanaged, color.icc != NULL);296 gtk_widget_set_sensitive(_box_colormanaged, color.icc != NULL);
592297
593 /* update out-of-gamut icon */298 /* update out-of-gamut icon */
594 gtk_widget_set_sensitive (_box_outofgamut, false);299 gtk_widget_set_sensitive(_box_outofgamut, false);
595 if (color.icc){300 if (color.icc) {
596 Inkscape::ColorProfile* target_profile = SP_ACTIVE_DOCUMENT->profileManager->find(color.icc->colorProfile.c_str());301 Inkscape::ColorProfile *target_profile =
597 if ( target_profile )302 SP_ACTIVE_DOCUMENT->profileManager->find(color.icc->colorProfile.c_str());
303 if (target_profile)
598 gtk_widget_set_sensitive(_box_outofgamut, target_profile->GamutCheck(color));304 gtk_widget_set_sensitive(_box_outofgamut, target_profile->GamutCheck(color));
599 }305 }
600306
601 /* update too-much-ink icon */307 /* update too-much-ink icon */
602 gtk_widget_set_sensitive (_box_toomuchink, false);308 gtk_widget_set_sensitive(_box_toomuchink, false);
603 if (color.icc){309 if (color.icc) {
604 Inkscape::ColorProfile* prof = SP_ACTIVE_DOCUMENT->profileManager->find(color.icc->colorProfile.c_str());310 Inkscape::ColorProfile *prof = SP_ACTIVE_DOCUMENT->profileManager->find(color.icc->colorProfile.c_str());
605 if ( prof && CMSSystem::isPrintColorSpace(prof) ) {311 if (prof && CMSSystem::isPrintColorSpace(prof)) {
606 gtk_widget_show(GTK_WIDGET(_box_toomuchink));312 gtk_widget_show(GTK_WIDGET(_box_toomuchink));
607 double ink_sum = 0;313 double ink_sum = 0;
608 for (unsigned int i=0; i<color.icc->colors.size(); i++){314 for (unsigned int i = 0; i < color.icc->colors.size(); i++) {
609 ink_sum += color.icc->colors[i];315 ink_sum += color.icc->colors[i];
610 }316 }
611317
612 /* Some literature states that when the sum of paint values exceed 320%, it is considered to be a satured color,318 /* Some literature states that when the sum of paint values exceed 320%, it is considered to be a satured
613 which means the paper can get too wet due to an excessive ammount of ink. This may lead to several issues319 color,
320 which means the paper can get too wet due to an excessive ammount of ink. This may lead to several
321 issues
614 such as misalignment and poor quality of printing in general.*/322 such as misalignment and poor quality of printing in general.*/
615 if ( ink_sum > 3.2 )323 if (ink_sum > 3.2)
616 gtk_widget_set_sensitive (_box_toomuchink, true);324 gtk_widget_set_sensitive(_box_toomuchink, true);
617 } else {325 }
326 else {
618 gtk_widget_hide(GTK_WIDGET(_box_toomuchink));327 gtk_widget_hide(GTK_WIDGET(_box_toomuchink));
619 }328 }
620 }329 }
621#endif //defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)330#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2)
622
623 if ( !_updatingrgba )
624 {
625 gchar s[32];
626 guint32 rgba;
627
628 /* Update RGBA entry */
629 rgba = color.toRGBA32( alpha );
630
631 g_snprintf (s, 32, "%08x", rgba);
632 const gchar* oldText = gtk_entry_get_text( GTK_ENTRY( _rgbae ) );
633 if ( strcmp( oldText, s ) != 0 )
634 {
635 g_signal_handler_block( _rgbae, _entryId );
636 gtk_entry_set_text( GTK_ENTRY(_rgbae), s );
637 g_signal_handler_unblock( _rgbae, _entryId );
638 }
639 }
640}331}
641332
642void ColorNotebook::_setCurrentPage(int i)333void ColorNotebook::_setCurrentPage(int i)
643{334{
644 gtk_notebook_set_current_page(GTK_NOTEBOOK(_book), i);335 gtk_notebook_set_current_page(GTK_NOTEBOOK(_book), i);
645336
646 if (_buttons && _trackerList && (static_cast<size_t>(i) < _trackerList->len) ) {337 if (_buttons && (static_cast<size_t>(i) < _available_pages.size())) {
647 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(_buttons[i]), TRUE);338 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(_buttons[i]), TRUE);
648 }339 }
649}340}
650341
651void ColorNotebook::_buttonClicked(GtkWidget *widget, SPColorNotebook *colorbook)
652{
653 ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
654
655 if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget))) {
656 return;
657 }
658
659 for(gint i = 0; i < gtk_notebook_get_n_pages (GTK_NOTEBOOK (nb->_book)); i++) {
660 if (nb->_buttons[i] == widget) {
661 gtk_notebook_set_current_page (GTK_NOTEBOOK (nb->_book), i);
662 }
663 }
664}
665
666void ColorNotebook::_entryGrabbed (SPColorSelector *, SPColorNotebook *colorbook)
667{
668 ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
669 nb->_grabbed();
670}
671
672void ColorNotebook::_entryDragged (SPColorSelector *csel, SPColorNotebook *colorbook)
673{
674 gboolean oldState;
675 ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
676
677 oldState = nb->_dragging;
678
679 nb->_dragging = TRUE;
680 nb->_entryModified( csel, colorbook );
681
682 nb->_dragging = oldState;
683}
684
685void ColorNotebook::_entryReleased (SPColorSelector *, SPColorNotebook *colorbook)
686{
687 ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
688 nb->_released();
689}
690
691void ColorNotebook::_entryChanged (SPColorSelector *csel, SPColorNotebook *colorbook)
692{
693 gboolean oldState;
694 ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
695
696 oldState = nb->_dragging;
697
698 nb->_dragging = FALSE;
699 nb->_entryModified( csel, colorbook );
700
701 nb->_dragging = oldState;
702}
703
704void ColorNotebook::_entryModified (SPColorSelector *csel, SPColorNotebook *colorbook)
705{
706 g_return_if_fail (colorbook != NULL);
707 g_return_if_fail (SP_IS_COLOR_NOTEBOOK (colorbook));
708 g_return_if_fail (csel != NULL);
709 g_return_if_fail (SP_IS_COLOR_SELECTOR (csel));
710
711 ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base);
712 SPColor color;
713 gfloat alpha = 1.0;
714
715 csel->base->getColorAlpha( color, alpha );
716 nb->_updateRgbaEntry( color, alpha );
717 nb->_updateInternals( color, alpha, nb->_dragging );
718}
719
720GtkWidget* ColorNotebook::addPage(GType page_type, guint submode)
721{
722 GtkWidget *page;
723
724 page = sp_color_selector_new( page_type );
725 if ( page )
726 {
727 GtkWidget* tab_label = 0;
728 SPColorSelector* csel;
729
730 csel = SP_COLOR_SELECTOR (page);
731 if ( submode > 0 )
732 {
733 csel->base->setSubmode( submode );
734 }
735 gtk_widget_show (page);
736 int index = csel->base ? csel->base->getSubmode() : 0;
The diff has been truncated for viewing.