std::vector<SVGLength> sp_svg_length_list_read(gchar const *str) { if (!str) { return std::vector<SVGLength>(); } SVGLength::Unit unit; float value; float computed; char *next = (char *) str; std::vector<SVGLength> list; while (sp_svg_length_read_lff(next, &unit, &value, &computed, &next)) { SVGLength length; length.set(unit, value, computed); list.push_back(length); while (next && *next && (*next == ',' || *next == ' ' || *next == '\n' || *next == '\r' || *next == '\t')) { // the list can be comma- or space-separated, but we will be generous and accept // a mix, including newlines and tabs next++; } if (!next || !*next) { break; } } return list; }
unsigned int sp_svg_length_read_ldd(gchar const *str, SVGLength::Unit *unit, double *value, double *computed) { float a; float b; unsigned int r = sp_svg_length_read_lff(str, unit, &a, &b, NULL); if (r) { if (value) { *value = a; } if (computed) { *computed = b; } } return r; }
unsigned int sp_svg_length_read (const gchar *str, SPSVGLength *length) { unsigned long unit; float value, computed; if (!str) return 0; if (!sp_svg_length_read_lff (str, &unit, &value, &computed)) return 0; length->set = 1; length->unit = unit; length->value = value; length->computed = computed; return 1; }
bool SVGLength::read(gchar const *str) { if (!str) { return false; } SVGLength::Unit u; float v; float c; if (!sp_svg_length_read_lff(str, &u, &v, &c, NULL)) { return false; } _set = true; unit = u; value = v; computed = c; return true; }
unsigned int sp_svg_length_read_computed_absolute(gchar const *str, float *length) { if (!str) { return 0; } SVGLength::Unit unit; float computed; if (!sp_svg_length_read_lff(str, &unit, NULL, &computed, NULL)) { // failed to read return 0; } if (svg_length_absolute_unit(unit) == false) { return 0; } *length = computed; return 1; }
static void sp_spiral_set (SPObject *object, unsigned int key, const gchar *value) { SPSpiral *spiral; SPShape *shape; gulong unit; spiral = SP_SPIRAL (object); shape = SP_SHAPE (object); /* fixme: we should really collect updates */ switch (key) { case SP_ATTR_SODIPODI_CX: if (!sp_svg_length_read_lff (value, &unit, NULL, &spiral->cx) || (unit == SP_SVG_UNIT_EM) || (unit == SP_SVG_UNIT_EX) || (unit == SP_SVG_UNIT_PERCENT)) { spiral->cx = 0.0; } sp_object_request_update (object, SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_SODIPODI_CY: if (!sp_svg_length_read_lff (value, &unit, NULL, &spiral->cy) || (unit == SP_SVG_UNIT_EM) || (unit == SP_SVG_UNIT_EX) || (unit == SP_SVG_UNIT_PERCENT)) { spiral->cy = 0.0; } sp_object_request_update (object, SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_SODIPODI_EXPANSION: if (value) { spiral->exp = atof (value); spiral->exp = CLAMP (spiral->exp, 0.0, 1000.0); } else { spiral->exp = 1.0; } sp_object_request_update (object, SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_SODIPODI_REVOLUTION: if (value) { spiral->revo = atof (value); spiral->revo = CLAMP (spiral->revo, 0.05, 20.0); } else { spiral->revo = 3.0; } sp_object_request_update (object, SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_SODIPODI_RADIUS: if (!sp_svg_length_read_lff (value, &unit, NULL, &spiral->rad) || (unit != SP_SVG_UNIT_EM) || (unit != SP_SVG_UNIT_EX) || (unit != SP_SVG_UNIT_PERCENT)) { spiral->rad = MAX (spiral->rad, 0.001); } sp_object_request_update (object, SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_SODIPODI_ARGUMENT: if (value) { spiral->arg = atof (value); } else { spiral->arg = 0.0; } sp_object_request_update (object, SP_OBJECT_MODIFIED_FLAG); break; case SP_ATTR_SODIPODI_T0: if (value) { spiral->t0 = atof (value); spiral->t0 = CLAMP (spiral->t0, -1.0, 0.999); } else { spiral->t0 = 0.0; } sp_object_request_update (object, SP_OBJECT_MODIFIED_FLAG); break; default: if (((SPObjectClass *) parent_class)->set) ((SPObjectClass *) parent_class)->set (object, key, value); break; } }