26
26
#ifdef HAVE_CONFIG_H
27
27
# include "config.h"
29
#include <livarot/Path.h>
30
#include "display/inkscape-cairo.h"
33
33
static void sp_ctrlline_class_init (SPCtrlLineClass *klass);
34
34
static void sp_ctrlline_init (SPCtrlLine *ctrlline);
35
35
static void sp_ctrlline_destroy (GtkObject *object);
37
static void sp_ctrlline_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int flags);
37
static void sp_ctrlline_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
38
38
static void sp_ctrlline_render (SPCanvasItem *item, SPCanvasBuf *buf);
40
40
static SPCanvasItemClass *parent_class;
43
43
sp_ctrlline_get_type (void)
45
static GtkType type = 0;
45
static GType type = 0;
51
sizeof (SPCtrlLineClass),
52
(GtkClassInitFunc) sp_ctrlline_class_init,
53
(GtkObjectInitFunc) sp_ctrlline_init,
48
sizeof(SPCtrlLineClass),
50
(GClassInitFunc) sp_ctrlline_class_init,
54
(GInstanceInitFunc) sp_ctrlline_init,
56
type = gtk_type_unique (SP_TYPE_CANVAS_ITEM, &info);
57
type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPCtrlLine", &info, (GTypeFlags)0);
104
99
sp_ctrlline_render (SPCanvasItem *item, SPCanvasBuf *buf)
106
SPCtrlLine *ctrlline = SP_CTRLLINE (item);
109
area.x0=buf->rect.x0;
110
area.x1=buf->rect.x1;
111
area.y0=buf->rect.y0;
112
area.y1=buf->rect.y1;
115
// CAIRO FIXME: after SPCanvasBuf is switched to unpacked 32bit rgb, rendering can be done via cairo:
116
cairo_surface_t* cst = cairo_image_surface_create_for_data (
119
buf->rect.x1 - buf->rect.x0,
120
buf->rect.y1 - buf->rect.y0,
123
cairo_t *ct = cairo_create (cst);
125
guint32 rgba = ctrlline->rgba;
126
cairo_set_source_rgba(ct, SP_RGBA32_R_F(rgba), SP_RGBA32_G_F(rgba), SP_RGBA32_B_F(rgba), SP_RGBA32_A_F(rgba));
128
cairo_set_line_width(ct, 0.5);
131
cairo_move_to (ct, ctrlline->s.x - buf->rect.x0, ctrlline->s.y - buf->rect.y0);
132
cairo_line_to (ct, ctrlline->e.x - buf->rect.x0, ctrlline->e.y - buf->rect.y0);
136
cairo_surface_finish (cst);
137
cairo_surface_destroy (cst);
140
// CAIRO FIXME: instead of this:
142
sp_canvas_prepare_buffer (buf);
143
nr_pixblock_render_ctrl_rgba (ctrlline->shp,ctrlline->rgba,area,(char*)buf->buf, buf->buf_rowstride);
101
SPCtrlLine *cl = SP_CTRLLINE (item);
109
sp_canvas_prepare_buffer (buf);
111
guint32 rgba = cl->rgba;
112
cairo_set_source_rgba(buf->ct, SP_RGBA32_B_F(rgba), SP_RGBA32_G_F(rgba), SP_RGBA32_R_F(rgba), SP_RGBA32_A_F(rgba));
114
cairo_set_line_width(buf->ct, 1);
115
cairo_new_path(buf->ct);
117
Geom::Point s = cl->s * cl->affine;
118
Geom::Point e = cl->e * cl->affine;
120
cairo_move_to (buf->ct, s[Geom::X] - buf->rect.x0, s[Geom::Y] - buf->rect.y0);
121
cairo_line_to (buf->ct, e[Geom::X] - buf->rect.x0, e[Geom::Y] - buf->rect.y0);
123
cairo_stroke(buf->ct);
148
sp_ctrlline_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int flags)
127
sp_ctrlline_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
150
129
SPCtrlLine *cl = SP_CTRLLINE (item);
157
136
sp_canvas_item_reset_bounds (item);
160
// CAIRO FIXME: all that is needed for update with cairo:
161
NR::Point s = NR::Point(cl->s.x, cl->s.y) * affine;
162
NR::Point e = NR::Point(cl->e.x, cl->e.y) * affine;
169
item->x1 = (int)(MIN(s[NR::X], e[NR::X]) - 1);
170
item->y1 = (int)(MIN(s[NR::Y], e[NR::Y]) - 1);
171
item->x2 = (int)(MAX(s[NR::X], e[NR::X]) + 1);
172
item->y2 = (int)(MAX(s[NR::Y], e[NR::Y]) + 1);
175
// CAIRO FIXME: instead of:
177
dbox.x0=dbox.x1=dbox.y0=dbox.y1=0;
182
Path* thePath = new Path;
183
thePath->MoveTo(NR::Point(cl->s.x, cl->s.y) * affine);
184
thePath->LineTo(NR::Point(cl->e.x, cl->e.y) * affine);
187
area.x0=(NR::ICoord)(double)item->x1;
188
area.x1=(NR::ICoord)(double)item->x2;
189
area.y0=(NR::ICoord)(double)item->y1;
190
area.y1=(NR::ICoord)(double)item->y2;
191
thePath->Convert(&area, 1.0);
192
if ( cl->shp == NULL ) cl->shp=new Shape;
193
thePath->Stroke(cl->shp,false,0.5,join_straight,butt_straight,20.0,false);
195
if ( cl->shp->leftX < cl->shp->rightX ) {
196
if ( dbox.x0 >= dbox.x1 ) {
197
dbox.x0=cl->shp->leftX;dbox.x1=cl->shp->rightX;
198
dbox.y0=cl->shp->topY;dbox.y1=cl->shp->bottomY;
200
if ( cl->shp->leftX < dbox.x0 ) dbox.x0=cl->shp->leftX;
201
if ( cl->shp->rightX > dbox.x1 ) dbox.x1=cl->shp->rightX;
202
if ( cl->shp->topY < dbox.y0 ) dbox.y0=cl->shp->topY;
203
if ( cl->shp->bottomY > dbox.y1 ) dbox.y1=cl->shp->bottomY;
208
item->x1 = (int)dbox.x0;
209
item->y1 = (int)dbox.y0;
210
item->x2 = (int)dbox.x1;
211
item->y2 = (int)dbox.y1;
213
sp_canvas_request_redraw (item->canvas, (int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
140
if (cl->s == cl->e) {
141
item->x1 = item->x2 = item->y1 = item->y2 = 0;
144
Geom::Point s = cl->s * affine;
145
Geom::Point e = cl->e * affine;
147
item->x1 = round(MIN(s[Geom::X], e[Geom::X]) - 1);
148
item->y1 = round(MIN(s[Geom::Y], e[Geom::Y]) - 1);
149
item->x2 = round(MAX(s[Geom::X], e[Geom::X]) + 1);
150
item->y2 = round(MAX(s[Geom::Y], e[Geom::Y]) + 1);
152
sp_canvas_request_redraw (item->canvas, (int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
236
177
g_return_if_fail (cl != NULL);
237
178
g_return_if_fail (SP_IS_CTRLLINE (cl));
239
if (DIFFER (x0, cl->s.x) || DIFFER (y0, cl->s.y) || DIFFER (x1, cl->e.x) || DIFFER (y1, cl->e.y)) {
180
if (DIFFER (x0, cl->s[Geom::X]) || DIFFER (y0, cl->s[Geom::Y]) || DIFFER (x1, cl->e[Geom::X]) || DIFFER (y1, cl->e[Geom::Y])) {
244
185
sp_canvas_item_request_update (SP_CANVAS_ITEM (cl));
249
sp_ctrlline_set_coords (SPCtrlLine *cl, const NR::Point start, const NR::Point end)
190
sp_ctrlline_set_coords (SPCtrlLine *cl, const Geom::Point start, const Geom::Point end)
251
192
sp_ctrlline_set_coords(cl, start[0], start[1], end[0], end[1]);