summaryrefslogtreecommitdiffstats
path: root/src/sp-pattern.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sp-pattern.cpp')
-rw-r--r--src/sp-pattern.cpp37
1 files changed, 19 insertions, 18 deletions
diff --git a/src/sp-pattern.cpp b/src/sp-pattern.cpp
index 9aefdf6ff..03afc1bf3 100644
--- a/src/sp-pattern.cpp
+++ b/src/sp-pattern.cpp
@@ -53,7 +53,7 @@ static void sp_pattern_modified (SPObject *object, unsigned int flags);
static void pattern_ref_changed(SPObject *old_ref, SPObject *ref, SPPattern *pat);
static void pattern_ref_modified (SPObject *ref, guint flags, SPPattern *pattern);
-static cairo_pattern_t *sp_pattern_create_pattern(SPPaintServer *ps, cairo_t *ct, NRRect const *bbox, double opacity);
+static cairo_pattern_t *sp_pattern_create_pattern(SPPaintServer *ps, cairo_t *ct, Geom::OptRect const &bbox, double opacity);
static SPPaintServerClass * pattern_parent_class;
@@ -245,11 +245,8 @@ sp_pattern_set (SPObject *object, unsigned int key, const gchar *value)
height = g_ascii_strtod (eptr, &eptr);
while (*eptr && ((*eptr == ',') || (*eptr == ' '))) eptr++;
if ((width > 0) && (height > 0)) {
- pat->viewBox.x0 = x;
- pat->viewBox.y0 = y;
- pat->viewBox.x1 = x + width;
- pat->viewBox.y1 = y + height;
- pat->viewBox_set = TRUE;
+ pat->viewBox = Geom::Rect::from_xywh(x, y, width, height);
+ pat->viewBox_set = TRUE;
} else {
pat->viewBox_set = FALSE;
}
@@ -581,13 +578,16 @@ gdouble pattern_height (SPPattern *pat)
return 0;
}
-NRRect *pattern_viewBox (SPPattern *pat)
+Geom::OptRect pattern_viewBox (SPPattern *pat)
{
- for (SPPattern *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
- if (pat_i->viewBox_set)
- return &(pat_i->viewBox);
- }
- return &(pat->viewBox);
+ Geom::OptRect viewbox;
+ for (SPPattern *pat_i = pat; pat_i != NULL; pat_i = pat_i->ref ? pat_i->ref->getObject() : NULL) {
+ if (pat_i->viewBox_set) {
+ viewbox = pat_i->viewBox;
+ break;
+ }
+ }
+ return viewbox;
}
bool pattern_hasItemChildren (SPPattern *pat)
@@ -604,7 +604,7 @@ bool pattern_hasItemChildren (SPPattern *pat)
static cairo_pattern_t *
sp_pattern_create_pattern(SPPaintServer *ps,
cairo_t *base_ct,
- NRRect const *bbox,
+ Geom::OptRect const &bbox,
double opacity)
{
SPPattern *pat = SP_PATTERN (ps);
@@ -647,17 +647,18 @@ sp_pattern_create_pattern(SPPaintServer *ps,
}
if (pat->viewBox_set) {
- gdouble tmp_x = pattern_width (pat) / (pattern_viewBox(pat)->x1 - pattern_viewBox(pat)->x0);
- gdouble tmp_y = pattern_height (pat) / (pattern_viewBox(pat)->y1 - pattern_viewBox(pat)->y0);
+ Geom::Rect vb = *pattern_viewBox(pat);
+ gdouble tmp_x = pattern_width (pat) / vb.width();
+ gdouble tmp_y = pattern_height (pat) / vb.height();
// FIXME: preserveAspectRatio must be taken into account here too!
- vb2ps = Geom::Affine(tmp_x, 0.0, 0.0, tmp_y, pattern_x(pat) - pattern_viewBox(pat)->x0 * tmp_x, pattern_y(pat) - pattern_viewBox(pat)->y0 * tmp_y);
+ vb2ps = Geom::Affine(tmp_x, 0.0, 0.0, tmp_y, pattern_x(pat) - vb.left() * tmp_x, pattern_y(pat) - vb.top() * tmp_y);
}
ps2user = pattern_patternTransform(pat);
if (!pat->viewBox_set && pattern_patternContentUnits (pat) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) {
/* BBox to user coordinate system */
- Geom::Affine bbox2user (bbox->x1 - bbox->x0, 0.0, 0.0, bbox->y1 - bbox->y0, bbox->x0, bbox->y0);
+ Geom::Affine bbox2user (bbox->width(), 0.0, 0.0, bbox->height(), bbox->left(), bbox->top());
ps2user *= bbox2user;
}
ps2user = Geom::Translate (pattern_x (pat), pattern_y (pat)) * ps2user;
@@ -667,7 +668,7 @@ sp_pattern_create_pattern(SPPaintServer *ps,
if (pattern_patternUnits(pat) == SP_PATTERN_UNITS_OBJECTBOUNDINGBOX) {
// interpret x, y, width, height in relation to bbox
- Geom::Affine bbox2user(bbox->x1 - bbox->x0, 0,0, bbox->y1 - bbox->y0, bbox->x0, bbox->y0);
+ Geom::Affine bbox2user(bbox->width(), 0.0, 0.0, bbox->height(), bbox->left(), bbox->top());
pattern_tile = pattern_tile * bbox2user;
}