52
52
sp_star_get_type (void)
54
static GType type = 0;
54
static GType type = 0;
60
(GClassInitFunc) sp_star_class_init,
64
(GInstanceInitFunc) sp_star_init,
65
NULL, /* value_table */
67
type = g_type_register_static (SP_TYPE_SHAPE, "SPStar", &info, (GTypeFlags)0);
60
(GClassInitFunc) sp_star_class_init,
64
(GInstanceInitFunc) sp_star_init,
65
NULL, /* value_table */
67
type = g_type_register_static (SP_TYPE_SHAPE, "SPStar", &info, (GTypeFlags)0);
73
73
sp_star_class_init (SPStarClass *klass)
75
GObjectClass * gobject_class;
76
SPObjectClass * sp_object_class;
77
SPItemClass * item_class;
78
SPLPEItemClass * lpe_item_class;
79
SPShapeClass * shape_class;
81
gobject_class = (GObjectClass *) klass;
82
sp_object_class = (SPObjectClass *) klass;
83
item_class = (SPItemClass *) klass;
84
lpe_item_class = (SPLPEItemClass *) klass;
85
shape_class = (SPShapeClass *) klass;
87
parent_class = (SPShapeClass *)g_type_class_ref (SP_TYPE_SHAPE);
89
sp_object_class->build = sp_star_build;
90
sp_object_class->write = sp_star_write;
91
sp_object_class->set = sp_star_set;
92
sp_object_class->update = sp_star_update;
94
item_class->description = sp_star_description;
95
item_class->snappoints = sp_star_snappoints;
75
GObjectClass * gobject_class;
76
SPObjectClass * sp_object_class;
77
SPItemClass * item_class;
78
SPLPEItemClass * lpe_item_class;
79
SPShapeClass * shape_class;
81
gobject_class = (GObjectClass *) klass;
82
sp_object_class = (SPObjectClass *) klass;
83
item_class = (SPItemClass *) klass;
84
lpe_item_class = (SPLPEItemClass *) klass;
85
shape_class = (SPShapeClass *) klass;
87
parent_class = (SPShapeClass *)g_type_class_ref (SP_TYPE_SHAPE);
89
sp_object_class->build = sp_star_build;
90
sp_object_class->write = sp_star_write;
91
sp_object_class->set = sp_star_set;
92
sp_object_class->update = sp_star_update;
94
item_class->description = sp_star_description;
95
item_class->snappoints = sp_star_snappoints;
97
97
lpe_item_class->update_patheffect = sp_star_update_patheffect;
99
shape_class->set_shape = sp_star_set_shape;
99
shape_class->set_shape = sp_star_set_shape;
103
103
sp_star_init (SPStar * star)
106
star->center = Geom::Point(0, 0);
109
star->arg[0] = star->arg[1] = 0.0;
112
star->randomized = 0.0;
106
star->center = Geom::Point(0, 0);
109
star->arg[0] = star->arg[1] = 0.0;
112
star->randomized = 0.0;
116
116
sp_star_build (SPObject * object, SPDocument * document, Inkscape::XML::Node * repr)
118
if (((SPObjectClass *) parent_class)->build)
119
((SPObjectClass *) parent_class)->build (object, document, repr);
118
if (((SPObjectClass *) parent_class)->build)
119
((SPObjectClass *) parent_class)->build (object, document, repr);
121
sp_object_read_attr (object, "sodipodi:cx");
122
sp_object_read_attr (object, "sodipodi:cy");
123
sp_object_read_attr (object, "sodipodi:sides");
124
sp_object_read_attr (object, "sodipodi:r1");
125
sp_object_read_attr (object, "sodipodi:r2");
126
sp_object_read_attr (object, "sodipodi:arg1");
127
sp_object_read_attr (object, "sodipodi:arg2");
128
sp_object_read_attr (object, "inkscape:flatsided");
129
sp_object_read_attr (object, "inkscape:rounded");
130
sp_object_read_attr (object, "inkscape:randomized");
121
sp_object_read_attr (object, "sodipodi:cx");
122
sp_object_read_attr (object, "sodipodi:cy");
123
sp_object_read_attr (object, "sodipodi:sides");
124
sp_object_read_attr (object, "sodipodi:r1");
125
sp_object_read_attr (object, "sodipodi:r2");
126
sp_object_read_attr (object, "sodipodi:arg1");
127
sp_object_read_attr (object, "sodipodi:arg2");
128
sp_object_read_attr (object, "inkscape:flatsided");
129
sp_object_read_attr (object, "inkscape:rounded");
130
sp_object_read_attr (object, "inkscape:randomized");
133
133
static Inkscape::XML::Node *
134
134
sp_star_write (SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags)
136
SPStar *star = SP_STAR (object);
138
if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
139
repr = xml_doc->createElement("svg:path");
142
if (flags & SP_OBJECT_WRITE_EXT) {
143
repr->setAttribute("sodipodi:type", "star");
144
sp_repr_set_int (repr, "sodipodi:sides", star->sides);
145
sp_repr_set_svg_double(repr, "sodipodi:cx", star->center[Geom::X]);
146
sp_repr_set_svg_double(repr, "sodipodi:cy", star->center[Geom::Y]);
147
sp_repr_set_svg_double(repr, "sodipodi:r1", star->r[0]);
148
sp_repr_set_svg_double(repr, "sodipodi:r2", star->r[1]);
149
sp_repr_set_svg_double(repr, "sodipodi:arg1", star->arg[0]);
150
sp_repr_set_svg_double(repr, "sodipodi:arg2", star->arg[1]);
151
sp_repr_set_boolean (repr, "inkscape:flatsided", star->flatsided);
152
sp_repr_set_svg_double(repr, "inkscape:rounded", star->rounded);
153
sp_repr_set_svg_double(repr, "inkscape:randomized", star->randomized);
136
SPStar *star = SP_STAR (object);
138
if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
139
repr = xml_doc->createElement("svg:path");
142
if (flags & SP_OBJECT_WRITE_EXT) {
143
repr->setAttribute("sodipodi:type", "star");
144
sp_repr_set_int (repr, "sodipodi:sides", star->sides);
145
sp_repr_set_svg_double(repr, "sodipodi:cx", star->center[Geom::X]);
146
sp_repr_set_svg_double(repr, "sodipodi:cy", star->center[Geom::Y]);
147
sp_repr_set_svg_double(repr, "sodipodi:r1", star->r[0]);
148
sp_repr_set_svg_double(repr, "sodipodi:r2", star->r[1]);
149
sp_repr_set_svg_double(repr, "sodipodi:arg1", star->arg[0]);
150
sp_repr_set_svg_double(repr, "sodipodi:arg2", star->arg[1]);
151
sp_repr_set_boolean (repr, "inkscape:flatsided", star->flatsided);
152
sp_repr_set_svg_double(repr, "inkscape:rounded", star->rounded);
153
sp_repr_set_svg_double(repr, "inkscape:randomized", star->randomized);
156
156
sp_star_set_shape ((SPShape *) star);
157
157
char *d = sp_svg_write_path (((SPShape *) star)->curve->get_pathvector());
158
158
repr->setAttribute("d", d);
161
if (((SPObjectClass *) (parent_class))->write)
162
((SPObjectClass *) (parent_class))->write (object, xml_doc, repr, flags);
161
if (((SPObjectClass *) (parent_class))->write)
162
((SPObjectClass *) (parent_class))->write (object, xml_doc, repr, flags);
168
168
sp_star_set (SPObject *object, unsigned int key, const gchar *value)
170
SVGLength::Unit unit;
172
SPStar *star = SP_STAR (object);
174
/* fixme: we should really collect updates */
176
case SP_ATTR_SODIPODI_SIDES:
178
star->sides = atoi (value);
179
star->sides = NR_CLAMP(star->sides, 3, 1024);
183
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
185
case SP_ATTR_SODIPODI_CX:
186
if (!sp_svg_length_read_ldd (value, &unit, NULL, &star->center[Geom::X]) ||
187
(unit == SVGLength::EM) ||
188
(unit == SVGLength::EX) ||
189
(unit == SVGLength::PERCENT)) {
190
star->center[Geom::X] = 0.0;
192
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
194
case SP_ATTR_SODIPODI_CY:
195
if (!sp_svg_length_read_ldd (value, &unit, NULL, &star->center[Geom::Y]) ||
196
(unit == SVGLength::EM) ||
197
(unit == SVGLength::EX) ||
198
(unit == SVGLength::PERCENT)) {
199
star->center[Geom::Y] = 0.0;
201
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
203
case SP_ATTR_SODIPODI_R1:
204
if (!sp_svg_length_read_ldd (value, &unit, NULL, &star->r[0]) ||
205
(unit == SVGLength::EM) ||
206
(unit == SVGLength::EX) ||
207
(unit == SVGLength::PERCENT)) {
210
/* fixme: Need CLAMP (Lauris) */
211
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
213
case SP_ATTR_SODIPODI_R2:
214
if (!sp_svg_length_read_ldd (value, &unit, NULL, &star->r[1]) ||
215
(unit == SVGLength::EM) ||
216
(unit == SVGLength::EX) ||
217
(unit == SVGLength::PERCENT)) {
220
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
222
case SP_ATTR_SODIPODI_ARG1:
224
star->arg[0] = g_ascii_strtod (value, NULL);
228
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
230
case SP_ATTR_SODIPODI_ARG2:
232
star->arg[1] = g_ascii_strtod (value, NULL);
236
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
238
case SP_ATTR_INKSCAPE_FLATSIDED:
239
if (value && !strcmp (value, "true"))
240
star->flatsided = true;
241
else star->flatsided = false;
242
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
244
case SP_ATTR_INKSCAPE_ROUNDED:
246
star->rounded = g_ascii_strtod (value, NULL);
250
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
252
case SP_ATTR_INKSCAPE_RANDOMIZED:
254
star->randomized = g_ascii_strtod (value, NULL);
256
star->randomized = 0.0;
258
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
261
if (((SPObjectClass *) parent_class)->set)
262
((SPObjectClass *) parent_class)->set (object, key, value);
170
SVGLength::Unit unit;
172
SPStar *star = SP_STAR (object);
174
/* fixme: we should really collect updates */
176
case SP_ATTR_SODIPODI_SIDES:
178
star->sides = atoi (value);
179
star->sides = NR_CLAMP(star->sides, 3, 1024);
183
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
185
case SP_ATTR_SODIPODI_CX:
186
if (!sp_svg_length_read_ldd (value, &unit, NULL, &star->center[Geom::X]) ||
187
(unit == SVGLength::EM) ||
188
(unit == SVGLength::EX) ||
189
(unit == SVGLength::PERCENT)) {
190
star->center[Geom::X] = 0.0;
192
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
194
case SP_ATTR_SODIPODI_CY:
195
if (!sp_svg_length_read_ldd (value, &unit, NULL, &star->center[Geom::Y]) ||
196
(unit == SVGLength::EM) ||
197
(unit == SVGLength::EX) ||
198
(unit == SVGLength::PERCENT)) {
199
star->center[Geom::Y] = 0.0;
201
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
203
case SP_ATTR_SODIPODI_R1:
204
if (!sp_svg_length_read_ldd (value, &unit, NULL, &star->r[0]) ||
205
(unit == SVGLength::EM) ||
206
(unit == SVGLength::EX) ||
207
(unit == SVGLength::PERCENT)) {
210
/* fixme: Need CLAMP (Lauris) */
211
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
213
case SP_ATTR_SODIPODI_R2:
214
if (!sp_svg_length_read_ldd (value, &unit, NULL, &star->r[1]) ||
215
(unit == SVGLength::EM) ||
216
(unit == SVGLength::EX) ||
217
(unit == SVGLength::PERCENT)) {
220
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
222
case SP_ATTR_SODIPODI_ARG1:
224
star->arg[0] = g_ascii_strtod (value, NULL);
228
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
230
case SP_ATTR_SODIPODI_ARG2:
232
star->arg[1] = g_ascii_strtod (value, NULL);
236
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
238
case SP_ATTR_INKSCAPE_FLATSIDED:
239
if (value && !strcmp (value, "true"))
240
star->flatsided = true;
241
else star->flatsided = false;
242
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
244
case SP_ATTR_INKSCAPE_ROUNDED:
246
star->rounded = g_ascii_strtod (value, NULL);
250
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
252
case SP_ATTR_INKSCAPE_RANDOMIZED:
254
star->randomized = g_ascii_strtod (value, NULL);
256
star->randomized = 0.0;
258
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
261
if (((SPObjectClass *) parent_class)->set)
262
((SPObjectClass *) parent_class)->set (object, key, value);
268
268
sp_star_update (SPObject *object, SPCtx *ctx, guint flags)
270
if (flags & (SP_OBJECT_MODIFIED_FLAG |
271
SP_OBJECT_STYLE_MODIFIED_FLAG |
272
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
273
sp_shape_set_shape ((SPShape *) object);
270
if (flags & (SP_OBJECT_MODIFIED_FLAG |
271
SP_OBJECT_STYLE_MODIFIED_FLAG |
272
SP_OBJECT_VIEWPORT_MODIFIED_FLAG)) {
273
sp_shape_set_shape ((SPShape *) object);
276
if (((SPObjectClass *) parent_class)->update)
277
((SPObjectClass *) parent_class)->update (object, ctx, flags);
276
if (((SPObjectClass *) parent_class)->update)
277
((SPObjectClass *) parent_class)->update (object, ctx, flags);
359
359
rnd (guint32 const seed, unsigned steps) {
361
for (; steps > 0; steps --)
362
lcg = lcg_next (lcg);
361
for (; steps > 0; steps --)
362
lcg = lcg_next (lcg);
364
return ( lcg / 4294967296. ) - 0.5;
364
return ( lcg / 4294967296. ) - 0.5;
367
367
static Geom::Point
368
368
sp_star_get_curvepoint (SPStar *star, SPStarPoint point, gint index, bool previ)
370
// the point whose neighboring curve handle we're calculating
371
Geom::Point o = sp_star_get_xy (star, point, index);
373
// indices of previous and next points
374
gint pi = (index > 0)? (index - 1) : (star->sides - 1);
375
gint ni = (index < star->sides - 1)? (index + 1) : 0;
377
// the other point type
378
SPStarPoint other = (point == SP_STAR_POINT_KNOT2? SP_STAR_POINT_KNOT1 : SP_STAR_POINT_KNOT2);
380
// the neighbors of o; depending on flatsided, they're either the same type (polygon) or the other type (star)
381
Geom::Point prev = (star->flatsided? sp_star_get_xy (star, point, pi) : sp_star_get_xy (star, other, point == SP_STAR_POINT_KNOT2? index : pi));
382
Geom::Point next = (star->flatsided? sp_star_get_xy (star, point, ni) : sp_star_get_xy (star, other, point == SP_STAR_POINT_KNOT1? index : ni));
384
// prev-next midpoint
385
Geom::Point mid = 0.5 * (prev + next);
387
// point to which we direct the bissector of the curve handles;
388
// it's far enough outside the star on the perpendicular to prev-next through mid
389
Geom::Point biss = mid + 100000 * rot90_rel (mid, next);
391
// lengths of vectors to prev and next
392
gdouble prev_len = Geom::L2 (prev - o);
393
gdouble next_len = Geom::L2 (next - o);
395
// unit-length vector perpendicular to o-biss
396
Geom::Point rot = rot90_rel (o, biss);
398
// multiply rot by star->rounded coefficient and the distance to the star point; flip for next
401
ret = (star->rounded * prev_len) * rot;
403
ret = (star->rounded * next_len * -1) * rot;
406
if (star->randomized == 0) {
407
// add the vector to o to get the final curvepoint
410
// the seed corresponding to the exact point
411
guint32 seed = point_unique_int (o);
413
// randomly rotate (by step 3 from the seed) and scale (by step 4) the vector
414
ret = ret * Geom::Matrix (Geom::Rotate (star->randomized * M_PI * rnd (seed, 3)));
415
ret *= ( 1 + star->randomized * rnd (seed, 4));
417
// the randomized corner point
418
Geom::Point o_randomized = sp_star_get_xy (star, point, index, true);
420
return o_randomized + ret;
370
// the point whose neighboring curve handle we're calculating
371
Geom::Point o = sp_star_get_xy (star, point, index);
373
// indices of previous and next points
374
gint pi = (index > 0)? (index - 1) : (star->sides - 1);
375
gint ni = (index < star->sides - 1)? (index + 1) : 0;
377
// the other point type
378
SPStarPoint other = (point == SP_STAR_POINT_KNOT2? SP_STAR_POINT_KNOT1 : SP_STAR_POINT_KNOT2);
380
// the neighbors of o; depending on flatsided, they're either the same type (polygon) or the other type (star)
381
Geom::Point prev = (star->flatsided? sp_star_get_xy (star, point, pi) : sp_star_get_xy (star, other, point == SP_STAR_POINT_KNOT2? index : pi));
382
Geom::Point next = (star->flatsided? sp_star_get_xy (star, point, ni) : sp_star_get_xy (star, other, point == SP_STAR_POINT_KNOT1? index : ni));
384
// prev-next midpoint
385
Geom::Point mid = 0.5 * (prev + next);
387
// point to which we direct the bissector of the curve handles;
388
// it's far enough outside the star on the perpendicular to prev-next through mid
389
Geom::Point biss = mid + 100000 * rot90_rel (mid, next);
391
// lengths of vectors to prev and next
392
gdouble prev_len = Geom::L2 (prev - o);
393
gdouble next_len = Geom::L2 (next - o);
395
// unit-length vector perpendicular to o-biss
396
Geom::Point rot = rot90_rel (o, biss);
398
// multiply rot by star->rounded coefficient and the distance to the star point; flip for next
401
ret = (star->rounded * prev_len) * rot;
403
ret = (star->rounded * next_len * -1) * rot;
406
if (star->randomized == 0) {
407
// add the vector to o to get the final curvepoint
410
// the seed corresponding to the exact point
411
guint32 seed = point_unique_int (o);
413
// randomly rotate (by step 3 from the seed) and scale (by step 4) the vector
414
ret = ret * Geom::Matrix (Geom::Rotate (star->randomized * M_PI * rnd (seed, 3)));
415
ret *= ( 1 + star->randomized * rnd (seed, 4));
417
// the randomized corner point
418
Geom::Point o_randomized = sp_star_get_xy (star, point, index, true);
420
return o_randomized + ret;
448
SPCurve *c = new SPCurve ();
450
gint sides = star->sides;
451
bool not_rounded = (fabs (star->rounded) < 1e-4);
453
// note that we pass randomized=true to sp_star_get_xy, because the curve must be randomized;
454
// other places that call that function (e.g. the knotholder) need the exact point
457
c->moveto(sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
458
if (star->flatsided == false) {
460
c->lineto(sp_star_get_xy (star, SP_STAR_POINT_KNOT2, 0, true));
462
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, 0, NEXT),
463
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, 0, PREV),
464
sp_star_get_xy (star, SP_STAR_POINT_KNOT2, 0, true));
468
// draw all middle segments
469
for (gint i = 1; i < sides; i++) {
471
c->lineto(sp_star_get_xy (star, SP_STAR_POINT_KNOT1, i, true));
473
if (star->flatsided == false) {
474
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, i - 1, NEXT),
475
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i, PREV),
476
sp_star_get_xy (star, SP_STAR_POINT_KNOT1, i, true));
478
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i - 1, NEXT),
479
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i, PREV),
480
sp_star_get_xy (star, SP_STAR_POINT_KNOT1, i, true));
483
if (star->flatsided == false) {
448
SPCurve *c = new SPCurve ();
450
gint sides = star->sides;
451
bool not_rounded = (fabs (star->rounded) < 1e-4);
453
// note that we pass randomized=true to sp_star_get_xy, because the curve must be randomized;
454
// other places that call that function (e.g. the knotholder) need the exact point
457
c->moveto(sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
458
if (star->flatsided == false) {
460
c->lineto(sp_star_get_xy (star, SP_STAR_POINT_KNOT2, 0, true));
462
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, 0, NEXT),
463
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, 0, PREV),
464
sp_star_get_xy (star, SP_STAR_POINT_KNOT2, 0, true));
468
// draw all middle segments
469
for (gint i = 1; i < sides; i++) {
471
c->lineto(sp_star_get_xy (star, SP_STAR_POINT_KNOT1, i, true));
473
if (star->flatsided == false) {
474
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, i - 1, NEXT),
475
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i, PREV),
476
sp_star_get_xy (star, SP_STAR_POINT_KNOT1, i, true));
478
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i - 1, NEXT),
479
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i, PREV),
480
sp_star_get_xy (star, SP_STAR_POINT_KNOT1, i, true));
483
if (star->flatsided == false) {
486
486
c->lineto(sp_star_get_xy (star, SP_STAR_POINT_KNOT2, i, true));
488
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i, NEXT),
489
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, i, PREV),
490
sp_star_get_xy (star, SP_STAR_POINT_KNOT2, i, true));
488
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, i, NEXT),
489
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, i, PREV),
490
sp_star_get_xy (star, SP_STAR_POINT_KNOT2, i, true));
497
c->lineto(sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
499
if (star->flatsided == false) {
500
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, sides - 1, NEXT),
501
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, 0, PREV),
502
sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
504
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, sides - 1, NEXT),
505
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, 0, PREV),
506
sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
497
if (star->flatsided == false) {
498
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT2, sides - 1, NEXT),
499
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, 0, PREV),
500
sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
502
c->curveto(sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, sides - 1, NEXT),
503
sp_star_get_curvepoint (star, SP_STAR_POINT_KNOT1, 0, PREV),
504
sp_star_get_xy (star, SP_STAR_POINT_KNOT1, 0, true));
527
525
sp_star_position_set (SPStar *star, gint sides, Geom::Point center, gdouble r1, gdouble r2, gdouble arg1, gdouble arg2, bool isflat, double rounded, double randomized)
529
g_return_if_fail (star != NULL);
530
g_return_if_fail (SP_IS_STAR (star));
527
g_return_if_fail (star != NULL);
528
g_return_if_fail (SP_IS_STAR (star));
532
star->sides = NR_CLAMP(sides, 3, 1024);
533
star->center = center;
534
star->r[0] = MAX (r1, 0.001);
535
if (isflat == false) {
536
star->r[1] = NR_CLAMP(r2, 0.0, star->r[0]);
538
star->r[1] = NR_CLAMP( r1*cos(M_PI/sides) ,0.0, star->r[0] );
542
star->flatsided = isflat;
543
star->rounded = rounded;
544
star->randomized = randomized;
545
SP_OBJECT(star)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
530
star->sides = NR_CLAMP(sides, 3, 1024);
531
star->center = center;
532
star->r[0] = MAX (r1, 0.001);
533
if (isflat == false) {
534
star->r[1] = NR_CLAMP(r2, 0.0, star->r[0]);
536
star->r[1] = NR_CLAMP( r1*cos(M_PI/sides) ,0.0, star->r[0] );
540
star->flatsided = isflat;
541
star->rounded = rounded;
542
star->randomized = randomized;
543
SP_OBJECT(star)->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
548
static void sp_star_snappoints(SPItem const *item, bool const target, SnapPointsWithType &p, Inkscape::SnapPreferences const *snapprefs)
546
static void sp_star_snappoints(SPItem const *item, std::vector<Inkscape::SnapCandidatePoint> &p, Inkscape::SnapPreferences const *snapprefs)
550
// We will determine the star's midpoint ourselves, instead of trusting on the base class
551
// Therefore setSnapObjectMidpoints() is set to false temporarily
552
Inkscape::SnapPreferences local_snapprefs = *snapprefs;
553
local_snapprefs.setSnapObjectMidpoints(false);
555
if (((SPItemClass *) parent_class)->snappoints) {
556
((SPItemClass *) parent_class)->snappoints (item, target, p, &local_snapprefs);
559
// Help enforcing strict snapping, i.e. only return nodes when we're snapping nodes to nodes or a guide to nodes
560
if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide())) {
564
if (snapprefs->getSnapObjectMidpoints()) {
565
Geom::Matrix const i2d (sp_item_i2d_affine (item));
566
int type = target ? int(Inkscape::SNAPTARGET_OBJECT_MIDPOINT) : int(Inkscape::SNAPSOURCE_OBJECT_MIDPOINT);
567
p.push_back(std::make_pair(SP_STAR(item)->center * i2d, type));
548
// We will determine the star's midpoint ourselves, instead of trusting on the base class
549
// Therefore setSnapObjectMidpoints() is set to false temporarily
550
Inkscape::SnapPreferences local_snapprefs = *snapprefs;
551
local_snapprefs.setSnapObjectMidpoints(false);
553
if (((SPItemClass *) parent_class)->snappoints) {
554
((SPItemClass *) parent_class)->snappoints (item, p, &local_snapprefs);
557
// Help enforcing strict snapping, i.e. only return nodes when we're snapping nodes to nodes or a guide to nodes
558
if (!(snapprefs->getSnapModeNode() || snapprefs->getSnapModeGuide())) {
562
if (snapprefs->getSnapObjectMidpoints()) {
563
Geom::Matrix const i2d (sp_item_i2d_affine (item));
564
p.push_back(Inkscape::SnapCandidatePoint(SP_STAR(item)->center * i2d,Inkscape::SNAPSOURCE_OBJECT_MIDPOINT, Inkscape::SNAPTARGET_OBJECT_MIDPOINT));