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