summaryrefslogtreecommitdiffstats
path: root/src/extension/internal/cairo-renderer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/extension/internal/cairo-renderer.cpp')
-rw-r--r--src/extension/internal/cairo-renderer.cpp62
1 files changed, 39 insertions, 23 deletions
diff --git a/src/extension/internal/cairo-renderer.cpp b/src/extension/internal/cairo-renderer.cpp
index 86e04fb54..af9c3cd6e 100644
--- a/src/extension/internal/cairo-renderer.cpp
+++ b/src/extension/internal/cairo-renderer.cpp
@@ -155,7 +155,6 @@ static void sp_image_render(SPItem *item, CairoRenderContext *ctx);
static void sp_symbol_render(SPItem *item, CairoRenderContext *ctx);
static void sp_asbitmap_render(SPItem *item, CairoRenderContext *ctx);
-/* TODO FIXME: this does not render painting-marker-01-f.svg of SVG1.1 Test suite correctly. (orientation of one of the markers middle left ) */
static void sp_shape_render (SPItem *item, CairoRenderContext *ctx)
{
NRRect pbox;
@@ -164,7 +163,6 @@ static void sp_shape_render (SPItem *item, CairoRenderContext *ctx)
if (!shape->curve) return;
- /* fixme: Think (Lauris) */
sp_item_invoke_bbox(item, &pbox, Geom::identity(), TRUE);
SPStyle* style = SP_OBJECT_STYLE (item);
@@ -187,16 +185,22 @@ static void sp_shape_render (SPItem *item, CairoRenderContext *ctx)
tr = Geom::Rotate::from_degrees(marker->orient) * Geom::Translate(path_it->front().pointAt(0));
}
+ bool render = true;
if (marker->markerUnits == SP_MARKER_UNITS_STROKEWIDTH) {
- tr = Geom::Scale(style->stroke_width.computed) * tr;
+ if (style->stroke_width.computed > 1e-9) {
+ tr = Geom::Scale(style->stroke_width.computed) * tr;
+ } else {
+ render = false; // stroke width zero and marker is thus scaled down to zero, skip
+ }
}
- tr = (Geom::Matrix)marker_item->transform * (Geom::Matrix)marker->c2p * tr;
-
- Geom::Matrix old_tr = marker_item->transform;
- marker_item->transform = tr;
- renderer->renderItem (ctx, marker_item);
- marker_item->transform = old_tr;
+ if (render) {
+ tr = (Geom::Matrix)marker_item->transform * (Geom::Matrix)marker->c2p * tr;
+ Geom::Matrix old_tr = marker_item->transform;
+ marker_item->transform = tr;
+ renderer->renderItem (ctx, marker_item);
+ marker_item->transform = old_tr;
+ }
}
if ( shape->marker[SP_MARKER_LOC_MID] && (path_it->size_default() > 1) ) {
@@ -218,16 +222,22 @@ static void sp_shape_render (SPItem *item, CairoRenderContext *ctx)
tr = Geom::Rotate::from_degrees(marker->orient) * Geom::Translate(curve_it1->pointAt(1));
}
+ bool render = true;
if (marker->markerUnits == SP_MARKER_UNITS_STROKEWIDTH) {
- tr = Geom::Scale(style->stroke_width.computed) * tr;
+ if (style->stroke_width.computed > 1e-9) {
+ tr = Geom::Scale(style->stroke_width.computed) * tr;
+ } else {
+ render = false; // stroke width zero and marker is thus scaled down to zero, skip
+ }
}
- tr = (Geom::Matrix)marker_item->transform * (Geom::Matrix)marker->c2p * tr;
-
- Geom::Matrix old_tr = marker_item->transform;
- marker_item->transform = tr;
- renderer->renderItem (ctx, marker_item);
- marker_item->transform = old_tr;
+ if (render) {
+ tr = (Geom::Matrix)marker_item->transform * (Geom::Matrix)marker->c2p * tr;
+ Geom::Matrix old_tr = marker_item->transform;
+ marker_item->transform = tr;
+ renderer->renderItem (ctx, marker_item);
+ marker_item->transform = old_tr;
+ }
++curve_it1;
++curve_it2;
@@ -253,16 +263,22 @@ static void sp_shape_render (SPItem *item, CairoRenderContext *ctx)
tr = Geom::Rotate::from_degrees(marker->orient) * Geom::Translate(lastcurve.pointAt(1));
}
+ bool render = true;
if (marker->markerUnits == SP_MARKER_UNITS_STROKEWIDTH) {
- tr = Geom::Scale(style->stroke_width.computed) * tr;
+ if (style->stroke_width.computed > 1e-9) {
+ tr = Geom::Scale(style->stroke_width.computed) * tr;
+ } else {
+ render = false; // stroke width zero and marker is thus scaled down to zero, skip
+ }
}
- tr = (Geom::Matrix)marker_item->transform * (Geom::Matrix)marker->c2p * tr;
-
- Geom::Matrix old_tr = marker_item->transform;
- marker_item->transform = tr;
- renderer->renderItem (ctx, marker_item);
- marker_item->transform = old_tr;
+ if (render) {
+ tr = (Geom::Matrix)marker_item->transform * (Geom::Matrix)marker->c2p * tr;
+ Geom::Matrix old_tr = marker_item->transform;
+ marker_item->transform = tr;
+ renderer->renderItem (ctx, marker_item);
+ marker_item->transform = old_tr;
+ }
}
}
}