Merge lp:~penginsbacon/inkscape/fill-n-stroke-cppify into lp:~inkscape.dev/inkscape/trunk
- fill-n-stroke-cppify
- Merge into trunk
Status: | Merged |
---|---|
Merged at revision: | 14160 |
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Tavmjong Bah | Approve | ||
Review via email: mp+259328@code.launchpad.net |
This proposal supersedes a proposal from 2015-05-03.
Commit message
Description of the change
> I've fixed the bugs detected by Tav and suv.
This branch merges the c++-sification effort from GSOC 2014 project.
Refactored classes are related to fill'n'stroke dialog. The list includes:
SPColorSelector
SPColorWheelSel
SPColorICCSelector
SPColorScales
SPNotebook
SPColorSlider
SPPattern
Tavmjong Bah (tavmjong-free) wrote : Posted in a previous version of this proposal | # |
Tavmjong Bah (tavmjong-free) wrote : Posted in a previous version of this proposal | # |
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.
Tomasz Boczkowski (penginsbacon) wrote : Posted in a previous version of this proposal | # |
I've fixed the bugs #1 and #2 in fill-n-
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:/
> You are the owner of lp:~penginsbacon/inkscape/fill-n-stroke-cppify.
>
su_v (suv-lp) wrote : Posted in a previous version of this proposal | # |
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:/
Does not happen if nothing is selected when opening Fill & Stroke for the first time in the current session.
su_v (suv-lp) wrote : Posted in a previous version of this proposal | # |
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).
Tavmjong Bah (tavmjong-free) wrote : | # |
Looks good when compiled directly. But when I try to merge with trunk I get:
Conflict adding file src/ui/
Conflict adding file src/ui/
Conflict adding file src/ui/
Conflict adding file src/ui/
4 conflicts encountered.
The moved files are identical to the added files.
When running 'make check':
make[1]: *** No rule to make target '../src/
This is due to not renaming the files in po/POTFILES.in
I've fixed the POT files and taken care of the merge conflicts.
Branch merged into trunk in revision 14160.
One possible bug still present:
Error message when trying to select mesh gradient:
** (inkscape:8619): WARNING **: file widgets/
Preview Diff
1 | === modified file 'src/desktop-style.cpp' |
2 | --- src/desktop-style.cpp 2015-05-16 12:50:10 +0000 |
3 | +++ src/desktop-style.cpp 2015-05-17 12:22:15 +0000 |
4 | @@ -576,8 +576,8 @@ |
5 | return QUERY_STYLE_MULTIPLE_DIFFERENT; // different kind of server |
6 | } |
7 | |
8 | - SPPattern *pat = pattern_getroot (pattern); |
9 | - SPPattern *pat_res = pattern_getroot (pattern_res); |
10 | + SPPattern *pat = SP_PATTERN (server)->rootPattern(); |
11 | + SPPattern *pat_res = SP_PATTERN (server_res)->rootPattern(); |
12 | if (pat_res != pat) { |
13 | return QUERY_STYLE_MULTIPLE_DIFFERENT; // different pattern roots |
14 | } |
15 | |
16 | === modified file 'src/extension/internal/cairo-render-context.cpp' |
17 | --- src/extension/internal/cairo-render-context.cpp 2015-05-08 13:46:25 +0000 |
18 | +++ src/extension/internal/cairo-render-context.cpp 2015-05-17 12:22:15 +0000 |
19 | @@ -1008,17 +1008,16 @@ |
20 | ps2user = Geom::identity(); |
21 | pcs2dev = Geom::identity(); |
22 | |
23 | - double x = pattern_x(pat); |
24 | - double y = pattern_y(pat); |
25 | - double width = pattern_width(pat); |
26 | - double height = pattern_height(pat); |
27 | + double x = pat->x(); |
28 | + double y = pat->y(); |
29 | + double width = pat->width(); |
30 | + double height = pat->height(); |
31 | double bbox_width_scaler; |
32 | double bbox_height_scaler; |
33 | |
34 | TRACE(("%f x %f pattern\n", width, height)); |
35 | |
36 | - if (pbox && pattern_patternUnits(pat) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) { |
37 | - //Geom::Affine bbox2user (pbox->x1 - pbox->x0, 0.0, 0.0, pbox->y1 - pbox->y0, pbox->x0, pbox->y0); |
38 | + if (pbox && pat->patternUnits() == SPPattern::UNITS_OBJECTBOUNDINGBOX) { |
39 | bbox_width_scaler = pbox->width(); |
40 | bbox_height_scaler = pbox->height(); |
41 | ps2user[4] = x * bbox_width_scaler + pbox->left(); |
42 | @@ -1031,13 +1030,13 @@ |
43 | } |
44 | |
45 | // apply pattern transformation |
46 | - Geom::Affine pattern_transform(pattern_patternTransform(pat)); |
47 | + Geom::Affine pattern_transform(pat->getTransform()); |
48 | ps2user *= pattern_transform; |
49 | Geom::Point ori (ps2user[4], ps2user[5]); |
50 | |
51 | // create pattern contents coordinate system |
52 | if (pat->viewBox_set) { |
53 | - Geom::Rect view_box = *pattern_viewBox(pat); |
54 | + Geom::Rect view_box = *pat->viewbox(); |
55 | |
56 | double x, y, w, h; |
57 | x = 0; |
58 | @@ -1050,7 +1049,7 @@ |
59 | pcs2dev[3] = h / view_box.height(); |
60 | pcs2dev[4] = x - view_box.left() * pcs2dev[0]; |
61 | pcs2dev[5] = y - view_box.top() * pcs2dev[3]; |
62 | - } else if (pbox && pattern_patternContentUnits(pat) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) { |
63 | + } else if (pbox && pat->patternContentUnits() == SPPattern::UNITS_OBJECTBOUNDINGBOX) { |
64 | pcs2dev[0] = pbox->width(); |
65 | pcs2dev[3] = pbox->height(); |
66 | } |
67 | |
68 | === modified file 'src/extension/internal/emf-print.cpp' |
69 | --- src/extension/internal/emf-print.cpp 2015-04-27 18:49:22 +0000 |
70 | +++ src/extension/internal/emf-print.cpp 2015-05-17 12:22:15 +0000 |
71 | @@ -388,8 +388,8 @@ |
72 | } else if (SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style))) { // must be paint-server |
73 | SPPaintServer *paintserver = style->fill.value.href->getObject(); |
74 | SPPattern *pat = SP_PATTERN(paintserver); |
75 | - double dwidth = pattern_width(pat); |
76 | - double dheight = pattern_height(pat); |
77 | + double dwidth = pat->width(); |
78 | + double dheight = pat->height(); |
79 | width = dwidth; |
80 | height = dheight; |
81 | brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor); |
82 | @@ -573,8 +573,8 @@ |
83 | if (SP_IS_PATTERN(SP_STYLE_STROKE_SERVER(style))) { // must be paint-server |
84 | SPPaintServer *paintserver = style->stroke.value.href->getObject(); |
85 | SPPattern *pat = SP_PATTERN(paintserver); |
86 | - double dwidth = pattern_width(pat); |
87 | - double dheight = pattern_height(pat); |
88 | + double dwidth = pat->width(); |
89 | + double dheight = pat->height(); |
90 | width = dwidth; |
91 | height = dheight; |
92 | brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor); |
93 | |
94 | === modified file 'src/extension/internal/wmf-print.cpp' |
95 | --- src/extension/internal/wmf-print.cpp 2015-04-27 18:49:22 +0000 |
96 | +++ src/extension/internal/wmf-print.cpp 2015-05-17 12:22:15 +0000 |
97 | @@ -380,8 +380,8 @@ |
98 | } else if (SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style))) { // must be paint-server |
99 | SPPaintServer *paintserver = style->fill.value.href->getObject(); |
100 | SPPattern *pat = SP_PATTERN(paintserver); |
101 | - double dwidth = pattern_width(pat); |
102 | - double dheight = pattern_height(pat); |
103 | + double dwidth = pat->width(); |
104 | + double dheight = pat->height(); |
105 | width = dwidth; |
106 | height = dheight; |
107 | brush_classify(pat, 0, &pixbuf, &hatchType, &hatchColor, &bkColor); |
108 | |
109 | === modified file 'src/extension/param/color.cpp' |
110 | --- src/extension/param/color.cpp 2015-04-27 23:38:31 +0000 |
111 | +++ src/extension/param/color.cpp 2015-05-17 12:22:15 +0000 |
112 | @@ -24,41 +24,37 @@ |
113 | #include "color.h" |
114 | |
115 | #include <color.h> |
116 | -#include "widgets/sp-color-selector.h" |
117 | -#include "widgets/sp-color-notebook.h" |
118 | +#include "ui/widget/color-notebook.h" |
119 | #include "preferences.h" |
120 | |
121 | - |
122 | namespace Inkscape { |
123 | namespace Extension { |
124 | |
125 | -void sp_color_param_changed(SPColorSelector *csel, GObject *cp); |
126 | - |
127 | - |
128 | ParamColor::~ParamColor(void) |
129 | { |
130 | - |
131 | + _color_changed.disconnect(); |
132 | } |
133 | |
134 | guint32 ParamColor::set( guint32 in, SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/ ) |
135 | { |
136 | - _value = in; |
137 | + _color_changed.block(true); |
138 | + _color.setValue(in); |
139 | + _color_changed.block(false); |
140 | |
141 | gchar * prefname = this->pref_name(); |
142 | std::string value; |
143 | string(value); |
144 | - |
145 | + |
146 | Inkscape::Preferences *prefs = Inkscape::Preferences::get(); |
147 | prefs->setString(extension_pref_root + prefname, value); |
148 | g_free(prefname); |
149 | |
150 | - return _value; |
151 | + return in; |
152 | } |
153 | |
154 | -ParamColor::ParamColor(const gchar *name, const gchar *guitext, const gchar *desc, const Parameter::_scope_t scope, |
155 | - bool gui_hidden, const gchar *gui_tip, Inkscape::Extension::Extension *ext, |
156 | - Inkscape::XML::Node *xml) |
157 | - : Parameter(name, guitext, desc, scope, gui_hidden, gui_tip, ext), _value(0), _changeSignal(0) |
158 | +ParamColor::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) : |
159 | + Parameter(name, guitext, desc, scope, gui_hidden, gui_tip, ext), |
160 | + _changeSignal(0) |
161 | { |
162 | const char * defaulthex = NULL; |
163 | if (xml->firstChild() != NULL) |
164 | @@ -72,51 +68,46 @@ |
165 | if (!paramval.empty()) |
166 | defaulthex = paramval.data(); |
167 | |
168 | - if (defaulthex) |
169 | - _value = atoi(defaulthex); |
170 | + if (defaulthex) { |
171 | + _color.setValue(atoi(defaulthex)); |
172 | + } |
173 | + _color_changed = _color.signal_changed.connect(sigc::mem_fun(this, &ParamColor::_onColorChanged)); |
174 | + |
175 | } |
176 | |
177 | void ParamColor::string(std::string &string) const |
178 | { |
179 | char str[16]; |
180 | - sprintf(str, "%i", _value); |
181 | + snprintf(str, 16, "%i", _color.value()); |
182 | string += str; |
183 | } |
184 | |
185 | Gtk::Widget *ParamColor::get_widget( SPDocument * /*doc*/, Inkscape::XML::Node * /*node*/, sigc::signal<void> * changeSignal ) |
186 | { |
187 | - if (_gui_hidden) return NULL; |
188 | + using Inkscape::UI::Widget::ColorNotebook; |
189 | + |
190 | + if (_gui_hidden) return NULL; |
191 | |
192 | _changeSignal = new sigc::signal<void>(*changeSignal); |
193 | - Gtk::HBox * hbox = Gtk::manage(new Gtk::HBox(false, 4)); |
194 | - SPColorSelector* spColorSelector = (SPColorSelector*)sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK); |
195 | |
196 | - ColorSelector* colorSelector = spColorSelector->base; |
197 | - if (_value < 1) { |
198 | - _value = 0xFF000000; |
199 | + if (_color.value() < 1) { |
200 | + _color_changed.block(true); |
201 | + _color.setValue(0xFF000000); |
202 | + _color_changed.block(false); |
203 | } |
204 | - SPColor *color = new SPColor( _value ); |
205 | - float alpha = (_value & 0xff) / 255.0F; |
206 | - colorSelector->setColorAlpha(*color, alpha); |
207 | - |
208 | - hbox->pack_start (*Glib::wrap(&spColorSelector->vbox), true, true, 0); |
209 | - g_signal_connect(G_OBJECT(spColorSelector), "changed", G_CALLBACK(sp_color_param_changed), (void*)this); |
210 | - |
211 | - gtk_widget_show(GTK_WIDGET(spColorSelector)); |
212 | + |
213 | + Gtk::HBox *hbox = Gtk::manage(new Gtk::HBox(false, 4)); |
214 | + Gtk::Widget *selector = Gtk::manage(new ColorNotebook(_color)); |
215 | + hbox->pack_start (*selector, true, true, 0); |
216 | + selector->show(); |
217 | hbox->show(); |
218 | - |
219 | - return dynamic_cast<Gtk::Widget *>(hbox); |
220 | + return hbox; |
221 | } |
222 | |
223 | -void sp_color_param_changed(SPColorSelector *csel, GObject *obj) |
224 | +void ParamColor::_onColorChanged() |
225 | { |
226 | - const SPColor color = csel->base->getColor(); |
227 | - float alpha = csel->base->getAlpha(); |
228 | - |
229 | - ParamColor* ptr = reinterpret_cast<ParamColor*>(obj); |
230 | - ptr->set(color.toRGBA32( alpha ), NULL, NULL); |
231 | - |
232 | - ptr->_changeSignal->emit(); |
233 | + if (_changeSignal) |
234 | + _changeSignal->emit(); |
235 | } |
236 | |
237 | }; /* namespace Extension */ |
238 | |
239 | === modified file 'src/extension/param/color.h' |
240 | --- src/extension/param/color.h 2012-02-29 01:16:51 +0000 |
241 | +++ src/extension/param/color.h 2015-05-17 12:22:15 +0000 |
242 | @@ -9,6 +9,7 @@ |
243 | */ |
244 | |
245 | #include "parameter.h" |
246 | +#include "ui/selected-color.h" |
247 | |
248 | class SPDocument; |
249 | |
250 | @@ -25,14 +26,17 @@ |
251 | |
252 | class ParamColor : public Parameter { |
253 | private: |
254 | - guint32 _value; |
255 | + void _onColorChanged(); |
256 | + |
257 | + Inkscape::UI::SelectedColor _color; |
258 | + sigc::connection _color_changed; |
259 | public: |
260 | 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); |
261 | |
262 | virtual ~ParamColor(void); |
263 | |
264 | /** Returns \c _value, with a \i const to protect it. */ |
265 | - guint32 get( SPDocument const * /*doc*/, Inkscape::XML::Node const * /*node*/ ) const { return _value; } |
266 | + guint32 get( SPDocument const * /*doc*/, Inkscape::XML::Node const * /*node*/ ) const { return _color.value(); } |
267 | |
268 | guint32 set (guint32 in, SPDocument * doc, Inkscape::XML::Node * node); |
269 | |
270 | @@ -44,6 +48,7 @@ |
271 | virtual void string (std::string &string) const; |
272 | |
273 | sigc::signal<void> * _changeSignal; |
274 | + |
275 | }; // class ParamColor |
276 | |
277 | } // namespace Extension |
278 | |
279 | === modified file 'src/extension/param/parameter.cpp' |
280 | --- src/extension/param/parameter.cpp 2014-03-27 01:33:44 +0000 |
281 | +++ src/extension/param/parameter.cpp 2015-05-17 12:22:15 +0000 |
282 | @@ -15,6 +15,10 @@ |
283 | # include "config.h" |
284 | #endif |
285 | |
286 | +#if GLIBMM_DISABLE_DEPRECATED && HAVE_GLIBMM_THREADS_H |
287 | +#include <glibmm/threads.h> |
288 | +#endif |
289 | + |
290 | #ifdef linux // does the dollar sign need escaping when passed as string parameter? |
291 | # define ESCAPE_DOLLAR_COMMANDLINE |
292 | #endif |
293 | @@ -26,8 +30,7 @@ |
294 | #include "document-private.h" |
295 | #include "sp-object.h" |
296 | #include <color.h> |
297 | -#include "widgets/sp-color-selector.h" |
298 | -#include "widgets/sp-color-notebook.h" |
299 | +#include "ui/widget/color-notebook.h" |
300 | |
301 | #include "parameter.h" |
302 | #include "bool.h" |
303 | |
304 | === modified file 'src/knot-holder-entity.cpp' |
305 | --- src/knot-holder-entity.cpp 2014-08-04 16:10:37 +0000 |
306 | +++ src/knot-holder-entity.cpp 2015-05-17 12:22:15 +0000 |
307 | @@ -140,19 +140,19 @@ |
308 | |
309 | static gdouble sp_pattern_extract_theta(SPPattern const *pat) |
310 | { |
311 | - Geom::Affine transf = pat->patternTransform; |
312 | + Geom::Affine transf = pat->getTransform(); |
313 | return Geom::atan2(transf.xAxis()); |
314 | } |
315 | |
316 | static Geom::Point sp_pattern_extract_scale(SPPattern const *pat) |
317 | { |
318 | - Geom::Affine transf = pat->patternTransform; |
319 | + Geom::Affine transf = pat->getTransform(); |
320 | return Geom::Point( transf.expansionX(), transf.expansionY() ); |
321 | } |
322 | |
323 | static Geom::Point sp_pattern_extract_trans(SPPattern const *pat) |
324 | { |
325 | - return Geom::Point(pat->patternTransform[4], pat->patternTransform[5]); |
326 | + return Geom::Point(pat->getTransform()[4], pat->getTransform()[5]); |
327 | } |
328 | |
329 | void |
330 | @@ -191,7 +191,7 @@ |
331 | { |
332 | SPPattern *pat = _fill ? SP_PATTERN(item->style->getFillPaintServer()) : SP_PATTERN(item->style->getStrokePaintServer()); |
333 | |
334 | - gdouble x = pattern_width(pat); |
335 | + gdouble x = pat->width(); |
336 | gdouble y = 0; |
337 | Geom::Point delta = Geom::Point(x,y); |
338 | Geom::Point scale = sp_pattern_extract_scale(pat); |
339 | @@ -240,8 +240,8 @@ |
340 | |
341 | // Get the new scale from the position of the knotholder |
342 | Geom::Point d = p_snapped - sp_pattern_extract_trans(pat); |
343 | - gdouble pat_x = pattern_width(pat); |
344 | - gdouble pat_y = pattern_height(pat); |
345 | + gdouble pat_x = pat->width(); |
346 | + gdouble pat_y = pat->height(); |
347 | Geom::Scale scl(1); |
348 | if ( state & GDK_CONTROL_MASK ) { |
349 | // if ctrl is pressed: use 1:1 scaling |
350 | @@ -267,10 +267,10 @@ |
351 | { |
352 | SPPattern *pat = _fill ? SP_PATTERN(item->style->getFillPaintServer()) : SP_PATTERN(item->style->getStrokePaintServer()); |
353 | |
354 | - gdouble x = pattern_width(pat); |
355 | - gdouble y = pattern_height(pat); |
356 | + gdouble x = pat->width(); |
357 | + gdouble y = pat->height(); |
358 | Geom::Point delta = Geom::Point(x,y); |
359 | - Geom::Affine a = pat->patternTransform; |
360 | + Geom::Affine a = pat->getTransform(); |
361 | a[4] = 0; |
362 | a[5] = 0; |
363 | delta = delta * a; |
364 | |
365 | === modified file 'src/selection-chemistry.cpp' |
366 | --- src/selection-chemistry.cpp 2015-05-09 12:59:00 +0000 |
367 | +++ src/selection-chemistry.cpp 2015-05-17 12:22:15 +0000 |
368 | @@ -1963,8 +1963,8 @@ |
369 | } |
370 | |
371 | } else if (dynamic_cast<SPPattern *>(sel_server) && dynamic_cast<SPPattern *>(iter_server)) { |
372 | - SPPattern *sel_pat = pattern_getroot(dynamic_cast<SPPattern *>(sel_server)); |
373 | - SPPattern *iter_pat = pattern_getroot(dynamic_cast<SPPattern *>(iter_server)); |
374 | + SPPattern *sel_pat = dynamic_cast<SPPattern *>(sel_server)->rootPattern(); |
375 | + SPPattern *iter_pat = dynamic_cast<SPPattern *>(iter_server)->rootPattern(); |
376 | if (sel_pat == iter_pat) { |
377 | match = true; |
378 | } |
379 | @@ -3312,7 +3312,7 @@ |
380 | int saved_compensation = prefs->getInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED); |
381 | prefs->setInt("/options/clonecompensation/value", SP_CLONE_COMPENSATION_UNMOVED); |
382 | |
383 | - gchar const *pat_id = pattern_tile(repr_copies, bbox, doc, |
384 | + gchar const *pat_id = SPPattern::produce(repr_copies, bbox, doc, |
385 | ( Geom::Affine(Geom::Translate(desktop->dt2doc(Geom::Point(r->min()[Geom::X], |
386 | r->max()[Geom::Y])))) |
387 | * parent_transform.inverse() ), |
388 | @@ -3390,9 +3390,9 @@ |
389 | |
390 | did = true; |
391 | |
392 | - SPPattern *pattern = pattern_getroot(basePat); |
393 | + SPPattern *pattern = basePat->rootPattern(); |
394 | |
395 | - Geom::Affine pat_transform = pattern_patternTransform(basePat); |
396 | + Geom::Affine pat_transform = basePat->getTransform(); |
397 | pat_transform *= item->transform; |
398 | |
399 | for (SPObject *child = pattern->firstChild() ; child != NULL; child = child->next ) { |
400 | |
401 | === modified file 'src/sp-item.cpp' |
402 | --- src/sp-item.cpp 2015-05-10 21:55:55 +0000 |
403 | +++ src/sp-item.cpp 2015-05-17 12:22:15 +0000 |
404 | @@ -1222,8 +1222,8 @@ |
405 | SPObject *server = style->getFillPaintServer(); |
406 | SPPattern *serverPatt = dynamic_cast<SPPattern *>(server); |
407 | if ( serverPatt ) { |
408 | - SPPattern *pattern = sp_pattern_clone_if_necessary(this, serverPatt, "fill"); |
409 | - sp_pattern_transform_multiply(pattern, postmul, set); |
410 | + SPPattern *pattern = serverPatt->clone_if_necessary(this, "fill"); |
411 | + pattern->transform_multiply(postmul, set); |
412 | } |
413 | } |
414 | |
415 | @@ -1232,8 +1232,8 @@ |
416 | SPObject *server = style->getStrokePaintServer(); |
417 | SPPattern *serverPatt = dynamic_cast<SPPattern *>(server); |
418 | if ( serverPatt ) { |
419 | - SPPattern *pattern = sp_pattern_clone_if_necessary(this, serverPatt, "stroke"); |
420 | - sp_pattern_transform_multiply(pattern, postmul, set); |
421 | + SPPattern *pattern = serverPatt->clone_if_necessary(this, "stroke"); |
422 | + pattern->transform_multiply(postmul, set); |
423 | } |
424 | } |
425 | } |
426 | |
427 | === modified file 'src/sp-pattern.cpp' |
428 | --- src/sp-pattern.cpp 2015-04-26 09:44:42 +0000 |
429 | +++ src/sp-pattern.cpp 2015-05-17 12:22:15 +0000 |
430 | @@ -5,7 +5,7 @@ |
431 | * Lauris Kaplinski <lauris@kaplinski.com> |
432 | * bulia byak <buliabyak@users.sf.net> |
433 | * Jon A. Cruz <jon@joncruz.org> |
434 | - * Abhishek Sharma |
435 | + * Abhishek Sharma |
436 | * |
437 | * Copyright (C) 2002 Lauris Kaplinski |
438 | * |
439 | @@ -13,15 +13,15 @@ |
440 | */ |
441 | |
442 | #ifdef HAVE_CONFIG_H |
443 | -# include "config.h" |
444 | +#include "config.h" |
445 | #endif |
446 | |
447 | #include <cstring> |
448 | #include <string> |
449 | #include <glibmm.h> |
450 | #include <2geom/transforms.h> |
451 | +#include <sigc++/functors/mem_fun.h> |
452 | |
453 | -#include "macros.h" |
454 | #include "svg/svg.h" |
455 | #include "display/cairo-utils.h" |
456 | #include "display/drawing-context.h" |
457 | @@ -34,67 +34,61 @@ |
458 | #include "style.h" |
459 | #include "sp-pattern.h" |
460 | #include "xml/repr.h" |
461 | -#include "display/grayscale.h" |
462 | - |
463 | -#include <sigc++/functors/ptr_fun.h> |
464 | -#include <sigc++/adaptors/bind.h> |
465 | - |
466 | -/* |
467 | - * Pattern |
468 | - */ |
469 | -static void pattern_ref_changed(SPObject *old_ref, SPObject *ref, SPPattern *pat); |
470 | -static void pattern_ref_modified (SPObject *ref, guint flags, SPPattern *pattern); |
471 | - |
472 | -SPPattern::SPPattern() : SPPaintServer(), SPViewBox() { |
473 | - this->href = NULL; |
474 | - |
475 | - this->ref = new SPPatternReference(this); |
476 | - this->ref->changedSignal().connect(sigc::bind(sigc::ptr_fun(pattern_ref_changed), this)); |
477 | - |
478 | - this->patternUnits = SP_PATTERN_UNITS_OBJECTBOUNDINGBOX; |
479 | - this->patternUnits_set = FALSE; |
480 | - |
481 | - this->patternContentUnits = SP_PATTERN_UNITS_USERSPACEONUSE; |
482 | - this->patternContentUnits_set = FALSE; |
483 | - |
484 | - this->patternTransform = Geom::identity(); |
485 | - this->patternTransform_set = FALSE; |
486 | - |
487 | - this->x.unset(); |
488 | - this->y.unset(); |
489 | - this->width.unset(); |
490 | - this->height.unset(); |
491 | -} |
492 | - |
493 | -SPPattern::~SPPattern() { |
494 | -} |
495 | - |
496 | -void SPPattern::build(SPDocument* doc, Inkscape::XML::Node* repr) { |
497 | - SPPaintServer::build(doc, repr); |
498 | - |
499 | - this->readAttr( "patternUnits" ); |
500 | - this->readAttr( "patternContentUnits" ); |
501 | - this->readAttr( "patternTransform" ); |
502 | - this->readAttr( "x" ); |
503 | - this->readAttr( "y" ); |
504 | - this->readAttr( "width" ); |
505 | - this->readAttr( "height" ); |
506 | - this->readAttr( "viewBox" ); |
507 | - this->readAttr( "preserveAspectRatio" ); |
508 | - this->readAttr( "xlink:href" ); |
509 | - |
510 | - /* Register ourselves */ |
511 | - doc->addResource("pattern", this); |
512 | -} |
513 | - |
514 | -void SPPattern::release() { |
515 | + |
516 | +#include "sp-factory.h" |
517 | + |
518 | +SPPattern::SPPattern() |
519 | + : SPPaintServer() |
520 | + , SPViewBox() |
521 | +{ |
522 | + this->ref = new SPPatternReference(this); |
523 | + this->ref->changedSignal().connect(sigc::mem_fun(this, &SPPattern::_onRefChanged)); |
524 | + |
525 | + this->_pattern_units = UNITS_OBJECTBOUNDINGBOX; |
526 | + this->_pattern_units_set = false; |
527 | + |
528 | + this->_pattern_content_units = UNITS_USERSPACEONUSE; |
529 | + this->_pattern_content_units_set = false; |
530 | + |
531 | + this->_pattern_transform = Geom::identity(); |
532 | + this->_pattern_transform_set = false; |
533 | + |
534 | + this->_x.unset(); |
535 | + this->_y.unset(); |
536 | + this->_width.unset(); |
537 | + this->_height.unset(); |
538 | +} |
539 | + |
540 | +SPPattern::~SPPattern() {} |
541 | + |
542 | +void SPPattern::build(SPDocument *doc, Inkscape::XML::Node *repr) |
543 | +{ |
544 | + SPPaintServer::build(doc, repr); |
545 | + |
546 | + this->readAttr("patternUnits"); |
547 | + this->readAttr("patternContentUnits"); |
548 | + this->readAttr("patternTransform"); |
549 | + this->readAttr("x"); |
550 | + this->readAttr("y"); |
551 | + this->readAttr("width"); |
552 | + this->readAttr("height"); |
553 | + this->readAttr("viewBox"); |
554 | + this->readAttr("preserveAspectRatio"); |
555 | + this->readAttr("xlink:href"); |
556 | + |
557 | + /* Register ourselves */ |
558 | + doc->addResource("pattern", this); |
559 | +} |
560 | + |
561 | +void SPPattern::release() |
562 | +{ |
563 | if (this->document) { |
564 | // Unregister ourselves |
565 | this->document->removeResource("pattern", this); |
566 | } |
567 | |
568 | if (this->ref) { |
569 | - this->modified_connection.disconnect(); |
570 | + this->_modified_connection.disconnect(); |
571 | this->ref->detach(); |
572 | delete this->ref; |
573 | this->ref = NULL; |
574 | @@ -103,113 +97,121 @@ |
575 | SPPaintServer::release(); |
576 | } |
577 | |
578 | -void SPPattern::set(unsigned int key, const gchar* value) { |
579 | - switch (key) { |
580 | - case SP_ATTR_PATTERNUNITS: |
581 | - if (value) { |
582 | - if (!strcmp (value, "userSpaceOnUse")) { |
583 | - this->patternUnits = SP_PATTERN_UNITS_USERSPACEONUSE; |
584 | - } else { |
585 | - this->patternUnits = SP_PATTERN_UNITS_OBJECTBOUNDINGBOX; |
586 | - } |
587 | - |
588 | - this->patternUnits_set = TRUE; |
589 | - } else { |
590 | - this->patternUnits_set = FALSE; |
591 | - } |
592 | - |
593 | - this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
594 | - break; |
595 | - |
596 | - case SP_ATTR_PATTERNCONTENTUNITS: |
597 | - if (value) { |
598 | - if (!strcmp (value, "userSpaceOnUse")) { |
599 | - this->patternContentUnits = SP_PATTERN_UNITS_USERSPACEONUSE; |
600 | - } else { |
601 | - this->patternContentUnits = SP_PATTERN_UNITS_OBJECTBOUNDINGBOX; |
602 | - } |
603 | - |
604 | - this->patternContentUnits_set = TRUE; |
605 | - } else { |
606 | - this->patternContentUnits_set = FALSE; |
607 | - } |
608 | - |
609 | - this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
610 | - break; |
611 | - |
612 | - case SP_ATTR_PATTERNTRANSFORM: { |
613 | - Geom::Affine t; |
614 | - |
615 | - if (value && sp_svg_transform_read (value, &t)) { |
616 | - this->patternTransform = t; |
617 | - this->patternTransform_set = TRUE; |
618 | - } else { |
619 | - this->patternTransform = Geom::identity(); |
620 | - this->patternTransform_set = FALSE; |
621 | - } |
622 | - |
623 | - this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
624 | - break; |
625 | - } |
626 | - case SP_ATTR_X: |
627 | - this->x.readOrUnset(value); |
628 | - this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
629 | - break; |
630 | - |
631 | - case SP_ATTR_Y: |
632 | - this->y.readOrUnset(value); |
633 | - this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
634 | - break; |
635 | - |
636 | - case SP_ATTR_WIDTH: |
637 | - this->width.readOrUnset(value); |
638 | - this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
639 | - break; |
640 | - |
641 | - case SP_ATTR_HEIGHT: |
642 | - this->height.readOrUnset(value); |
643 | - this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
644 | - break; |
645 | - |
646 | - case SP_ATTR_VIEWBOX: |
647 | - set_viewBox( value ); |
648 | +void SPPattern::set(unsigned int key, const gchar *value) |
649 | +{ |
650 | + switch (key) { |
651 | + case SP_ATTR_PATTERNUNITS: |
652 | + if (value) { |
653 | + if (!strcmp(value, "userSpaceOnUse")) { |
654 | + this->_pattern_units = UNITS_USERSPACEONUSE; |
655 | + } |
656 | + else { |
657 | + this->_pattern_units = UNITS_OBJECTBOUNDINGBOX; |
658 | + } |
659 | + |
660 | + this->_pattern_units_set = true; |
661 | + } |
662 | + else { |
663 | + this->_pattern_units_set = false; |
664 | + } |
665 | + |
666 | + this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
667 | + break; |
668 | + |
669 | + case SP_ATTR_PATTERNCONTENTUNITS: |
670 | + if (value) { |
671 | + if (!strcmp(value, "userSpaceOnUse")) { |
672 | + this->_pattern_content_units = UNITS_USERSPACEONUSE; |
673 | + } |
674 | + else { |
675 | + this->_pattern_content_units = UNITS_OBJECTBOUNDINGBOX; |
676 | + } |
677 | + |
678 | + this->_pattern_content_units_set = true; |
679 | + } |
680 | + else { |
681 | + this->_pattern_content_units_set = false; |
682 | + } |
683 | + |
684 | + this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
685 | + break; |
686 | + |
687 | + case SP_ATTR_PATTERNTRANSFORM: { |
688 | + Geom::Affine t; |
689 | + |
690 | + if (value && sp_svg_transform_read(value, &t)) { |
691 | + this->_pattern_transform = t; |
692 | + this->_pattern_transform_set = true; |
693 | + } |
694 | + else { |
695 | + this->_pattern_transform = Geom::identity(); |
696 | + this->_pattern_transform_set = false; |
697 | + } |
698 | + |
699 | + this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
700 | + break; |
701 | + } |
702 | + case SP_ATTR_X: |
703 | + this->_x.readOrUnset(value); |
704 | + this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
705 | + break; |
706 | + |
707 | + case SP_ATTR_Y: |
708 | + this->_y.readOrUnset(value); |
709 | + this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
710 | + break; |
711 | + |
712 | + case SP_ATTR_WIDTH: |
713 | + this->_width.readOrUnset(value); |
714 | + this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
715 | + break; |
716 | + |
717 | + case SP_ATTR_HEIGHT: |
718 | + this->_height.readOrUnset(value); |
719 | + this->requestModified(SP_OBJECT_MODIFIED_FLAG); |
720 | + break; |
721 | + |
722 | + case SP_ATTR_VIEWBOX: |
723 | + set_viewBox(value); |
724 | this->requestModified(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); |
725 | break; |
726 | |
727 | case SP_ATTR_PRESERVEASPECTRATIO: |
728 | - set_preserveAspectRatio( value ); |
729 | + set_preserveAspectRatio(value); |
730 | this->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG); |
731 | break; |
732 | |
733 | - case SP_ATTR_XLINK_HREF: |
734 | - if ( value && this->href && ( strcmp(value, this->href) == 0 ) ) { |
735 | - /* Href unchanged, do nothing. */ |
736 | - } else { |
737 | - g_free(this->href); |
738 | - this->href = NULL; |
739 | - |
740 | - if (value) { |
741 | - // First, set the href field; it's only used in the "unchanged" check above. |
742 | - this->href = g_strdup(value); |
743 | - // Now do the attaching, which emits the changed signal. |
744 | - if (value) { |
745 | - try { |
746 | - this->ref->attach(Inkscape::URI(value)); |
747 | - } catch (Inkscape::BadURIException &e) { |
748 | - g_warning("%s", e.what()); |
749 | - this->ref->detach(); |
750 | - } |
751 | - } else { |
752 | - this->ref->detach(); |
753 | - } |
754 | - } |
755 | - } |
756 | - break; |
757 | - |
758 | - default: |
759 | - SPPaintServer::set(key, value); |
760 | - break; |
761 | - } |
762 | + case SP_ATTR_XLINK_HREF: |
763 | + if (value && this->href == value) { |
764 | + /* Href unchanged, do nothing. */ |
765 | + } |
766 | + else { |
767 | + this->href.clear(); |
768 | + |
769 | + if (value) { |
770 | + // First, set the href field; it's only used in the "unchanged" check above. |
771 | + this->href = value; |
772 | + // Now do the attaching, which emits the changed signal. |
773 | + if (value) { |
774 | + try { |
775 | + this->ref->attach(Inkscape::URI(value)); |
776 | + } |
777 | + catch (Inkscape::BadURIException &e) { |
778 | + g_warning("%s", e.what()); |
779 | + this->ref->detach(); |
780 | + } |
781 | + } |
782 | + else { |
783 | + this->ref->detach(); |
784 | + } |
785 | + } |
786 | + } |
787 | + break; |
788 | + |
789 | + default: |
790 | + SPPaintServer::set(key, value); |
791 | + break; |
792 | + } |
793 | } |
794 | |
795 | |
796 | @@ -217,104 +219,90 @@ |
797 | |
798 | /* fixme: We need ::order_changed handler too (Lauris) */ |
799 | |
800 | -static GSList *pattern_getchildren(SPPattern *pat) |
801 | +void SPPattern::_getChildren(std::list<SPObject *> &l) |
802 | { |
803 | - GSList *l = NULL; |
804 | - |
805 | - for (SPPattern *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
806 | + for (SPPattern *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
807 | if (pat_i->firstChild()) { // find the first one with children |
808 | - for (SPObject *child = pat->firstChild() ; child ; child = child->getNext() ) { |
809 | - l = g_slist_prepend (l, child); |
810 | - } |
811 | - break; // do not go further up the chain if children are found |
812 | - } |
813 | - } |
814 | - |
815 | - return l; |
816 | -} |
817 | - |
818 | -void SPPattern::update(SPCtx* ctx, unsigned int flags) { |
819 | - if (flags & SP_OBJECT_MODIFIED_FLAG) { |
820 | - flags |= SP_OBJECT_PARENT_MODIFIED_FLAG; |
821 | - } |
822 | - |
823 | - flags &= SP_OBJECT_MODIFIED_CASCADE; |
824 | - |
825 | - GSList *l = pattern_getchildren (this); |
826 | - l = g_slist_reverse (l); |
827 | - |
828 | - while (l) { |
829 | - SPObject *child = SP_OBJECT (l->data); |
830 | - |
831 | - sp_object_ref (child, NULL); |
832 | - l = g_slist_remove (l, child); |
833 | - |
834 | - if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { |
835 | - child->updateDisplay(ctx, flags); |
836 | - } |
837 | - |
838 | - sp_object_unref (child, NULL); |
839 | - } |
840 | -} |
841 | - |
842 | -void SPPattern::modified(unsigned int flags) { |
843 | - if (flags & SP_OBJECT_MODIFIED_FLAG) { |
844 | - flags |= SP_OBJECT_PARENT_MODIFIED_FLAG; |
845 | - } |
846 | - |
847 | - flags &= SP_OBJECT_MODIFIED_CASCADE; |
848 | - |
849 | - GSList *l = pattern_getchildren (this); |
850 | - l = g_slist_reverse (l); |
851 | - |
852 | - while (l) { |
853 | - SPObject *child = SP_OBJECT (l->data); |
854 | - |
855 | - sp_object_ref (child, NULL); |
856 | - l = g_slist_remove (l, child); |
857 | - |
858 | - if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { |
859 | - child->emitModified(flags); |
860 | - } |
861 | - |
862 | - sp_object_unref (child, NULL); |
863 | - } |
864 | -} |
865 | - |
866 | -/** |
867 | -Gets called when the pattern is reattached to another <pattern> |
868 | -*/ |
869 | -static void |
870 | -pattern_ref_changed(SPObject *old_ref, SPObject *ref, SPPattern *pat) |
871 | -{ |
872 | - if (old_ref) { |
873 | - pat->modified_connection.disconnect(); |
874 | - } |
875 | - |
876 | - if (SP_IS_PATTERN (ref)) { |
877 | - pat->modified_connection = ref->connectModified(sigc::bind<2>(sigc::ptr_fun(&pattern_ref_modified), pat)); |
878 | - } |
879 | - |
880 | - pattern_ref_modified (ref, 0, pat); |
881 | -} |
882 | - |
883 | -/** |
884 | -Gets called when the referenced <pattern> is changed |
885 | -*/ |
886 | -static void pattern_ref_modified (SPObject */*ref*/, guint /*flags*/, SPPattern *pattern) |
887 | -{ |
888 | - if ( SP_IS_OBJECT(pattern) ) { |
889 | - pattern->requestModified(SP_OBJECT_MODIFIED_FLAG); |
890 | - } |
891 | + for (SPObject *child = pat_i->firstChild(); child; child = child->getNext()) { |
892 | + l.push_back(child); |
893 | + } |
894 | + break; // do not go further up the chain if children are found |
895 | + } |
896 | + } |
897 | +} |
898 | + |
899 | +void SPPattern::update(SPCtx *ctx, unsigned int flags) |
900 | +{ |
901 | + typedef std::list<SPObject *>::iterator SPObjectIterator; |
902 | + |
903 | + if (flags & SP_OBJECT_MODIFIED_FLAG) { |
904 | + flags |= SP_OBJECT_PARENT_MODIFIED_FLAG; |
905 | + } |
906 | + |
907 | + flags &= SP_OBJECT_MODIFIED_CASCADE; |
908 | + |
909 | + std::list<SPObject *> l; |
910 | + _getChildren(l); |
911 | + |
912 | + for (SPObjectIterator it = l.begin(); it != l.end(); it++) { |
913 | + SPObject *child = *it; |
914 | + |
915 | + sp_object_ref(child, NULL); |
916 | + |
917 | + if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { |
918 | + child->updateDisplay(ctx, flags); |
919 | + } |
920 | + |
921 | + sp_object_unref(child, NULL); |
922 | + } |
923 | +} |
924 | + |
925 | +void SPPattern::modified(unsigned int flags) |
926 | +{ |
927 | + typedef std::list<SPObject *>::iterator SPObjectIterator; |
928 | + |
929 | + if (flags & SP_OBJECT_MODIFIED_FLAG) { |
930 | + flags |= SP_OBJECT_PARENT_MODIFIED_FLAG; |
931 | + } |
932 | + |
933 | + flags &= SP_OBJECT_MODIFIED_CASCADE; |
934 | + |
935 | + std::list<SPObject *> l; |
936 | + _getChildren(l); |
937 | + |
938 | + for (SPObjectIterator it = l.begin(); it != l.end(); it++) { |
939 | + SPObject *child = *it; |
940 | + |
941 | + sp_object_ref(child, NULL); |
942 | + |
943 | + if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) { |
944 | + child->emitModified(flags); |
945 | + } |
946 | + |
947 | + sp_object_unref(child, NULL); |
948 | + } |
949 | +} |
950 | + |
951 | +void SPPattern::_onRefChanged(SPObject *old_ref, SPObject *ref) |
952 | +{ |
953 | + if (old_ref) { |
954 | + _modified_connection.disconnect(); |
955 | + } |
956 | + |
957 | + if (SP_IS_PATTERN(ref)) { |
958 | + _modified_connection = ref->connectModified(sigc::mem_fun(this, &SPPattern::_onRefModified)); |
959 | + } |
960 | + |
961 | + _onRefModified(ref, 0); |
962 | +} |
963 | + |
964 | +void SPPattern::_onRefModified(SPObject * /*ref*/, guint /*flags*/) |
965 | +{ |
966 | + requestModified(SP_OBJECT_MODIFIED_FLAG); |
967 | // Conditional to avoid causing infinite loop if there's a cycle in the href chain. |
968 | } |
969 | |
970 | - |
971 | -/** |
972 | -Count how many times pat is used by the styles of o and its descendants |
973 | -*/ |
974 | -static guint |
975 | -count_pattern_hrefs(SPObject *o, SPPattern *pat) |
976 | +guint SPPattern::_countHrefs(SPObject *o) const |
977 | { |
978 | if (!o) |
979 | return 1; |
980 | @@ -322,84 +310,79 @@ |
981 | guint i = 0; |
982 | |
983 | SPStyle *style = o->style; |
984 | - if (style |
985 | - && style->fill.isPaintserver() |
986 | - && SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style)) |
987 | - && SP_PATTERN(SP_STYLE_FILL_SERVER(style)) == pat) |
988 | - { |
989 | - i ++; |
990 | + if (style && style->fill.isPaintserver() && SP_IS_PATTERN(SP_STYLE_FILL_SERVER(style)) && |
991 | + SP_PATTERN(SP_STYLE_FILL_SERVER(style)) == this) { |
992 | + i++; |
993 | } |
994 | - if (style |
995 | - && style->stroke.isPaintserver() |
996 | - && SP_IS_PATTERN(SP_STYLE_STROKE_SERVER(style)) |
997 | - && SP_PATTERN(SP_STYLE_STROKE_SERVER(style)) == pat) |
998 | - { |
999 | - i ++; |
1000 | + if (style && style->stroke.isPaintserver() && SP_IS_PATTERN(SP_STYLE_STROKE_SERVER(style)) && |
1001 | + SP_PATTERN(SP_STYLE_STROKE_SERVER(style)) == this) { |
1002 | + i++; |
1003 | } |
1004 | |
1005 | - for ( SPObject *child = o->firstChild(); child != NULL; child = child->next ) { |
1006 | - i += count_pattern_hrefs(child, pat); |
1007 | + for (SPObject *child = o->firstChild(); child != NULL; child = child->next) { |
1008 | + i += _countHrefs(child); |
1009 | } |
1010 | |
1011 | return i; |
1012 | } |
1013 | |
1014 | -SPPattern *pattern_chain(SPPattern *pattern) |
1015 | +SPPattern *SPPattern::_chain() const |
1016 | { |
1017 | - SPDocument *document = pattern->document; |
1018 | - Inkscape::XML::Document *xml_doc = document->getReprDoc(); |
1019 | + Inkscape::XML::Document *xml_doc = document->getReprDoc(); |
1020 | Inkscape::XML::Node *defsrepr = document->getDefs()->getRepr(); |
1021 | |
1022 | Inkscape::XML::Node *repr = xml_doc->createElement("svg:pattern"); |
1023 | repr->setAttribute("inkscape:collect", "always"); |
1024 | - gchar *parent_ref = g_strconcat("#", pattern->getRepr()->attribute("id"), NULL); |
1025 | - repr->setAttribute("xlink:href", parent_ref); |
1026 | - g_free (parent_ref); |
1027 | + Glib::ustring parent_ref = Glib::ustring::compose("#%1", getRepr()->attribute("id")); |
1028 | + repr->setAttribute("xlink:href", parent_ref); |
1029 | |
1030 | defsrepr->addChild(repr, NULL); |
1031 | const gchar *child_id = repr->attribute("id"); |
1032 | SPObject *child = document->getObjectById(child_id); |
1033 | - g_assert (SP_IS_PATTERN (child)); |
1034 | + g_assert(SP_IS_PATTERN(child)); |
1035 | |
1036 | - return SP_PATTERN (child); |
1037 | + return SP_PATTERN(child); |
1038 | } |
1039 | |
1040 | -SPPattern * |
1041 | -sp_pattern_clone_if_necessary (SPItem *item, SPPattern *pattern, const gchar *property) |
1042 | +SPPattern *SPPattern::clone_if_necessary(SPItem *item, const gchar *property) |
1043 | { |
1044 | - if (!pattern->href || pattern->hrefcount > count_pattern_hrefs(item, pattern)) { |
1045 | - pattern = pattern_chain (pattern); |
1046 | - gchar *href = g_strconcat("url(#", pattern->getRepr()->attribute("id"), ")", NULL); |
1047 | + SPPattern *pattern = this; |
1048 | + if (pattern->href.empty() || pattern->hrefcount > _countHrefs(item)) { |
1049 | + pattern = _chain(); |
1050 | + Glib::ustring href = Glib::ustring::compose("url(#%1)", pattern->getRepr()->attribute("id")); |
1051 | |
1052 | - SPCSSAttr *css = sp_repr_css_attr_new (); |
1053 | - sp_repr_css_set_property (css, property, href); |
1054 | + SPCSSAttr *css = sp_repr_css_attr_new(); |
1055 | + sp_repr_css_set_property(css, property, href.c_str()); |
1056 | sp_repr_css_change_recursive(item->getRepr(), css, "style"); |
1057 | } |
1058 | return pattern; |
1059 | } |
1060 | |
1061 | -void |
1062 | -sp_pattern_transform_multiply (SPPattern *pattern, Geom::Affine postmul, bool set) |
1063 | +void SPPattern::transform_multiply(Geom::Affine postmul, bool set) |
1064 | { |
1065 | // this formula is for a different interpretation of pattern transforms as described in (*) in sp-pattern.cpp |
1066 | // for it to work, we also need sp_object_read_attr( item, "transform"); |
1067 | - //pattern->patternTransform = premul * item->transform * pattern->patternTransform * item->transform.inverse() * postmul; |
1068 | + // pattern->patternTransform = premul * item->transform * pattern->patternTransform * item->transform.inverse() * |
1069 | + // postmul; |
1070 | |
1071 | // otherwise the formula is much simpler |
1072 | if (set) { |
1073 | - pattern->patternTransform = postmul; |
1074 | - } else { |
1075 | - pattern->patternTransform = pattern_patternTransform(pattern) * postmul; |
1076 | - } |
1077 | - pattern->patternTransform_set = TRUE; |
1078 | + _pattern_transform = postmul; |
1079 | + } |
1080 | + else { |
1081 | + _pattern_transform = getTransform() * postmul; |
1082 | + } |
1083 | + _pattern_transform_set = true; |
1084 | |
1085 | - gchar *c=sp_svg_transform_write(pattern->patternTransform); |
1086 | - pattern->getRepr()->setAttribute("patternTransform", c); |
1087 | - g_free(c); |
1088 | + Glib::ustring c = sp_svg_transform_write(_pattern_transform); |
1089 | + getRepr()->setAttribute("patternTransform", c); |
1090 | } |
1091 | |
1092 | -const gchar *pattern_tile(const std::vector<Inkscape::XML::Node*> &reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine transform, Geom::Affine move) |
1093 | +const gchar *SPPattern::produce(const std::vector<Inkscape::XML::Node *> &reprs, Geom::Rect bounds, |
1094 | + SPDocument *document, Geom::Affine transform, Geom::Affine move) |
1095 | { |
1096 | + typedef std::vector<Inkscape::XML::Node *>::const_iterator NodePtrIterator; |
1097 | + |
1098 | Inkscape::XML::Document *xml_doc = document->getReprDoc(); |
1099 | Inkscape::XML::Node *defsrepr = document->getDefs()->getRepr(); |
1100 | |
1101 | @@ -408,20 +391,19 @@ |
1102 | sp_repr_set_svg_double(repr, "width", bounds.dimensions()[Geom::X]); |
1103 | sp_repr_set_svg_double(repr, "height", bounds.dimensions()[Geom::Y]); |
1104 | |
1105 | - gchar *t=sp_svg_transform_write(transform); |
1106 | + Glib::ustring t = sp_svg_transform_write(transform); |
1107 | repr->setAttribute("patternTransform", t); |
1108 | - g_free(t); |
1109 | |
1110 | defsrepr->appendChild(repr); |
1111 | const gchar *pat_id = repr->attribute("id"); |
1112 | SPObject *pat_object = document->getObjectById(pat_id); |
1113 | |
1114 | - for (std::vector<Inkscape::XML::Node*>::const_iterator i=reprs.begin();i!=reprs.end();i++){ |
1115 | + for (NodePtrIterator i = reprs.begin(); i != reprs.end(); i++) { |
1116 | Inkscape::XML::Node *node = *i; |
1117 | SPItem *copy = SP_ITEM(pat_object->appendChildRepr(node)); |
1118 | |
1119 | Geom::Affine dup_transform; |
1120 | - if (!sp_svg_transform_read (node->attribute("transform"), &dup_transform)) |
1121 | + if (!sp_svg_transform_read(node->attribute("transform"), &dup_transform)) |
1122 | dup_transform = Geom::identity(); |
1123 | dup_transform *= move; |
1124 | |
1125 | @@ -432,14 +414,15 @@ |
1126 | return pat_id; |
1127 | } |
1128 | |
1129 | -SPPattern *pattern_getroot(SPPattern *pat) |
1130 | +SPPattern *SPPattern::rootPattern() |
1131 | { |
1132 | - for (SPPattern *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1133 | - if ( pat_i->firstChild() ) { // find the first one with children |
1134 | + for (SPPattern *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1135 | + if (pat_i->firstChild()) { // find the first one with children |
1136 | return pat_i; |
1137 | } |
1138 | } |
1139 | - return pat; // document is broken, we can't get to root; but at least we can return pat which is supposedly a valid pattern |
1140 | + return this; // document is broken, we can't get to root; but at least we can return pat which is supposedly a valid |
1141 | + // pattern |
1142 | } |
1143 | |
1144 | |
1145 | @@ -447,73 +430,73 @@ |
1146 | // Access functions that look up fields up the chain of referenced patterns and return the first one which is set |
1147 | // FIXME: all of them must use chase_hrefs the same as in SPGradient, to avoid lockup on circular refs |
1148 | |
1149 | -guint pattern_patternUnits (SPPattern const *pat) |
1150 | -{ |
1151 | - for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1152 | - if (pat_i->patternUnits_set) |
1153 | - return pat_i->patternUnits; |
1154 | - } |
1155 | - return pat->patternUnits; |
1156 | -} |
1157 | - |
1158 | -guint pattern_patternContentUnits (SPPattern const *pat) |
1159 | -{ |
1160 | - for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1161 | - if (pat_i->patternContentUnits_set) |
1162 | - return pat_i->patternContentUnits; |
1163 | - } |
1164 | - return pat->patternContentUnits; |
1165 | -} |
1166 | - |
1167 | -Geom::Affine const &pattern_patternTransform(SPPattern const *pat) |
1168 | -{ |
1169 | - for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1170 | - if (pat_i->patternTransform_set) |
1171 | - return pat_i->patternTransform; |
1172 | - } |
1173 | - return pat->patternTransform; |
1174 | -} |
1175 | - |
1176 | -gdouble pattern_x (SPPattern const *pat) |
1177 | -{ |
1178 | - for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1179 | - if (pat_i->x._set) |
1180 | - return pat_i->x.computed; |
1181 | - } |
1182 | - return 0; |
1183 | -} |
1184 | - |
1185 | -gdouble pattern_y (SPPattern const *pat) |
1186 | -{ |
1187 | - for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1188 | - if (pat_i->y._set) |
1189 | - return pat_i->y.computed; |
1190 | - } |
1191 | - return 0; |
1192 | -} |
1193 | - |
1194 | -gdouble pattern_width (SPPattern const* pat) |
1195 | -{ |
1196 | - for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1197 | - if (pat_i->width._set) |
1198 | - return pat_i->width.computed; |
1199 | - } |
1200 | - return 0; |
1201 | -} |
1202 | - |
1203 | -gdouble pattern_height (SPPattern const *pat) |
1204 | -{ |
1205 | - for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1206 | - if (pat_i->height._set) |
1207 | - return pat_i->height.computed; |
1208 | - } |
1209 | - return 0; |
1210 | -} |
1211 | - |
1212 | -Geom::OptRect pattern_viewBox (SPPattern const *pat) |
1213 | +SPPattern::PatternUnits SPPattern::patternUnits() const |
1214 | +{ |
1215 | + for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1216 | + if (pat_i->_pattern_units_set) |
1217 | + return pat_i->_pattern_units; |
1218 | + } |
1219 | + return _pattern_units; |
1220 | +} |
1221 | + |
1222 | +SPPattern::PatternUnits SPPattern::patternContentUnits() const |
1223 | +{ |
1224 | + for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1225 | + if (pat_i->_pattern_content_units_set) |
1226 | + return pat_i->_pattern_content_units; |
1227 | + } |
1228 | + return _pattern_content_units; |
1229 | +} |
1230 | + |
1231 | +Geom::Affine const &SPPattern::getTransform() const |
1232 | +{ |
1233 | + for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1234 | + if (pat_i->_pattern_transform_set) |
1235 | + return pat_i->_pattern_transform; |
1236 | + } |
1237 | + return _pattern_transform; |
1238 | +} |
1239 | + |
1240 | +gdouble SPPattern::x() const |
1241 | +{ |
1242 | + for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1243 | + if (pat_i->_x._set) |
1244 | + return pat_i->_x.computed; |
1245 | + } |
1246 | + return 0; |
1247 | +} |
1248 | + |
1249 | +gdouble SPPattern::y() const |
1250 | +{ |
1251 | + for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1252 | + if (pat_i->_y._set) |
1253 | + return pat_i->_y.computed; |
1254 | + } |
1255 | + return 0; |
1256 | +} |
1257 | + |
1258 | +gdouble SPPattern::width() const |
1259 | +{ |
1260 | + for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1261 | + if (pat_i->_width._set) |
1262 | + return pat_i->_width.computed; |
1263 | + } |
1264 | + return 0; |
1265 | +} |
1266 | + |
1267 | +gdouble SPPattern::height() const |
1268 | +{ |
1269 | + for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1270 | + if (pat_i->_height._set) |
1271 | + return pat_i->_height.computed; |
1272 | + } |
1273 | + return 0; |
1274 | +} |
1275 | + |
1276 | +Geom::OptRect SPPattern::viewbox() const |
1277 | { |
1278 | Geom::OptRect viewbox; |
1279 | - for (SPPattern const *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1280 | + for (SPPattern const *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1281 | if (pat_i->viewBox_set) { |
1282 | viewbox = pat_i->viewBox; |
1283 | break; |
1284 | @@ -522,10 +505,10 @@ |
1285 | return viewbox; |
1286 | } |
1287 | |
1288 | -static bool pattern_hasItemChildren (SPPattern const *pat) |
1289 | +bool SPPattern::_hasItemChildren() const |
1290 | { |
1291 | bool hasChildren = false; |
1292 | - for (SPObject const *child = pat->firstChild() ; child && !hasChildren ; child = child->getNext() ) { |
1293 | + for (SPObject const *child = firstChild(); child && !hasChildren; child = child->getNext()) { |
1294 | if (SP_IS_ITEM(child)) { |
1295 | hasChildren = true; |
1296 | } |
1297 | @@ -535,15 +518,16 @@ |
1298 | |
1299 | bool SPPattern::isValid() const |
1300 | { |
1301 | - double tile_width = pattern_width(this); |
1302 | - double tile_height = pattern_height(this); |
1303 | + double tile_width = width(); |
1304 | + double tile_height = height(); |
1305 | |
1306 | - if (tile_width <= 0 || tile_height <= 0) |
1307 | - return false; |
1308 | - return true; |
1309 | + if (tile_width <= 0 || tile_height <= 0) |
1310 | + return false; |
1311 | + return true; |
1312 | } |
1313 | |
1314 | -cairo_pattern_t* SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &bbox, double opacity) { |
1315 | +cairo_pattern_t *SPPattern::pattern_new(cairo_t *base_ct, Geom::OptRect const &bbox, double opacity) |
1316 | +{ |
1317 | |
1318 | bool needs_opacity = (1.0 - opacity) >= 1e-3; |
1319 | bool visible = opacity >= 1e-3; |
1320 | @@ -557,28 +541,28 @@ |
1321 | |
1322 | for (SPPattern *pat_i = this; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) { |
1323 | // find the first one with item children |
1324 | - if (pat_i && SP_IS_OBJECT(pat_i) && pattern_hasItemChildren(pat_i)) { |
1325 | + if (pat_i && SP_IS_OBJECT(pat_i) && pat_i->_hasItemChildren()) { |
1326 | shown = pat_i; |
1327 | break; // do not go further up the chain if children are found |
1328 | } |
1329 | } |
1330 | |
1331 | if (!shown) { |
1332 | - return cairo_pattern_create_rgba(0,0,0,0); |
1333 | + return cairo_pattern_create_rgba(0, 0, 0, 0); |
1334 | } |
1335 | |
1336 | /* Create drawing for rendering */ |
1337 | Inkscape::Drawing drawing; |
1338 | - unsigned int dkey = SPItem::display_key_new (1); |
1339 | + unsigned int dkey = SPItem::display_key_new(1); |
1340 | Inkscape::DrawingGroup *root = new Inkscape::DrawingGroup(drawing); |
1341 | drawing.setRoot(root); |
1342 | |
1343 | - for (SPObject *child = shown->firstChild(); child != NULL; child = child->getNext() ) { |
1344 | - if (SP_IS_ITEM (child)) { |
1345 | + for (SPObject *child = shown->firstChild(); child != NULL; child = child->getNext()) { |
1346 | + if (SP_IS_ITEM(child)) { |
1347 | // for each item in pattern, show it on our drawing, add to the group, |
1348 | // and connect to the release signal in case the item gets deleted |
1349 | Inkscape::DrawingItem *cai; |
1350 | - cai = SP_ITEM(child)->invoke_show (drawing, dkey, SP_ITEM_SHOW_DISPLAY); |
1351 | + cai = SP_ITEM(child)->invoke_show(drawing, dkey, SP_ITEM_SHOW_DISPLAY); |
1352 | root->appendChild(cai); |
1353 | } |
1354 | } |
1355 | @@ -591,40 +575,41 @@ |
1356 | // * "x", "y", and "patternTransform" transform tile to user space after tile is generated. |
1357 | |
1358 | // These functions recursively search up the tree to find the values. |
1359 | - double tile_x = pattern_x(this); |
1360 | - double tile_y = pattern_y(this); |
1361 | - double tile_width = pattern_width(this); |
1362 | - double tile_height = pattern_height(this); |
1363 | - if ( bbox && (pattern_patternUnits(this) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) ) { |
1364 | - tile_x *= bbox->width(); |
1365 | - tile_y *= bbox->height(); |
1366 | - tile_width *= bbox->width(); |
1367 | + double tile_x = x(); |
1368 | + double tile_y = y(); |
1369 | + double tile_width = width(); |
1370 | + double tile_height = height(); |
1371 | + if (bbox && (patternUnits() == UNITS_OBJECTBOUNDINGBOX)) { |
1372 | + tile_x *= bbox->width(); |
1373 | + tile_y *= bbox->height(); |
1374 | + tile_width *= bbox->width(); |
1375 | tile_height *= bbox->height(); |
1376 | } |
1377 | |
1378 | // Pattern size in pattern space |
1379 | Geom::Rect pattern_tile = Geom::Rect::from_xywh(0, 0, tile_width, tile_height); |
1380 | - |
1381 | + |
1382 | // Content to tile (pattern space) |
1383 | Geom::Affine content2ps; |
1384 | - Geom::OptRect effective_view_box = pattern_viewBox(this); |
1385 | + Geom::OptRect effective_view_box = viewbox(); |
1386 | if (effective_view_box) { |
1387 | - // viewBox to pattern server (using SPViewBox) |
1388 | + // viewBox to pattern server (using SPViewBox) |
1389 | viewBox = *effective_view_box; |
1390 | c2p.setIdentity(); |
1391 | - apply_viewbox( pattern_tile ); |
1392 | + apply_viewbox(pattern_tile); |
1393 | content2ps = c2p; |
1394 | - } else { |
1395 | + } |
1396 | + else { |
1397 | |
1398 | // Content to bbox |
1399 | - if (bbox && (pattern_patternContentUnits(this) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) ) { |
1400 | - content2ps = Geom::Affine(bbox->width(), 0.0, 0.0, bbox->height(), 0,0); |
1401 | + if (bbox && (patternContentUnits() == UNITS_OBJECTBOUNDINGBOX)) { |
1402 | + content2ps = Geom::Affine(bbox->width(), 0.0, 0.0, bbox->height(), 0, 0); |
1403 | } |
1404 | } |
1405 | |
1406 | |
1407 | // Tile (pattern space) to user. |
1408 | - Geom::Affine ps2user = Geom::Translate(tile_x,tile_y) * pattern_patternTransform(this); |
1409 | + Geom::Affine ps2user = Geom::Translate(tile_x, tile_y) * getTransform(); |
1410 | |
1411 | |
1412 | // Transform of object with pattern (includes screen scaling) |
1413 | @@ -644,7 +629,7 @@ |
1414 | // to find the optimum tile size for rendering |
1415 | // c is number of pixels in buffer x and y. |
1416 | // Scale factor of 1.1 is too small... see bug #1251039 |
1417 | - Geom::Point c(pattern_tile.dimensions()*ps2user.descrim()*full.descrim()*2.0); |
1418 | + Geom::Point c(pattern_tile.dimensions() * ps2user.descrim() * full.descrim() * 2.0); |
1419 | |
1420 | // Create drawing surface with size of pattern tile (in pattern space) but with number of pixels |
1421 | // based on required resolution (c). |
1422 | @@ -660,16 +645,16 @@ |
1423 | } |
1424 | |
1425 | // TODO: make sure there are no leaks. |
1426 | - Inkscape::UpdateContext ctx; // UpdateContext is structure with only ctm! |
1427 | + Inkscape::UpdateContext ctx; // UpdateContext is structure with only ctm! |
1428 | ctx.ctm = content2ps * pattern_surface.drawingTransform(); |
1429 | - dc.transform( pattern_surface.drawingTransform().inverse() ); |
1430 | + dc.transform(pattern_surface.drawingTransform().inverse()); |
1431 | drawing.update(Geom::IntRect::infinite(), ctx); |
1432 | |
1433 | // Render drawing to pattern_surface via drawing context, this calls root->render |
1434 | // which is really DrawingItem->render(). |
1435 | drawing.render(dc, one_tile); |
1436 | - for (SPObject *child = shown->firstChild() ; child != NULL; child = child->getNext() ) { |
1437 | - if (SP_IS_ITEM (child)) { |
1438 | + for (SPObject *child = shown->firstChild(); child != NULL; child = child->getNext()) { |
1439 | + if (SP_IS_ITEM(child)) { |
1440 | SP_ITEM(child)->invoke_hide(dkey); |
1441 | } |
1442 | } |
1443 | @@ -685,12 +670,12 @@ |
1444 | |
1445 | if (needs_opacity) { |
1446 | dc.popGroupToSource(); // pop raw pattern |
1447 | - dc.paint(opacity); // apply opacity |
1448 | + dc.paint(opacity); // apply opacity |
1449 | } |
1450 | |
1451 | cairo_pattern_t *cp = cairo_pattern_create_for_surface(pattern_surface.raw()); |
1452 | // Apply transformation to user space. Also compensate for oversampling. |
1453 | - ink_cairo_pattern_set_matrix(cp, ps2user.inverse() * pattern_surface.drawingTransform() ); |
1454 | + ink_cairo_pattern_set_matrix(cp, ps2user.inverse() * pattern_surface.drawingTransform()); |
1455 | |
1456 | cairo_pattern_set_extend(cp, CAIRO_EXTEND_REPEAT); |
1457 | |
1458 | |
1459 | === modified file 'src/sp-pattern.h' |
1460 | --- src/sp-pattern.h 2015-02-19 03:25:21 +0000 |
1461 | +++ src/sp-pattern.h 2015-05-17 12:22:15 +0000 |
1462 | @@ -1,9 +1,6 @@ |
1463 | -#ifndef SEEN_SP_PATTERN_H |
1464 | -#define SEEN_SP_PATTERN_H |
1465 | - |
1466 | -/* |
1467 | +/** @file |
1468 | * SVG <pattern> implementation |
1469 | - * |
1470 | + *//* |
1471 | * Author: |
1472 | * Lauris Kaplinski <lauris@kaplinski.com> |
1473 | * Abhishek Sharma |
1474 | @@ -13,95 +10,131 @@ |
1475 | * Released under GNU GPL, read the file 'COPYING' for more information |
1476 | */ |
1477 | |
1478 | -#define SP_PATTERN(obj) (dynamic_cast<SPPattern*>((SPObject*)obj)) |
1479 | -#define SP_IS_PATTERN(obj) (dynamic_cast<const SPPattern*>((SPObject*)obj) != NULL) |
1480 | +#ifndef SEEN_SP_PATTERN_H |
1481 | +#define SEEN_SP_PATTERN_H |
1482 | |
1483 | -class SPPatternReference; |
1484 | -class SPItem; |
1485 | -typedef struct _GSList GSList; |
1486 | +#include <list> |
1487 | +#include <stddef.h> |
1488 | +#include <glibmm/ustring.h> |
1489 | +#include <sigc++/connection.h> |
1490 | |
1491 | #include "svg/svg-length.h" |
1492 | #include "sp-paint-server.h" |
1493 | #include "uri-references.h" |
1494 | #include "viewbox.h" |
1495 | |
1496 | -#include <sigc++/connection.h> |
1497 | - |
1498 | +class SPPatternReference; |
1499 | +class SPItem; |
1500 | + |
1501 | +namespace Inkscape { |
1502 | +namespace XML { |
1503 | + |
1504 | +class Node; |
1505 | +} |
1506 | +} |
1507 | + |
1508 | +#define SP_PATTERN(obj) (dynamic_cast<SPPattern *>((SPObject *)obj)) |
1509 | +#define SP_IS_PATTERN(obj) (dynamic_cast<const SPPattern *>((SPObject *)obj) != NULL) |
1510 | |
1511 | class SPPattern : public SPPaintServer, public SPViewBox { |
1512 | public: |
1513 | - SPPattern(); |
1514 | - virtual ~SPPattern(); |
1515 | + enum PatternUnits { UNITS_USERSPACEONUSE, UNITS_OBJECTBOUNDINGBOX }; |
1516 | + |
1517 | + SPPattern(); |
1518 | + virtual ~SPPattern(); |
1519 | |
1520 | /* Reference (href) */ |
1521 | - char *href; |
1522 | + Glib::ustring href; |
1523 | SPPatternReference *ref; |
1524 | |
1525 | + gdouble x() const; |
1526 | + gdouble y() const; |
1527 | + gdouble width() const; |
1528 | + gdouble height() const; |
1529 | + Geom::OptRect viewbox() const; |
1530 | + SPPattern::PatternUnits patternUnits() const; |
1531 | + SPPattern::PatternUnits patternContentUnits() const; |
1532 | + Geom::Affine const &getTransform() const; |
1533 | + SPPattern *rootPattern(); // TODO: const |
1534 | + |
1535 | + SPPattern *clone_if_necessary(SPItem *item, const gchar *property); |
1536 | + void transform_multiply(Geom::Affine postmul, bool set); |
1537 | + |
1538 | + /** |
1539 | + * @brief create a new pattern in XML tree |
1540 | + * @return created pattern id |
1541 | + */ |
1542 | + static const gchar *produce(const std::vector<Inkscape::XML::Node *> &reprs, Geom::Rect bounds, |
1543 | + SPDocument *document, Geom::Affine transform, Geom::Affine move); |
1544 | + |
1545 | + bool isValid() const; |
1546 | + |
1547 | + virtual cairo_pattern_t *pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity); |
1548 | + |
1549 | +protected: |
1550 | + virtual void build(SPDocument *doc, Inkscape::XML::Node *repr); |
1551 | + virtual void release(); |
1552 | + virtual void set(unsigned int key, const gchar *value); |
1553 | + virtual void update(SPCtx *ctx, unsigned int flags); |
1554 | + virtual void modified(unsigned int flags); |
1555 | + |
1556 | +private: |
1557 | + bool _hasItemChildren() const; |
1558 | + void _getChildren(std::list<SPObject *> &l); |
1559 | + SPPattern *_chain() const; |
1560 | + |
1561 | + /** |
1562 | + Count how many times pattern is used by the styles of o and its descendants |
1563 | + */ |
1564 | + guint _countHrefs(SPObject *o) const; |
1565 | + |
1566 | + /** |
1567 | + Gets called when the pattern is reattached to another <pattern> |
1568 | + */ |
1569 | + void _onRefChanged(SPObject *old_ref, SPObject *ref); |
1570 | + |
1571 | + /** |
1572 | + Gets called when the referenced <pattern> is changed |
1573 | + */ |
1574 | + void _onRefModified(SPObject *ref, guint flags); |
1575 | + |
1576 | /* patternUnits and patternContentUnits attribute */ |
1577 | - unsigned int patternUnits : 1; |
1578 | - unsigned int patternUnits_set : 1; |
1579 | - unsigned int patternContentUnits : 1; |
1580 | - unsigned int patternContentUnits_set : 1; |
1581 | + PatternUnits _pattern_units : 1; |
1582 | + bool _pattern_units_set : 1; |
1583 | + PatternUnits _pattern_content_units : 1; |
1584 | + bool _pattern_content_units_set : 1; |
1585 | /* patternTransform attribute */ |
1586 | - Geom::Affine patternTransform; |
1587 | - unsigned int patternTransform_set : 1; |
1588 | + Geom::Affine _pattern_transform; |
1589 | + bool _pattern_transform_set : 1; |
1590 | /* Tile rectangle */ |
1591 | - SVGLength x; |
1592 | - SVGLength y; |
1593 | - SVGLength width; |
1594 | - SVGLength height; |
1595 | - |
1596 | - sigc::connection modified_connection; |
1597 | - |
1598 | - bool isValid() const; |
1599 | - |
1600 | - virtual cairo_pattern_t* pattern_new(cairo_t *ct, Geom::OptRect const &bbox, double opacity); |
1601 | - |
1602 | -protected: |
1603 | - virtual void build(SPDocument* doc, Inkscape::XML::Node* repr); |
1604 | - virtual void release(); |
1605 | - virtual void set(unsigned int key, const gchar* value); |
1606 | - virtual void update(SPCtx* ctx, unsigned int flags); |
1607 | - virtual void modified(unsigned int flags); |
1608 | + SVGLength _x; |
1609 | + SVGLength _y; |
1610 | + SVGLength _width; |
1611 | + SVGLength _height; |
1612 | + |
1613 | + sigc::connection _modified_connection; |
1614 | }; |
1615 | |
1616 | |
1617 | class SPPatternReference : public Inkscape::URIReference { |
1618 | public: |
1619 | - SPPatternReference (SPObject *obj) : URIReference(obj) {} |
1620 | - SPPattern *getObject() const { |
1621 | + SPPatternReference(SPObject *obj) |
1622 | + : URIReference(obj) |
1623 | + { |
1624 | + } |
1625 | + |
1626 | + SPPattern *getObject() const |
1627 | + { |
1628 | return reinterpret_cast<SPPattern *>(URIReference::getObject()); |
1629 | } |
1630 | |
1631 | protected: |
1632 | - virtual bool _acceptObject(SPObject *obj) const { |
1633 | - return SP_IS_PATTERN (obj); |
1634 | + virtual bool _acceptObject(SPObject *obj) const |
1635 | + { |
1636 | + return SP_IS_PATTERN(obj); |
1637 | } |
1638 | }; |
1639 | |
1640 | -enum { |
1641 | - SP_PATTERN_UNITS_USERSPACEONUSE, |
1642 | - SP_PATTERN_UNITS_OBJECTBOUNDINGBOX |
1643 | -}; |
1644 | - |
1645 | -unsigned int pattern_users (SPPattern *pattern); |
1646 | -SPPattern *pattern_chain (SPPattern *pattern); |
1647 | -SPPattern *sp_pattern_clone_if_necessary (SPItem *item, SPPattern *pattern, const char *property); |
1648 | -void sp_pattern_transform_multiply (SPPattern *pattern, Geom::Affine postmul, bool set); |
1649 | - |
1650 | -const char *pattern_tile (const std::vector<Inkscape::XML::Node*> &reprs, Geom::Rect bounds, SPDocument *document, Geom::Affine transform, Geom::Affine move); |
1651 | - |
1652 | -SPPattern *pattern_getroot (SPPattern *pat); |
1653 | - |
1654 | -unsigned int pattern_patternUnits (SPPattern const *pat); |
1655 | -unsigned int pattern_patternContentUnits (SPPattern const *pat); |
1656 | -Geom::Affine const &pattern_patternTransform(SPPattern const *pat); |
1657 | -double pattern_x (SPPattern const *pat); |
1658 | -double pattern_y (SPPattern const *pat); |
1659 | -double pattern_width (SPPattern const *pat); |
1660 | -double pattern_height (SPPattern const *pat); |
1661 | -Geom::OptRect pattern_viewBox (SPPattern const *pat); |
1662 | - |
1663 | #endif // SEEN_SP_PATTERN_H |
1664 | |
1665 | /* |
1666 | |
1667 | === modified file 'src/ui/CMakeLists.txt' |
1668 | --- src/ui/CMakeLists.txt 2015-05-12 20:23:05 +0000 |
1669 | +++ src/ui/CMakeLists.txt 2015-05-17 12:22:15 +0000 |
1670 | @@ -6,6 +6,7 @@ |
1671 | interface.cpp |
1672 | object-edit.cpp |
1673 | previewholder.cpp |
1674 | + selected-color.cpp |
1675 | shape-editor.cpp |
1676 | tool-factory.cpp |
1677 | tools-switch.cpp |
1678 | @@ -115,8 +116,14 @@ |
1679 | widget/anchor-selector.cpp |
1680 | widget/button.cpp |
1681 | widget/clipmaskicon.cpp |
1682 | + widget/color-entry.cpp |
1683 | + widget/color-icc-selector.cpp |
1684 | + widget/color-notebook.cpp |
1685 | widget/color-picker.cpp |
1686 | widget/color-preview.cpp |
1687 | + widget/color-scales.cpp |
1688 | + widget/color-slider.cpp |
1689 | + widget/color-wheel-selector.cpp |
1690 | widget/dock-item.cpp |
1691 | widget/dock.cpp |
1692 | widget/entity-entry.cpp |
1693 | @@ -175,6 +182,7 @@ |
1694 | previewable.h |
1695 | previewfillable.h |
1696 | previewholder.h |
1697 | + selected-color.h |
1698 | shape-editor.h |
1699 | tool-factory.h |
1700 | tools-switch.h |
1701 | @@ -288,8 +296,14 @@ |
1702 | widget/anchor-selector.h |
1703 | widget/attr-widget.h |
1704 | widget/button.h |
1705 | + widget/color-entry.h |
1706 | + widget/color-icc-selector.h |
1707 | + widget/color-notebook.h |
1708 | widget/color-picker.h |
1709 | widget/color-preview.h |
1710 | + widget/color-scales.h |
1711 | + widget/color-slider.h |
1712 | + widget/color-wheel-selector.h |
1713 | widget/combo-enums.h |
1714 | widget/dock-item.h |
1715 | widget/dock.h |
1716 | |
1717 | === modified file 'src/ui/Makefile_insert' |
1718 | --- src/ui/Makefile_insert 2015-02-25 01:04:28 +0000 |
1719 | +++ src/ui/Makefile_insert 2015-05-17 12:22:15 +0000 |
1720 | @@ -19,6 +19,8 @@ |
1721 | ui/previewfillable.h \ |
1722 | ui/previewholder.cpp \ |
1723 | ui/previewholder.h \ |
1724 | + ui/selected-color.h \ |
1725 | + ui/selected-color.cpp \ |
1726 | ui/shape-editor.cpp \ |
1727 | ui/shape-editor.h \ |
1728 | ui/tool-factory.cpp \ |
1729 | |
1730 | === modified file 'src/ui/dialog/objects.cpp' |
1731 | --- src/ui/dialog/objects.cpp 2015-02-27 02:10:36 +0000 |
1732 | +++ src/ui/dialog/objects.cpp 2015-05-17 12:22:15 +0000 |
1733 | @@ -45,6 +45,7 @@ |
1734 | #include "style.h" |
1735 | #include "ui/tools-switch.h" |
1736 | #include "ui/icon-names.h" |
1737 | +#include "ui/selected-color.h" |
1738 | #include "ui/widget/imagetoggler.h" |
1739 | #include "ui/widget/layertypeicon.h" |
1740 | #include "ui/widget/insertordericon.h" |
1741 | @@ -53,7 +54,7 @@ |
1742 | #include "ui/tools/node-tool.h" |
1743 | #include "ui/tools/tool-base.h" |
1744 | #include "verbs.h" |
1745 | -#include "widgets/sp-color-notebook.h" |
1746 | +#include "ui/widget/color-notebook.h" |
1747 | #include "widgets/icon.h" |
1748 | #include "xml/node.h" |
1749 | #include "xml/node-observer.h" |
1750 | @@ -928,12 +929,12 @@ |
1751 | //If the current item is not selected, store only it in the highlight source |
1752 | _storeHighlightTarget(iter); |
1753 | } |
1754 | - if (_colorSelector) |
1755 | + if (_selectedColor) |
1756 | { |
1757 | //Set up the color selector |
1758 | SPColor color; |
1759 | color.set( row[_model->_colHighlight] ); |
1760 | - _colorSelector->base->setColorAlpha(color, SP_RGBA32_A_F(row[_model->_colHighlight])); |
1761 | + _selectedColor->setColorAlpha(color, SP_RGBA32_A_F(row[_model->_colHighlight])); |
1762 | } |
1763 | //Show the color selector dialog |
1764 | _colorSelectorDialog.show(); |
1765 | @@ -1440,17 +1441,16 @@ |
1766 | * @param csel Color selector |
1767 | * @param cp Objects panel |
1768 | */ |
1769 | -void sp_highlight_picker_color_mod(SPColorSelector *csel, GObject * cp) |
1770 | +void ObjectsPanel::_highlightPickerColorMod() |
1771 | { |
1772 | SPColor color; |
1773 | float alpha = 0; |
1774 | - csel->base->getColorAlpha(color, alpha); |
1775 | + _selectedColor->colorAlpha(color, alpha); |
1776 | + |
1777 | guint32 rgba = color.toRGBA32( alpha ); |
1778 | - |
1779 | - ObjectsPanel *ptr = reinterpret_cast<ObjectsPanel *>(cp); |
1780 | |
1781 | //Set the highlight color for all items in the _highlight_target (all selected items) |
1782 | - for (std::vector<SPItem *>::iterator iter = ptr->_highlight_target.begin(); iter != ptr->_highlight_target.end(); ++iter) |
1783 | + for (std::vector<SPItem *>::iterator iter = _highlight_target.begin(); iter != _highlight_target.end(); ++iter) |
1784 | { |
1785 | SPItem * target = *iter; |
1786 | target->setHighlightColor(rgba); |
1787 | @@ -1922,18 +1922,16 @@ |
1788 | _colorSelectorDialog.set_title (_("Select Highlight Color")); |
1789 | _colorSelectorDialog.set_border_width (4); |
1790 | _colorSelectorDialog.property_modal() = true; |
1791 | - _colorSelector = SP_COLOR_SELECTOR(sp_color_selector_new(SP_TYPE_COLOR_NOTEBOOK)); |
1792 | + _selectedColor.reset(new Inkscape::UI::SelectedColor); |
1793 | + Gtk::Widget *color_selector = Gtk::manage(new Inkscape::UI::Widget::ColorNotebook(*_selectedColor)); |
1794 | _colorSelectorDialog.get_vbox()->pack_start ( |
1795 | - *Glib::wrap(&_colorSelector->vbox), true, true, 0); |
1796 | - |
1797 | - g_signal_connect(G_OBJECT(_colorSelector), "dragged", |
1798 | - G_CALLBACK(sp_highlight_picker_color_mod), (void *)this); |
1799 | - g_signal_connect(G_OBJECT(_colorSelector), "released", |
1800 | - G_CALLBACK(sp_highlight_picker_color_mod), (void *)this); |
1801 | - g_signal_connect(G_OBJECT(_colorSelector), "changed", |
1802 | - G_CALLBACK(sp_highlight_picker_color_mod), (void *)this); |
1803 | - |
1804 | - gtk_widget_show(GTK_WIDGET(_colorSelector)); |
1805 | + *color_selector, true, true, 0); |
1806 | + |
1807 | + _selectedColor->signal_dragged.connect(sigc::mem_fun(*this, &ObjectsPanel::_highlightPickerColorMod)); |
1808 | + _selectedColor->signal_released.connect(sigc::mem_fun(*this, &ObjectsPanel::_highlightPickerColorMod)); |
1809 | + _selectedColor->signal_changed.connect(sigc::mem_fun(*this, &ObjectsPanel::_highlightPickerColorMod)); |
1810 | + |
1811 | + color_selector->show(); |
1812 | |
1813 | setDesktop( targetDesktop ); |
1814 | |
1815 | @@ -1951,7 +1949,6 @@ |
1816 | { |
1817 | //Close the highlight selection dialog |
1818 | _colorSelectorDialog.hide(); |
1819 | - _colorSelector = NULL; |
1820 | |
1821 | //Set the desktop to null, which will disconnect all object watchers |
1822 | setDesktop(NULL); |
1823 | |
1824 | === modified file 'src/ui/dialog/objects.h' |
1825 | --- src/ui/dialog/objects.h 2015-04-27 23:38:31 +0000 |
1826 | +++ src/ui/dialog/objects.h 2015-05-17 12:22:15 +0000 |
1827 | @@ -16,6 +16,7 @@ |
1828 | # include <config.h> |
1829 | #endif |
1830 | |
1831 | +#include <boost/scoped_ptr.hpp> |
1832 | #include <gtkmm/box.h> |
1833 | #include <gtkmm/treeview.h> |
1834 | #include <gtkmm/treestore.h> |
1835 | @@ -36,6 +37,9 @@ |
1836 | namespace Inkscape { |
1837 | |
1838 | namespace UI { |
1839 | + |
1840 | +class SelectedColor; |
1841 | + |
1842 | namespace Dialog { |
1843 | |
1844 | |
1845 | @@ -166,8 +170,7 @@ |
1846 | Gtk::Alignment _blur_alignment; |
1847 | |
1848 | Gtk::Dialog _colorSelectorDialog; |
1849 | - SPColorSelector *_colorSelector; |
1850 | - |
1851 | + boost::scoped_ptr<Inkscape::UI::SelectedColor> _selectedColor; |
1852 | |
1853 | //Methods: |
1854 | |
1855 | @@ -233,7 +236,7 @@ |
1856 | |
1857 | void setupDialog(const Glib::ustring &title); |
1858 | |
1859 | - friend void sp_highlight_picker_color_mod(SPColorSelector *csel, GObject *cp); |
1860 | + void _highlightPickerColorMod(); |
1861 | |
1862 | }; |
1863 | |
1864 | |
1865 | === modified file 'src/ui/dialog/tags.cpp' |
1866 | --- src/ui/dialog/tags.cpp 2015-02-27 03:21:48 +0000 |
1867 | +++ src/ui/dialog/tags.cpp 2015-05-17 12:22:15 +0000 |
1868 | @@ -51,7 +51,7 @@ |
1869 | #include "ui/tools/tool-base.h" //"event-context.h" |
1870 | #include "selection.h" |
1871 | //#include "dialogs/dialog-events.h" |
1872 | -#include "widgets/sp-color-notebook.h" |
1873 | +#include "ui/widget/color-notebook.h" |
1874 | #include "style.h" |
1875 | #include "filter-chemistry.h" |
1876 | #include "filters/blend.h" |
1877 | |
1878 | === added file 'src/ui/selected-color.cpp' |
1879 | --- src/ui/selected-color.cpp 1970-01-01 00:00:00 +0000 |
1880 | +++ src/ui/selected-color.cpp 2015-05-17 12:22:15 +0000 |
1881 | @@ -0,0 +1,163 @@ |
1882 | +/** @file |
1883 | + * Color selected in color selector widget. |
1884 | + * This file was created during the refactoring of SPColorSelector |
1885 | + *//* |
1886 | + * Authors: |
1887 | + * bulia byak <buliabyak@users.sf.net> |
1888 | + * Jon A. Cruz <jon@joncruz.org> |
1889 | + * Tomasz Boczkowski <penginsbacon@gmail.com> |
1890 | + * |
1891 | + * Copyright (C) 2014 Authors |
1892 | + * Released under GNU GPL, read the file 'COPYING' for more information |
1893 | + */ |
1894 | +#ifdef HAVE_CONFIG_H |
1895 | +# include "config.h" |
1896 | +#endif |
1897 | + |
1898 | +#include <glibmm/ustring.h> |
1899 | +#include <cmath> |
1900 | + |
1901 | +#include "svg/svg-icc-color.h" |
1902 | +#include "ui/selected-color.h" |
1903 | + |
1904 | +namespace Inkscape { |
1905 | +namespace UI { |
1906 | + |
1907 | +double const SelectedColor::_EPSILON = 1e-4; |
1908 | + |
1909 | +SelectedColor::SelectedColor() |
1910 | + : _color(0) |
1911 | + , _alpha(1.0) |
1912 | + , _held(false) |
1913 | + , _virgin(true) |
1914 | + , _updating(false) |
1915 | +{ |
1916 | + |
1917 | +} |
1918 | + |
1919 | +SelectedColor::~SelectedColor() { |
1920 | + |
1921 | +} |
1922 | + |
1923 | +void SelectedColor::setColor(SPColor const &color) |
1924 | +{ |
1925 | + setColorAlpha( color, _alpha); |
1926 | +} |
1927 | + |
1928 | +SPColor SelectedColor::color() const |
1929 | +{ |
1930 | + return _color; |
1931 | +} |
1932 | + |
1933 | +void SelectedColor::setAlpha(gfloat alpha) |
1934 | +{ |
1935 | + g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) ); |
1936 | + setColorAlpha( _color, alpha); |
1937 | +} |
1938 | + |
1939 | +gfloat SelectedColor::alpha() const |
1940 | +{ |
1941 | + return _alpha; |
1942 | +} |
1943 | + |
1944 | +void SelectedColor::setValue(guint32 value) |
1945 | +{ |
1946 | + SPColor color(value); |
1947 | + gfloat alpha = SP_RGBA32_A_F(value); |
1948 | + setColorAlpha(color, alpha); |
1949 | +} |
1950 | + |
1951 | +guint32 SelectedColor::value() const |
1952 | +{ |
1953 | + return color().toRGBA32(_alpha); |
1954 | +} |
1955 | + |
1956 | +void SelectedColor::setColorAlpha(SPColor const &color, gfloat alpha, bool emit_signal) |
1957 | +{ |
1958 | +#ifdef DUMP_CHANGE_INFO |
1959 | + 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")); |
1960 | +#endif |
1961 | + g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) ); |
1962 | + |
1963 | + if (_updating) { |
1964 | + return; |
1965 | + } |
1966 | + |
1967 | +#ifdef DUMP_CHANGE_INFO |
1968 | + g_message("---- SelectedColor::setColorAlpha virgin:%s !close:%s alpha is:%s", |
1969 | + (_virgin?"YES":"no"), |
1970 | + (!color.isClose( _color, _EPSILON )?"YES":"no"), |
1971 | + ((fabs((_alpha) - (alpha)) >= _EPSILON )?"YES":"no") |
1972 | + ); |
1973 | +#endif |
1974 | + |
1975 | + if ( _virgin || !color.isClose( _color, _EPSILON ) || |
1976 | + (fabs((_alpha) - (alpha)) >= _EPSILON )) { |
1977 | + |
1978 | + _virgin = false; |
1979 | + |
1980 | + _color = color; |
1981 | + _alpha = alpha; |
1982 | + |
1983 | + if (emit_signal) |
1984 | + { |
1985 | + _updating = true; |
1986 | + if (_held) { |
1987 | + signal_dragged.emit(); |
1988 | + } else { |
1989 | + signal_changed.emit(); |
1990 | + } |
1991 | + _updating = false; |
1992 | + } |
1993 | + |
1994 | +#ifdef DUMP_CHANGE_INFO |
1995 | + } else { |
1996 | + g_message("++++ SelectedColor::setColorAlpha color:%08x ==> _color:%08X isClose:%s", color.toRGBA32(alpha), _color.toRGBA32(_alpha), |
1997 | + (color.isClose( _color, _EPSILON )?"YES":"no")); |
1998 | +#endif |
1999 | + } |
2000 | +} |
2001 | + |
2002 | +void SelectedColor::colorAlpha(SPColor &color, gfloat &alpha) const { |
2003 | + color = _color; |
2004 | + alpha = _alpha; |
2005 | +} |
2006 | + |
2007 | +void SelectedColor::setHeld(bool held) { |
2008 | + if (_updating) { |
2009 | + return; |
2010 | + } |
2011 | + bool grabbed = held && !_held; |
2012 | + bool released = !held && _held; |
2013 | + |
2014 | + _held = held; |
2015 | + |
2016 | + _updating = true; |
2017 | + if (grabbed) { |
2018 | + signal_grabbed.emit(); |
2019 | + } |
2020 | + |
2021 | + if (released) { |
2022 | + signal_released.emit(); |
2023 | + signal_changed.emit(); |
2024 | + } |
2025 | + _updating = false; |
2026 | +} |
2027 | + |
2028 | +void SelectedColor::preserveICC() { |
2029 | + _color.icc = _color.icc ? new SVGICCColor(*_color.icc) : 0; |
2030 | +} |
2031 | + |
2032 | +} |
2033 | +} |
2034 | + |
2035 | +/* |
2036 | + Local Variables: |
2037 | + mode:c++ |
2038 | + c-file-style:"stroustrup" |
2039 | + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) |
2040 | + indent-tabs-mode:nil |
2041 | + fill-column:99 |
2042 | + End: |
2043 | +*/ |
2044 | +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : |
2045 | |
2046 | === added file 'src/ui/selected-color.h' |
2047 | --- src/ui/selected-color.h 1970-01-01 00:00:00 +0000 |
2048 | +++ src/ui/selected-color.h 2015-05-17 12:22:15 +0000 |
2049 | @@ -0,0 +1,96 @@ |
2050 | +/** @file |
2051 | + * Color selected in color selector widget. |
2052 | + * This file was created during the refactoring of SPColorSelector |
2053 | + *//* |
2054 | + * Authors: |
2055 | + * bulia byak <buliabyak@users.sf.net> |
2056 | + * Jon A. Cruz <jon@joncruz.org> |
2057 | + * Tomasz Boczkowski <penginsbacon@gmail.com> |
2058 | + * |
2059 | + * Copyright (C) 2014 Authors |
2060 | + * Released under GNU GPL, read the file 'COPYING' for more information |
2061 | + */ |
2062 | +#ifndef SEEN_SELECTED_COLOR |
2063 | +#define SEEN_SELECTED_COLOR |
2064 | + |
2065 | +#include <sigc++/signal.h> |
2066 | +#include "color.h" |
2067 | + |
2068 | +namespace Gtk |
2069 | +{ |
2070 | + class Widget; |
2071 | +} |
2072 | + |
2073 | +namespace Inkscape { |
2074 | +namespace UI { |
2075 | + |
2076 | +class SelectedColor { |
2077 | +public: |
2078 | + SelectedColor(); |
2079 | + virtual ~SelectedColor(); |
2080 | + |
2081 | + void setColor(SPColor const &color); |
2082 | + SPColor color() const; |
2083 | + |
2084 | + void setAlpha(gfloat alpha); |
2085 | + gfloat alpha() const; |
2086 | + |
2087 | + void setValue(guint32 value); |
2088 | + guint32 value() const; |
2089 | + |
2090 | + void setColorAlpha(SPColor const &color, gfloat alpha, bool emit_signal = true); |
2091 | + void colorAlpha(SPColor &color, gfloat &alpha) const; |
2092 | + |
2093 | + void setHeld(bool held); |
2094 | + |
2095 | + void preserveICC(); |
2096 | + |
2097 | + sigc::signal<void> signal_grabbed; |
2098 | + sigc::signal<void> signal_dragged; |
2099 | + sigc::signal<void> signal_released; |
2100 | + sigc::signal<void> signal_changed; |
2101 | +private: |
2102 | + // By default, disallow copy constructor and assignment operator |
2103 | + SelectedColor(SelectedColor const &obj); |
2104 | + SelectedColor& operator=(SelectedColor const &obj); |
2105 | + |
2106 | + SPColor _color; |
2107 | + /** |
2108 | + * Color alpha value guaranteed to be in [0, 1]. |
2109 | + */ |
2110 | + gfloat _alpha; |
2111 | + |
2112 | + bool _held; |
2113 | + /** |
2114 | + * This flag is true if no color is set yet |
2115 | + */ |
2116 | + bool _virgin; |
2117 | + |
2118 | + bool _updating; |
2119 | + |
2120 | + static double const _EPSILON; |
2121 | +}; |
2122 | + |
2123 | +class ColorSelectorFactory { |
2124 | +public: |
2125 | + virtual ~ColorSelectorFactory() { |
2126 | + } |
2127 | + |
2128 | + virtual Gtk::Widget* createWidget(SelectedColor &color) const = 0; |
2129 | + virtual Glib::ustring modeName() const = 0; |
2130 | +}; |
2131 | + |
2132 | +} |
2133 | +} |
2134 | + |
2135 | +#endif |
2136 | +/* |
2137 | + Local Variables: |
2138 | + mode:c++ |
2139 | + c-file-style:"stroustrup" |
2140 | + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) |
2141 | + indent-tabs-mode:nil |
2142 | + fill-column:99 |
2143 | + End: |
2144 | +*/ |
2145 | +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : |
2146 | |
2147 | === modified file 'src/ui/widget/Makefile_insert' |
2148 | --- src/ui/widget/Makefile_insert 2015-05-12 19:43:24 +0000 |
2149 | +++ src/ui/widget/Makefile_insert 2015-05-17 12:22:15 +0000 |
2150 | @@ -6,10 +6,22 @@ |
2151 | ui/widget/attr-widget.h \ |
2152 | ui/widget/button.h \ |
2153 | ui/widget/button.cpp \ |
2154 | + ui/widget/color-entry.cpp \ |
2155 | + ui/widget/color-entry.h \ |
2156 | + ui/widget/color-icc-selector.cpp \ |
2157 | + ui/widget/color-icc-selector.h \ |
2158 | + ui/widget/color-notebook.cpp \ |
2159 | + ui/widget/color-notebook.h \ |
2160 | + ui/widget/color-wheel-selector.cpp \ |
2161 | + ui/widget/color-wheel-selector.h \ |
2162 | ui/widget/color-picker.cpp \ |
2163 | ui/widget/color-picker.h \ |
2164 | ui/widget/color-preview.cpp \ |
2165 | ui/widget/color-preview.h \ |
2166 | + ui/widget/color-slider.cpp \ |
2167 | + ui/widget/color-slider.h \ |
2168 | + ui/widget/color-scales.cpp \ |
2169 | + ui/widget/color-scales.h \ |
2170 | ui/widget/combo-enums.h \ |
2171 | ui/widget/dock.h \ |
2172 | ui/widget/dock.cpp \ |
2173 | |
2174 | === added file 'src/ui/widget/color-entry.cpp' |
2175 | --- src/ui/widget/color-entry.cpp 1970-01-01 00:00:00 +0000 |
2176 | +++ src/ui/widget/color-entry.cpp 2015-05-17 12:22:15 +0000 |
2177 | @@ -0,0 +1,104 @@ |
2178 | +/** @file |
2179 | + * Entry widget for typing color value in css form |
2180 | + *//* |
2181 | + * Authors: |
2182 | + * Tomasz Boczkowski <penginsbacon@gmail.com> |
2183 | + * |
2184 | + * Copyright (C) 2014 Authors |
2185 | + * Released under GNU GPL, read the file 'COPYING' for more information |
2186 | + */ |
2187 | +#include <glibmm.h> |
2188 | +#include <glibmm/i18n.h> |
2189 | +#include <iomanip> |
2190 | + |
2191 | +#include "color-entry.h" |
2192 | + |
2193 | +namespace Inkscape { |
2194 | +namespace UI { |
2195 | +namespace Widget { |
2196 | + |
2197 | +ColorEntry::ColorEntry(SelectedColor &color) |
2198 | + : _color(color) |
2199 | + , _updating(false) |
2200 | +{ |
2201 | + _color_changed_connection = color.signal_changed.connect(sigc::mem_fun(this, &ColorEntry::_onColorChanged)); |
2202 | + _color_dragged_connection = color.signal_dragged.connect(sigc::mem_fun(this, &ColorEntry::_onColorChanged)); |
2203 | + _onColorChanged(); |
2204 | + |
2205 | + set_max_length(8); |
2206 | + set_width_chars(8); |
2207 | + set_tooltip_text(_("Hexadecimal RGBA value of the color")); |
2208 | +} |
2209 | + |
2210 | +ColorEntry::~ColorEntry() |
2211 | +{ |
2212 | + _color_changed_connection.disconnect(); |
2213 | + _color_dragged_connection.disconnect(); |
2214 | +} |
2215 | + |
2216 | +void ColorEntry::on_changed() |
2217 | +{ |
2218 | + if (_updating) { |
2219 | + return; |
2220 | + } |
2221 | + |
2222 | + Glib::ustring text = get_text(); |
2223 | + bool changed = false; |
2224 | + |
2225 | + // Coerce the value format to eight hex digits |
2226 | + if (!text.empty() && text[0] == '#') { |
2227 | + changed = true; |
2228 | + text.erase(0, 1); |
2229 | + if (text.size() == 6) { |
2230 | + // it was a standard RGB hex |
2231 | + unsigned int alpha = SP_COLOR_F_TO_U(_color.alpha()); |
2232 | + text += Glib::ustring::format(std::hex, std::setw(2), std::setfill(L'0'), alpha); |
2233 | + } |
2234 | + } |
2235 | + |
2236 | + gchar *str = g_strdup(text.c_str()); |
2237 | + gchar *end = 0; |
2238 | + guint64 rgba = g_ascii_strtoull(str, &end, 16); |
2239 | + if (end != str) { |
2240 | + ptrdiff_t len = end - str; |
2241 | + if (len < 8) { |
2242 | + rgba = rgba << (4 * (8 - len)); |
2243 | + } |
2244 | + if (changed) { |
2245 | + set_text(str); |
2246 | + } |
2247 | + SPColor color(rgba); |
2248 | + _color.setColorAlpha(color, SP_RGBA32_A_F(rgba)); |
2249 | + } |
2250 | + g_free(str); |
2251 | +} |
2252 | + |
2253 | + |
2254 | +void ColorEntry::_onColorChanged() |
2255 | +{ |
2256 | + SPColor color = _color.color(); |
2257 | + gdouble alpha = _color.alpha(); |
2258 | + |
2259 | + guint32 rgba = color.toRGBA32(alpha); |
2260 | + Glib::ustring text = Glib::ustring::format(std::hex, std::setw(8), std::setfill(L'0'), rgba); |
2261 | + |
2262 | + Glib::ustring old_text = get_text(); |
2263 | + if (old_text != text) { |
2264 | + _updating = true; |
2265 | + set_text(text); |
2266 | + _updating = false; |
2267 | + } |
2268 | +} |
2269 | +} |
2270 | +} |
2271 | +} |
2272 | +/* |
2273 | + Local Variables: |
2274 | + mode:c++ |
2275 | + c-file-style:"stroustrup" |
2276 | + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) |
2277 | + indent-tabs-mode:nil |
2278 | + fill-column:99 |
2279 | + End: |
2280 | +*/ |
2281 | +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : |
2282 | |
2283 | === added file 'src/ui/widget/color-entry.h' |
2284 | --- src/ui/widget/color-entry.h 1970-01-01 00:00:00 +0000 |
2285 | +++ src/ui/widget/color-entry.h 2015-05-17 12:22:15 +0000 |
2286 | @@ -0,0 +1,53 @@ |
2287 | +/** @file |
2288 | + * Entry widget for typing color value in css form |
2289 | + *//* |
2290 | + * Authors: |
2291 | + * Tomasz Boczkowski <penginsbacon@gmail.com> |
2292 | + * |
2293 | + * Copyright (C) 2014 Authors |
2294 | + * Released under GNU GPL, read the file 'COPYING' for more information |
2295 | + */ |
2296 | + |
2297 | +#ifndef SEEN_COLOR_ENTRY_H |
2298 | +#define SEEN_COLOR_ENTRY_H_ |
2299 | + |
2300 | +#include <gtkmm/entry.h> |
2301 | +#include "ui/selected-color.h" |
2302 | + |
2303 | +namespace Inkscape { |
2304 | +namespace UI { |
2305 | +namespace Widget { |
2306 | + |
2307 | +class ColorEntry : public Gtk::Entry |
2308 | +{ |
2309 | +public: |
2310 | + ColorEntry(SelectedColor &color); |
2311 | + virtual ~ColorEntry(); |
2312 | + |
2313 | +protected: |
2314 | + void on_changed(); |
2315 | + |
2316 | +private: |
2317 | + void _onColorChanged(); |
2318 | + |
2319 | + SelectedColor &_color; |
2320 | + sigc::connection _color_changed_connection; |
2321 | + sigc::connection _color_dragged_connection; |
2322 | + bool _updating; |
2323 | +}; |
2324 | + |
2325 | +} |
2326 | +} |
2327 | +} |
2328 | + |
2329 | +#endif |
2330 | +/* |
2331 | + Local Variables: |
2332 | + mode:c++ |
2333 | + c-file-style:"stroustrup" |
2334 | + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) |
2335 | + indent-tabs-mode:nil |
2336 | + fill-column:99 |
2337 | + End: |
2338 | +*/ |
2339 | +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 : |
2340 | |
2341 | === renamed file 'src/widgets/sp-color-icc-selector.cpp' => 'src/ui/widget/color-icc-selector.cpp' |
2342 | --- src/widgets/sp-color-icc-selector.cpp 2014-10-08 02:22:03 +0000 |
2343 | +++ src/ui/widget/color-icc-selector.cpp 2015-05-17 12:22:15 +0000 |
2344 | @@ -1,24 +1,26 @@ |
2345 | #ifdef HAVE_CONFIG_H |
2346 | -# include "config.h" |
2347 | +#include "config.h" |
2348 | #endif |
2349 | |
2350 | -#include "gradient-vector.h" |
2351 | #include <math.h> |
2352 | +#include <gtkmm/adjustment.h> |
2353 | +#include <glibmm/i18n.h> |
2354 | + |
2355 | #include <gtk/gtk.h> |
2356 | -#include <glibmm/i18n.h> |
2357 | #include <map> |
2358 | #include <set> |
2359 | #include <vector> |
2360 | |
2361 | #include "ui/dialog-events.h" |
2362 | -#include "sp-color-icc-selector.h" |
2363 | -#include "sp-color-scales.h" |
2364 | -#include "sp-color-slider.h" |
2365 | +#include "ui/widget/color-icc-selector.h" |
2366 | +#include "ui/widget/color-scales.h" |
2367 | +#include "ui/widget/color-slider.h" |
2368 | #include "svg/svg-icc-color.h" |
2369 | #include "colorspace.h" |
2370 | #include "document.h" |
2371 | #include "inkscape.h" |
2372 | #include "profile-manager.h" |
2373 | +#include "widgets/gradient-vector.h" |
2374 | |
2375 | #define noDEBUG_LCMS |
2376 | |
2377 | @@ -32,137 +34,32 @@ |
2378 | #endif // DEBUG_LCMS |
2379 | #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2380 | |
2381 | - |
2382 | #ifdef DEBUG_LCMS |
2383 | extern guint update_in_progress; |
2384 | -#define DEBUG_MESSAGE(key, ...) \ |
2385 | -{\ |
2386 | - Inkscape::Preferences *prefs = Inkscape::Preferences::get();\ |
2387 | - bool dump = prefs->getBool("/options/scislac/" #key);\ |
2388 | - bool dumpD = prefs->getBool("/options/scislac/" #key "D");\ |
2389 | - bool dumpD2 = prefs->getBool("/options/scislac/" #key "D2");\ |
2390 | - dumpD &&= ( (update_in_progress == 0) || dumpD2 );\ |
2391 | - if ( dump )\ |
2392 | - {\ |
2393 | - g_message( __VA_ARGS__ );\ |
2394 | -\ |
2395 | - }\ |
2396 | - if ( dumpD )\ |
2397 | - {\ |
2398 | - GtkWidget *dialog = gtk_message_dialog_new(NULL,\ |
2399 | - GTK_DIALOG_DESTROY_WITH_PARENT, \ |
2400 | - GTK_MESSAGE_INFO, \ |
2401 | - GTK_BUTTONS_OK, \ |
2402 | - __VA_ARGS__ \ |
2403 | - );\ |
2404 | - g_signal_connect_swapped(dialog, "response",\ |
2405 | - G_CALLBACK(gtk_widget_destroy), \ |
2406 | - dialog); \ |
2407 | - gtk_widget_show_all( dialog );\ |
2408 | - }\ |
2409 | -} |
2410 | +#define DEBUG_MESSAGE(key, ...) \ |
2411 | + { \ |
2412 | + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); \ |
2413 | + bool dump = prefs->getBool("/options/scislac/" #key); \ |
2414 | + bool dumpD = prefs->getBool("/options/scislac/" #key "D"); \ |
2415 | + bool dumpD2 = prefs->getBool("/options/scislac/" #key "D2"); \ |
2416 | + dumpD && = ((update_in_progress == 0) || dumpD2); \ |
2417 | + if (dump) { \ |
2418 | + g_message(__VA_ARGS__); \ |
2419 | + } \ |
2420 | + if (dumpD) { \ |
2421 | + GtkWidget *dialog = gtk_message_dialog_new(NULL, GTK_DIALOG_DESTROY_WITH_PARENT, GTK_MESSAGE_INFO, \ |
2422 | + GTK_BUTTONS_OK, __VA_ARGS__); \ |
2423 | + g_signal_connect_swapped(dialog, "response", G_CALLBACK(gtk_widget_destroy), dialog); \ |
2424 | + gtk_widget_show_all(dialog); \ |
2425 | + } \ |
2426 | + } |
2427 | #endif // DEBUG_LCMS |
2428 | |
2429 | |
2430 | - |
2431 | -G_BEGIN_DECLS |
2432 | - |
2433 | -static void sp_color_icc_selector_dispose(GObject *object); |
2434 | -static void sp_color_icc_selector_show_all (GtkWidget *widget); |
2435 | -static void sp_color_icc_selector_hide(GtkWidget *widget); |
2436 | - |
2437 | -G_END_DECLS |
2438 | - |
2439 | -/** |
2440 | - * Class containing the parts for a single color component's UI presence. |
2441 | - */ |
2442 | -class ComponentUI |
2443 | -{ |
2444 | -public: |
2445 | - ComponentUI() : |
2446 | - _component(), |
2447 | - _adj(0), |
2448 | - _slider(0), |
2449 | - _btn(0), |
2450 | - _label(0), |
2451 | - _map(0) |
2452 | - { |
2453 | - } |
2454 | - |
2455 | - ComponentUI(colorspace::Component const &component) : |
2456 | - _component(component), |
2457 | - _adj(0), |
2458 | - _slider(0), |
2459 | - _btn(0), |
2460 | - _label(0), |
2461 | - _map(0) |
2462 | - { |
2463 | - } |
2464 | - |
2465 | - colorspace::Component _component; |
2466 | - GtkAdjustment *_adj; // Component adjustment |
2467 | - GtkWidget *_slider; |
2468 | - GtkWidget *_btn; // spinbutton |
2469 | - GtkWidget *_label; // Label |
2470 | - guchar *_map; |
2471 | -}; |
2472 | - |
2473 | -/** |
2474 | - * Class that implements the internals of the selector. |
2475 | - */ |
2476 | -class ColorICCSelectorImpl |
2477 | -{ |
2478 | -public: |
2479 | - |
2480 | - ColorICCSelectorImpl( ColorICCSelector *owner); |
2481 | - |
2482 | - ~ColorICCSelectorImpl(); |
2483 | - |
2484 | - static void _adjustmentChanged ( GtkAdjustment *adjustment, SPColorICCSelector *cs ); |
2485 | - |
2486 | - static void _sliderGrabbed( SPColorSlider *slider, SPColorICCSelector *cs ); |
2487 | - static void _sliderReleased( SPColorSlider *slider, SPColorICCSelector *cs ); |
2488 | - static void _sliderChanged( SPColorSlider *slider, SPColorICCSelector *cs ); |
2489 | - |
2490 | - static void _profileSelected( GtkWidget* src, gpointer data ); |
2491 | - static void _fixupHit( GtkWidget* src, gpointer data ); |
2492 | - |
2493 | -#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2494 | - void _setProfile( SVGICCColor* profile ); |
2495 | - void _switchToProfile( gchar const* name ); |
2496 | -#endif |
2497 | - void _updateSliders( gint ignore ); |
2498 | - void _profilesChanged( std::string const & name ); |
2499 | - |
2500 | - ColorICCSelector *_owner; |
2501 | - |
2502 | - gboolean _updating : 1; |
2503 | - gboolean _dragging : 1; |
2504 | - |
2505 | - guint32 _fixupNeeded; |
2506 | - GtkWidget* _fixupBtn; |
2507 | - GtkWidget* _profileSel; |
2508 | - |
2509 | - std::vector<ComponentUI> _compUI; |
2510 | - |
2511 | - GtkAdjustment* _adj; // Channel adjustment |
2512 | - GtkWidget* _slider; |
2513 | - GtkWidget* _sbtn; // Spinbutton |
2514 | - GtkWidget* _label; // Label |
2515 | - |
2516 | -#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2517 | - std::string _profileName; |
2518 | - Inkscape::ColorProfile* _prof; |
2519 | - guint _profChannelCount; |
2520 | - gulong _profChangedID; |
2521 | -#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2522 | -}; |
2523 | - |
2524 | #define XPAD 4 |
2525 | #define YPAD 1 |
2526 | |
2527 | -namespace |
2528 | -{ |
2529 | +namespace { |
2530 | |
2531 | size_t maxColorspaceComponentCount = 0; |
2532 | |
2533 | @@ -187,91 +84,40 @@ |
2534 | /** |
2535 | * Helper function to handle GTK2/GTK3 attachment #ifdef code. |
2536 | */ |
2537 | -void attachToGridOrTable(GtkWidget *parent, |
2538 | - GtkWidget *child, |
2539 | - guint left, |
2540 | - guint top, |
2541 | - guint width, |
2542 | - guint height, |
2543 | - bool hexpand = false, |
2544 | - bool centered = false, |
2545 | - guint xpadding = XPAD, |
2546 | - guint ypadding = YPAD) |
2547 | +void attachToGridOrTable(GtkWidget *parent, GtkWidget *child, guint left, guint top, guint width, guint height, |
2548 | + bool hexpand = false, bool centered = false, guint xpadding = XPAD, guint ypadding = YPAD) |
2549 | { |
2550 | -#if GTK_CHECK_VERSION(3,0,0) |
2551 | - #if GTK_CHECK_VERSION(3,12,0) |
2552 | - gtk_widget_set_margin_start( child, xpadding ); |
2553 | - gtk_widget_set_margin_end( child, xpadding ); |
2554 | - #else |
2555 | - gtk_widget_set_margin_left( child, xpadding ); |
2556 | - gtk_widget_set_margin_right( child, xpadding ); |
2557 | - #endif |
2558 | +#if GTK_CHECK_VERSION(3, 0, 0) |
2559 | + #if GTK_CHECK_VERSION(3, 12, 0) |
2560 | + gtk_widget_set_margin_start(child, xpadding); |
2561 | + gtk_widget_set_margin_end(child, xpadding); |
2562 | + #else |
2563 | + gtk_widget_set_margin_left(child, xpadding); |
2564 | + gtk_widget_set_margin_right(child, xpadding); |
2565 | + #endif |
2566 | |
2567 | - gtk_widget_set_margin_top( child, ypadding ); |
2568 | - gtk_widget_set_margin_bottom( child, ypadding ); |
2569 | + gtk_widget_set_margin_top(child, ypadding); |
2570 | + gtk_widget_set_margin_bottom(child, ypadding); |
2571 | if (hexpand) { |
2572 | gtk_widget_set_hexpand(child, TRUE); |
2573 | } |
2574 | if (centered) { |
2575 | - gtk_widget_set_halign( child, GTK_ALIGN_CENTER ); |
2576 | - gtk_widget_set_valign( child, GTK_ALIGN_CENTER ); |
2577 | + gtk_widget_set_halign(child, GTK_ALIGN_CENTER); |
2578 | + gtk_widget_set_valign(child, GTK_ALIGN_CENTER); |
2579 | } |
2580 | - gtk_grid_attach( GTK_GRID(parent), child, left, top, width, height ); |
2581 | + gtk_grid_attach(GTK_GRID(parent), child, left, top, width, height); |
2582 | #else |
2583 | - GtkAttachOptions xoptions = centered ? static_cast<GtkAttachOptions>(0) : hexpand ? (GTK_EXPAND | GTK_FILL) : GTK_FILL; |
2584 | + GtkAttachOptions xoptions = |
2585 | + centered ? static_cast<GtkAttachOptions>(0) : hexpand ? (GTK_EXPAND | GTK_FILL) : GTK_FILL; |
2586 | GtkAttachOptions yoptions = centered ? static_cast<GtkAttachOptions>(0) : GTK_FILL; |
2587 | |
2588 | - gtk_table_attach( GTK_TABLE(parent), child, left, left + width, top, top + height, xoptions, yoptions, xpadding, ypadding ); |
2589 | + gtk_table_attach(GTK_TABLE(parent), child, left, left + width, top, top + height, xoptions, yoptions, xpadding, |
2590 | + ypadding); |
2591 | #endif |
2592 | } |
2593 | |
2594 | } // namespace |
2595 | |
2596 | -G_DEFINE_TYPE(SPColorICCSelector, sp_color_icc_selector, SP_TYPE_COLOR_SELECTOR); |
2597 | - |
2598 | -static void sp_color_icc_selector_class_init(SPColorICCSelectorClass *klass) |
2599 | -{ |
2600 | - static const gchar* nameset[] = {N_("CMS"), 0}; |
2601 | - GObjectClass *object_class = G_OBJECT_CLASS(klass); |
2602 | - GtkWidgetClass *widget_class = GTK_WIDGET_CLASS(klass); |
2603 | - SPColorSelectorClass *selector_class = SP_COLOR_SELECTOR_CLASS (klass); |
2604 | - |
2605 | - selector_class->name = nameset; |
2606 | - selector_class->submode_count = 1; |
2607 | - |
2608 | - object_class->dispose = sp_color_icc_selector_dispose; |
2609 | - |
2610 | - widget_class->show_all = sp_color_icc_selector_show_all; |
2611 | - widget_class->hide = sp_color_icc_selector_hide; |
2612 | -} |
2613 | - |
2614 | - |
2615 | -ColorICCSelector::ColorICCSelector( SPColorSelector* csel ) |
2616 | - : ColorSelector( csel ), |
2617 | - _impl(NULL) |
2618 | -{ |
2619 | -} |
2620 | - |
2621 | -ColorICCSelector::~ColorICCSelector() |
2622 | -{ |
2623 | - if (_impl) |
2624 | - { |
2625 | - delete _impl; |
2626 | - _impl = 0; |
2627 | - } |
2628 | -} |
2629 | - |
2630 | -void sp_color_icc_selector_init(SPColorICCSelector *cs) |
2631 | -{ |
2632 | - SP_COLOR_SELECTOR(cs)->base = new ColorICCSelector( SP_COLOR_SELECTOR(cs) ); |
2633 | - |
2634 | - if ( SP_COLOR_SELECTOR(cs)->base ) |
2635 | - { |
2636 | - SP_COLOR_SELECTOR(cs)->base->init(); |
2637 | - } |
2638 | -} |
2639 | - |
2640 | - |
2641 | /* |
2642 | icSigRgbData |
2643 | icSigCmykData |
2644 | @@ -283,32 +129,32 @@ |
2645 | |
2646 | |
2647 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2648 | -static cmsUInt16Number* getScratch() { |
2649 | +static cmsUInt16Number *getScratch() |
2650 | +{ |
2651 | // bytes per pixel * input channels * width |
2652 | - static cmsUInt16Number* scritch = static_cast<cmsUInt16Number*>(g_new(cmsUInt16Number, 4 * 1024)); |
2653 | + static cmsUInt16Number *scritch = static_cast<cmsUInt16Number *>(g_new(cmsUInt16Number, 4 * 1024)); |
2654 | |
2655 | return scritch; |
2656 | } |
2657 | |
2658 | -colorspace::Component::Component() : |
2659 | - name(), |
2660 | - tip(), |
2661 | - scale(1) |
2662 | -{ |
2663 | -} |
2664 | - |
2665 | -colorspace::Component::Component(std::string const &name, std::string const &tip, guint scale) : |
2666 | - name(name), |
2667 | - tip(tip), |
2668 | - scale(scale) |
2669 | -{ |
2670 | -} |
2671 | - |
2672 | -std::vector<colorspace::Component> colorspace::getColorSpaceInfo( uint32_t space ) |
2673 | +colorspace::Component::Component() |
2674 | + : name() |
2675 | + , tip() |
2676 | + , scale(1) |
2677 | +{ |
2678 | +} |
2679 | + |
2680 | +colorspace::Component::Component(std::string const &name, std::string const &tip, guint scale) |
2681 | + : name(name) |
2682 | + , tip(tip) |
2683 | + , scale(scale) |
2684 | +{ |
2685 | +} |
2686 | + |
2687 | +std::vector<colorspace::Component> colorspace::getColorSpaceInfo(uint32_t space) |
2688 | { |
2689 | static std::map<cmsUInt32Number, std::vector<Component> > sets; |
2690 | - if (sets.empty()) |
2691 | - { |
2692 | + if (sets.empty()) { |
2693 | sets[cmsSigXYZData].push_back(Component("_X", "X", 2)); // TYPE_XYZ_16 |
2694 | sets[cmsSigXYZData].push_back(Component("_Y", "Y", 1)); |
2695 | sets[cmsSigXYZData].push_back(Component("_Z", "Z", 2)); |
2696 | @@ -317,7 +163,7 @@ |
2697 | sets[cmsSigLabData].push_back(Component("_a", "a", 256)); |
2698 | sets[cmsSigLabData].push_back(Component("_b", "b", 256)); |
2699 | |
2700 | - //cmsSigLuvData |
2701 | + // cmsSigLuvData |
2702 | |
2703 | sets[cmsSigYCbCrData].push_back(Component("_Y", "Y", 1)); // TYPE_YCbCr_16 |
2704 | sets[cmsSigYCbCrData].push_back(Component("C_b", "Cb", 1)); |
2705 | @@ -350,8 +196,7 @@ |
2706 | sets[cmsSigCmyData].push_back(Component(_("_M:"), _("Magenta"), 1)); |
2707 | sets[cmsSigCmyData].push_back(Component(_("_Y:"), _("Yellow"), 1)); |
2708 | |
2709 | - for (std::map<cmsUInt32Number, std::vector<Component> >::iterator it = sets.begin(); it != sets.end(); ++it) |
2710 | - { |
2711 | + for (std::map<cmsUInt32Number, std::vector<Component> >::iterator it = sets.begin(); it != sets.end(); ++it) { |
2712 | knownColorspaces.insert(it->first); |
2713 | maxColorspaceComponentCount = std::max(maxColorspaceComponentCount, it->second.size()); |
2714 | } |
2715 | @@ -359,39 +204,148 @@ |
2716 | |
2717 | std::vector<Component> target; |
2718 | |
2719 | - if (sets.find(space) != sets.end()) |
2720 | - { |
2721 | + if (sets.find(space) != sets.end()) { |
2722 | target = sets[space]; |
2723 | } |
2724 | return target; |
2725 | } |
2726 | |
2727 | |
2728 | -std::vector<colorspace::Component> colorspace::getColorSpaceInfo( Inkscape::ColorProfile *prof ) |
2729 | -{ |
2730 | - return getColorSpaceInfo( asICColorSpaceSig(prof->getColorSpace()) ); |
2731 | -} |
2732 | - |
2733 | -#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2734 | - |
2735 | -ColorICCSelectorImpl::ColorICCSelectorImpl(ColorICCSelector *owner) : |
2736 | - _owner(owner), |
2737 | - _updating( FALSE ), |
2738 | - _dragging( FALSE ), |
2739 | - _fixupNeeded(0), |
2740 | - _fixupBtn(0), |
2741 | - _profileSel(0), |
2742 | - _compUI(), |
2743 | - _adj(0), |
2744 | - _slider(0), |
2745 | - _sbtn(0), |
2746 | - _label(0) |
2747 | -#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2748 | - , |
2749 | - _profileName(), |
2750 | - _prof(0), |
2751 | - _profChannelCount(0), |
2752 | - _profChangedID(0) |
2753 | +std::vector<colorspace::Component> colorspace::getColorSpaceInfo(Inkscape::ColorProfile *prof) |
2754 | +{ |
2755 | + return getColorSpaceInfo(asICColorSpaceSig(prof->getColorSpace())); |
2756 | +} |
2757 | + |
2758 | +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2759 | + |
2760 | +namespace Inkscape { |
2761 | +namespace UI { |
2762 | +namespace Widget { |
2763 | + |
2764 | +/** |
2765 | + * Class containing the parts for a single color component's UI presence. |
2766 | + */ |
2767 | +class ComponentUI { |
2768 | + public: |
2769 | + ComponentUI() |
2770 | + : _component() |
2771 | + , _adj(0) |
2772 | + , _slider(0) |
2773 | + , _btn(0) |
2774 | + , _label(0) |
2775 | + , _map(0) |
2776 | + { |
2777 | + } |
2778 | + |
2779 | + ComponentUI(colorspace::Component const &component) |
2780 | + : _component(component) |
2781 | + , _adj(0) |
2782 | + , _slider(0) |
2783 | + , _btn(0) |
2784 | + , _label(0) |
2785 | + , _map(0) |
2786 | + { |
2787 | + } |
2788 | + |
2789 | + colorspace::Component _component; |
2790 | + GtkAdjustment *_adj; // Component adjustment |
2791 | + Inkscape::UI::Widget::ColorSlider *_slider; |
2792 | + GtkWidget *_btn; // spinbutton |
2793 | + GtkWidget *_label; // Label |
2794 | + guchar *_map; |
2795 | +}; |
2796 | + |
2797 | +/** |
2798 | + * Class that implements the internals of the selector. |
2799 | + */ |
2800 | +class ColorICCSelectorImpl { |
2801 | + public: |
2802 | + ColorICCSelectorImpl(ColorICCSelector *owner, SelectedColor &color); |
2803 | + |
2804 | + ~ColorICCSelectorImpl(); |
2805 | + |
2806 | + static void _adjustmentChanged(GtkAdjustment *adjustment, ColorICCSelectorImpl *cs); |
2807 | + |
2808 | + void _sliderGrabbed(); |
2809 | + void _sliderReleased(); |
2810 | + void _sliderChanged(); |
2811 | + |
2812 | + static void _profileSelected(GtkWidget *src, gpointer data); |
2813 | + static void _fixupHit(GtkWidget *src, gpointer data); |
2814 | + |
2815 | +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2816 | + void _setProfile(SVGICCColor *profile); |
2817 | + void _switchToProfile(gchar const *name); |
2818 | +#endif |
2819 | + void _updateSliders(gint ignore); |
2820 | + void _profilesChanged(std::string const &name); |
2821 | + |
2822 | + ColorICCSelector *_owner; |
2823 | + SelectedColor &_color; |
2824 | + |
2825 | + gboolean _updating : 1; |
2826 | + gboolean _dragging : 1; |
2827 | + |
2828 | + guint32 _fixupNeeded; |
2829 | + GtkWidget *_fixupBtn; |
2830 | + GtkWidget *_profileSel; |
2831 | + |
2832 | + std::vector<ComponentUI> _compUI; |
2833 | + |
2834 | + GtkAdjustment *_adj; // Channel adjustment |
2835 | + Inkscape::UI::Widget::ColorSlider *_slider; |
2836 | + GtkWidget *_sbtn; // Spinbutton |
2837 | + GtkWidget *_label; // Label |
2838 | + |
2839 | +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2840 | + std::string _profileName; |
2841 | + Inkscape::ColorProfile *_prof; |
2842 | + guint _profChannelCount; |
2843 | + gulong _profChangedID; |
2844 | +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2845 | +}; |
2846 | + |
2847 | + |
2848 | + |
2849 | +const gchar *ColorICCSelector::MODE_NAME = N_("CMS"); |
2850 | + |
2851 | +ColorICCSelector::ColorICCSelector(SelectedColor &color) |
2852 | + : _impl(NULL) |
2853 | +{ |
2854 | + _impl = new ColorICCSelectorImpl(this, color); |
2855 | + init(); |
2856 | + color.signal_changed.connect(sigc::mem_fun(this, &ColorICCSelector::_colorChanged)); |
2857 | + // color.signal_dragged.connect(sigc::mem_fun(this, &ColorICCSelector::_colorChanged)); |
2858 | +} |
2859 | + |
2860 | +ColorICCSelector::~ColorICCSelector() |
2861 | +{ |
2862 | + if (_impl) { |
2863 | + delete _impl; |
2864 | + _impl = 0; |
2865 | + } |
2866 | +} |
2867 | + |
2868 | + |
2869 | + |
2870 | +ColorICCSelectorImpl::ColorICCSelectorImpl(ColorICCSelector *owner, SelectedColor &color) |
2871 | + : _owner(owner) |
2872 | + , _color(color) |
2873 | + , _updating(FALSE) |
2874 | + , _dragging(FALSE) |
2875 | + , _fixupNeeded(0) |
2876 | + , _fixupBtn(0) |
2877 | + , _profileSel(0) |
2878 | + , _compUI() |
2879 | + , _adj(0) |
2880 | + , _slider(0) |
2881 | + , _sbtn(0) |
2882 | + , _label(0) |
2883 | +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2884 | + , _profileName() |
2885 | + , _prof(0) |
2886 | + , _profChannelCount(0) |
2887 | + , _profChangedID(0) |
2888 | #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2889 | { |
2890 | } |
2891 | @@ -405,21 +359,12 @@ |
2892 | |
2893 | void ColorICCSelector::init() |
2894 | { |
2895 | - if (_impl) delete(_impl); |
2896 | - _impl = new ColorICCSelectorImpl(this); |
2897 | gint row = 0; |
2898 | |
2899 | _impl->_updating = FALSE; |
2900 | _impl->_dragging = FALSE; |
2901 | |
2902 | -#if GTK_CHECK_VERSION(3,0,0) |
2903 | - GtkWidget *t = gtk_grid_new(); |
2904 | -#else |
2905 | - GtkWidget *t = gtk_table_new(5, 3, FALSE); |
2906 | -#endif |
2907 | - |
2908 | - gtk_widget_show (t); |
2909 | - gtk_box_pack_start (GTK_BOX (_csel), t, TRUE, TRUE, 4); |
2910 | + GtkWidget *t = GTK_WIDGET(gobj()); |
2911 | |
2912 | _impl->_compUI.clear(); |
2913 | |
2914 | @@ -428,50 +373,53 @@ |
2915 | |
2916 | |
2917 | _impl->_fixupBtn = gtk_button_new_with_label(_("Fix")); |
2918 | - g_signal_connect( G_OBJECT(_impl->_fixupBtn), "clicked", G_CALLBACK(ColorICCSelectorImpl::_fixupHit), (gpointer)_impl ); |
2919 | - gtk_widget_set_sensitive( _impl->_fixupBtn, FALSE ); |
2920 | - gtk_widget_set_tooltip_text( _impl->_fixupBtn, _("Fix RGB fallback to match icc-color() value.") ); |
2921 | - //gtk_misc_set_alignment( GTK_MISC (_impl->_fixupBtn), 1.0, 0.5 ); |
2922 | - gtk_widget_show( _impl->_fixupBtn ); |
2923 | + g_signal_connect(G_OBJECT(_impl->_fixupBtn), "clicked", G_CALLBACK(ColorICCSelectorImpl::_fixupHit), |
2924 | + (gpointer)_impl); |
2925 | + gtk_widget_set_sensitive(_impl->_fixupBtn, FALSE); |
2926 | + gtk_widget_set_tooltip_text(_impl->_fixupBtn, _("Fix RGB fallback to match icc-color() value.")); |
2927 | + // gtk_misc_set_alignment( GTK_MISC (_impl->_fixupBtn), 1.0, 0.5 ); |
2928 | + gtk_widget_show(_impl->_fixupBtn); |
2929 | |
2930 | attachToGridOrTable(t, _impl->_fixupBtn, 0, row, 1, 1); |
2931 | |
2932 | // Combobox and store with 2 columns : label (0) and full name (1) |
2933 | - GtkListStore *store = gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_STRING); |
2934 | - _impl->_profileSel = gtk_combo_box_new_with_model (GTK_TREE_MODEL (store)); |
2935 | + GtkListStore *store = gtk_list_store_new(2, G_TYPE_STRING, G_TYPE_STRING); |
2936 | + _impl->_profileSel = gtk_combo_box_new_with_model(GTK_TREE_MODEL(store)); |
2937 | |
2938 | - GtkCellRenderer *renderer = gtk_cell_renderer_text_new (); |
2939 | + GtkCellRenderer *renderer = gtk_cell_renderer_text_new(); |
2940 | gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(_impl->_profileSel), renderer, TRUE); |
2941 | gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT(_impl->_profileSel), renderer, "text", 0, NULL); |
2942 | |
2943 | GtkTreeIter iter; |
2944 | - gtk_list_store_append (store, &iter); |
2945 | - gtk_list_store_set (store, &iter, 0, _("<none>"), 1, _("<none>"), -1); |
2946 | + gtk_list_store_append(store, &iter); |
2947 | + gtk_list_store_set(store, &iter, 0, _("<none>"), 1, _("<none>"), -1); |
2948 | |
2949 | - gtk_widget_show( _impl->_profileSel ); |
2950 | - gtk_combo_box_set_active( GTK_COMBO_BOX(_impl->_profileSel), 0 ); |
2951 | + gtk_widget_show(_impl->_profileSel); |
2952 | + gtk_combo_box_set_active(GTK_COMBO_BOX(_impl->_profileSel), 0); |
2953 | |
2954 | attachToGridOrTable(t, _impl->_profileSel, 1, row, 1, 1); |
2955 | |
2956 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2957 | - _impl->_profChangedID = g_signal_connect( G_OBJECT(_impl->_profileSel), "changed", G_CALLBACK(ColorICCSelectorImpl::_profileSelected), (gpointer)_impl ); |
2958 | + _impl->_profChangedID = g_signal_connect(G_OBJECT(_impl->_profileSel), "changed", |
2959 | + G_CALLBACK(ColorICCSelectorImpl::_profileSelected), (gpointer)_impl); |
2960 | #else |
2961 | - gtk_widget_set_sensitive( _impl->_profileSel, false ); |
2962 | + gtk_widget_set_sensitive(_impl->_profileSel, false); |
2963 | #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2964 | |
2965 | |
2966 | row++; |
2967 | |
2968 | - // populate the data for colorspaces and channels: |
2969 | +// populate the data for colorspaces and channels: |
2970 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2971 | - std::vector<colorspace::Component> things = colorspace::getColorSpaceInfo( cmsSigRgbData ); |
2972 | + std::vector<colorspace::Component> things = colorspace::getColorSpaceInfo(cmsSigRgbData); |
2973 | #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2974 | |
2975 | - for ( size_t i = 0; i < maxColorspaceComponentCount; i++ ) { |
2976 | + for (size_t i = 0; i < maxColorspaceComponentCount; i++) { |
2977 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
2978 | if (i < things.size()) { |
2979 | _impl->_compUI.push_back(ComponentUI(things[i])); |
2980 | - } else { |
2981 | + } |
2982 | + else { |
2983 | _impl->_compUI.push_back(ComponentUI()); |
2984 | } |
2985 | |
2986 | @@ -482,9 +430,10 @@ |
2987 | std::string labelStr = "."; |
2988 | #endif |
2989 | |
2990 | - _impl->_compUI[i]._label = gtk_label_new_with_mnemonic( labelStr.c_str() ); |
2991 | - gtk_misc_set_alignment( GTK_MISC (_impl->_compUI[i]._label), 1.0, 0.5 ); |
2992 | - gtk_widget_show( _impl->_compUI[i]._label ); |
2993 | + _impl->_compUI[i]._label = gtk_label_new_with_mnemonic(labelStr.c_str()); |
2994 | + gtk_misc_set_alignment(GTK_MISC(_impl->_compUI[i]._label), 1.0, 0.5); |
2995 | + gtk_widget_show(_impl->_compUI[i]._label); |
2996 | + gtk_widget_set_no_show_all(_impl->_compUI[i]._label, TRUE); |
2997 | |
2998 | attachToGridOrTable(t, _impl->_compUI[i]._label, 0, row, 1, 1); |
2999 | |
3000 | @@ -493,41 +442,47 @@ |
3001 | gdouble step = static_cast<gdouble>(scaleValue) / 100.0; |
3002 | gdouble page = static_cast<gdouble>(scaleValue) / 10.0; |
3003 | gint digits = (step > 0.9) ? 0 : 2; |
3004 | - _impl->_compUI[i]._adj = GTK_ADJUSTMENT( gtk_adjustment_new( 0.0, 0.0, scaleValue, step, page, page ) ); |
3005 | + _impl->_compUI[i]._adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, scaleValue, step, page, page)); |
3006 | |
3007 | // Slider |
3008 | - _impl->_compUI[i]._slider = sp_color_slider_new( _impl->_compUI[i]._adj ); |
3009 | -#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3010 | - gtk_widget_set_tooltip_text( _impl->_compUI[i]._slider, (i < things.size()) ? things[i].tip.c_str() : "" ); |
3011 | -#else |
3012 | - gtk_widget_set_tooltip_text( _impl->_compUI[i]._slider, "." ); |
3013 | -#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3014 | - gtk_widget_show( _impl->_compUI[i]._slider ); |
3015 | - |
3016 | - attachToGridOrTable(t, _impl->_compUI[i]._slider, 1, row, 1, 1, true); |
3017 | - |
3018 | - _impl->_compUI[i]._btn = gtk_spin_button_new( _impl->_compUI[i]._adj, step, digits ); |
3019 | -#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3020 | - gtk_widget_set_tooltip_text( _impl->_compUI[i]._btn, (i < things.size()) ? things[i].tip.c_str() : "" ); |
3021 | -#else |
3022 | - gtk_widget_set_tooltip_text( _impl->_compUI[i]._btn, "." ); |
3023 | -#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3024 | - sp_dialog_defocus_on_enter( _impl->_compUI[i]._btn ); |
3025 | - gtk_label_set_mnemonic_widget( GTK_LABEL(_impl->_compUI[i]._label), _impl->_compUI[i]._btn ); |
3026 | - gtk_widget_show( _impl->_compUI[i]._btn ); |
3027 | + _impl->_compUI[i]._slider = |
3028 | + Gtk::manage(new Inkscape::UI::Widget::ColorSlider(Glib::wrap(_impl->_compUI[i]._adj, true))); |
3029 | +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3030 | + _impl->_compUI[i]._slider->set_tooltip_text((i < things.size()) ? things[i].tip.c_str() : ""); |
3031 | +#else |
3032 | + _impl->_compUI[i]._slider->set_tooltip_text("."); |
3033 | +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3034 | + _impl->_compUI[i]._slider->show(); |
3035 | + _impl->_compUI[i]._slider->set_no_show_all(); |
3036 | + |
3037 | + attachToGridOrTable(t, _impl->_compUI[i]._slider->gobj(), 1, row, 1, 1, true); |
3038 | + |
3039 | + _impl->_compUI[i]._btn = gtk_spin_button_new(_impl->_compUI[i]._adj, step, digits); |
3040 | +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3041 | + gtk_widget_set_tooltip_text(_impl->_compUI[i]._btn, (i < things.size()) ? things[i].tip.c_str() : ""); |
3042 | +#else |
3043 | + gtk_widget_set_tooltip_text(_impl->_compUI[i]._btn, "."); |
3044 | +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3045 | + sp_dialog_defocus_on_enter(_impl->_compUI[i]._btn); |
3046 | + gtk_label_set_mnemonic_widget(GTK_LABEL(_impl->_compUI[i]._label), _impl->_compUI[i]._btn); |
3047 | + gtk_widget_show(_impl->_compUI[i]._btn); |
3048 | + gtk_widget_set_no_show_all(_impl->_compUI[i]._btn, TRUE); |
3049 | |
3050 | attachToGridOrTable(t, _impl->_compUI[i]._btn, 2, row, 1, 1, false, true); |
3051 | |
3052 | - _impl->_compUI[i]._map = g_new( guchar, 4 * 1024 ); |
3053 | - memset( _impl->_compUI[i]._map, 0x0ff, 1024 * 4 ); |
3054 | + _impl->_compUI[i]._map = g_new(guchar, 4 * 1024); |
3055 | + memset(_impl->_compUI[i]._map, 0x0ff, 1024 * 4); |
3056 | |
3057 | |
3058 | // Signals |
3059 | - g_signal_connect( G_OBJECT( _impl->_compUI[i]._adj ), "value_changed", G_CALLBACK( ColorICCSelectorImpl::_adjustmentChanged ), _csel ); |
3060 | + g_signal_connect(G_OBJECT(_impl->_compUI[i]._adj), "value_changed", |
3061 | + G_CALLBACK(ColorICCSelectorImpl::_adjustmentChanged), _impl); |
3062 | |
3063 | - g_signal_connect( G_OBJECT( _impl->_compUI[i]._slider ), "grabbed", G_CALLBACK( ColorICCSelectorImpl::_sliderGrabbed ), _csel ); |
3064 | - g_signal_connect( G_OBJECT( _impl->_compUI[i]._slider ), "released", G_CALLBACK( ColorICCSelectorImpl::_sliderReleased ), _csel ); |
3065 | - g_signal_connect( G_OBJECT( _impl->_compUI[i]._slider ), "changed", G_CALLBACK( ColorICCSelectorImpl::_sliderChanged ), _csel ); |
3066 | + _impl->_compUI[i]._slider->signal_grabbed.connect(sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderGrabbed)); |
3067 | + _impl->_compUI[i]._slider->signal_released.connect( |
3068 | + sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderReleased)); |
3069 | + _impl->_compUI[i]._slider->signal_value_changed.connect( |
3070 | + sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderChanged)); |
3071 | |
3072 | row++; |
3073 | } |
3074 | @@ -543,16 +498,14 @@ |
3075 | _impl->_adj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 255.0, 1.0, 10.0, 10.0)); |
3076 | |
3077 | // Slider |
3078 | - _impl->_slider = sp_color_slider_new(_impl->_adj); |
3079 | - gtk_widget_set_tooltip_text(_impl->_slider, _("Alpha (opacity)")); |
3080 | - gtk_widget_show(_impl->_slider); |
3081 | - |
3082 | - attachToGridOrTable(t, _impl->_slider, 1, row, 1, 1, true); |
3083 | - |
3084 | - sp_color_slider_set_colors( SP_COLOR_SLIDER( _impl->_slider ), |
3085 | - SP_RGBA32_F_COMPOSE( 1.0, 1.0, 1.0, 0.0 ), |
3086 | - SP_RGBA32_F_COMPOSE( 1.0, 1.0, 1.0, 0.5 ), |
3087 | - SP_RGBA32_F_COMPOSE( 1.0, 1.0, 1.0, 1.0 ) ); |
3088 | + _impl->_slider = Gtk::manage(new Inkscape::UI::Widget::ColorSlider(Glib::wrap(_impl->_adj, true))); |
3089 | + _impl->_slider->set_tooltip_text(_("Alpha (opacity)")); |
3090 | + _impl->_slider->show(); |
3091 | + |
3092 | + attachToGridOrTable(t, _impl->_slider->gobj(), 1, row, 1, 1, true); |
3093 | + |
3094 | + _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), |
3095 | + SP_RGBA32_F_COMPOSE(1.0, 1.0, 1.0, 1.0)); |
3096 | |
3097 | |
3098 | // Spinbutton |
3099 | @@ -565,96 +518,72 @@ |
3100 | attachToGridOrTable(t, _impl->_sbtn, 2, row, 1, 1, false, true); |
3101 | |
3102 | // Signals |
3103 | - g_signal_connect(G_OBJECT(_impl->_adj), "value_changed", G_CALLBACK(ColorICCSelectorImpl::_adjustmentChanged), _csel); |
3104 | - |
3105 | - g_signal_connect(G_OBJECT(_impl->_slider), "grabbed", G_CALLBACK(ColorICCSelectorImpl::_sliderGrabbed), _csel); |
3106 | - g_signal_connect(G_OBJECT(_impl->_slider), "released", G_CALLBACK(ColorICCSelectorImpl::_sliderReleased), _csel); |
3107 | - g_signal_connect(G_OBJECT(_impl->_slider), "changed", G_CALLBACK(ColorICCSelectorImpl::_sliderChanged), _csel); |
3108 | -} |
3109 | - |
3110 | -static void sp_color_icc_selector_dispose(GObject *object) |
3111 | -{ |
3112 | - if (G_OBJECT_CLASS(sp_color_icc_selector_parent_class)->dispose) { |
3113 | - G_OBJECT_CLASS(sp_color_icc_selector_parent_class)->dispose(object); |
3114 | - } |
3115 | -} |
3116 | - |
3117 | -static void |
3118 | -sp_color_icc_selector_show_all (GtkWidget *widget) |
3119 | -{ |
3120 | - gtk_widget_show (widget); |
3121 | -} |
3122 | - |
3123 | -static void sp_color_icc_selector_hide(GtkWidget *widget) |
3124 | -{ |
3125 | - gtk_widget_hide(widget); |
3126 | -} |
3127 | - |
3128 | -GtkWidget * |
3129 | -sp_color_icc_selector_new (void) |
3130 | -{ |
3131 | - SPColorICCSelector *csel; |
3132 | - |
3133 | - csel = static_cast<SPColorICCSelector*>(g_object_new (SP_TYPE_COLOR_ICC_SELECTOR, NULL)); |
3134 | - |
3135 | - return GTK_WIDGET (csel); |
3136 | -} |
3137 | - |
3138 | - |
3139 | -void ColorICCSelectorImpl::_fixupHit( GtkWidget* /*src*/, gpointer data ) |
3140 | -{ |
3141 | - ColorICCSelectorImpl* self = reinterpret_cast<ColorICCSelectorImpl*>(data); |
3142 | - gtk_widget_set_sensitive( self->_fixupBtn, FALSE ); |
3143 | - self->_adjustmentChanged( self->_compUI[0]._adj, SP_COLOR_ICC_SELECTOR(self->_owner->_csel) ); |
3144 | + g_signal_connect(G_OBJECT(_impl->_adj), "value_changed", G_CALLBACK(ColorICCSelectorImpl::_adjustmentChanged), |
3145 | + _impl); |
3146 | + |
3147 | + _impl->_slider->signal_grabbed.connect(sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderGrabbed)); |
3148 | + _impl->_slider->signal_released.connect(sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderReleased)); |
3149 | + _impl->_slider->signal_value_changed.connect(sigc::mem_fun(_impl, &ColorICCSelectorImpl::_sliderChanged)); |
3150 | + |
3151 | + gtk_widget_show(t); |
3152 | +} |
3153 | + |
3154 | +void ColorICCSelectorImpl::_fixupHit(GtkWidget * /*src*/, gpointer data) |
3155 | +{ |
3156 | + ColorICCSelectorImpl *self = reinterpret_cast<ColorICCSelectorImpl *>(data); |
3157 | + gtk_widget_set_sensitive(self->_fixupBtn, FALSE); |
3158 | + self->_adjustmentChanged(self->_compUI[0]._adj, self); |
3159 | } |
3160 | |
3161 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3162 | -void ColorICCSelectorImpl::_profileSelected( GtkWidget* /*src*/, gpointer data ) |
3163 | +void ColorICCSelectorImpl::_profileSelected(GtkWidget * /*src*/, gpointer data) |
3164 | { |
3165 | - ColorICCSelectorImpl* self = reinterpret_cast<ColorICCSelectorImpl*>(data); |
3166 | + ColorICCSelectorImpl *self = reinterpret_cast<ColorICCSelectorImpl *>(data); |
3167 | |
3168 | - GtkTreeIter iter; |
3169 | + GtkTreeIter iter; |
3170 | if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(self->_profileSel), &iter)) { |
3171 | GtkTreeModel *store = gtk_combo_box_get_model(GTK_COMBO_BOX(self->_profileSel)); |
3172 | - gchar* name = 0; |
3173 | + gchar *name = 0; |
3174 | |
3175 | gtk_tree_model_get(store, &iter, 1, &name, -1); |
3176 | - self->_switchToProfile( name ); |
3177 | - gtk_widget_set_tooltip_text(self->_profileSel, name ); |
3178 | + self->_switchToProfile(name); |
3179 | + gtk_widget_set_tooltip_text(self->_profileSel, name); |
3180 | |
3181 | - if ( name ) { |
3182 | - g_free( name ); |
3183 | + if (name) { |
3184 | + g_free(name); |
3185 | } |
3186 | } |
3187 | } |
3188 | #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3189 | |
3190 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3191 | -void ColorICCSelectorImpl::_switchToProfile( gchar const* name ) |
3192 | +void ColorICCSelectorImpl::_switchToProfile(gchar const *name) |
3193 | { |
3194 | bool dirty = false; |
3195 | - SPColor tmp( _owner->_color ); |
3196 | + SPColor tmp(_color.color()); |
3197 | |
3198 | - if ( name ) { |
3199 | - if ( tmp.icc && tmp.icc->colorProfile == name ) { |
3200 | -#ifdef DEBUG_LCMS |
3201 | - g_message("Already at name [%s]", name ); |
3202 | -#endif // DEBUG_LCMS |
3203 | - } else { |
3204 | -#ifdef DEBUG_LCMS |
3205 | - g_message("Need to switch to profile [%s]", name ); |
3206 | -#endif // DEBUG_LCMS |
3207 | - if ( tmp.icc ) { |
3208 | + if (name) { |
3209 | + if (tmp.icc && tmp.icc->colorProfile == name) { |
3210 | +#ifdef DEBUG_LCMS |
3211 | + g_message("Already at name [%s]", name); |
3212 | +#endif // DEBUG_LCMS |
3213 | + } |
3214 | + else { |
3215 | +#ifdef DEBUG_LCMS |
3216 | + g_message("Need to switch to profile [%s]", name); |
3217 | +#endif // DEBUG_LCMS |
3218 | + if (tmp.icc) { |
3219 | tmp.icc->colors.clear(); |
3220 | - } else { |
3221 | + } |
3222 | + else { |
3223 | tmp.icc = new SVGICCColor(); |
3224 | } |
3225 | tmp.icc->colorProfile = name; |
3226 | - Inkscape::ColorProfile* newProf = SP_ACTIVE_DOCUMENT->profileManager->find(name); |
3227 | - if ( newProf ) { |
3228 | + Inkscape::ColorProfile *newProf = SP_ACTIVE_DOCUMENT->profileManager->find(name); |
3229 | + if (newProf) { |
3230 | cmsHTRANSFORM trans = newProf->getTransfFromSRGB8(); |
3231 | - if ( trans ) { |
3232 | - guint32 val = _owner->_color.toRGBA32(0); |
3233 | + if (trans) { |
3234 | + guint32 val = _color.color().toRGBA32(0); |
3235 | guchar pre[4] = { |
3236 | static_cast<guchar>(SP_RGBA32_R_U(val)), |
3237 | static_cast<guchar>(SP_RGBA32_G_U(val)), |
3238 | @@ -663,29 +592,31 @@ |
3239 | #ifdef DEBUG_LCMS |
3240 | g_message("Shoving in [%02x] [%02x] [%02x]", pre[0], pre[1], pre[2]); |
3241 | #endif // DEBUG_LCMS |
3242 | - cmsUInt16Number post[4] = {0,0,0,0}; |
3243 | - cmsDoTransform( trans, pre, post, 1 ); |
3244 | + cmsUInt16Number post[4] = { 0, 0, 0, 0 }; |
3245 | + cmsDoTransform(trans, pre, post, 1); |
3246 | #ifdef DEBUG_LCMS |
3247 | g_message("got on out [%04x] [%04x] [%04x] [%04x]", post[0], post[1], post[2], post[3]); |
3248 | #endif // DEBUG_LCMS |
3249 | #if HAVE_LIBLCMS1 |
3250 | - guint count = _cmsChannelsOf( asICColorSpaceSig(newProf->getColorSpace()) ); |
3251 | + guint count = _cmsChannelsOf(asICColorSpaceSig(newProf->getColorSpace())); |
3252 | #elif HAVE_LIBLCMS2 |
3253 | - guint count = cmsChannelsOf( asICColorSpaceSig(newProf->getColorSpace()) ); |
3254 | + guint count = cmsChannelsOf(asICColorSpaceSig(newProf->getColorSpace())); |
3255 | #endif |
3256 | |
3257 | - std::vector<colorspace::Component> things = colorspace::getColorSpaceInfo(asICColorSpaceSig(newProf->getColorSpace())); |
3258 | + std::vector<colorspace::Component> things = |
3259 | + colorspace::getColorSpaceInfo(asICColorSpaceSig(newProf->getColorSpace())); |
3260 | |
3261 | - for ( guint i = 0; i < count; i++ ) { |
3262 | - gdouble val = (((gdouble)post[i])/65535.0) * (gdouble)((i < things.size()) ? things[i].scale : 1); |
3263 | + for (guint i = 0; i < count; i++) { |
3264 | + gdouble val = |
3265 | + (((gdouble)post[i]) / 65535.0) * (gdouble)((i < things.size()) ? things[i].scale : 1); |
3266 | #ifdef DEBUG_LCMS |
3267 | g_message(" scaled %d by %d to be %f", i, ((i < things.size()) ? things[i].scale : 1), val); |
3268 | #endif // DEBUG_LCMS |
3269 | tmp.icc->colors.push_back(val); |
3270 | } |
3271 | cmsHTRANSFORM retrans = newProf->getTransfToSRGB8(); |
3272 | - if ( retrans ) { |
3273 | - cmsDoTransform( retrans, post, pre, 1 ); |
3274 | + if (retrans) { |
3275 | + cmsDoTransform(retrans, post, pre, 1); |
3276 | #ifdef DEBUG_LCMS |
3277 | g_message(" back out [%02x] [%02x] [%02x]", pre[0], pre[1], pre[2]); |
3278 | #endif // DEBUG_LCMS |
3279 | @@ -695,30 +626,32 @@ |
3280 | } |
3281 | dirty = true; |
3282 | } |
3283 | - } else { |
3284 | + } |
3285 | + else { |
3286 | #ifdef DEBUG_LCMS |
3287 | - g_message("NUKE THE ICC"); |
3288 | + g_message("NUKE THE ICC"); |
3289 | #endif // DEBUG_LCMS |
3290 | - if ( tmp.icc ) { |
3291 | + if (tmp.icc) { |
3292 | delete tmp.icc; |
3293 | tmp.icc = 0; |
3294 | dirty = true; |
3295 | - _fixupHit( 0, this ); |
3296 | - } else { |
3297 | + _fixupHit(0, this); |
3298 | + } |
3299 | + else { |
3300 | #ifdef DEBUG_LCMS |
3301 | - g_message("No icc to nuke"); |
3302 | + g_message("No icc to nuke"); |
3303 | #endif // DEBUG_LCMS |
3304 | } |
3305 | } |
3306 | |
3307 | - if ( dirty ) { |
3308 | + if (dirty) { |
3309 | #ifdef DEBUG_LCMS |
3310 | g_message("+----------------"); |
3311 | g_message("+ new color is [%s]", tmp.toString().c_str()); |
3312 | #endif // DEBUG_LCMS |
3313 | - _setProfile( tmp.icc ); |
3314 | + _setProfile(tmp.icc); |
3315 | //_adjustmentChanged( _compUI[0]._adj, SP_COLOR_ICC_SELECTOR(_csel) ); |
3316 | - _owner->setColorAlpha( tmp, _owner->_alpha, true ); |
3317 | + _color.setColor(tmp); |
3318 | #ifdef DEBUG_LCMS |
3319 | g_message("+_________________"); |
3320 | #endif // DEBUG_LCMS |
3321 | @@ -727,238 +660,257 @@ |
3322 | #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3323 | |
3324 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3325 | -void ColorICCSelectorImpl::_profilesChanged( std::string const & name ) |
3326 | +void ColorICCSelectorImpl::_profilesChanged(std::string const &name) |
3327 | { |
3328 | - GtkComboBox* combo = GTK_COMBO_BOX(_profileSel); |
3329 | + GtkComboBox *combo = GTK_COMBO_BOX(_profileSel); |
3330 | |
3331 | - g_signal_handler_block( G_OBJECT(_profileSel), _profChangedID ); |
3332 | + g_signal_handler_block(G_OBJECT(_profileSel), _profChangedID); |
3333 | |
3334 | GtkListStore *store = GTK_LIST_STORE(gtk_combo_box_get_model(combo)); |
3335 | gtk_list_store_clear(store); |
3336 | |
3337 | GtkTreeIter iter; |
3338 | - gtk_list_store_append (store, &iter); |
3339 | + gtk_list_store_append(store, &iter); |
3340 | gtk_list_store_set(store, &iter, 0, _("<none>"), 1, _("<none>"), -1); |
3341 | |
3342 | - gtk_combo_box_set_active( combo, 0 ); |
3343 | + gtk_combo_box_set_active(combo, 0); |
3344 | |
3345 | int index = 1; |
3346 | - const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList( "iccprofile" ); |
3347 | - while ( current ) { |
3348 | - SPObject* obj = SP_OBJECT(current->data); |
3349 | - Inkscape::ColorProfile* prof = reinterpret_cast<Inkscape::ColorProfile*>(obj); |
3350 | + const GSList *current = SP_ACTIVE_DOCUMENT->getResourceList("iccprofile"); |
3351 | + while (current) { |
3352 | + SPObject *obj = SP_OBJECT(current->data); |
3353 | + Inkscape::ColorProfile *prof = reinterpret_cast<Inkscape::ColorProfile *>(obj); |
3354 | |
3355 | - gtk_list_store_append (store, &iter); |
3356 | + gtk_list_store_append(store, &iter); |
3357 | gtk_list_store_set(store, &iter, 0, gr_ellipsize_text(prof->name, 25).c_str(), 1, prof->name, -1); |
3358 | |
3359 | - if ( name == prof->name ) { |
3360 | - gtk_combo_box_set_active( combo, index ); |
3361 | - gtk_widget_set_tooltip_text(_profileSel, prof->name ); |
3362 | + if (name == prof->name) { |
3363 | + gtk_combo_box_set_active(combo, index); |
3364 | + gtk_widget_set_tooltip_text(_profileSel, prof->name); |
3365 | } |
3366 | |
3367 | index++; |
3368 | current = g_slist_next(current); |
3369 | } |
3370 | |
3371 | - g_signal_handler_unblock( G_OBJECT(_profileSel), _profChangedID ); |
3372 | + g_signal_handler_unblock(G_OBJECT(_profileSel), _profChangedID); |
3373 | } |
3374 | #else |
3375 | -void ColorICCSelectorImpl::_profilesChanged( std::string const & /*name*/ ) |
3376 | +void ColorICCSelectorImpl::_profilesChanged(std::string const & /*name*/) {} |
3377 | +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3378 | + |
3379 | +void ColorICCSelector::on_show() |
3380 | { |
3381 | +#if GTK_CHECK_VERSION(3, 0, 0) |
3382 | + Gtk::Grid::on_show(); |
3383 | +#else |
3384 | + Gtk::Table::on_show(); |
3385 | +#endif |
3386 | + _colorChanged(); |
3387 | } |
3388 | -#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3389 | |
3390 | // Helpers for setting color value |
3391 | |
3392 | void ColorICCSelector::_colorChanged() |
3393 | { |
3394 | _impl->_updating = TRUE; |
3395 | - //sp_color_icc_set_color( SP_COLOR_ICC( _icc ), &color ); |
3396 | - |
3397 | -#ifdef DEBUG_LCMS |
3398 | - g_message( "/^^^^^^^^^ %p::_colorChanged(%08x:%s)", this, |
3399 | - _color.toRGBA32(_alpha), ( (_color.icc) ? _color.icc->colorProfile.c_str(): "<null>" ) |
3400 | - ); |
3401 | -#endif // DEBUG_LCMS |
3402 | - |
3403 | -#ifdef DEBUG_LCMS |
3404 | - g_message("FLIPPIES!!!! %p '%s'", _color.icc, (_color.icc ? _color.icc->colorProfile.c_str():"<null>")); |
3405 | -#endif // DEBUG_LCMS |
3406 | - |
3407 | - _impl->_profilesChanged( (_color.icc) ? _color.icc->colorProfile : std::string("") ); |
3408 | - ColorScales::setScaled( _impl->_adj, _alpha ); |
3409 | +// sp_color_icc_set_color( SP_COLOR_ICC( _icc ), &color ); |
3410 | + |
3411 | +#ifdef DEBUG_LCMS |
3412 | + g_message("/^^^^^^^^^ %p::_colorChanged(%08x:%s)", this, _impl->_color.color().toRGBA32(_impl->_color.alpha()), |
3413 | + ((_impl->_color.color().icc) ? _impl->_color.color().icc->colorProfile.c_str() : "<null>")); |
3414 | +#endif // DEBUG_LCMS |
3415 | + |
3416 | +#ifdef DEBUG_LCMS |
3417 | + g_message("FLIPPIES!!!! %p '%s'", _impl->_color.color().icc, |
3418 | + (_impl->_color.color().icc ? _impl->_color.color().icc->colorProfile.c_str() : "<null>")); |
3419 | +#endif // DEBUG_LCMS |
3420 | + |
3421 | + _impl->_profilesChanged((_impl->_color.color().icc) ? _impl->_color.color().icc->colorProfile : std::string("")); |
3422 | + ColorScales::setScaled(_impl->_adj, _impl->_color.alpha()); |
3423 | |
3424 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3425 | - _impl->_setProfile( _color.icc ); |
3426 | + _impl->_setProfile(_impl->_color.color().icc); |
3427 | _impl->_fixupNeeded = 0; |
3428 | - gtk_widget_set_sensitive( _impl->_fixupBtn, FALSE ); |
3429 | + gtk_widget_set_sensitive(_impl->_fixupBtn, FALSE); |
3430 | |
3431 | if (_impl->_prof) { |
3432 | - if (_impl->_prof->getTransfToSRGB8() ) { |
3433 | + if (_impl->_prof->getTransfToSRGB8()) { |
3434 | cmsUInt16Number tmp[4]; |
3435 | - for ( guint i = 0; i < _impl->_profChannelCount; i++ ) { |
3436 | + for (guint i = 0; i < _impl->_profChannelCount; i++) { |
3437 | gdouble val = 0.0; |
3438 | - if ( _color.icc->colors.size() > i ) { |
3439 | - if ( _impl->_compUI[i]._component.scale == 256 ) { |
3440 | - val = (_color.icc->colors[i] + 128.0) / static_cast<gdouble>(_impl->_compUI[i]._component.scale); |
3441 | - } else { |
3442 | - val = _color.icc->colors[i] / static_cast<gdouble>(_impl->_compUI[i]._component.scale); |
3443 | + if (_impl->_color.color().icc->colors.size() > i) { |
3444 | + if (_impl->_compUI[i]._component.scale == 256) { |
3445 | + val = (_impl->_color.color().icc->colors[i] + 128.0) / |
3446 | + static_cast<gdouble>(_impl->_compUI[i]._component.scale); |
3447 | + } |
3448 | + else { |
3449 | + val = _impl->_color.color().icc->colors[i] / |
3450 | + static_cast<gdouble>(_impl->_compUI[i]._component.scale); |
3451 | } |
3452 | } |
3453 | tmp[i] = val * 0x0ffff; |
3454 | } |
3455 | - guchar post[4] = {0,0,0,0}; |
3456 | + guchar post[4] = { 0, 0, 0, 0 }; |
3457 | cmsHTRANSFORM trans = _impl->_prof->getTransfToSRGB8(); |
3458 | - if ( trans ) { |
3459 | - cmsDoTransform( trans, tmp, post, 1 ); |
3460 | - guint32 other = SP_RGBA32_U_COMPOSE(post[0], post[1], post[2], 255 ); |
3461 | - if ( other != _color.toRGBA32(255) ) { |
3462 | + if (trans) { |
3463 | + cmsDoTransform(trans, tmp, post, 1); |
3464 | + guint32 other = SP_RGBA32_U_COMPOSE(post[0], post[1], post[2], 255); |
3465 | + if (other != _impl->_color.color().toRGBA32(255)) { |
3466 | _impl->_fixupNeeded = other; |
3467 | - gtk_widget_set_sensitive( _impl->_fixupBtn, TRUE ); |
3468 | + gtk_widget_set_sensitive(_impl->_fixupBtn, TRUE); |
3469 | #ifdef DEBUG_LCMS |
3470 | - g_message("Color needs to change 0x%06x to 0x%06x", _color.toRGBA32(255) >> 8, other >> 8 ); |
3471 | + g_message("Color needs to change 0x%06x to 0x%06x", _color.toRGBA32(255) >> 8, other >> 8); |
3472 | #endif // DEBUG_LCMS |
3473 | } |
3474 | } |
3475 | } |
3476 | } |
3477 | #else |
3478 | - //(void)color; |
3479 | +//(void)color; |
3480 | #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3481 | - _impl->_updateSliders( -1 ); |
3482 | + _impl->_updateSliders(-1); |
3483 | |
3484 | |
3485 | _impl->_updating = FALSE; |
3486 | #ifdef DEBUG_LCMS |
3487 | - g_message( "\\_________ %p::_colorChanged()", this ); |
3488 | + g_message("\\_________ %p::_colorChanged()", this); |
3489 | #endif // DEBUG_LCMS |
3490 | } |
3491 | |
3492 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3493 | -void ColorICCSelectorImpl::_setProfile( SVGICCColor* profile ) |
3494 | +void ColorICCSelectorImpl::_setProfile(SVGICCColor *profile) |
3495 | { |
3496 | #ifdef DEBUG_LCMS |
3497 | - g_message( "/^^^^^^^^^ %p::_setProfile(%s)", this, |
3498 | - ( (profile) ? profile->colorProfile.c_str() : "<null>") |
3499 | - ); |
3500 | + g_message("/^^^^^^^^^ %p::_setProfile(%s)", this, ((profile) ? profile->colorProfile.c_str() : "<null>")); |
3501 | #endif // DEBUG_LCMS |
3502 | bool profChanged = false; |
3503 | - if ( _prof && (!profile || (_profileName != profile->colorProfile) ) ) { |
3504 | + if (_prof && (!profile || (_profileName != profile->colorProfile))) { |
3505 | // Need to clear out the prior one |
3506 | profChanged = true; |
3507 | _profileName.clear(); |
3508 | _prof = 0; |
3509 | _profChannelCount = 0; |
3510 | - } else if ( profile && !_prof ) { |
3511 | + } |
3512 | + else if (profile && !_prof) { |
3513 | profChanged = true; |
3514 | } |
3515 | |
3516 | - for ( size_t i = 0; i < _compUI.size(); i++ ) { |
3517 | - gtk_widget_hide( _compUI[i]._label ); |
3518 | - gtk_widget_hide( _compUI[i]._slider ); |
3519 | - gtk_widget_hide( _compUI[i]._btn ); |
3520 | + for (size_t i = 0; i < _compUI.size(); i++) { |
3521 | + gtk_widget_hide(_compUI[i]._label); |
3522 | + _compUI[i]._slider->hide(); |
3523 | + gtk_widget_hide(_compUI[i]._btn); |
3524 | } |
3525 | |
3526 | - if ( profile ) { |
3527 | + if (profile) { |
3528 | _prof = SP_ACTIVE_DOCUMENT->profileManager->find(profile->colorProfile.c_str()); |
3529 | - if ( _prof && (asICColorProfileClassSig(_prof->getProfileClass()) != cmsSigNamedColorClass) ) { |
3530 | + if (_prof && (asICColorProfileClassSig(_prof->getProfileClass()) != cmsSigNamedColorClass)) { |
3531 | #if HAVE_LIBLCMS1 |
3532 | - _profChannelCount = _cmsChannelsOf( asICColorSpaceSig(_prof->getColorSpace()) ); |
3533 | + _profChannelCount = _cmsChannelsOf(asICColorSpaceSig(_prof->getColorSpace())); |
3534 | #elif HAVE_LIBLCMS2 |
3535 | - _profChannelCount = cmsChannelsOf( asICColorSpaceSig(_prof->getColorSpace()) ); |
3536 | + _profChannelCount = cmsChannelsOf(asICColorSpaceSig(_prof->getColorSpace())); |
3537 | #endif |
3538 | |
3539 | - if ( profChanged ) { |
3540 | - std::vector<colorspace::Component> things = colorspace::getColorSpaceInfo(asICColorSpaceSig(_prof->getColorSpace())); |
3541 | - for (size_t i = 0; (i < things.size()) && (i < _profChannelCount); ++i) |
3542 | - { |
3543 | + if (profChanged) { |
3544 | + std::vector<colorspace::Component> things = |
3545 | + colorspace::getColorSpaceInfo(asICColorSpaceSig(_prof->getColorSpace())); |
3546 | + for (size_t i = 0; (i < things.size()) && (i < _profChannelCount); ++i) { |
3547 | _compUI[i]._component = things[i]; |
3548 | } |
3549 | |
3550 | - for ( guint i = 0; i < _profChannelCount; i++ ) { |
3551 | - gtk_label_set_text_with_mnemonic( GTK_LABEL(_compUI[i]._label), (i < things.size()) ? things[i].name.c_str() : ""); |
3552 | - |
3553 | - gtk_widget_set_tooltip_text( _compUI[i]._slider, (i < things.size()) ? things[i].tip.c_str() : "" ); |
3554 | - gtk_widget_set_tooltip_text( _compUI[i]._btn, (i < things.size()) ? things[i].tip.c_str() : "" ); |
3555 | - |
3556 | - sp_color_slider_set_colors( SP_COLOR_SLIDER(_compUI[i]._slider), |
3557 | - SPColor(0.0, 0.0, 0.0).toRGBA32(0xff), |
3558 | - SPColor(0.5, 0.5, 0.5).toRGBA32(0xff), |
3559 | - SPColor(1.0, 1.0, 1.0).toRGBA32(0xff) ); |
3560 | -/* |
3561 | - _compUI[i]._adj = GTK_ADJUSTMENT( gtk_adjustment_new( val, 0.0, _fooScales[i], step, page, page ) ); |
3562 | - g_signal_connect( G_OBJECT( _compUI[i]._adj ), "value_changed", G_CALLBACK( _adjustmentChanged ), _csel ); |
3563 | - |
3564 | - sp_color_slider_set_adjustment( SP_COLOR_SLIDER(_compUI[i]._slider), _compUI[i]._adj ); |
3565 | - gtk_spin_button_set_adjustment( GTK_SPIN_BUTTON(_compUI[i]._btn), _compUI[i]._adj ); |
3566 | - gtk_spin_button_set_digits( GTK_SPIN_BUTTON(_compUI[i]._btn), digits ); |
3567 | -*/ |
3568 | - gtk_widget_show( _compUI[i]._label ); |
3569 | - gtk_widget_show( _compUI[i]._slider ); |
3570 | - gtk_widget_show( _compUI[i]._btn ); |
3571 | - //gtk_adjustment_set_value( _compUI[i]._adj, 0.0 ); |
3572 | - //gtk_adjustment_set_value( _compUI[i]._adj, val ); |
3573 | + for (guint i = 0; i < _profChannelCount; i++) { |
3574 | + gtk_label_set_text_with_mnemonic(GTK_LABEL(_compUI[i]._label), |
3575 | + (i < things.size()) ? things[i].name.c_str() : ""); |
3576 | + |
3577 | + _compUI[i]._slider->set_tooltip_text((i < things.size()) ? things[i].tip.c_str() : ""); |
3578 | + gtk_widget_set_tooltip_text(_compUI[i]._btn, (i < things.size()) ? things[i].tip.c_str() : ""); |
3579 | + |
3580 | + _compUI[i]._slider->setColors(SPColor(0.0, 0.0, 0.0).toRGBA32(0xff), |
3581 | + SPColor(0.5, 0.5, 0.5).toRGBA32(0xff), |
3582 | + SPColor(1.0, 1.0, 1.0).toRGBA32(0xff)); |
3583 | + /* |
3584 | + _compUI[i]._adj = GTK_ADJUSTMENT( gtk_adjustment_new( val, 0.0, _fooScales[i], |
3585 | + step, page, page ) ); |
3586 | + g_signal_connect( G_OBJECT( _compUI[i]._adj ), "value_changed", G_CALLBACK( |
3587 | + _adjustmentChanged ), _csel ); |
3588 | + |
3589 | + sp_color_slider_set_adjustment( SP_COLOR_SLIDER(_compUI[i]._slider), |
3590 | + _compUI[i]._adj ); |
3591 | + gtk_spin_button_set_adjustment( GTK_SPIN_BUTTON(_compUI[i]._btn), |
3592 | + _compUI[i]._adj ); |
3593 | + gtk_spin_button_set_digits( GTK_SPIN_BUTTON(_compUI[i]._btn), digits ); |
3594 | + */ |
3595 | + gtk_widget_show(_compUI[i]._label); |
3596 | + _compUI[i]._slider->show(); |
3597 | + gtk_widget_show(_compUI[i]._btn); |
3598 | + // gtk_adjustment_set_value( _compUI[i]._adj, 0.0 ); |
3599 | + // gtk_adjustment_set_value( _compUI[i]._adj, val ); |
3600 | } |
3601 | - for ( size_t i = _profChannelCount; i < _compUI.size(); i++ ) { |
3602 | - gtk_widget_hide( _compUI[i]._label ); |
3603 | - gtk_widget_hide( _compUI[i]._slider ); |
3604 | - gtk_widget_hide( _compUI[i]._btn ); |
3605 | + for (size_t i = _profChannelCount; i < _compUI.size(); i++) { |
3606 | + gtk_widget_hide(_compUI[i]._label); |
3607 | + _compUI[i]._slider->hide(); |
3608 | + gtk_widget_hide(_compUI[i]._btn); |
3609 | } |
3610 | } |
3611 | - } else { |
3612 | + } |
3613 | + else { |
3614 | // Give up for now on named colors |
3615 | _prof = 0; |
3616 | } |
3617 | } |
3618 | |
3619 | #ifdef DEBUG_LCMS |
3620 | - g_message( "\\_________ %p::_setProfile()", this ); |
3621 | + g_message("\\_________ %p::_setProfile()", this); |
3622 | #endif // DEBUG_LCMS |
3623 | } |
3624 | #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3625 | |
3626 | -void ColorICCSelectorImpl::_updateSliders( gint ignore ) |
3627 | +void ColorICCSelectorImpl::_updateSliders(gint ignore) |
3628 | { |
3629 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3630 | - if ( _owner->_color.icc ) |
3631 | - { |
3632 | - for ( guint i = 0; i < _profChannelCount; i++ ) { |
3633 | + if (_color.color().icc) { |
3634 | + for (guint i = 0; i < _profChannelCount; i++) { |
3635 | gdouble val = 0.0; |
3636 | - if ( _owner->_color.icc->colors.size() > i ) { |
3637 | - if ( _compUI[i]._component.scale == 256 ) { |
3638 | - val = (_owner->_color.icc->colors[i] + 128.0) / static_cast<gdouble>(_compUI[i]._component.scale); |
3639 | - } else { |
3640 | - val = _owner->_color.icc->colors[i] / static_cast<gdouble>(_compUI[i]._component.scale); |
3641 | + if (_color.color().icc->colors.size() > i) { |
3642 | + if (_compUI[i]._component.scale == 256) { |
3643 | + val = (_color.color().icc->colors[i] + 128.0) / static_cast<gdouble>(_compUI[i]._component.scale); |
3644 | + } |
3645 | + else { |
3646 | + val = _color.color().icc->colors[i] / static_cast<gdouble>(_compUI[i]._component.scale); |
3647 | } |
3648 | } |
3649 | - gtk_adjustment_set_value( _compUI[i]._adj, val ); |
3650 | + gtk_adjustment_set_value(_compUI[i]._adj, val); |
3651 | } |
3652 | |
3653 | - if ( _prof ) { |
3654 | - if ( _prof->getTransfToSRGB8() ) { |
3655 | - for ( guint i = 0; i < _profChannelCount; i++ ) { |
3656 | - if ( static_cast<gint>(i) != ignore ) { |
3657 | - cmsUInt16Number* scratch = getScratch(); |
3658 | - cmsUInt16Number filler[4] = {0, 0, 0, 0}; |
3659 | - for ( guint j = 0; j < _profChannelCount; j++ ) { |
3660 | - filler[j] = 0x0ffff * ColorScales::getScaled( _compUI[j]._adj ); |
3661 | + if (_prof) { |
3662 | + if (_prof->getTransfToSRGB8()) { |
3663 | + for (guint i = 0; i < _profChannelCount; i++) { |
3664 | + if (static_cast<gint>(i) != ignore) { |
3665 | + cmsUInt16Number *scratch = getScratch(); |
3666 | + cmsUInt16Number filler[4] = { 0, 0, 0, 0 }; |
3667 | + for (guint j = 0; j < _profChannelCount; j++) { |
3668 | + filler[j] = 0x0ffff * ColorScales::getScaled(_compUI[j]._adj); |
3669 | } |
3670 | - |
3671 | - cmsUInt16Number* p = scratch; |
3672 | - for ( guint x = 0; x < 1024; x++ ) { |
3673 | - for ( guint j = 0; j < _profChannelCount; j++ ) { |
3674 | - if ( j == i ) { |
3675 | + |
3676 | + cmsUInt16Number *p = scratch; |
3677 | + for (guint x = 0; x < 1024; x++) { |
3678 | + for (guint j = 0; j < _profChannelCount; j++) { |
3679 | + if (j == i) { |
3680 | *p++ = x * 0x0ffff / 1024; |
3681 | - } else { |
3682 | + } |
3683 | + else { |
3684 | *p++ = filler[j]; |
3685 | } |
3686 | } |
3687 | } |
3688 | - |
3689 | + |
3690 | cmsHTRANSFORM trans = _prof->getTransfToSRGB8(); |
3691 | - if ( trans ) { |
3692 | - cmsDoTransform( trans, scratch, _compUI[i]._map, 1024 ); |
3693 | - sp_color_slider_set_map( SP_COLOR_SLIDER(_compUI[i]._slider), _compUI[i]._map ); |
3694 | + if (trans) { |
3695 | + cmsDoTransform(trans, scratch, _compUI[i]._map, 1024); |
3696 | + if (_compUI[i]._slider) |
3697 | + { |
3698 | + _compUI[i]._slider->setMap(_compUI[i]._map); |
3699 | + } |
3700 | } |
3701 | } |
3702 | } |
3703 | @@ -969,15 +921,15 @@ |
3704 | (void)ignore; |
3705 | #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3706 | |
3707 | - guint32 start = _owner->_color.toRGBA32( 0x00 ); |
3708 | - guint32 mid = _owner->_color.toRGBA32( 0x7f ); |
3709 | - guint32 end = _owner->_color.toRGBA32( 0xff ); |
3710 | + guint32 start = _color.color().toRGBA32(0x00); |
3711 | + guint32 mid = _color.color().toRGBA32(0x7f); |
3712 | + guint32 end = _color.color().toRGBA32(0xff); |
3713 | |
3714 | - sp_color_slider_set_colors( SP_COLOR_SLIDER(_slider), start, mid, end ); |
3715 | + _slider->setColors(start, mid, end); |
3716 | } |
3717 | |
3718 | |
3719 | -void ColorICCSelectorImpl::_adjustmentChanged( GtkAdjustment *adjustment, SPColorICCSelector *cs ) |
3720 | +void ColorICCSelectorImpl::_adjustmentChanged(GtkAdjustment *adjustment, ColorICCSelectorImpl *cs) |
3721 | { |
3722 | // // TODO check this. It looks questionable: |
3723 | // // if a value is entered between 0 and 1 exclusive, normalize it to (int) 0..255 or 0..100 |
3724 | @@ -986,121 +938,135 @@ |
3725 | // } |
3726 | |
3727 | #ifdef DEBUG_LCMS |
3728 | - g_message( "/^^^^^^^^^ %p::_adjustmentChanged()", cs ); |
3729 | + g_message("/^^^^^^^^^ %p::_adjustmentChanged()", cs); |
3730 | #endif // DEBUG_LCMS |
3731 | |
3732 | - ColorICCSelector* iccSelector = static_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base); |
3733 | - if (iccSelector->_impl->_updating) { |
3734 | - return; |
3735 | - } |
3736 | - |
3737 | - iccSelector->_impl->_updating = TRUE; |
3738 | - |
3739 | - gint match = -1; |
3740 | - |
3741 | - SPColor newColor( iccSelector->_color ); |
3742 | - gfloat scaled = ColorScales::getScaled( iccSelector->_impl->_adj ); |
3743 | - if ( iccSelector->_impl->_adj == adjustment ) { |
3744 | + ColorICCSelector *iccSelector = cs->_owner; |
3745 | + if (iccSelector->_impl->_updating) { |
3746 | + return; |
3747 | + } |
3748 | + |
3749 | + iccSelector->_impl->_updating = TRUE; |
3750 | + |
3751 | + gint match = -1; |
3752 | + |
3753 | + SPColor newColor(iccSelector->_impl->_color.color()); |
3754 | + gfloat scaled = ColorScales::getScaled(iccSelector->_impl->_adj); |
3755 | + if (iccSelector->_impl->_adj == adjustment) { |
3756 | #ifdef DEBUG_LCMS |
3757 | - g_message("ALPHA"); |
3758 | + g_message("ALPHA"); |
3759 | #endif // DEBUG_LCMS |
3760 | - } else { |
3761 | + } |
3762 | + else { |
3763 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3764 | - for ( size_t i = 0; i < iccSelector->_impl->_compUI.size(); i++ ) { |
3765 | - if ( iccSelector->_impl->_compUI[i]._adj == adjustment ) { |
3766 | - match = i; |
3767 | - break; |
3768 | - } |
3769 | - } |
3770 | - if ( match >= 0 ) { |
3771 | -#ifdef DEBUG_LCMS |
3772 | - g_message(" channel %d", match ); |
3773 | -#endif // DEBUG_LCMS |
3774 | - } |
3775 | - |
3776 | - |
3777 | - cmsUInt16Number tmp[4]; |
3778 | - for ( guint i = 0; i < 4; i++ ) { |
3779 | - tmp[i] = ColorScales::getScaled( iccSelector->_impl->_compUI[i]._adj ) * 0x0ffff; |
3780 | - } |
3781 | - guchar post[4] = {0,0,0,0}; |
3782 | - |
3783 | - cmsHTRANSFORM trans = iccSelector->_impl->_prof->getTransfToSRGB8(); |
3784 | - if ( trans ) { |
3785 | - cmsDoTransform( trans, tmp, post, 1 ); |
3786 | - } |
3787 | - |
3788 | - SPColor other( SP_RGBA32_U_COMPOSE(post[0], post[1], post[2], 255) ); |
3789 | - other.icc = new SVGICCColor(); |
3790 | - if ( iccSelector->_color.icc ) { |
3791 | - other.icc->colorProfile = iccSelector->_color.icc->colorProfile; |
3792 | - } |
3793 | - |
3794 | - guint32 prior = iccSelector->_color.toRGBA32(255); |
3795 | - guint32 newer = other.toRGBA32(255); |
3796 | - |
3797 | - if ( prior != newer ) { |
3798 | -#ifdef DEBUG_LCMS |
3799 | - g_message("Transformed color from 0x%08x to 0x%08x", prior, newer ); |
3800 | - g_message(" ~~~~ FLIP"); |
3801 | -#endif // DEBUG_LCMS |
3802 | - newColor = other; |
3803 | - newColor.icc->colors.clear(); |
3804 | - for ( guint i = 0; i < iccSelector->_impl->_profChannelCount; i++ ) { |
3805 | - gdouble val = ColorScales::getScaled( iccSelector->_impl->_compUI[i]._adj ); |
3806 | - val *= iccSelector->_impl->_compUI[i]._component.scale; |
3807 | - if ( iccSelector->_impl->_compUI[i]._component.scale == 256 ) { |
3808 | - val -= 128; |
3809 | - } |
3810 | - newColor.icc->colors.push_back( val ); |
3811 | - } |
3812 | - } |
3813 | + for (size_t i = 0; i < iccSelector->_impl->_compUI.size(); i++) { |
3814 | + if (iccSelector->_impl->_compUI[i]._adj == adjustment) { |
3815 | + match = i; |
3816 | + break; |
3817 | + } |
3818 | + } |
3819 | + if (match >= 0) { |
3820 | +#ifdef DEBUG_LCMS |
3821 | + g_message(" channel %d", match); |
3822 | +#endif // DEBUG_LCMS |
3823 | + } |
3824 | + |
3825 | + |
3826 | + cmsUInt16Number tmp[4]; |
3827 | + for (guint i = 0; i < 4; i++) { |
3828 | + tmp[i] = ColorScales::getScaled(iccSelector->_impl->_compUI[i]._adj) * 0x0ffff; |
3829 | + } |
3830 | + guchar post[4] = { 0, 0, 0, 0 }; |
3831 | + |
3832 | + cmsHTRANSFORM trans = iccSelector->_impl->_prof->getTransfToSRGB8(); |
3833 | + if (trans) { |
3834 | + cmsDoTransform(trans, tmp, post, 1); |
3835 | + } |
3836 | + |
3837 | + SPColor other(SP_RGBA32_U_COMPOSE(post[0], post[1], post[2], 255)); |
3838 | + other.icc = new SVGICCColor(); |
3839 | + if (iccSelector->_impl->_color.color().icc) { |
3840 | + other.icc->colorProfile = iccSelector->_impl->_color.color().icc->colorProfile; |
3841 | + } |
3842 | + |
3843 | + guint32 prior = iccSelector->_impl->_color.color().toRGBA32(255); |
3844 | + guint32 newer = other.toRGBA32(255); |
3845 | + |
3846 | + if (prior != newer) { |
3847 | +#ifdef DEBUG_LCMS |
3848 | + g_message("Transformed color from 0x%08x to 0x%08x", prior, newer); |
3849 | + g_message(" ~~~~ FLIP"); |
3850 | +#endif // DEBUG_LCMS |
3851 | + newColor = other; |
3852 | + newColor.icc->colors.clear(); |
3853 | + for (guint i = 0; i < iccSelector->_impl->_profChannelCount; i++) { |
3854 | + gdouble val = ColorScales::getScaled(iccSelector->_impl->_compUI[i]._adj); |
3855 | + val *= iccSelector->_impl->_compUI[i]._component.scale; |
3856 | + if (iccSelector->_impl->_compUI[i]._component.scale == 256) { |
3857 | + val -= 128; |
3858 | + } |
3859 | + newColor.icc->colors.push_back(val); |
3860 | + } |
3861 | + } |
3862 | #endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
3863 | - } |
3864 | - iccSelector->_updateInternals( newColor, scaled, iccSelector->_impl->_dragging ); |
3865 | - iccSelector->_impl->_updateSliders( match ); |
3866 | + } |
3867 | + iccSelector->_impl->_color.setColorAlpha(newColor, scaled); |
3868 | + // iccSelector->_updateInternals( newColor, scaled, iccSelector->_impl->_dragging ); |
3869 | + iccSelector->_impl->_updateSliders(match); |
3870 | |
3871 | - iccSelector->_impl->_updating = FALSE; |
3872 | + iccSelector->_impl->_updating = FALSE; |
3873 | #ifdef DEBUG_LCMS |
3874 | - g_message( "\\_________ %p::_adjustmentChanged()", cs ); |
3875 | + g_message("\\_________ %p::_adjustmentChanged()", cs); |
3876 | #endif // DEBUG_LCMS |
3877 | } |
3878 | |
3879 | -void ColorICCSelectorImpl::_sliderGrabbed( SPColorSlider * /*slider*/, SPColorICCSelector * /*cs*/ ) |
3880 | +void ColorICCSelectorImpl::_sliderGrabbed() |
3881 | { |
3882 | -// ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base); |
3883 | -// if (!iccSelector->_dragging) { |
3884 | -// iccSelector->_dragging = TRUE; |
3885 | -// iccSelector->_grabbed(); |
3886 | -// iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_impl->_adj ), iccSelector->_dragging ); |
3887 | -// } |
3888 | + // ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base); |
3889 | + // if (!iccSelector->_dragging) { |
3890 | + // iccSelector->_dragging = TRUE; |
3891 | + // iccSelector->_grabbed(); |
3892 | + // iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_impl->_adj ), |
3893 | + // iccSelector->_dragging ); |
3894 | + // } |
3895 | } |
3896 | |
3897 | -void ColorICCSelectorImpl::_sliderReleased( SPColorSlider * /*slider*/, SPColorICCSelector * /*cs*/ ) |
3898 | +void ColorICCSelectorImpl::_sliderReleased() |
3899 | { |
3900 | -// ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base); |
3901 | -// if (iccSelector->_dragging) { |
3902 | -// iccSelector->_dragging = FALSE; |
3903 | -// iccSelector->_released(); |
3904 | -// iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_adj ), iccSelector->_dragging ); |
3905 | -// } |
3906 | + // ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base); |
3907 | + // if (iccSelector->_dragging) { |
3908 | + // iccSelector->_dragging = FALSE; |
3909 | + // iccSelector->_released(); |
3910 | + // iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_adj ), |
3911 | + // iccSelector->_dragging ); |
3912 | + // } |
3913 | } |
3914 | |
3915 | #ifdef DEBUG_LCMS |
3916 | -void ColorICCSelectorImpl::_sliderChanged( SPColorSlider *slider, SPColorICCSelector *cs ) |
3917 | +void ColorICCSelectorImpl::_sliderChanged(SPColorSlider *slider, SPColorICCSelector *cs) |
3918 | #else |
3919 | -void ColorICCSelectorImpl::_sliderChanged( SPColorSlider * /*slider*/, SPColorICCSelector * /*cs*/ ) |
3920 | +void ColorICCSelectorImpl::_sliderChanged() |
3921 | #endif // DEBUG_LCMS |
3922 | { |
3923 | #ifdef DEBUG_LCMS |
3924 | - g_message("Changed %p and %p", slider, cs ); |
3925 | + g_message("Changed %p and %p", slider, cs); |
3926 | #endif // DEBUG_LCMS |
3927 | -// ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base); |
3928 | - |
3929 | -// iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_adj ), iccSelector->_dragging ); |
3930 | -} |
3931 | - |
3932 | - |
3933 | + // ColorICCSelector* iccSelector = dynamic_cast<ColorICCSelector*>(SP_COLOR_SELECTOR(cs)->base); |
3934 | + |
3935 | + // iccSelector->_updateInternals( iccSelector->_color, ColorScales::getScaled( iccSelector->_adj ), |
3936 | + // iccSelector->_dragging ); |
3937 | +} |
3938 | + |
3939 | +Gtk::Widget *ColorICCSelectorFactory::createWidget(Inkscape::UI::SelectedColor &color) const |
3940 | +{ |
3941 | + Gtk::Widget *w = Gtk::manage(new ColorICCSelector(color)); |
3942 | + return w; |
3943 | +} |
3944 | + |
3945 | +Glib::ustring ColorICCSelectorFactory::modeName() const { return gettext(ColorICCSelector::MODE_NAME); } |
3946 | +} |
3947 | +} |
3948 | +} |
3949 | /* |
3950 | Local Variables: |
3951 | mode:c++ |
3952 | |
3953 | === renamed file 'src/widgets/sp-color-icc-selector.h' => 'src/ui/widget/color-icc-selector.h' |
3954 | --- src/widgets/sp-color-icc-selector.h 2014-10-08 02:22:03 +0000 |
3955 | +++ src/ui/widget/color-icc-selector.h 2015-05-17 12:22:15 +0000 |
3956 | @@ -1,63 +1,69 @@ |
3957 | #ifndef SEEN_SP_COLOR_ICC_SELECTOR_H |
3958 | #define SEEN_SP_COLOR_ICC_SELECTOR_H |
3959 | |
3960 | -#include <glib.h> |
3961 | -#include "sp-color-selector.h" |
3962 | +#ifdef HAVE_CONFIG_H |
3963 | +#include <config.h> |
3964 | +#endif |
3965 | + |
3966 | +#include <gtkmm/widget.h> |
3967 | +#if WITH_GTKMM_3_0 |
3968 | +#include <gtkmm/grid.h> |
3969 | +#else |
3970 | +#include <gtkmm/table.h> |
3971 | +#endif |
3972 | + |
3973 | +#include "ui/selected-color.h" |
3974 | |
3975 | namespace Inkscape { |
3976 | + |
3977 | class ColorProfile; |
3978 | -} |
3979 | |
3980 | -struct SPColorICCSelector; |
3981 | -struct SPColorICCSelectorClass; |
3982 | +namespace UI { |
3983 | +namespace Widget { |
3984 | |
3985 | class ColorICCSelectorImpl; |
3986 | |
3987 | -class ColorICCSelector: public ColorSelector |
3988 | -{ |
3989 | -public: |
3990 | - ColorICCSelector( SPColorSelector* csel ); |
3991 | +class ColorICCSelector |
3992 | +#if GTK_CHECK_VERSION(3, 0, 0) |
3993 | + : public Gtk::Grid |
3994 | +#else |
3995 | + : public Gtk::Table |
3996 | +#endif |
3997 | + { |
3998 | + public: |
3999 | + static const gchar *MODE_NAME; |
4000 | + |
4001 | + ColorICCSelector(SelectedColor &color); |
4002 | virtual ~ColorICCSelector(); |
4003 | |
4004 | virtual void init(); |
4005 | |
4006 | -protected: |
4007 | + protected: |
4008 | + void on_show(); |
4009 | + |
4010 | virtual void _colorChanged(); |
4011 | |
4012 | - void _recalcColor( gboolean changing ); |
4013 | + void _recalcColor(gboolean changing); |
4014 | |
4015 | -private: |
4016 | + private: |
4017 | friend class ColorICCSelectorImpl; |
4018 | |
4019 | // By default, disallow copy constructor and assignment operator |
4020 | - ColorICCSelector( const ColorICCSelector& obj ); |
4021 | - ColorICCSelector& operator=( const ColorICCSelector& obj ); |
4022 | + ColorICCSelector(const ColorICCSelector &obj); |
4023 | + ColorICCSelector &operator=(const ColorICCSelector &obj); |
4024 | |
4025 | ColorICCSelectorImpl *_impl; |
4026 | }; |
4027 | |
4028 | |
4029 | - |
4030 | -#define SP_TYPE_COLOR_ICC_SELECTOR (sp_color_icc_selector_get_type()) |
4031 | -#define SP_COLOR_ICC_SELECTOR(o) (G_TYPE_CHECK_INSTANCE_CAST((o), SP_TYPE_COLOR_ICC_SELECTOR, SPColorICCSelector)) |
4032 | -#define SP_COLOR_ICC_SELECTOR_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), SP_TYPE_COLOR_ICC_SELECTOR, SPColorICCSelectorClass)) |
4033 | -#define SP_IS_COLOR_ICC_SELECTOR(o) (G_TYPE_CHECK_INSTANCE_TYPE((o), SP_TYPE_COLOR_ICC_SELECTOR)) |
4034 | -#define SP_IS_COLOR_ICC_SELECTOR_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE((k), SP_TYPE_COLOR_ICC_SELECTOR)) |
4035 | - |
4036 | -struct SPColorICCSelector { |
4037 | - SPColorSelector parent; |
4038 | -}; |
4039 | - |
4040 | -struct SPColorICCSelectorClass { |
4041 | - SPColorSelectorClass parent_class; |
4042 | -}; |
4043 | - |
4044 | -GType sp_color_icc_selector_get_type(void); |
4045 | - |
4046 | -GtkWidget *sp_color_icc_selector_new(void); |
4047 | - |
4048 | - |
4049 | - |
4050 | +class ColorICCSelectorFactory : public ColorSelectorFactory { |
4051 | + public: |
4052 | + Gtk::Widget *createWidget(SelectedColor &color) const; |
4053 | + Glib::ustring modeName() const; |
4054 | +}; |
4055 | +} |
4056 | +} |
4057 | +} |
4058 | #endif // SEEN_SP_COLOR_ICC_SELECTOR_H |
4059 | |
4060 | /* |
4061 | |
4062 | === renamed file 'src/widgets/sp-color-notebook.cpp' => 'src/ui/widget/color-notebook.cpp' |
4063 | --- src/widgets/sp-color-notebook.cpp 2014-10-08 02:22:03 +0000 |
4064 | +++ src/ui/widget/color-notebook.cpp 2015-05-17 12:22:15 +0000 |
4065 | @@ -1,11 +1,13 @@ |
4066 | -/* |
4067 | - * A notebook with RGB, CMYK, CMS, HSL, and Wheel pages |
4068 | - * |
4069 | - * Author: |
4070 | +/** |
4071 | + * @file |
4072 | + * A notebook with RGB, CMYK, CMS, HSL, and Wheel pages - implementation |
4073 | + */ |
4074 | +/* Authors: |
4075 | * Lauris Kaplinski <lauris@kaplinski.com> |
4076 | * bulia byak <buliabyak@users.sf.net> |
4077 | + * Tomasz Boczkowski <penginsbacon@gmail.com> (c++-sification) |
4078 | * |
4079 | - * Copyright (C) 2001-2002 Lauris Kaplinski |
4080 | + * Copyright (C) 2001-2014 Authors |
4081 | * |
4082 | * This code is in public domain |
4083 | */ |
4084 | @@ -14,7 +16,7 @@ |
4085 | #define noDUMP_CHANGE_INFO |
4086 | |
4087 | #ifdef HAVE_CONFIG_H |
4088 | -# include "config.h" |
4089 | +#include "config.h" |
4090 | #endif |
4091 | |
4092 | #include "widgets/icon.h" |
4093 | @@ -22,512 +24,233 @@ |
4094 | #include <string> |
4095 | #include <cstdlib> |
4096 | #include <cstddef> |
4097 | -#include <gtk/gtk.h> |
4098 | #include <glibmm/i18n.h> |
4099 | +#include <gtkmm/label.h> |
4100 | +#include <gtkmm/notebook.h> |
4101 | |
4102 | -#include "ui/dialog-events.h" |
4103 | -#include "../preferences.h" |
4104 | -#include "sp-color-notebook.h" |
4105 | -#include "spw-utilities.h" |
4106 | -#include "sp-color-scales.h" |
4107 | -#include "sp-color-icc-selector.h" |
4108 | -#include "sp-color-wheel-selector.h" |
4109 | +#include "preferences.h" |
4110 | +#include "widgets/spw-utilities.h" |
4111 | #include "svg/svg-icc-color.h" |
4112 | -#include "../inkscape.h" |
4113 | -#include "../document.h" |
4114 | -#include "../profile-manager.h" |
4115 | +#include "inkscape.h" |
4116 | +#include "document.h" |
4117 | +#include "profile-manager.h" |
4118 | #include "color-profile.h" |
4119 | #include "cms-system.h" |
4120 | +#include "ui/dialog-events.h" |
4121 | #include "ui/tools-switch.h" |
4122 | #include "ui/tools/tool-base.h" |
4123 | +#include "ui/widget/color-entry.h" |
4124 | +#include "ui/widget/color-icc-selector.h" |
4125 | +#include "ui/widget/color-notebook.h" |
4126 | +#include "ui/widget/color-scales.h" |
4127 | +#include "ui/widget/color-wheel-selector.h" |
4128 | |
4129 | using Inkscape::CMSSystem; |
4130 | |
4131 | -struct SPColorNotebookTracker { |
4132 | - const gchar* name; |
4133 | - const gchar* className; |
4134 | - GType type; |
4135 | - guint submode; |
4136 | - gboolean enabledFull; |
4137 | - gboolean enabledBrief; |
4138 | - SPColorNotebook *backPointer; |
4139 | -}; |
4140 | - |
4141 | -static void sp_color_notebook_dispose(GObject *object); |
4142 | - |
4143 | -static void sp_color_notebook_show_all (GtkWidget *widget); |
4144 | -static void sp_color_notebook_hide(GtkWidget *widget); |
4145 | - |
4146 | #define XPAD 4 |
4147 | #define YPAD 1 |
4148 | |
4149 | -G_DEFINE_TYPE(SPColorNotebook, sp_color_notebook, SP_TYPE_COLOR_SELECTOR); |
4150 | - |
4151 | -static void sp_color_notebook_class_init(SPColorNotebookClass *klass) |
4152 | -{ |
4153 | - GObjectClass *object_class = reinterpret_cast<GObjectClass *>(klass); |
4154 | - GtkWidgetClass *widget_class = reinterpret_cast<GtkWidgetClass *>(klass); |
4155 | - |
4156 | - object_class->dispose = sp_color_notebook_dispose; |
4157 | - |
4158 | - widget_class->show_all = sp_color_notebook_show_all; |
4159 | - widget_class->hide = sp_color_notebook_hide; |
4160 | -} |
4161 | - |
4162 | -static void |
4163 | -sp_color_notebook_switch_page(GtkNotebook *notebook, |
4164 | - GtkWidget *page, |
4165 | - guint page_num, |
4166 | - SPColorNotebook *colorbook) |
4167 | -{ |
4168 | - if ( colorbook ) |
4169 | - { |
4170 | - ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base); |
4171 | - nb->switchPage( notebook, page, page_num ); |
4172 | - |
4173 | - // remember the page we switched to |
4174 | - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); |
4175 | - prefs->setInt("/colorselector/page", page_num); |
4176 | - } |
4177 | -} |
4178 | - |
4179 | -void ColorNotebook::switchPage(GtkNotebook*, |
4180 | - GtkWidget*, |
4181 | - guint page_num) |
4182 | -{ |
4183 | - SPColorSelector* csel; |
4184 | - GtkWidget* widget; |
4185 | - |
4186 | - if ( gtk_notebook_get_current_page (GTK_NOTEBOOK (_book)) >= 0 ) |
4187 | - { |
4188 | - csel = getCurrentSelector(); |
4189 | - csel->base->getColorAlpha(_color, _alpha); |
4190 | - } |
4191 | - widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (_book), page_num); |
4192 | - if ( widget && SP_IS_COLOR_SELECTOR(widget) ) |
4193 | - { |
4194 | - csel = SP_COLOR_SELECTOR (widget); |
4195 | - csel->base->setColorAlpha( _color, _alpha ); |
4196 | - |
4197 | - // Temporary workaround to undo a spurious GRABBED |
4198 | - _released(); |
4199 | - } |
4200 | -} |
4201 | - |
4202 | -static gint sp_color_notebook_menu_handler( GtkWidget *widget, GdkEvent *event ) |
4203 | -{ |
4204 | - if (event->type == GDK_BUTTON_PRESS) |
4205 | - { |
4206 | - SPColorSelector* csel = SP_COLOR_SELECTOR(widget); |
4207 | - (dynamic_cast<ColorNotebook*>(csel->base))->menuHandler( event ); |
4208 | - |
4209 | - /* Tell calling code that we have handled this event; the buck |
4210 | - * stops here. */ |
4211 | - return TRUE; |
4212 | - } |
4213 | - |
4214 | - /* Tell calling code that we have not handled this event; pass it on. */ |
4215 | - return FALSE; |
4216 | -} |
4217 | - |
4218 | -gint ColorNotebook::menuHandler( GdkEvent* event ) |
4219 | -{ |
4220 | - GdkEventButton *bevent = (GdkEventButton *) event; |
4221 | - gtk_menu_popup (GTK_MENU( _popup ), NULL, NULL, NULL, NULL, |
4222 | - bevent->button, bevent->time); |
4223 | - return TRUE; |
4224 | -} |
4225 | - |
4226 | -static void sp_color_notebook_menuitem_response (GtkMenuItem *menuitem, gpointer user_data) |
4227 | -{ |
4228 | - gboolean active = gtk_check_menu_item_get_active (GTK_CHECK_MENU_ITEM (menuitem)); |
4229 | - SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (user_data); |
4230 | - if ( entry ) |
4231 | - { |
4232 | - if ( active ) |
4233 | - { |
4234 | - (dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(entry->backPointer)->base))->addPage(entry->type, entry->submode); |
4235 | - } |
4236 | - else |
4237 | - { |
4238 | - (dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(entry->backPointer)->base))->removePage(entry->type, entry->submode); |
4239 | - } |
4240 | - } |
4241 | -} |
4242 | - |
4243 | -static void |
4244 | -sp_color_notebook_init (SPColorNotebook *colorbook) |
4245 | -{ |
4246 | - SP_COLOR_SELECTOR(colorbook)->base = new ColorNotebook( SP_COLOR_SELECTOR(colorbook) ); |
4247 | - |
4248 | - if ( SP_COLOR_SELECTOR(colorbook)->base ) |
4249 | - { |
4250 | - SP_COLOR_SELECTOR(colorbook)->base->init(); |
4251 | - } |
4252 | -} |
4253 | - |
4254 | -void ColorNotebook::init() |
4255 | +namespace Inkscape { |
4256 | +namespace UI { |
4257 | +namespace Widget { |
4258 | + |
4259 | + |
4260 | +ColorNotebook::ColorNotebook(SelectedColor &color) |
4261 | +#if GTK_CHECK_VERSION(3, 0, 0) |
4262 | + : Gtk::Grid() |
4263 | +#else |
4264 | + : Gtk::Table(2, 3, false) |
4265 | +#endif |
4266 | + , _selected_color(color) |
4267 | + |
4268 | +{ |
4269 | + Page *page; |
4270 | + |
4271 | + page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_RGB), true); |
4272 | + _available_pages.push_back(page); |
4273 | + page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_HSV), true); |
4274 | + _available_pages.push_back(page); |
4275 | + page = new Page(new ColorScalesFactory(SP_COLOR_SCALES_MODE_CMYK), true); |
4276 | + _available_pages.push_back(page); |
4277 | + page = new Page(new ColorWheelSelectorFactory, true); |
4278 | + _available_pages.push_back(page); |
4279 | +#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4280 | + page = new Page(new ColorICCSelectorFactory, true); |
4281 | + _available_pages.push_back(page); |
4282 | +#endif |
4283 | + |
4284 | + _initUI(); |
4285 | + |
4286 | + _selected_color.signal_changed.connect(sigc::mem_fun(this, &ColorNotebook::_onSelectedColorChanged)); |
4287 | + _selected_color.signal_dragged.connect(sigc::mem_fun(this, &ColorNotebook::_onSelectedColorChanged)); |
4288 | +} |
4289 | + |
4290 | +ColorNotebook::~ColorNotebook() |
4291 | +{ |
4292 | + if (_buttons) { |
4293 | + delete[] _buttons; |
4294 | + _buttons = 0; |
4295 | + } |
4296 | +} |
4297 | + |
4298 | +ColorNotebook::Page::Page(Inkscape::UI::ColorSelectorFactory *selector_factory, bool enabled_full) |
4299 | + : selector_factory(selector_factory) |
4300 | + , enabled_full(enabled_full) |
4301 | +{ |
4302 | +} |
4303 | + |
4304 | + |
4305 | +void ColorNotebook::_initUI() |
4306 | { |
4307 | guint row = 0; |
4308 | - guint i = 0; |
4309 | - guint j = 0; |
4310 | - GType *selector_types = 0; |
4311 | - guint selector_type_count = 0; |
4312 | - |
4313 | - /* tempory hardcoding to get types loaded */ |
4314 | - SP_TYPE_COLOR_SCALES; |
4315 | - SP_TYPE_COLOR_WHEEL_SELECTOR; |
4316 | -#if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4317 | - SP_TYPE_COLOR_ICC_SELECTOR; |
4318 | -#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4319 | - |
4320 | - /* REJON: Comment out the next line to not use the normal GTK Color |
4321 | - wheel. */ |
4322 | - |
4323 | -// SP_TYPE_COLOR_GTKSELECTOR; |
4324 | - |
4325 | - _updating = FALSE; |
4326 | - _updatingrgba = FALSE; |
4327 | - _btn = 0; |
4328 | - _popup = 0; |
4329 | - _trackerList = g_ptr_array_new (); |
4330 | - |
4331 | - _book = gtk_notebook_new (); |
4332 | - gtk_widget_show (_book); |
4333 | - |
4334 | - // Dont show the notebook tabs, use radiobuttons instead |
4335 | - gtk_notebook_set_show_border (GTK_NOTEBOOK (_book), false); |
4336 | - gtk_notebook_set_show_tabs (GTK_NOTEBOOK (_book), false); |
4337 | - |
4338 | - selector_types = g_type_children (SP_TYPE_COLOR_SELECTOR, &selector_type_count); |
4339 | - |
4340 | - for ( i = 0; i < selector_type_count; i++ ) |
4341 | - { |
4342 | - if (!g_type_is_a (selector_types[i], SP_TYPE_COLOR_NOTEBOOK)) |
4343 | - { |
4344 | - guint howmany = 1; |
4345 | - gpointer klass = g_type_class_ref (selector_types[i]); |
4346 | - if ( klass && SP_IS_COLOR_SELECTOR_CLASS(klass) ) |
4347 | - { |
4348 | - SPColorSelectorClass *ck = SP_COLOR_SELECTOR_CLASS (klass); |
4349 | - howmany = MAX (1, ck->submode_count); |
4350 | - for ( j = 0; j < howmany; j++ ) |
4351 | - { |
4352 | - SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (malloc(sizeof(SPColorNotebookTracker))); |
4353 | - if ( entry ) |
4354 | - { |
4355 | - memset( entry, 0, sizeof(SPColorNotebookTracker) ); |
4356 | - entry->name = ck->name[j]; |
4357 | - entry->type = selector_types[i]; |
4358 | - entry->submode = j; |
4359 | - entry->enabledFull = TRUE; |
4360 | - entry->enabledBrief = TRUE; |
4361 | - entry->backPointer = SP_COLOR_NOTEBOOK(_csel); |
4362 | - |
4363 | - g_ptr_array_add (_trackerList, entry); |
4364 | - } |
4365 | - } |
4366 | - } |
4367 | - } |
4368 | - } |
4369 | - |
4370 | -#if GTK_CHECK_VERSION(3,0,0) |
4371 | + |
4372 | + Gtk::Notebook *notebook = Gtk::manage(new Gtk::Notebook); |
4373 | + notebook->show(); |
4374 | + notebook->set_show_border(false); |
4375 | + notebook->set_show_tabs(false); |
4376 | + _book = GTK_WIDGET(notebook->gobj()); |
4377 | + |
4378 | +#if GTK_CHECK_VERSION(3, 0, 0) |
4379 | _buttonbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 2); |
4380 | gtk_box_set_homogeneous(GTK_BOX(_buttonbox), TRUE); |
4381 | #else |
4382 | - _buttonbox = gtk_hbox_new (TRUE, 2); |
4383 | + _buttonbox = gtk_hbox_new(TRUE, 2); |
4384 | #endif |
4385 | |
4386 | - gtk_widget_show (_buttonbox); |
4387 | - _buttons = new GtkWidget *[_trackerList->len]; |
4388 | + gtk_widget_show(_buttonbox); |
4389 | + _buttons = new GtkWidget *[_available_pages.size()]; |
4390 | |
4391 | - for ( i = 0; i < _trackerList->len; i++ ) |
4392 | - { |
4393 | - SPColorNotebookTracker *entry = |
4394 | - reinterpret_cast< SPColorNotebookTracker* > (g_ptr_array_index (_trackerList, i)); |
4395 | - if ( entry ) |
4396 | - { |
4397 | - addPage(entry->type, entry->submode); |
4398 | - } |
4399 | + for (int i = 0; static_cast<size_t>(i) < _available_pages.size(); i++) { |
4400 | + _addPage(_available_pages[i]); |
4401 | } |
4402 | |
4403 | -#if GTK_CHECK_VERSION(3,0,0) |
4404 | - GtkWidget* table = gtk_grid_new(); |
4405 | -#else |
4406 | - GtkWidget* table = gtk_table_new(2, 3, FALSE); |
4407 | -#endif |
4408 | - |
4409 | - gtk_widget_show (table); |
4410 | - |
4411 | - gtk_box_pack_start (GTK_BOX (_csel), table, TRUE, TRUE, 0); |
4412 | - |
4413 | - sp_set_font_size_smaller (_buttonbox); |
4414 | - |
4415 | -#if GTK_CHECK_VERSION(3,0,0) |
4416 | - #if GTK_CHECK_VERSION(3,12,0) |
4417 | + sp_set_font_size_smaller(_buttonbox); |
4418 | + |
4419 | +#if GTK_CHECK_VERSION(3, 0, 0) |
4420 | + #if GTK_CHECK_VERSION(3, 12, 0) |
4421 | gtk_widget_set_margin_start(_buttonbox, XPAD); |
4422 | gtk_widget_set_margin_end(_buttonbox, XPAD); |
4423 | - #else |
4424 | + #else |
4425 | gtk_widget_set_margin_left(_buttonbox, XPAD); |
4426 | gtk_widget_set_margin_right(_buttonbox, XPAD); |
4427 | - #endif |
4428 | + #endif |
4429 | gtk_widget_set_margin_top(_buttonbox, YPAD); |
4430 | gtk_widget_set_margin_bottom(_buttonbox, YPAD); |
4431 | gtk_widget_set_hexpand(_buttonbox, TRUE); |
4432 | gtk_widget_set_valign(_buttonbox, GTK_ALIGN_CENTER); |
4433 | - gtk_grid_attach(GTK_GRID(table), _buttonbox, 0, row, 2, 1); |
4434 | + attach(*Glib::wrap(_buttonbox), 0, row, 2, 1); |
4435 | #else |
4436 | - gtk_table_attach (GTK_TABLE (table), _buttonbox, 0, 2, row, row + 1, |
4437 | - static_cast<GtkAttachOptions>(GTK_EXPAND|GTK_FILL), |
4438 | - static_cast<GtkAttachOptions>(0), |
4439 | - XPAD, YPAD); |
4440 | + attach(*Glib::wrap(_buttonbox), 0, 2, row, row + 1, Gtk::EXPAND | Gtk::FILL, static_cast<Gtk::AttachOptions>(0), |
4441 | + XPAD, YPAD); |
4442 | #endif |
4443 | |
4444 | row++; |
4445 | |
4446 | -#if GTK_CHECK_VERSION(3,0,0) |
4447 | - #if GTK_CHECK_VERSION(3,12,0) |
4448 | - gtk_widget_set_margin_start(_book, XPAD*2); |
4449 | - gtk_widget_set_margin_end(_book, XPAD*2); |
4450 | - #else |
4451 | - gtk_widget_set_margin_left(_book, XPAD*2); |
4452 | - gtk_widget_set_margin_right(_book, XPAD*2); |
4453 | - #endif |
4454 | +#if GTK_CHECK_VERSION(3, 0, 0) |
4455 | +#if GTK_CHECK_VERSION(3, 12, 0) |
4456 | + gtk_widget_set_margin_start(_book, XPAD * 2); |
4457 | + gtk_widget_set_margin_end(_book, XPAD * 2); |
4458 | +#else |
4459 | + gtk_widget_set_margin_left(_book, XPAD * 2); |
4460 | + gtk_widget_set_margin_right(_book, XPAD * 2); |
4461 | +#endif |
4462 | gtk_widget_set_margin_top(_book, YPAD); |
4463 | gtk_widget_set_margin_bottom(_book, YPAD); |
4464 | gtk_widget_set_hexpand(_book, TRUE); |
4465 | gtk_widget_set_vexpand(_book, TRUE); |
4466 | - gtk_grid_attach(GTK_GRID(table), _book, 0, row, 2, 1); |
4467 | + attach(*notebook, 0, row, 2, 1); |
4468 | #else |
4469 | - gtk_table_attach (GTK_TABLE (table), _book, 0, 2, row, row + 1, |
4470 | - static_cast<GtkAttachOptions>(GTK_EXPAND|GTK_FILL), |
4471 | - static_cast<GtkAttachOptions>(GTK_EXPAND|GTK_FILL), |
4472 | - XPAD*2, YPAD); |
4473 | + attach(*notebook, 0, 2, row, row + 1, Gtk::EXPAND | Gtk::FILL, Gtk::EXPAND | Gtk::FILL, XPAD * 2, YPAD); |
4474 | #endif |
4475 | |
4476 | // restore the last active page |
4477 | Inkscape::Preferences *prefs = Inkscape::Preferences::get(); |
4478 | _setCurrentPage(prefs->getInt("/colorselector/page", 0)); |
4479 | - |
4480 | - { |
4481 | - gboolean found = FALSE; |
4482 | - |
4483 | - _popup = gtk_menu_new(); |
4484 | - GtkMenu *menu = GTK_MENU (_popup); |
4485 | - |
4486 | - for ( i = 0; i < _trackerList->len; i++ ) |
4487 | - { |
4488 | - SPColorNotebookTracker *entry = reinterpret_cast< SPColorNotebookTracker* > (g_ptr_array_index (_trackerList, i)); |
4489 | - if ( entry ) |
4490 | - { |
4491 | - GtkWidget *item = gtk_check_menu_item_new_with_label (_(entry->name)); |
4492 | - gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), entry->enabledFull); |
4493 | - gtk_widget_show (item); |
4494 | - gtk_menu_shell_append (GTK_MENU_SHELL(menu), item); |
4495 | - |
4496 | - g_signal_connect (G_OBJECT (item), "activate", |
4497 | - G_CALLBACK (sp_color_notebook_menuitem_response), |
4498 | - reinterpret_cast< gpointer > (entry) ); |
4499 | - found = TRUE; |
4500 | - } |
4501 | - } |
4502 | - |
4503 | - GtkWidget *arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_NONE); |
4504 | - gtk_widget_show (arrow); |
4505 | - |
4506 | - _btn = gtk_button_new (); |
4507 | - gtk_widget_show (_btn); |
4508 | - gtk_container_add (GTK_CONTAINER (_btn), arrow); |
4509 | - |
4510 | - GtkWidget *align = gtk_alignment_new (1.0, 0.0, 0.0, 0.0); |
4511 | - gtk_widget_show (align); |
4512 | - gtk_container_add (GTK_CONTAINER (align), _btn); |
4513 | - |
4514 | - // uncomment to reenable the "show/hide modes" menu, |
4515 | - // but first fix it so it remembers its settings in prefs and does not take that much space (entire vertical column!) |
4516 | - //gtk_table_attach (GTK_TABLE (table), align, 2, 3, row, row + 1, GTK_FILL, GTK_FILL, XPAD, YPAD); |
4517 | - |
4518 | - g_signal_connect_swapped(G_OBJECT(_btn), "event", G_CALLBACK (sp_color_notebook_menu_handler), G_OBJECT(_csel)); |
4519 | - if ( !found ) |
4520 | - { |
4521 | - gtk_widget_set_sensitive (_btn, FALSE); |
4522 | - } |
4523 | - } |
4524 | - |
4525 | row++; |
4526 | |
4527 | -#if GTK_CHECK_VERSION(3,0,0) |
4528 | +#if GTK_CHECK_VERSION(3, 0, 0) |
4529 | GtkWidget *rgbabox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); |
4530 | #else |
4531 | - GtkWidget *rgbabox = gtk_hbox_new (FALSE, 0); |
4532 | + GtkWidget *rgbabox = gtk_hbox_new(FALSE, 0); |
4533 | #endif |
4534 | |
4535 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4536 | /* Create color management icons */ |
4537 | - _box_colormanaged = gtk_event_box_new (); |
4538 | - GtkWidget *colormanaged = gtk_image_new_from_icon_name ("color-management-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); |
4539 | - gtk_container_add (GTK_CONTAINER (_box_colormanaged), colormanaged); |
4540 | - gtk_widget_set_tooltip_text (_box_colormanaged, _("Color Managed")); |
4541 | - gtk_widget_set_sensitive (_box_colormanaged, false); |
4542 | + _box_colormanaged = gtk_event_box_new(); |
4543 | + GtkWidget *colormanaged = gtk_image_new_from_icon_name("color-management-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); |
4544 | + gtk_container_add(GTK_CONTAINER(_box_colormanaged), colormanaged); |
4545 | + gtk_widget_set_tooltip_text(_box_colormanaged, _("Color Managed")); |
4546 | + gtk_widget_set_sensitive(_box_colormanaged, false); |
4547 | gtk_box_pack_start(GTK_BOX(rgbabox), _box_colormanaged, FALSE, FALSE, 2); |
4548 | |
4549 | - _box_outofgamut = gtk_event_box_new (); |
4550 | - GtkWidget *outofgamut = gtk_image_new_from_icon_name ("out-of-gamut-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); |
4551 | - gtk_container_add (GTK_CONTAINER (_box_outofgamut), outofgamut); |
4552 | - gtk_widget_set_tooltip_text (_box_outofgamut, _("Out of gamut!")); |
4553 | - gtk_widget_set_sensitive (_box_outofgamut, false); |
4554 | + _box_outofgamut = gtk_event_box_new(); |
4555 | + GtkWidget *outofgamut = gtk_image_new_from_icon_name("out-of-gamut-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); |
4556 | + gtk_container_add(GTK_CONTAINER(_box_outofgamut), outofgamut); |
4557 | + gtk_widget_set_tooltip_text(_box_outofgamut, _("Out of gamut!")); |
4558 | + gtk_widget_set_sensitive(_box_outofgamut, false); |
4559 | gtk_box_pack_start(GTK_BOX(rgbabox), _box_outofgamut, FALSE, FALSE, 2); |
4560 | |
4561 | - _box_toomuchink = gtk_event_box_new (); |
4562 | - GtkWidget *toomuchink = gtk_image_new_from_icon_name ("too-much-ink-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); |
4563 | - gtk_container_add (GTK_CONTAINER (_box_toomuchink), toomuchink); |
4564 | - gtk_widget_set_tooltip_text (_box_toomuchink, _("Too much ink!")); |
4565 | - gtk_widget_set_sensitive (_box_toomuchink, false); |
4566 | + _box_toomuchink = gtk_event_box_new(); |
4567 | + GtkWidget *toomuchink = gtk_image_new_from_icon_name("too-much-ink-icon", GTK_ICON_SIZE_SMALL_TOOLBAR); |
4568 | + gtk_container_add(GTK_CONTAINER(_box_toomuchink), toomuchink); |
4569 | + gtk_widget_set_tooltip_text(_box_toomuchink, _("Too much ink!")); |
4570 | + gtk_widget_set_sensitive(_box_toomuchink, false); |
4571 | gtk_box_pack_start(GTK_BOX(rgbabox), _box_toomuchink, FALSE, FALSE, 2); |
4572 | -#endif //defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4573 | +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4574 | |
4575 | |
4576 | /* Color picker */ |
4577 | - GtkWidget *picker = gtk_image_new_from_icon_name ("color-picker", GTK_ICON_SIZE_SMALL_TOOLBAR); |
4578 | - _btn_picker = gtk_button_new (); |
4579 | + GtkWidget *picker = gtk_image_new_from_icon_name("color-picker", GTK_ICON_SIZE_SMALL_TOOLBAR); |
4580 | + _btn_picker = gtk_button_new(); |
4581 | gtk_button_set_relief(GTK_BUTTON(_btn_picker), GTK_RELIEF_NONE); |
4582 | - gtk_widget_show (_btn); |
4583 | - gtk_container_add (GTK_CONTAINER (_btn_picker), picker); |
4584 | - gtk_widget_set_tooltip_text (_btn_picker, _("Pick colors from image")); |
4585 | + gtk_container_add(GTK_CONTAINER(_btn_picker), picker); |
4586 | + gtk_widget_set_tooltip_text(_btn_picker, _("Pick colors from image")); |
4587 | gtk_box_pack_start(GTK_BOX(rgbabox), _btn_picker, FALSE, FALSE, 2); |
4588 | - g_signal_connect(G_OBJECT(_btn_picker), "clicked", G_CALLBACK(ColorNotebook::_picker_clicked), _csel); |
4589 | + g_signal_connect(G_OBJECT(_btn_picker), "clicked", G_CALLBACK(ColorNotebook::_onPickerClicked), this); |
4590 | |
4591 | /* Create RGBA entry and color preview */ |
4592 | - _rgbal = gtk_label_new_with_mnemonic (_("RGBA_:")); |
4593 | - gtk_misc_set_alignment (GTK_MISC (_rgbal), 1.0, 0.5); |
4594 | + _rgbal = gtk_label_new_with_mnemonic(_("RGBA_:")); |
4595 | + gtk_misc_set_alignment(GTK_MISC(_rgbal), 1.0, 0.5); |
4596 | gtk_box_pack_start(GTK_BOX(rgbabox), _rgbal, TRUE, TRUE, 2); |
4597 | |
4598 | - _rgbae = gtk_entry_new (); |
4599 | - sp_dialog_defocus_on_enter (_rgbae); |
4600 | - gtk_entry_set_max_length (GTK_ENTRY (_rgbae), 8); |
4601 | - gtk_entry_set_width_chars (GTK_ENTRY (_rgbae), 8); |
4602 | - gtk_widget_set_tooltip_text (_rgbae, _("Hexadecimal RGBA value of the color")); |
4603 | - gtk_box_pack_start(GTK_BOX(rgbabox), _rgbae, FALSE, FALSE, 0); |
4604 | - gtk_label_set_mnemonic_widget (GTK_LABEL(_rgbal), _rgbae); |
4605 | + ColorEntry *rgba_entry = Gtk::manage(new ColorEntry(_selected_color)); |
4606 | + sp_dialog_defocus_on_enter(GTK_WIDGET(rgba_entry->gobj())); |
4607 | + gtk_box_pack_start(GTK_BOX(rgbabox), GTK_WIDGET(rgba_entry->gobj()), FALSE, FALSE, 0); |
4608 | + gtk_label_set_mnemonic_widget(GTK_LABEL(_rgbal), GTK_WIDGET(rgba_entry->gobj())); |
4609 | |
4610 | - sp_set_font_size_smaller (rgbabox); |
4611 | - gtk_widget_show_all (rgbabox); |
4612 | + sp_set_font_size_smaller(rgbabox); |
4613 | + gtk_widget_show_all(rgbabox); |
4614 | |
4615 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4616 | - //the "too much ink" icon is initially hidden |
4617 | + // the "too much ink" icon is initially hidden |
4618 | gtk_widget_hide(GTK_WIDGET(_box_toomuchink)); |
4619 | -#endif //defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4620 | +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4621 | |
4622 | -#if GTK_CHECK_VERSION(3,0,0) |
4623 | - #if GTK_CHECK_VERSION(3,12,0) |
4624 | +#if GTK_CHECK_VERSION(3, 0, 0) |
4625 | + #if GTK_CHECK_VERSION(3, 12, 0) |
4626 | gtk_widget_set_margin_start(rgbabox, XPAD); |
4627 | gtk_widget_set_margin_end(rgbabox, XPAD); |
4628 | - #else |
4629 | + #else |
4630 | gtk_widget_set_margin_left(rgbabox, XPAD); |
4631 | gtk_widget_set_margin_right(rgbabox, XPAD); |
4632 | - #endif |
4633 | + #endif |
4634 | gtk_widget_set_margin_top(rgbabox, YPAD); |
4635 | gtk_widget_set_margin_bottom(rgbabox, YPAD); |
4636 | - gtk_grid_attach(GTK_GRID(table), rgbabox, 0, row, 2, 1); |
4637 | + attach(*Glib::wrap(rgbabox), 0, row, 2, 1); |
4638 | #else |
4639 | - gtk_table_attach (GTK_TABLE (table), rgbabox, 0, 2, row, row + 1, GTK_FILL, GTK_SHRINK, XPAD, YPAD); |
4640 | + attach(*Glib::wrap(rgbabox), 0, 2, row, row + 1, Gtk::FILL, Gtk::SHRINK, XPAD, YPAD); |
4641 | #endif |
4642 | |
4643 | #ifdef SPCS_PREVIEW |
4644 | - _p = sp_color_preview_new (0xffffffff); |
4645 | - gtk_widget_show (_p); |
4646 | - gtk_table_attach (GTK_TABLE (table), _p, 2, 3, row, row + 1, GTK_FILL, GTK_FILL, XPAD, YPAD); |
4647 | + _p = sp_color_preview_new(0xffffffff); |
4648 | + gtk_widget_show(_p); |
4649 | + attach(*Glib::wrap(_p), 2, 3, row, row + 1, Gtk::FILL, Gtk::FILL, XPAD, YPAD); |
4650 | #endif |
4651 | |
4652 | - _switchId = g_signal_connect(G_OBJECT (_book), "switch-page", |
4653 | - G_CALLBACK (sp_color_notebook_switch_page), SP_COLOR_NOTEBOOK(_csel)); |
4654 | - |
4655 | - _entryId = g_signal_connect (G_OBJECT (_rgbae), "changed", G_CALLBACK (ColorNotebook::_rgbaEntryChangedHook), _csel); |
4656 | -} |
4657 | - |
4658 | -static void sp_color_notebook_dispose(GObject *object) |
4659 | -{ |
4660 | - if (G_OBJECT_CLASS(sp_color_notebook_parent_class)->dispose) |
4661 | - G_OBJECT_CLASS(sp_color_notebook_parent_class)->dispose(object); |
4662 | -} |
4663 | - |
4664 | -ColorNotebook::~ColorNotebook() |
4665 | -{ |
4666 | - if ( _trackerList ) |
4667 | - { |
4668 | - g_ptr_array_free (_trackerList, TRUE); |
4669 | - _trackerList = 0; |
4670 | - } |
4671 | - |
4672 | - if ( _switchId ) |
4673 | - { |
4674 | - if ( _book ) |
4675 | - { |
4676 | - g_signal_handler_disconnect (_book, _switchId); |
4677 | - _switchId = 0; |
4678 | - } |
4679 | - } |
4680 | - |
4681 | - if ( _buttons ) |
4682 | - { |
4683 | - delete [] _buttons; |
4684 | - _buttons = 0; |
4685 | - } |
4686 | - |
4687 | -} |
4688 | - |
4689 | -static void |
4690 | -sp_color_notebook_show_all (GtkWidget *widget) |
4691 | -{ |
4692 | - gtk_widget_show (widget); |
4693 | -} |
4694 | - |
4695 | -static void sp_color_notebook_hide(GtkWidget *widget) |
4696 | -{ |
4697 | - gtk_widget_hide(widget); |
4698 | -} |
4699 | - |
4700 | -GtkWidget *sp_color_notebook_new() |
4701 | -{ |
4702 | - SPColorNotebook *colorbook = SP_COLOR_NOTEBOOK(g_object_new (SP_TYPE_COLOR_NOTEBOOK, NULL)); |
4703 | - |
4704 | - return GTK_WIDGET(colorbook); |
4705 | -} |
4706 | - |
4707 | -ColorNotebook::ColorNotebook( SPColorSelector* csel ) |
4708 | - : ColorSelector( csel ) |
4709 | -{ |
4710 | -} |
4711 | - |
4712 | -SPColorSelector* ColorNotebook::getCurrentSelector() |
4713 | -{ |
4714 | - SPColorSelector* csel = NULL; |
4715 | - gint current_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (_book)); |
4716 | - |
4717 | - if ( current_page >= 0 ) |
4718 | - { |
4719 | - GtkWidget* widget = gtk_notebook_get_nth_page (GTK_NOTEBOOK (_book), current_page); |
4720 | - if ( SP_IS_COLOR_SELECTOR (widget) ) |
4721 | - { |
4722 | - csel = SP_COLOR_SELECTOR (widget); |
4723 | - } |
4724 | - } |
4725 | - |
4726 | - return csel; |
4727 | -} |
4728 | - |
4729 | -void ColorNotebook::_colorChanged() |
4730 | -{ |
4731 | - SPColorSelector* cselPage = getCurrentSelector(); |
4732 | - if ( cselPage ) |
4733 | - { |
4734 | - cselPage->base->setColorAlpha( _color, _alpha ); |
4735 | - } |
4736 | - |
4737 | - _updateRgbaEntry( _color, _alpha ); |
4738 | -} |
4739 | - |
4740 | -void ColorNotebook::_picker_clicked(GtkWidget * /*widget*/, SPColorNotebook * /*colorbook*/) |
4741 | + g_signal_connect(G_OBJECT(_book), "switch-page", G_CALLBACK(ColorNotebook::_onPageSwitched), this); |
4742 | +} |
4743 | + |
4744 | +void ColorNotebook::_onPickerClicked(GtkWidget * /*widget*/, ColorNotebook * /*colorbook*/) |
4745 | { |
4746 | // Set the dropper into a "one click" mode, so it reverts to the previous tool after a click |
4747 | Inkscape::Preferences *prefs = Inkscape::Preferences::get(); |
4748 | @@ -535,283 +258,113 @@ |
4749 | Inkscape::UI::Tools::sp_toggle_dropper(SP_ACTIVE_DESKTOP); |
4750 | } |
4751 | |
4752 | -void ColorNotebook::_rgbaEntryChangedHook(GtkEntry *entry, SPColorNotebook *colorbook) |
4753 | -{ |
4754 | - (dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base))->_rgbaEntryChanged( entry ); |
4755 | -} |
4756 | - |
4757 | -void ColorNotebook::_rgbaEntryChanged(GtkEntry* entry) |
4758 | -{ |
4759 | - if (_updating) return; |
4760 | - if (_updatingrgba) return; |
4761 | - |
4762 | - const gchar *t = gtk_entry_get_text( entry ); |
4763 | - |
4764 | - if (t) { |
4765 | - Glib::ustring text = t; |
4766 | - bool changed = false; |
4767 | - if (!text.empty() && text[0] == '#') { |
4768 | - changed = true; |
4769 | - text.erase(0,1); |
4770 | - if (text.size() == 6) { |
4771 | - // it was a standard RGB hex |
4772 | - unsigned int alph = SP_COLOR_F_TO_U(_alpha); |
4773 | - gchar* tmp = g_strdup_printf("%02x", alph); |
4774 | - text += tmp; |
4775 | - g_free(tmp); |
4776 | - } |
4777 | - } |
4778 | - gchar* str = g_strdup(text.c_str()); |
4779 | - gchar* end = 0; |
4780 | - guint64 rgba = g_ascii_strtoull( str, &end, 16 ); |
4781 | - if ( end != str ) { |
4782 | - ptrdiff_t len = end - str; |
4783 | - if ( len < 8 ) { |
4784 | - rgba = rgba << ( 4 * ( 8 - len ) ); |
4785 | - } |
4786 | - _updatingrgba = TRUE; |
4787 | - if ( changed ) { |
4788 | - gtk_entry_set_text( entry, str ); |
4789 | - } |
4790 | - SPColor color( rgba ); |
4791 | - setColorAlpha( color, SP_RGBA32_A_F(rgba), true ); |
4792 | - _updatingrgba = FALSE; |
4793 | - } |
4794 | - g_free(str); |
4795 | - } |
4796 | -} |
4797 | +void ColorNotebook::_onButtonClicked(GtkWidget *widget, ColorNotebook *nb) |
4798 | +{ |
4799 | + if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget))) { |
4800 | + return; |
4801 | + } |
4802 | + |
4803 | + for (gint i = 0; i < gtk_notebook_get_n_pages(GTK_NOTEBOOK(nb->_book)); i++) { |
4804 | + if (nb->_buttons[i] == widget) { |
4805 | + gtk_notebook_set_current_page(GTK_NOTEBOOK(nb->_book), i); |
4806 | + } |
4807 | + } |
4808 | +} |
4809 | + |
4810 | +void ColorNotebook::_onSelectedColorChanged() { _updateICCButtons(); } |
4811 | + |
4812 | +void ColorNotebook::_onPageSwitched(GtkNotebook *notebook, GtkWidget *page, guint page_num, ColorNotebook *colorbook) |
4813 | +{ |
4814 | + if (colorbook->get_visible()) { |
4815 | + // remember the page we switched to |
4816 | + Inkscape::Preferences *prefs = Inkscape::Preferences::get(); |
4817 | + prefs->setInt("/colorselector/page", page_num); |
4818 | + } |
4819 | +} |
4820 | + |
4821 | |
4822 | // TODO pass in param so as to avoid the need for SP_ACTIVE_DOCUMENT |
4823 | -void ColorNotebook::_updateRgbaEntry( const SPColor& color, gfloat alpha ) |
4824 | +void ColorNotebook::_updateICCButtons() |
4825 | { |
4826 | - g_return_if_fail( ( 0.0 <= alpha ) && ( alpha <= 1.0 ) ); |
4827 | + SPColor color = _selected_color.color(); |
4828 | + gfloat alpha = _selected_color.alpha(); |
4829 | + |
4830 | + g_return_if_fail((0.0 <= alpha) && (alpha <= 1.0)); |
4831 | |
4832 | #if defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4833 | /* update color management icon*/ |
4834 | - gtk_widget_set_sensitive (_box_colormanaged, color.icc != NULL); |
4835 | + gtk_widget_set_sensitive(_box_colormanaged, color.icc != NULL); |
4836 | |
4837 | /* update out-of-gamut icon */ |
4838 | - gtk_widget_set_sensitive (_box_outofgamut, false); |
4839 | - if (color.icc){ |
4840 | - Inkscape::ColorProfile* target_profile = SP_ACTIVE_DOCUMENT->profileManager->find(color.icc->colorProfile.c_str()); |
4841 | - if ( target_profile ) |
4842 | + gtk_widget_set_sensitive(_box_outofgamut, false); |
4843 | + if (color.icc) { |
4844 | + Inkscape::ColorProfile *target_profile = |
4845 | + SP_ACTIVE_DOCUMENT->profileManager->find(color.icc->colorProfile.c_str()); |
4846 | + if (target_profile) |
4847 | gtk_widget_set_sensitive(_box_outofgamut, target_profile->GamutCheck(color)); |
4848 | } |
4849 | |
4850 | /* update too-much-ink icon */ |
4851 | - gtk_widget_set_sensitive (_box_toomuchink, false); |
4852 | - if (color.icc){ |
4853 | - Inkscape::ColorProfile* prof = SP_ACTIVE_DOCUMENT->profileManager->find(color.icc->colorProfile.c_str()); |
4854 | - if ( prof && CMSSystem::isPrintColorSpace(prof) ) { |
4855 | + gtk_widget_set_sensitive(_box_toomuchink, false); |
4856 | + if (color.icc) { |
4857 | + Inkscape::ColorProfile *prof = SP_ACTIVE_DOCUMENT->profileManager->find(color.icc->colorProfile.c_str()); |
4858 | + if (prof && CMSSystem::isPrintColorSpace(prof)) { |
4859 | gtk_widget_show(GTK_WIDGET(_box_toomuchink)); |
4860 | double ink_sum = 0; |
4861 | - for (unsigned int i=0; i<color.icc->colors.size(); i++){ |
4862 | + for (unsigned int i = 0; i < color.icc->colors.size(); i++) { |
4863 | ink_sum += color.icc->colors[i]; |
4864 | } |
4865 | |
4866 | - /* Some literature states that when the sum of paint values exceed 320%, it is considered to be a satured color, |
4867 | - which means the paper can get too wet due to an excessive ammount of ink. This may lead to several issues |
4868 | + /* Some literature states that when the sum of paint values exceed 320%, it is considered to be a satured |
4869 | + color, |
4870 | + which means the paper can get too wet due to an excessive ammount of ink. This may lead to several |
4871 | + issues |
4872 | such as misalignment and poor quality of printing in general.*/ |
4873 | - if ( ink_sum > 3.2 ) |
4874 | - gtk_widget_set_sensitive (_box_toomuchink, true); |
4875 | - } else { |
4876 | + if (ink_sum > 3.2) |
4877 | + gtk_widget_set_sensitive(_box_toomuchink, true); |
4878 | + } |
4879 | + else { |
4880 | gtk_widget_hide(GTK_WIDGET(_box_toomuchink)); |
4881 | } |
4882 | } |
4883 | -#endif //defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4884 | - |
4885 | - if ( !_updatingrgba ) |
4886 | - { |
4887 | - gchar s[32]; |
4888 | - guint32 rgba; |
4889 | - |
4890 | - /* Update RGBA entry */ |
4891 | - rgba = color.toRGBA32( alpha ); |
4892 | - |
4893 | - g_snprintf (s, 32, "%08x", rgba); |
4894 | - const gchar* oldText = gtk_entry_get_text( GTK_ENTRY( _rgbae ) ); |
4895 | - if ( strcmp( oldText, s ) != 0 ) |
4896 | - { |
4897 | - g_signal_handler_block( _rgbae, _entryId ); |
4898 | - gtk_entry_set_text( GTK_ENTRY(_rgbae), s ); |
4899 | - g_signal_handler_unblock( _rgbae, _entryId ); |
4900 | - } |
4901 | - } |
4902 | +#endif // defined(HAVE_LIBLCMS1) || defined(HAVE_LIBLCMS2) |
4903 | } |
4904 | |
4905 | void ColorNotebook::_setCurrentPage(int i) |
4906 | { |
4907 | gtk_notebook_set_current_page(GTK_NOTEBOOK(_book), i); |
4908 | |
4909 | - if (_buttons && _trackerList && (static_cast<size_t>(i) < _trackerList->len) ) { |
4910 | + if (_buttons && (static_cast<size_t>(i) < _available_pages.size())) { |
4911 | gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(_buttons[i]), TRUE); |
4912 | } |
4913 | } |
4914 | |
4915 | -void ColorNotebook::_buttonClicked(GtkWidget *widget, SPColorNotebook *colorbook) |
4916 | -{ |
4917 | - ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base); |
4918 | - |
4919 | - if (!gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON(widget))) { |
4920 | - return; |
4921 | - } |
4922 | - |
4923 | - for(gint i = 0; i < gtk_notebook_get_n_pages (GTK_NOTEBOOK (nb->_book)); i++) { |
4924 | - if (nb->_buttons[i] == widget) { |
4925 | - gtk_notebook_set_current_page (GTK_NOTEBOOK (nb->_book), i); |
4926 | - } |
4927 | - } |
4928 | -} |
4929 | - |
4930 | -void ColorNotebook::_entryGrabbed (SPColorSelector *, SPColorNotebook *colorbook) |
4931 | -{ |
4932 | - ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base); |
4933 | - nb->_grabbed(); |
4934 | -} |
4935 | - |
4936 | -void ColorNotebook::_entryDragged (SPColorSelector *csel, SPColorNotebook *colorbook) |
4937 | -{ |
4938 | - gboolean oldState; |
4939 | - ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base); |
4940 | - |
4941 | - oldState = nb->_dragging; |
4942 | - |
4943 | - nb->_dragging = TRUE; |
4944 | - nb->_entryModified( csel, colorbook ); |
4945 | - |
4946 | - nb->_dragging = oldState; |
4947 | -} |
4948 | - |
4949 | -void ColorNotebook::_entryReleased (SPColorSelector *, SPColorNotebook *colorbook) |
4950 | -{ |
4951 | - ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base); |
4952 | - nb->_released(); |
4953 | -} |
4954 | - |
4955 | -void ColorNotebook::_entryChanged (SPColorSelector *csel, SPColorNotebook *colorbook) |
4956 | -{ |
4957 | - gboolean oldState; |
4958 | - ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base); |
4959 | - |
4960 | - oldState = nb->_dragging; |
4961 | - |
4962 | - nb->_dragging = FALSE; |
4963 | - nb->_entryModified( csel, colorbook ); |
4964 | - |
4965 | - nb->_dragging = oldState; |
4966 | -} |
4967 | - |
4968 | -void ColorNotebook::_entryModified (SPColorSelector *csel, SPColorNotebook *colorbook) |
4969 | -{ |
4970 | - g_return_if_fail (colorbook != NULL); |
4971 | - g_return_if_fail (SP_IS_COLOR_NOTEBOOK (colorbook)); |
4972 | - g_return_if_fail (csel != NULL); |
4973 | - g_return_if_fail (SP_IS_COLOR_SELECTOR (csel)); |
4974 | - |
4975 | - ColorNotebook* nb = dynamic_cast<ColorNotebook*>(SP_COLOR_SELECTOR(colorbook)->base); |
4976 | - SPColor color; |
4977 | - gfloat alpha = 1.0; |
4978 | - |
4979 | - csel->base->getColorAlpha( color, alpha ); |
4980 | - nb->_updateRgbaEntry( color, alpha ); |
4981 | - nb->_updateInternals( color, alpha, nb->_dragging ); |
4982 | -} |
4983 | - |
4984 | -GtkWidget* ColorNotebook::addPage(GType page_type, guint submode) |
4985 | -{ |
4986 | - GtkWidget *page; |
4987 | - |
4988 | - page = sp_color_selector_new( page_type ); |
4989 | - if ( page ) |
4990 | - { |
4991 | - GtkWidget* tab_label = 0; |
4992 | - SPColorSelector* csel; |
4993 | - |
4994 | - csel = SP_COLOR_SELECTOR (page); |
4995 | - if ( submode > 0 ) |
4996 | - { |
4997 | - csel->base->setSubmode( submode ); |
4998 | - } |
4999 | - gtk_widget_show (page); |
5000 | - int index = csel->base ? csel->base->getSubmode() : 0; |
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!