e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz/*
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * Simple bezier bpath CanvasItem for inkscape
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz *
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg * Authors:
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen * Lauris Kaplinski <lauris@ximian.com>
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * Jon A. Cruz <jon@joncruz.org>
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz *
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * Copyright (C) 2001 Lauris Kaplinski and Ximian, Inc.
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz *
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz * Released under GNU GPL
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz *
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz */
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz#include <sstream>
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz#include <string.h>
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz#include "desktop.h"
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz#include "color.h"
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk#include "display/sp-canvas-group.h"
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen#include "display/sp-canvas-util.h"
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk#include "display/canvas-bpath.h"
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk#include "display/curve.h"
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk#include "display/cairo-utils.h"
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk#include "helper/geom.h"
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk#include "display/sp-canvas.h"
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenkstatic void sp_canvas_bpath_destroy(SPCanvasItem *object);
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzstatic void sp_canvas_bpath_update (SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzstatic void sp_canvas_bpath_render (SPCanvasItem *item, SPCanvasBuf *buf);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzstatic double sp_canvas_bpath_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzG_DEFINE_TYPE(SPCanvasBPath, sp_canvas_bpath, SP_TYPE_CANVAS_ITEM);
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzstatic void sp_canvas_bpath_class_init(SPCanvasBPathClass *klass)
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz{
39a897cf2c4e5c0208d081fe7d51dc893b5c33d1Liam P. White SPCanvasItemClass *item_class = (SPCanvasItemClass *) klass;
3cddc158875c47546688b0746fb0f36a8b71a299Liam P. White
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item_class->destroy = sp_canvas_bpath_destroy;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item_class->update = sp_canvas_bpath_update;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item_class->render = sp_canvas_bpath_render;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item_class->point = sp_canvas_bpath_point;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz}
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdgstatic void
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdgsp_canvas_bpath_init (SPCanvasBPath * bpath)
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg{
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg bpath->fill_rgba = 0x00000000;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz bpath->fill_rule = SP_WIND_RULE_EVENODD;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz bpath->stroke_rgba = 0x00000000;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz bpath->stroke_width = 1.0;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz bpath->stroke_linejoin = SP_STROKE_LINEJOIN_MITER;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz bpath->stroke_linecap = SP_STROKE_LINECAP_BUTT;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz bpath->stroke_miterlimit = 11.0;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz}
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzstatic void sp_canvas_bpath_destroy(SPCanvasItem *object)
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz{
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz SPCanvasBPath *cbp = SP_CANVAS_BPATH (object);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen if (cbp->curve) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz cbp->curve = cbp->curve->unref();
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz }
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz if (SP_CANVAS_ITEM_CLASS(sp_canvas_bpath_parent_class)->destroy)
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz (* SP_CANVAS_ITEM_CLASS(sp_canvas_bpath_parent_class)->destroy) (object);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz}
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzstatic void sp_canvas_bpath_update(SPCanvasItem *item, Geom::Affine const &affine, unsigned int flags)
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz{
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz SPCanvasBPath *cbp = SP_CANVAS_BPATH(item);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item->canvas->requestRedraw((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen if (reinterpret_cast<SPCanvasItemClass *>(sp_canvas_bpath_parent_class)->update) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz reinterpret_cast<SPCanvasItemClass *>(sp_canvas_bpath_parent_class)->update(item, affine, flags);
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk }
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz sp_canvas_item_reset_bounds (item);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz if (!cbp->curve) return;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz cbp->affine = affine;
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz Geom::OptRect bbox = bounds_exact_transformed(cbp->curve->get_pathvector(), affine);
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz if (bbox) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item->x1 = (int)bbox->min()[Geom::X] - 1;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item->y1 = (int)bbox->min()[Geom::Y] - 1;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item->x2 = (int)bbox->max()[Geom::X] + 1;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item->y2 = (int)bbox->max()[Geom::Y] + 1;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz } else {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen item->x1 = 0;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item->y1 = 0;
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk item->x2 = 0;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item->y2 = 0;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz }
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz item->canvas->requestRedraw((int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz}
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzstatic void
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelensp_canvas_bpath_render (SPCanvasItem *item, SPCanvasBuf *buf)
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz{
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk SPCanvasBPath *cbp = SP_CANVAS_BPATH (item);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz Geom::Rect area = buf->rect;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz if ( !cbp->curve ||
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz ((cbp->stroke_rgba & 0xff) == 0 && (cbp->fill_rgba & 0xff) == 0 ) ||
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz cbp->curve->get_segment_count() < 1)
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen return;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk if (!buf->ct)
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz return;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz bool dofill = ((cbp->fill_rgba & 0xff) != 0);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz bool dostroke = ((cbp->stroke_rgba & 0xff) != 0);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz cairo_set_tolerance(buf->ct, 0.5);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg cairo_new_path(buf->ct);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg feed_pathvector_to_cairo (buf->ct, cbp->curve->get_pathvector(), cbp->affine, area,
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz /* optimized_stroke = */ !dofill, 1);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz if (dofill) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz // RGB / BGR
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz ink_cairo_set_source_rgba32(buf->ct, cbp->fill_rgba);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz cairo_set_fill_rule(buf->ct, cbp->fill_rule == SP_WIND_RULE_EVENODD? CAIRO_FILL_RULE_EVEN_ODD
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg : CAIRO_FILL_RULE_WINDING);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg cairo_fill_preserve(buf->ct);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg }
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz if (dostroke) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz ink_cairo_set_source_rgba32(buf->ct, cbp->stroke_rgba);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz cairo_set_line_width(buf->ct, 1);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz if (cbp->dashes[0] != 0 && cbp->dashes[1] != 0) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz cairo_set_dash (buf->ct, cbp->dashes, 2, 0);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg }
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg cairo_stroke(buf->ct);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg } else {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz cairo_new_path(buf->ct);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz }
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz}
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzstatic double
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzsp_canvas_bpath_point (SPCanvasItem *item, Geom::Point p, SPCanvasItem **actual_item)
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg{
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg SPCanvasBPath *cbp = SP_CANVAS_BPATH (item);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz if ( !cbp->curve ||
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz ((cbp->stroke_rgba & 0xff) == 0 && (cbp->fill_rgba & 0xff) == 0 ) ||
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz cbp->curve->get_segment_count() < 1)
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz return Geom::infinity();
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz double width = 0.5;
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg Geom::Rect viewbox = item->canvas->getViewbox();
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg viewbox.expandBy (width);
77fd5ff29861c6c87bcc9fc466d330b17a978c8ajaspervdg double dist = Geom::infinity();
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz pathv_matrix_point_bbox_wind_distance(cbp->curve->get_pathvector(), cbp->affine, p, NULL, NULL, &dist, 0.5, &viewbox);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz if (dist <= 1.0) {
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz *actual_item = item;
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz }
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg return dist;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg}
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
d37634d73670180f99a3e0ea583621373d90ec4fJohan EngelenSPCanvasItem *
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelensp_canvas_bpath_new (SPCanvasGroup *parent, SPCurve *curve)
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz{
9cf82ac568634e779873c4bf6cd6b7bdd465556dtweenk g_return_val_if_fail (parent != NULL, NULL);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz g_return_val_if_fail (SP_IS_CANVAS_GROUP (parent), NULL);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg SPCanvasItem *item = sp_canvas_item_new (parent, SP_TYPE_CANVAS_BPATH, NULL);
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg sp_canvas_bpath_set_bpath (SP_CANVAS_BPATH (item), curve);
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg return item;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg}
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzvoid
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruzsp_canvas_bpath_set_bpath (SPCanvasBPath *cbp, SPCurve *curve)
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz{
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz g_return_if_fail (cbp != NULL);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz g_return_if_fail (SP_IS_CANVAS_BPATH (cbp));
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen if (cbp->curve) {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen cbp->curve = cbp->curve->unref();
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz }
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen if (curve) {
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen cbp->curve = curve->ref();
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz }
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen sp_canvas_item_request_update (SP_CANVAS_ITEM (cbp));
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen}
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelenvoid
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelensp_canvas_bpath_set_fill (SPCanvasBPath *cbp, guint32 rgba, SPWindRule rule)
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen{
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen g_return_if_fail (cbp != NULL);
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz g_return_if_fail (SP_IS_CANVAS_BPATH (cbp));
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen cbp->fill_rgba = rgba;
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen cbp->fill_rule = rule;
9eb886f0efdd076022ef171278e8475a580a1e91jaspervdg
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg sp_canvas_item_request_update (SP_CANVAS_ITEM (cbp));
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg}
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdgvoid
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdgsp_canvas_bpath_set_stroke (SPCanvasBPath *cbp, guint32 rgba, gdouble width, SPStrokeJoinType join, SPStrokeCapType cap, double dash, double gap)
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg{
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg g_return_if_fail (cbp != NULL);
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg g_return_if_fail (SP_IS_CANVAS_BPATH (cbp));
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg cbp->stroke_rgba = rgba;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg cbp->stroke_width = MAX (width, 0.1);
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg cbp->stroke_linejoin = join;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg cbp->stroke_linecap = cap;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg cbp->dashes[0] = dash;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg cbp->dashes[1] = gap;
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg sp_canvas_item_request_update (SP_CANVAS_ITEM (cbp));
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg}
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg/*
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg Local Variables:
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg mode:c++
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg c-file-style:"stroustrup"
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
93a34ae628e2dccf2db5f7cfffe82371e6f0d040jaspervdg indent-tabs-mode:nil
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz fill-column:99
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz End:
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen*/
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :
e69f7d715a3db7f1fff1c8334714c8fab63852abjoncruz