xref: /haiku/src/libs/icon/transformer/StrokeTransformer.cpp (revision 325a6253ceb7c4162df2805f7aabc2a119c93534)
1fb07ece0SStephan Aßmus /*
2*325a6253SAxel Dörfler  * Copyright 2006-2007, Haiku.
3fb07ece0SStephan Aßmus  * Distributed under the terms of the MIT License.
4fb07ece0SStephan Aßmus  *
5fb07ece0SStephan Aßmus  * Authors:
6fb07ece0SStephan Aßmus  *		Stephan Aßmus <superstippi@gmx.de>
7fb07ece0SStephan Aßmus  */
8fb07ece0SStephan Aßmus 
9fb07ece0SStephan Aßmus 
10*325a6253SAxel Dörfler #include "StrokeTransformer.h"
11fb07ece0SStephan Aßmus 
12fb07ece0SStephan Aßmus #ifdef ICON_O_MATIC
13fb07ece0SStephan Aßmus # include <Message.h>
14fb07ece0SStephan Aßmus 
15fb07ece0SStephan Aßmus # include "CommonPropertyIDs.h"
16fb07ece0SStephan Aßmus # include "OptionProperty.h"
17fb07ece0SStephan Aßmus # include "Property.h"
18fb07ece0SStephan Aßmus # include "PropertyObject.h"
19fb07ece0SStephan Aßmus #endif // ICON_O_MATIC
20fb07ece0SStephan Aßmus 
21*325a6253SAxel Dörfler #include <new>
22*325a6253SAxel Dörfler 
23*325a6253SAxel Dörfler using namespace BPrivate::Icon;
24fb07ece0SStephan Aßmus using std::nothrow;
25fb07ece0SStephan Aßmus 
26*325a6253SAxel Dörfler 
27fb07ece0SStephan Aßmus // constructor
28fb07ece0SStephan Aßmus StrokeTransformer::StrokeTransformer(VertexSource& source)
29fb07ece0SStephan Aßmus 	: Transformer(source, "Stroke"),
30fb07ece0SStephan Aßmus 	  Stroke(source)
31fb07ece0SStephan Aßmus {
32fb07ece0SStephan Aßmus }
33fb07ece0SStephan Aßmus 
34fb07ece0SStephan Aßmus #ifdef ICON_O_MATIC
35fb07ece0SStephan Aßmus // constructor
36fb07ece0SStephan Aßmus StrokeTransformer::StrokeTransformer(VertexSource& source,
37fb07ece0SStephan Aßmus 									 BMessage* archive)
38fb07ece0SStephan Aßmus 	: Transformer(source, archive),
39fb07ece0SStephan Aßmus 	  Stroke(source)
40fb07ece0SStephan Aßmus {
41fb07ece0SStephan Aßmus 	if (!archive)
42fb07ece0SStephan Aßmus 		return;
43fb07ece0SStephan Aßmus 
44fb07ece0SStephan Aßmus 	int32 mode;
45fb07ece0SStephan Aßmus 	if (archive->FindInt32("line cap", &mode) == B_OK)
46fb07ece0SStephan Aßmus 		line_cap((agg::line_cap_e)mode);
47fb07ece0SStephan Aßmus 
48fb07ece0SStephan Aßmus 	if (archive->FindInt32("line join", &mode) == B_OK)
49fb07ece0SStephan Aßmus 		line_join((agg::line_join_e)mode);
50fb07ece0SStephan Aßmus 
51fb07ece0SStephan Aßmus 	if (archive->FindInt32("inner join", &mode) == B_OK)
52fb07ece0SStephan Aßmus 		inner_join((agg::inner_join_e)mode);
53fb07ece0SStephan Aßmus 
54fb07ece0SStephan Aßmus 	double value;
55fb07ece0SStephan Aßmus 	if (archive->FindDouble("width", &value) == B_OK)
56fb07ece0SStephan Aßmus 		width(value);
57fb07ece0SStephan Aßmus 
58fb07ece0SStephan Aßmus 	if (archive->FindDouble("miter limit", &value) == B_OK)
59fb07ece0SStephan Aßmus 		miter_limit(value);
60fb07ece0SStephan Aßmus 
61fb07ece0SStephan Aßmus 	if (archive->FindDouble("inner miter limit", &value) == B_OK)
62fb07ece0SStephan Aßmus 		inner_miter_limit(value);
63fb07ece0SStephan Aßmus 
64fb07ece0SStephan Aßmus 	if (archive->FindDouble("shorten", &value) == B_OK)
65fb07ece0SStephan Aßmus 		shorten(value);
66fb07ece0SStephan Aßmus }
67fb07ece0SStephan Aßmus #endif // ICON_O_MATIC
68fb07ece0SStephan Aßmus 
69fb07ece0SStephan Aßmus // destructor
70fb07ece0SStephan Aßmus StrokeTransformer::~StrokeTransformer()
71fb07ece0SStephan Aßmus {
72fb07ece0SStephan Aßmus }
73fb07ece0SStephan Aßmus 
74fb07ece0SStephan Aßmus // Clone
75fb07ece0SStephan Aßmus Transformer*
76fb07ece0SStephan Aßmus StrokeTransformer::Clone(VertexSource& source) const
77fb07ece0SStephan Aßmus {
78fb07ece0SStephan Aßmus 	StrokeTransformer* clone = new (nothrow) StrokeTransformer(source);
79fb07ece0SStephan Aßmus 	if (clone) {
80fb07ece0SStephan Aßmus 		clone->line_cap(line_cap());
81fb07ece0SStephan Aßmus 		clone->line_join(line_join());
82fb07ece0SStephan Aßmus 		clone->inner_join(inner_join());
83fb07ece0SStephan Aßmus 		clone->width(width());
84fb07ece0SStephan Aßmus 		clone->miter_limit(miter_limit());
85fb07ece0SStephan Aßmus 		clone->inner_miter_limit(inner_miter_limit());
86fb07ece0SStephan Aßmus 		clone->shorten(shorten());
87fb07ece0SStephan Aßmus 	}
88fb07ece0SStephan Aßmus 	return clone;
89fb07ece0SStephan Aßmus }
90fb07ece0SStephan Aßmus 
91fb07ece0SStephan Aßmus // rewind
92fb07ece0SStephan Aßmus void
93fb07ece0SStephan Aßmus StrokeTransformer::rewind(unsigned path_id)
94fb07ece0SStephan Aßmus {
95fb07ece0SStephan Aßmus 	Stroke::rewind(path_id);
96fb07ece0SStephan Aßmus }
97fb07ece0SStephan Aßmus 
98fb07ece0SStephan Aßmus // vertex
99fb07ece0SStephan Aßmus unsigned
100fb07ece0SStephan Aßmus StrokeTransformer::vertex(double* x, double* y)
101fb07ece0SStephan Aßmus {
102fb07ece0SStephan Aßmus 	return Stroke::vertex(x, y);
103fb07ece0SStephan Aßmus }
104fb07ece0SStephan Aßmus 
105fb07ece0SStephan Aßmus // SetSource
106fb07ece0SStephan Aßmus void
107fb07ece0SStephan Aßmus StrokeTransformer::SetSource(VertexSource& source)
108fb07ece0SStephan Aßmus {
109fb07ece0SStephan Aßmus 	Transformer::SetSource(source);
110fb07ece0SStephan Aßmus 	Stroke::attach(source);
111fb07ece0SStephan Aßmus }
112fb07ece0SStephan Aßmus 
113fb07ece0SStephan Aßmus // WantsOpenPaths
114fb07ece0SStephan Aßmus bool
115fb07ece0SStephan Aßmus StrokeTransformer::WantsOpenPaths() const
116fb07ece0SStephan Aßmus {
117fb07ece0SStephan Aßmus 	return true;
118fb07ece0SStephan Aßmus }
119fb07ece0SStephan Aßmus 
120fb07ece0SStephan Aßmus // ApproximationScale
121fb07ece0SStephan Aßmus double
122fb07ece0SStephan Aßmus StrokeTransformer::ApproximationScale() const
123fb07ece0SStephan Aßmus {
124fb07ece0SStephan Aßmus 	return fSource.ApproximationScale() * width();
125fb07ece0SStephan Aßmus }
126fb07ece0SStephan Aßmus 
127fb07ece0SStephan Aßmus // #pragma mark -
128fb07ece0SStephan Aßmus 
129fb07ece0SStephan Aßmus #ifdef ICON_O_MATIC
130fb07ece0SStephan Aßmus 
131fb07ece0SStephan Aßmus // Archive
132fb07ece0SStephan Aßmus status_t
133fb07ece0SStephan Aßmus StrokeTransformer::Archive(BMessage* into, bool deep) const
134fb07ece0SStephan Aßmus {
135fb07ece0SStephan Aßmus 	status_t ret = Transformer::Archive(into, deep);
136fb07ece0SStephan Aßmus 
137fb07ece0SStephan Aßmus 	if (ret == B_OK)
138fb07ece0SStephan Aßmus 		into->what = archive_code;
139fb07ece0SStephan Aßmus 
140fb07ece0SStephan Aßmus 	if (ret == B_OK)
141fb07ece0SStephan Aßmus 		ret = into->AddInt32("line cap", line_cap());
142fb07ece0SStephan Aßmus 
143fb07ece0SStephan Aßmus 	if (ret == B_OK)
144fb07ece0SStephan Aßmus 		ret = into->AddInt32("line join", line_join());
145fb07ece0SStephan Aßmus 
146fb07ece0SStephan Aßmus 	if (ret == B_OK)
147fb07ece0SStephan Aßmus 		ret = into->AddInt32("inner join", inner_join());
148fb07ece0SStephan Aßmus 
149fb07ece0SStephan Aßmus 	if (ret == B_OK)
150fb07ece0SStephan Aßmus 		ret = into->AddDouble("width", width());
151fb07ece0SStephan Aßmus 
152fb07ece0SStephan Aßmus 	if (ret == B_OK)
153fb07ece0SStephan Aßmus 		ret = into->AddDouble("miter limit", miter_limit());
154fb07ece0SStephan Aßmus 
155fb07ece0SStephan Aßmus 	if (ret == B_OK)
156fb07ece0SStephan Aßmus 		ret = into->AddDouble("inner miter limit", inner_miter_limit());
157fb07ece0SStephan Aßmus 
158fb07ece0SStephan Aßmus 	if (ret == B_OK)
159fb07ece0SStephan Aßmus 		ret = into->AddDouble("shorten",shorten());
160fb07ece0SStephan Aßmus 
161fb07ece0SStephan Aßmus 	return ret;
162fb07ece0SStephan Aßmus }
163fb07ece0SStephan Aßmus 
164fb07ece0SStephan Aßmus // MakePropertyObject
165fb07ece0SStephan Aßmus PropertyObject*
166fb07ece0SStephan Aßmus StrokeTransformer::MakePropertyObject() const
167fb07ece0SStephan Aßmus {
168fb07ece0SStephan Aßmus 	PropertyObject* object = Transformer::MakePropertyObject();
169fb07ece0SStephan Aßmus 	if (!object)
170fb07ece0SStephan Aßmus 		return NULL;
171fb07ece0SStephan Aßmus 
172fb07ece0SStephan Aßmus 	// width
173fb07ece0SStephan Aßmus 	object->AddProperty(new FloatProperty(PROPERTY_WIDTH, width()));
174fb07ece0SStephan Aßmus 
175fb07ece0SStephan Aßmus 	// cap mode
176fb07ece0SStephan Aßmus 	OptionProperty* property = new OptionProperty(PROPERTY_CAP_MODE);
177fb07ece0SStephan Aßmus 	property->AddOption(agg::butt_cap, "Butt");
178fb07ece0SStephan Aßmus 	property->AddOption(agg::square_cap, "Square");
179fb07ece0SStephan Aßmus 	property->AddOption(agg::round_cap, "Round");
180fb07ece0SStephan Aßmus 	property->SetCurrentOptionID(line_cap());
181fb07ece0SStephan Aßmus 
182fb07ece0SStephan Aßmus 	object->AddProperty(property);
183fb07ece0SStephan Aßmus 
184fb07ece0SStephan Aßmus 	// join mode
185fb07ece0SStephan Aßmus 	property = new OptionProperty(PROPERTY_JOIN_MODE);
186fb07ece0SStephan Aßmus 	property->AddOption(agg::miter_join, "Miter");
187fb07ece0SStephan Aßmus 	property->AddOption(agg::round_join, "Round");
188fb07ece0SStephan Aßmus 	property->AddOption(agg::bevel_join, "Bevel");
189fb07ece0SStephan Aßmus 	property->SetCurrentOptionID(line_join());
190fb07ece0SStephan Aßmus 
191fb07ece0SStephan Aßmus 	object->AddProperty(property);
192fb07ece0SStephan Aßmus 
193fb07ece0SStephan Aßmus 	// miter limit
194fb07ece0SStephan Aßmus 	if (line_join() == agg::miter_join) {
195fb07ece0SStephan Aßmus 		object->AddProperty(new FloatProperty(PROPERTY_MITER_LIMIT,
196fb07ece0SStephan Aßmus 											  miter_limit()));
197fb07ece0SStephan Aßmus 	}
198fb07ece0SStephan Aßmus 
1992f953b71SStephan Aßmus //	// shorten
2002f953b71SStephan Aßmus //	object->AddProperty(new FloatProperty(PROPERTY_STROKE_SHORTEN,
2012f953b71SStephan Aßmus //										  shorten()));
202fb07ece0SStephan Aßmus 
203fb07ece0SStephan Aßmus 	return object;
204fb07ece0SStephan Aßmus }
205fb07ece0SStephan Aßmus 
206fb07ece0SStephan Aßmus // SetToPropertyObject
207fb07ece0SStephan Aßmus bool
208fb07ece0SStephan Aßmus StrokeTransformer::SetToPropertyObject(const PropertyObject* object)
209fb07ece0SStephan Aßmus {
210fb07ece0SStephan Aßmus 	AutoNotificationSuspender _(this);
211fb07ece0SStephan Aßmus 	Transformer::SetToPropertyObject(object);
212fb07ece0SStephan Aßmus 
213fb07ece0SStephan Aßmus 	// width
214fb07ece0SStephan Aßmus 	float w = object->Value(PROPERTY_WIDTH, (float)width());
215fb07ece0SStephan Aßmus 	if (w != width()) {
216fb07ece0SStephan Aßmus 		width(w);
217fb07ece0SStephan Aßmus 		Notify();
218fb07ece0SStephan Aßmus 	}
219fb07ece0SStephan Aßmus 
220fb07ece0SStephan Aßmus 	// cap mode
221fb07ece0SStephan Aßmus 	OptionProperty* property = dynamic_cast<OptionProperty*>(
222fb07ece0SStephan Aßmus 			object->FindProperty(PROPERTY_CAP_MODE));
223fb07ece0SStephan Aßmus 	if (property && line_cap() != property->CurrentOptionID()) {
224fb07ece0SStephan Aßmus 		line_cap((agg::line_cap_e)property->CurrentOptionID());
225fb07ece0SStephan Aßmus 		Notify();
226fb07ece0SStephan Aßmus 	}
227fb07ece0SStephan Aßmus 	// join mode
228fb07ece0SStephan Aßmus 	property = dynamic_cast<OptionProperty*>(
229fb07ece0SStephan Aßmus 		object->FindProperty(PROPERTY_JOIN_MODE));
230fb07ece0SStephan Aßmus 	if (property && line_join() != property->CurrentOptionID()) {
231fb07ece0SStephan Aßmus 		line_join((agg::line_join_e)property->CurrentOptionID());
232fb07ece0SStephan Aßmus 		Notify();
233fb07ece0SStephan Aßmus 	}
234fb07ece0SStephan Aßmus 
235fb07ece0SStephan Aßmus 	// miter limit
236fb07ece0SStephan Aßmus 	float l = object->Value(PROPERTY_MITER_LIMIT, (float)miter_limit());
237fb07ece0SStephan Aßmus 	if (l != miter_limit()) {
238fb07ece0SStephan Aßmus 		miter_limit(l);
239fb07ece0SStephan Aßmus 		Notify();
240fb07ece0SStephan Aßmus 	}
241fb07ece0SStephan Aßmus 
242fb07ece0SStephan Aßmus 	// shorten
243fb07ece0SStephan Aßmus 	float s = object->Value(PROPERTY_STROKE_SHORTEN, (float)shorten());
244fb07ece0SStephan Aßmus 	if (s != shorten()) {
245fb07ece0SStephan Aßmus 		shorten(s);
246fb07ece0SStephan Aßmus 		Notify();
247fb07ece0SStephan Aßmus 	}
248fb07ece0SStephan Aßmus 
249fb07ece0SStephan Aßmus 	return HasPendingNotifications();
250fb07ece0SStephan Aßmus }
251fb07ece0SStephan Aßmus 
252fb07ece0SStephan Aßmus #endif // ICON_O_MATIC
253fb07ece0SStephan Aßmus 
254fb07ece0SStephan Aßmus 
255