2 * Copyright 2006-2007, Haiku.
3 * Distributed under the terms of the MIT License.
6 * Stephan Aßmus <superstippi@gmx.de>
10 #include "StrokeTransformer.h"
15 # include "CommonPropertyIDs.h"
16 # include "OptionProperty.h"
17 # include "Property.h"
18 # include "PropertyObject.h"
19 #endif // ICON_O_MATIC
29 StrokeTransformer::StrokeTransformer(VertexSource
& source
)
30 : Transformer(source
, "Stroke"),
36 StrokeTransformer::StrokeTransformer(VertexSource
& source
,
38 : Transformer(source
, archive
),
45 if (archive
->FindInt32("line cap", &mode
) == B_OK
)
46 line_cap((agg::line_cap_e
)mode
);
48 if (archive
->FindInt32("line join", &mode
) == B_OK
)
49 line_join((agg::line_join_e
)mode
);
51 if (archive
->FindInt32("inner join", &mode
) == B_OK
)
52 inner_join((agg::inner_join_e
)mode
);
55 if (archive
->FindDouble("width", &value
) == B_OK
)
58 if (archive
->FindDouble("miter limit", &value
) == B_OK
)
61 if (archive
->FindDouble("inner miter limit", &value
) == B_OK
)
62 inner_miter_limit(value
);
64 if (archive
->FindDouble("shorten", &value
) == B_OK
)
69 StrokeTransformer::~StrokeTransformer()
75 StrokeTransformer::Clone(VertexSource
& source
) const
77 StrokeTransformer
* clone
= new (nothrow
) StrokeTransformer(source
);
79 clone
->line_cap(line_cap());
80 clone
->line_join(line_join());
81 clone
->inner_join(inner_join());
82 clone
->width(width());
83 clone
->miter_limit(miter_limit());
84 clone
->inner_miter_limit(inner_miter_limit());
85 clone
->shorten(shorten());
92 StrokeTransformer::rewind(unsigned path_id
)
94 Stroke::rewind(path_id
);
99 StrokeTransformer::vertex(double* x
, double* y
)
101 return Stroke::vertex(x
, y
);
106 StrokeTransformer::SetSource(VertexSource
& source
)
108 Transformer::SetSource(source
);
109 Stroke::attach(source
);
114 StrokeTransformer::WantsOpenPaths() const
119 // ApproximationScale
121 StrokeTransformer::ApproximationScale() const
123 double scale
= fSource
.ApproximationScale();
124 double factor
= fabs(width());
136 StrokeTransformer::Archive(BMessage
* into
, bool deep
) const
138 status_t ret
= Transformer::Archive(into
, deep
);
141 into
->what
= archive_code
;
144 ret
= into
->AddInt32("line cap", line_cap());
147 ret
= into
->AddInt32("line join", line_join());
150 ret
= into
->AddInt32("inner join", inner_join());
153 ret
= into
->AddDouble("width", width());
156 ret
= into
->AddDouble("miter limit", miter_limit());
159 ret
= into
->AddDouble("inner miter limit", inner_miter_limit());
162 ret
= into
->AddDouble("shorten",shorten());
167 // MakePropertyObject
169 StrokeTransformer::MakePropertyObject() const
171 PropertyObject
* object
= Transformer::MakePropertyObject();
176 object
->AddProperty(new FloatProperty(PROPERTY_WIDTH
, width()));
179 OptionProperty
* property
= new OptionProperty(PROPERTY_CAP_MODE
);
180 property
->AddOption(agg::butt_cap
, "Butt");
181 property
->AddOption(agg::square_cap
, "Square");
182 property
->AddOption(agg::round_cap
, "Round");
183 property
->SetCurrentOptionID(line_cap());
185 object
->AddProperty(property
);
188 property
= new OptionProperty(PROPERTY_JOIN_MODE
);
189 property
->AddOption(agg::miter_join
, "Miter");
190 property
->AddOption(agg::round_join
, "Round");
191 property
->AddOption(agg::bevel_join
, "Bevel");
192 property
->SetCurrentOptionID(line_join());
194 object
->AddProperty(property
);
197 if (line_join() == agg::miter_join
) {
198 object
->AddProperty(new FloatProperty(PROPERTY_MITER_LIMIT
,
203 // object->AddProperty(new FloatProperty(PROPERTY_STROKE_SHORTEN,
209 // SetToPropertyObject
211 StrokeTransformer::SetToPropertyObject(const PropertyObject
* object
)
213 AutoNotificationSuspender
_(this);
214 Transformer::SetToPropertyObject(object
);
217 float w
= object
->Value(PROPERTY_WIDTH
, (float)width());
224 OptionProperty
* property
= dynamic_cast<OptionProperty
*>(
225 object
->FindProperty(PROPERTY_CAP_MODE
));
226 if (property
&& line_cap() != property
->CurrentOptionID()) {
227 line_cap((agg::line_cap_e
)property
->CurrentOptionID());
231 property
= dynamic_cast<OptionProperty
*>(
232 object
->FindProperty(PROPERTY_JOIN_MODE
));
233 if (property
&& line_join() != property
->CurrentOptionID()) {
234 line_join((agg::line_join_e
)property
->CurrentOptionID());
239 float l
= object
->Value(PROPERTY_MITER_LIMIT
, (float)miter_limit());
240 if (l
!= miter_limit()) {
246 float s
= object
->Value(PROPERTY_STROKE_SHORTEN
, (float)shorten());
247 if (s
!= shorten()) {
252 return HasPendingNotifications();
255 #endif // ICON_O_MATIC