1 #include <iostream>
2 #include <string.h>
3
4 #include <gdk-pixbuf/gdk-pixdata.h>
5
6 #include "effectlist.h"
7
8 #include "ppeffect.h"
9 #include "ppeffect_temperature.h"
10 #include "effectwidget_tempchange.h"
11 #include "effectwidget_unsharpmask.h"
12 #include "ppeffect_temperature_icon.cpp"
13 #include "ppeffect_desaturate.h"
14 #include "ppeffect_desaturate_icon.cpp"
15 #include "ppeffect_unsharpmask.h"
16 #include "ppeffect_unsharpmask_icon.cpp"
17
18 #ifdef HAVE_CONFIG_H
19 #include "config.h"
20 #endif
21
22 #include "gettext.h"
23 #define _(x) gettext(x)
24 #define N_(x) gettext_noop(x)
25
26 using namespace std;
27
28 enum EFFECT_PRIORITIES {PRIORITY_UNSHARPMASK,PRIORITY_TEMPERATURE,PRIORITY_DESATURATE};
29
30
31 // Abstract base class
32
33 class EffectListEntry
34 {
35 public:
EffectListEntry()36 EffectListEntry()
37 {
38 }
~EffectListEntry()39 virtual ~EffectListEntry()
40 {
41 }
42 virtual const char *GetID()=0;
43 virtual const char *GetName()=0;
44 virtual GdkPixbuf *GetIcon()=0;
45 virtual PPEffect *CreateEffect(PPEffectHeader &header)=0;
CreateWidget(PPEffect * effect=NULL)46 virtual GtkWidget *CreateWidget(PPEffect *effect=NULL)
47 {
48 return(NULL);
49 }
EffectToWidget(GtkWidget * widget,PPEffect * effect)50 virtual void EffectToWidget(GtkWidget *widget,PPEffect *effect)
51 {
52 }
WidgetToEffect(GtkWidget * widget,PPEffect * effect)53 virtual void WidgetToEffect(GtkWidget *widget,PPEffect *effect)
54 {
55 }
56 protected:
57 };
58
59
60 // Subclass for Temperature effect
61
62
63 class EffectListEntry_Temperature : public EffectListEntry
64 {
65 public:
EffectListEntry_Temperature()66 EffectListEntry_Temperature() :
67 EffectListEntry(), icon(NULL), tempchange(0)
68 {
69 }
~EffectListEntry_Temperature()70 virtual ~EffectListEntry_Temperature()
71 {
72 }
GetID()73 virtual const char *GetID()
74 {
75 return(PPEffect_Temperature::ID);
76 }
GetName()77 virtual const char *GetName()
78 {
79 return(gettext(PPEffect_Temperature::Name));
80 }
GetIcon()81 virtual GdkPixbuf *GetIcon()
82 {
83 if(icon)
84 return(icon);
85 GdkPixdata pd;
86 GError *err;
87
88 if(!gdk_pixdata_deserialize(&pd,sizeof(PPEffect_Temperature_Icon),PPEffect_Temperature_Icon,&err))
89 throw(err->message);
90
91 if(!(icon=gdk_pixbuf_from_pixdata(&pd,false,&err)))
92 throw(err->message);
93
94 return(icon);
95 }
CreateEffect(PPEffectHeader & header)96 virtual PPEffect *CreateEffect(PPEffectHeader &header)
97 {
98 PPEffect_Temperature *result=new PPEffect_Temperature(header,PRIORITY_TEMPERATURE,PPEFFECT_PRESCALE);
99 result->SetTempChange(tempchange);
100 return(result);
101 }
CreateWidget(PPEffect * effect)102 virtual GtkWidget *CreateWidget(PPEffect *effect)
103 {
104 PPEffect_Temperature *pe=(PPEffect_Temperature *)effect;
105 GtkWidget *result=NULL;
106 result=effectwidget_tempchange_new();
107 if(pe)
108 EffectToWidget(result,effect);
109 else
110 effectwidget_tempchange_set(EFFECTWIDGET_TEMPCHANGE(result),tempchange);
111 gtk_widget_set_sensitive(result,(pe!=NULL));
112 return(result);
113 }
EffectToWidget(GtkWidget * widget,PPEffect * effect)114 virtual void EffectToWidget(GtkWidget *widget,PPEffect *effect)
115 {
116 PPEffect_Temperature *pe=(PPEffect_Temperature *)effect;
117 if(pe)
118 effectwidget_tempchange_set(EFFECTWIDGET_TEMPCHANGE(widget),pe->GetTempChange());
119 }
WidgetToEffect(GtkWidget * widget,PPEffect * effect)120 virtual void WidgetToEffect(GtkWidget *widget,PPEffect *effect)
121 {
122 PPEffect_Temperature *pe=(PPEffect_Temperature *)effect;
123 tempchange=effectwidget_tempchange_get(EFFECTWIDGET_TEMPCHANGE(widget));
124 if(pe)
125 pe->SetTempChange(tempchange);
126 }
127 protected:
128 GdkPixbuf *icon;
129 int tempchange;
130 };
131
132
133 // Subclass for Desaturate effect
134
135
136 class EffectListEntry_Desaturate : public EffectListEntry
137 {
138 public:
EffectListEntry_Desaturate()139 EffectListEntry_Desaturate() :
140 EffectListEntry(), icon(NULL)
141 {
142 }
~EffectListEntry_Desaturate()143 virtual ~EffectListEntry_Desaturate()
144 {
145 }
GetID()146 virtual const char *GetID()
147 {
148 return(PPEffect_Desaturate::ID);
149 }
GetName()150 virtual const char *GetName()
151 {
152 return(gettext(PPEffect_Desaturate::Name));
153 }
GetIcon()154 virtual GdkPixbuf *GetIcon()
155 {
156 if(icon)
157 return(icon);
158 GdkPixdata pd;
159 GError *err;
160
161 if(!gdk_pixdata_deserialize(&pd,sizeof(PPEffect_Desaturate_Icon),PPEffect_Desaturate_Icon,&err))
162 throw(err->message);
163
164 if(!(icon=gdk_pixbuf_from_pixdata(&pd,false,&err)))
165 throw(err->message);
166
167 return(icon);
168 }
CreateEffect(PPEffectHeader & header)169 virtual PPEffect *CreateEffect(PPEffectHeader &header)
170 {
171 PPEffect_Desaturate *result=new PPEffect_Desaturate(header,PRIORITY_DESATURATE,PPEFFECT_PRESCALE);
172 return(result);
173 }
174 protected:
175 GdkPixbuf *icon;
176 };
177
178
179 // Subclass for UnsharpMask effect
180
181
182 class EffectListEntry_UnsharpMask : public EffectListEntry
183 {
184 public:
EffectListEntry_UnsharpMask()185 EffectListEntry_UnsharpMask() :
186 EffectListEntry(), icon(NULL), radius(3.0), amount(1.5)
187 {
188 }
~EffectListEntry_UnsharpMask()189 virtual ~EffectListEntry_UnsharpMask()
190 {
191 }
GetID()192 virtual const char *GetID()
193 {
194 return(PPEffect_UnsharpMask::ID);
195 }
GetName()196 virtual const char *GetName()
197 {
198 return(gettext(PPEffect_UnsharpMask::Name));
199 }
GetIcon()200 virtual GdkPixbuf *GetIcon()
201 {
202 if(icon)
203 return(icon);
204 GdkPixdata pd;
205 GError *err;
206
207 if(!gdk_pixdata_deserialize(&pd,sizeof(PPEffect_UnsharpMask_Icon),PPEffect_UnsharpMask_Icon,&err))
208 throw(err->message);
209
210 if(!(icon=gdk_pixbuf_from_pixdata(&pd,false,&err)))
211 throw(err->message);
212
213 return(icon);
214 }
CreateEffect(PPEffectHeader & header)215 virtual PPEffect *CreateEffect(PPEffectHeader &header)
216 {
217 PPEffect_UnsharpMask *result=new PPEffect_UnsharpMask(header,PRIORITY_UNSHARPMASK,PPEFFECT_PRESCALE);
218 result->SetRadius(radius);
219 result->SetAmount(amount);
220 return(result);
221 }
CreateWidget(PPEffect * effect)222 virtual GtkWidget *CreateWidget(PPEffect *effect)
223 {
224 PPEffect_UnsharpMask *pe=(PPEffect_UnsharpMask *)effect;
225 GtkWidget *result=NULL;
226 result=effectwidget_unsharpmask_new();
227 if(pe)
228 EffectToWidget(result,effect);
229 else
230 {
231 effectwidget_unsharpmask_set_radius(EFFECTWIDGET_UNSHARPMASK(result),radius);
232 effectwidget_unsharpmask_set_amount(EFFECTWIDGET_UNSHARPMASK(result),amount);
233 }
234 gtk_widget_set_sensitive(result,(pe!=NULL));
235 return(result);
236 }
EffectToWidget(GtkWidget * widget,PPEffect * effect)237 virtual void EffectToWidget(GtkWidget *widget,PPEffect *effect)
238 {
239 PPEffect_UnsharpMask *pe=(PPEffect_UnsharpMask *)effect;
240 if(pe)
241 {
242 effectwidget_unsharpmask_set_radius(EFFECTWIDGET_UNSHARPMASK(widget),pe->GetRadius());
243 effectwidget_unsharpmask_set_amount(EFFECTWIDGET_UNSHARPMASK(widget),pe->GetAmount());
244 }
245 }
WidgetToEffect(GtkWidget * widget,PPEffect * effect)246 virtual void WidgetToEffect(GtkWidget *widget,PPEffect *effect)
247 {
248 PPEffect_UnsharpMask *pe=(PPEffect_UnsharpMask *)effect;
249 radius=effectwidget_unsharpmask_get_radius(EFFECTWIDGET_UNSHARPMASK(widget));
250 amount=effectwidget_unsharpmask_get_amount(EFFECTWIDGET_UNSHARPMASK(widget));
251 if(pe)
252 {
253 pe->SetRadius(radius);
254 pe->SetAmount(amount);
255 }
256 }
257 protected:
258 GdkPixbuf *icon;
259 float radius;
260 float amount;
261 };
262
263
264 // Table of effects...
265
266 static EffectListEntry_Desaturate effectlistentry_desaturate;
267 static EffectListEntry_Temperature effectlistentry_temperature;
268 static EffectListEntry_UnsharpMask effectlistentry_unsharpmask;
269
270 static EffectListEntry *effectlistsources[]=
271 {
272 &effectlistentry_desaturate,
273 &effectlistentry_temperature,
274 &effectlistentry_unsharpmask
275 };
276
277 #define SOURCECOUNT (sizeof(effectlistsources)/sizeof(EffectListEntry *))
278
279
280 // EffectListSource member functions.
281
EffectListSource()282 EffectListSource::EffectListSource()
283 {
284 }
285
286
~EffectListSource()287 EffectListSource::~EffectListSource()
288 {
289 }
290
291
EffectCount()292 int EffectListSource::EffectCount()
293 {
294 return(SOURCECOUNT);
295 }
296
297
GetID(unsigned int effect)298 const char *EffectListSource::GetID(unsigned int effect)
299 {
300 if((effect>=0) && (effect<SOURCECOUNT))
301 return(effectlistsources[effect]->GetID());
302 return(NULL);
303 }
304
305
GetName(unsigned int effect)306 const char *EffectListSource::GetName(unsigned int effect)
307 {
308 if((effect>=0) && (effect<SOURCECOUNT))
309 return(effectlistsources[effect]->GetName());
310 return(NULL);
311 }
312
313
GetIcon(unsigned int effect)314 GdkPixbuf *EffectListSource::GetIcon(unsigned int effect)
315 {
316 if((effect>=0) && (effect<SOURCECOUNT))
317 return(effectlistsources[effect]->GetIcon());
318 return(NULL);
319 }
320
321
CreateEffect(unsigned int effect,PPEffectHeader & header)322 PPEffect *EffectListSource::CreateEffect(unsigned int effect,PPEffectHeader &header)
323 {
324 if((effect>=0) && (effect<SOURCECOUNT))
325 return(effectlistsources[effect]->CreateEffect(header));
326 return(NULL);
327 }
328
329
CreateWidget(unsigned int idx,PPEffect * effect)330 GtkWidget *EffectListSource::CreateWidget(unsigned int idx,PPEffect *effect)
331 {
332 if((idx>=0) && (idx<SOURCECOUNT))
333 return(effectlistsources[idx]->CreateWidget(effect));
334 return(NULL);
335 }
336
337
WidgetToEffect(GtkWidget * widget,PPEffect * effect)338 void EffectListSource::WidgetToEffect(GtkWidget *widget,PPEffect *effect)
339 {
340 const char *id=effect->GetID();
341 for(unsigned int i=0;i<SOURCECOUNT;++i)
342 {
343 if(strcmp(effectlistsources[i]->GetID(),id)==0)
344 {
345 effectlistsources[i]->WidgetToEffect(widget,effect);
346 }
347 }
348 }
349
350
EffectToWidget(GtkWidget * widget,PPEffect * effect)351 void EffectListSource::EffectToWidget(GtkWidget *widget,PPEffect *effect)
352 {
353 const char *id=effect->GetID();
354 for(unsigned int i=0;i<SOURCECOUNT;++i)
355 {
356 if(strcmp(effectlistsources[i]->GetID(),id)==0)
357 {
358 effectlistsources[i]->EffectToWidget(widget,effect);
359 }
360 }
361 }
362