diff --git a/src/marker.cpp b/src/marker.cpp
index d3927fd59e8e4ee069a11175bc6be033603c4c18..e4c2e0c305633929ea8df52a65a2e748b3250ea7 100644 (file)
--- a/src/marker.cpp
+++ b/src/marker.cpp
static void
sp_marker_init (SPMarker *marker)
{
- marker->viewBox_set = FALSE;
-
- marker->c2p.setIdentity();
-
+ marker->viewBox = Geom::OptRect();
+ marker->c2p.setIdentity();
marker->views = NULL;
}
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG);
break;
case SP_ATTR_VIEWBOX:
- marker->viewBox_set = FALSE;
+ marker->viewBox = Geom::OptRect();
if (value) {
double x, y, width, height;
char *eptr;
while (*eptr && ((*eptr == ',') || (*eptr == ' '))) eptr++;
if ((width > 0) && (height > 0)) {
/* Set viewbox */
- marker->viewBox.x0 = x;
- marker->viewBox.y0 = y;
- marker->viewBox.x1 = x + width;
- marker->viewBox.y1 = y + height;
- marker->viewBox_set = TRUE;
+ marker->viewBox = Geom::Rect( Geom::Point(x,y),
+ Geom::Point(x + width, y + height) );
}
}
object->requestDisplayUpdate(SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_VIEWPORT_MODIFIED_FLAG);
SPItem *item;
SPMarker *marker;
SPItemCtx rctx;
- NRRect *vb;
+ Geom::Rect vb;
double x, y, width, height;
SPMarkerView *v;
marker->c2p.setIdentity();
/* Viewbox is always present, either implicitly or explicitly */
- if (marker->viewBox_set) {
- vb = &marker->viewBox;
+ if (marker->viewBox) {
+ vb = *marker->viewBox;
} else {
- vb = &rctx.vp;
+ vb = *(rctx.vp.upgrade_2geom());
}
/* Now set up viewbox transformation */
/* Determine actual viewbox in viewport coordinates */
} else {
double scalex, scaley, scale;
/* Things are getting interesting */
- scalex = (rctx.vp.x1 - rctx.vp.x0) / (vb->x1 - vb->x0);
- scaley = (rctx.vp.y1 - rctx.vp.y0) / (vb->y1 - vb->y0);
+ scalex = (rctx.vp.x1 - rctx.vp.x0) / (vb.width());
+ scaley = (rctx.vp.y1 - rctx.vp.y0) / (vb.height());
scale = (marker->aspect_clip == SP_ASPECT_MEET) ? MIN (scalex, scaley) : MAX (scalex, scaley);
- width = (vb->x1 - vb->x0) * scale;
- height = (vb->y1 - vb->y0) * scale;
+ width = (vb.width()) * scale;
+ height = (vb.height()) * scale;
/* Now place viewbox to requested position */
switch (marker->aspect_align) {
case SP_ASPECT_XMIN_YMIN:
}
}
- {
- Geom::Matrix q;
- /* Compose additional transformation from scale and position */
- q[0] = width / (vb->x1 - vb->x0);
- q[1] = 0.0;
- q[2] = 0.0;
- q[3] = height / (vb->y1 - vb->y0);
- q[4] = -vb->x0 * q[0] + x;
- q[5] = -vb->y0 * q[3] + y;
- /* Append viewbox transformation */
- marker->c2p = q * marker->c2p;
- }
-
- /* Append reference translation */
- /* fixme: lala (Lauris) */
- marker->c2p = Geom::Translate(-marker->refX.computed, -marker->refY.computed) * marker->c2p;
+ // viewbox transformation and reference translation
+ marker->c2p = Geom::Translate(-marker->refX.computed, -marker->refY.computed) *
+ Geom::Scale(width / vb.width(), height / vb.height());
rctx.i2doc = marker->c2p * rctx.i2doc;
/* If viewBox is set reinitialize child viewport */
/* Otherwise it already correct */
- if (marker->viewBox_set) {
- rctx.vp.x0 = marker->viewBox.x0;
- rctx.vp.y0 = marker->viewBox.y0;
- rctx.vp.x1 = marker->viewBox.x1;
- rctx.vp.y1 = marker->viewBox.y1;
+ if (marker->viewBox) {
+ rctx.vp.x0 = marker->viewBox->min()[Geom::X];
+ rctx.vp.y0 = marker->viewBox->min()[Geom::Y];
+ rctx.vp.x1 = marker->viewBox->max()[Geom::X];
+ rctx.vp.y1 = marker->viewBox->max()[Geom::Y];
rctx.i2vp = Geom::identity();
}