1fb07ece0SStephan Aßmus /* 2325a6253SAxel 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 10325a6253SAxel 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 21325a6253SAxel Dörfler #include <new> 22325a6253SAxel Dörfler 23325a6253SAxel Dörfler using namespace BPrivate::Icon; 24fb07ece0SStephan Aßmus using std::nothrow; 25fb07ece0SStephan Aßmus 26325a6253SAxel 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 { 124*12a257d7SStephan Aßmus double scale = fSource.ApproximationScale(); 125*12a257d7SStephan Aßmus double factor = fabs(width()); 126*12a257d7SStephan Aßmus if (factor > 1.0) 127*12a257d7SStephan Aßmus scale *= factor; 128*12a257d7SStephan Aßmus return scale; 129fb07ece0SStephan Aßmus } 130fb07ece0SStephan Aßmus 131fb07ece0SStephan Aßmus // #pragma mark - 132fb07ece0SStephan Aßmus 133fb07ece0SStephan Aßmus #ifdef ICON_O_MATIC 134fb07ece0SStephan Aßmus 135fb07ece0SStephan Aßmus // Archive 136fb07ece0SStephan Aßmus status_t 137fb07ece0SStephan Aßmus StrokeTransformer::Archive(BMessage* into, bool deep) const 138fb07ece0SStephan Aßmus { 139fb07ece0SStephan Aßmus status_t ret = Transformer::Archive(into, deep); 140fb07ece0SStephan Aßmus 141fb07ece0SStephan Aßmus if (ret == B_OK) 142fb07ece0SStephan Aßmus into->what = archive_code; 143fb07ece0SStephan Aßmus 144fb07ece0SStephan Aßmus if (ret == B_OK) 145fb07ece0SStephan Aßmus ret = into->AddInt32("line cap", line_cap()); 146fb07ece0SStephan Aßmus 147fb07ece0SStephan Aßmus if (ret == B_OK) 148fb07ece0SStephan Aßmus ret = into->AddInt32("line join", line_join()); 149fb07ece0SStephan Aßmus 150fb07ece0SStephan Aßmus if (ret == B_OK) 151fb07ece0SStephan Aßmus ret = into->AddInt32("inner join", inner_join()); 152fb07ece0SStephan Aßmus 153fb07ece0SStephan Aßmus if (ret == B_OK) 154fb07ece0SStephan Aßmus ret = into->AddDouble("width", width()); 155fb07ece0SStephan Aßmus 156fb07ece0SStephan Aßmus if (ret == B_OK) 157fb07ece0SStephan Aßmus ret = into->AddDouble("miter limit", miter_limit()); 158fb07ece0SStephan Aßmus 159fb07ece0SStephan Aßmus if (ret == B_OK) 160fb07ece0SStephan Aßmus ret = into->AddDouble("inner miter limit", inner_miter_limit()); 161fb07ece0SStephan Aßmus 162fb07ece0SStephan Aßmus if (ret == B_OK) 163fb07ece0SStephan Aßmus ret = into->AddDouble("shorten",shorten()); 164fb07ece0SStephan Aßmus 165fb07ece0SStephan Aßmus return ret; 166fb07ece0SStephan Aßmus } 167fb07ece0SStephan Aßmus 168fb07ece0SStephan Aßmus // MakePropertyObject 169fb07ece0SStephan Aßmus PropertyObject* 170fb07ece0SStephan Aßmus StrokeTransformer::MakePropertyObject() const 171fb07ece0SStephan Aßmus { 172fb07ece0SStephan Aßmus PropertyObject* object = Transformer::MakePropertyObject(); 173fb07ece0SStephan Aßmus if (!object) 174fb07ece0SStephan Aßmus return NULL; 175fb07ece0SStephan Aßmus 176fb07ece0SStephan Aßmus // width 177fb07ece0SStephan Aßmus object->AddProperty(new FloatProperty(PROPERTY_WIDTH, width())); 178fb07ece0SStephan Aßmus 179fb07ece0SStephan Aßmus // cap mode 180fb07ece0SStephan Aßmus OptionProperty* property = new OptionProperty(PROPERTY_CAP_MODE); 181fb07ece0SStephan Aßmus property->AddOption(agg::butt_cap, "Butt"); 182fb07ece0SStephan Aßmus property->AddOption(agg::square_cap, "Square"); 183fb07ece0SStephan Aßmus property->AddOption(agg::round_cap, "Round"); 184fb07ece0SStephan Aßmus property->SetCurrentOptionID(line_cap()); 185fb07ece0SStephan Aßmus 186fb07ece0SStephan Aßmus object->AddProperty(property); 187fb07ece0SStephan Aßmus 188fb07ece0SStephan Aßmus // join mode 189fb07ece0SStephan Aßmus property = new OptionProperty(PROPERTY_JOIN_MODE); 190fb07ece0SStephan Aßmus property->AddOption(agg::miter_join, "Miter"); 191fb07ece0SStephan Aßmus property->AddOption(agg::round_join, "Round"); 192fb07ece0SStephan Aßmus property->AddOption(agg::bevel_join, "Bevel"); 193fb07ece0SStephan Aßmus property->SetCurrentOptionID(line_join()); 194fb07ece0SStephan Aßmus 195fb07ece0SStephan Aßmus object->AddProperty(property); 196fb07ece0SStephan Aßmus 197fb07ece0SStephan Aßmus // miter limit 198fb07ece0SStephan Aßmus if (line_join() == agg::miter_join) { 199fb07ece0SStephan Aßmus object->AddProperty(new FloatProperty(PROPERTY_MITER_LIMIT, 200fb07ece0SStephan Aßmus miter_limit())); 201fb07ece0SStephan Aßmus } 202fb07ece0SStephan Aßmus 2032f953b71SStephan Aßmus // // shorten 2042f953b71SStephan Aßmus // object->AddProperty(new FloatProperty(PROPERTY_STROKE_SHORTEN, 2052f953b71SStephan Aßmus // shorten())); 206fb07ece0SStephan Aßmus 207fb07ece0SStephan Aßmus return object; 208fb07ece0SStephan Aßmus } 209fb07ece0SStephan Aßmus 210fb07ece0SStephan Aßmus // SetToPropertyObject 211fb07ece0SStephan Aßmus bool 212fb07ece0SStephan Aßmus StrokeTransformer::SetToPropertyObject(const PropertyObject* object) 213fb07ece0SStephan Aßmus { 214fb07ece0SStephan Aßmus AutoNotificationSuspender _(this); 215fb07ece0SStephan Aßmus Transformer::SetToPropertyObject(object); 216fb07ece0SStephan Aßmus 217fb07ece0SStephan Aßmus // width 218fb07ece0SStephan Aßmus float w = object->Value(PROPERTY_WIDTH, (float)width()); 219fb07ece0SStephan Aßmus if (w != width()) { 220fb07ece0SStephan Aßmus width(w); 221fb07ece0SStephan Aßmus Notify(); 222fb07ece0SStephan Aßmus } 223fb07ece0SStephan Aßmus 224fb07ece0SStephan Aßmus // cap mode 225fb07ece0SStephan Aßmus OptionProperty* property = dynamic_cast<OptionProperty*>( 226fb07ece0SStephan Aßmus object->FindProperty(PROPERTY_CAP_MODE)); 227fb07ece0SStephan Aßmus if (property && line_cap() != property->CurrentOptionID()) { 228fb07ece0SStephan Aßmus line_cap((agg::line_cap_e)property->CurrentOptionID()); 229fb07ece0SStephan Aßmus Notify(); 230fb07ece0SStephan Aßmus } 231fb07ece0SStephan Aßmus // join mode 232fb07ece0SStephan Aßmus property = dynamic_cast<OptionProperty*>( 233fb07ece0SStephan Aßmus object->FindProperty(PROPERTY_JOIN_MODE)); 234fb07ece0SStephan Aßmus if (property && line_join() != property->CurrentOptionID()) { 235fb07ece0SStephan Aßmus line_join((agg::line_join_e)property->CurrentOptionID()); 236fb07ece0SStephan Aßmus Notify(); 237fb07ece0SStephan Aßmus } 238fb07ece0SStephan Aßmus 239fb07ece0SStephan Aßmus // miter limit 240fb07ece0SStephan Aßmus float l = object->Value(PROPERTY_MITER_LIMIT, (float)miter_limit()); 241fb07ece0SStephan Aßmus if (l != miter_limit()) { 242fb07ece0SStephan Aßmus miter_limit(l); 243fb07ece0SStephan Aßmus Notify(); 244fb07ece0SStephan Aßmus } 245fb07ece0SStephan Aßmus 246fb07ece0SStephan Aßmus // shorten 247fb07ece0SStephan Aßmus float s = object->Value(PROPERTY_STROKE_SHORTEN, (float)shorten()); 248fb07ece0SStephan Aßmus if (s != shorten()) { 249fb07ece0SStephan Aßmus shorten(s); 250fb07ece0SStephan Aßmus Notify(); 251fb07ece0SStephan Aßmus } 252fb07ece0SStephan Aßmus 253fb07ece0SStephan Aßmus return HasPendingNotifications(); 254fb07ece0SStephan Aßmus } 255fb07ece0SStephan Aßmus 256fb07ece0SStephan Aßmus #endif // ICON_O_MATIC 257fb07ece0SStephan Aßmus 258fb07ece0SStephan Aßmus 259