index 96bda98806a6ed2a0a7920528908906fe74fcc2a..0ef23812e0b828b858d168c7a9a7e2f4f3f6941a 100644 (file)
*
* Author:
* Lauris Kaplinski <lauris@kaplinski.com>
+ * Johan Engelen <j.b.c.engelen@ewi.utwente.nl>
*
+ * Copyright (C) 2007 Johan Engelen
* Copyright (C) 1999-2002 Lauris Kaplinski
*
* Released under GNU GPL
*
*/
-#include "display-forward.h"
#include "sp-canvas-util.h"
#include "sp-ctrlline.h"
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
-#include <livarot/Shape.h>
-#include <livarot/Path.h>
+#include <color.h>
+#include "display/inkscape-cairo.h"
-struct SPCtrlLine : public SPCanvasItem{
- guint32 rgba;
- NRPoint s, e;
- Shape* shp;
-};
-
-struct SPCtrlLineClass : public SPCanvasItemClass{};
static void sp_ctrlline_class_init (SPCtrlLineClass *klass);
static void sp_ctrlline_init (SPCtrlLine *ctrlline);
static void sp_ctrlline_destroy (GtkObject *object);
-static void sp_ctrlline_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int flags);
+static void sp_ctrlline_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
static void sp_ctrlline_render (SPCanvasItem *item, SPCanvasBuf *buf);
static SPCanvasItemClass *parent_class;
-GtkType
+GType
sp_ctrlline_get_type (void)
{
- static GtkType type = 0;
-
+ static GType type = 0;
if (!type) {
- GtkTypeInfo info = {
- "SPCtrlLine",
- sizeof (SPCtrlLine),
- sizeof (SPCtrlLineClass),
- (GtkClassInitFunc) sp_ctrlline_class_init,
- (GtkObjectInitFunc) sp_ctrlline_init,
- NULL, NULL, NULL
+ GTypeInfo info = {
+ sizeof(SPCtrlLineClass),
+ NULL, NULL,
+ (GClassInitFunc) sp_ctrlline_class_init,
+ NULL, NULL,
+ sizeof(SPCtrlLine),
+ 0,
+ (GInstanceInitFunc) sp_ctrlline_init,
+ NULL
};
- type = gtk_type_unique (SP_TYPE_CANVAS_ITEM, &info);
+ type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPCtrlLine", &info, (GTypeFlags)0);
}
return type;
}
sp_ctrlline_init (SPCtrlLine *ctrlline)
{
ctrlline->rgba = 0x0000ff7f;
- ctrlline->s.x = ctrlline->s.y = ctrlline->e.x = ctrlline->e.y = 0.0;
- ctrlline->shp=NULL;
+ ctrlline->s[Geom::X] = ctrlline->s[Geom::Y] = ctrlline->e[Geom::X] = ctrlline->e[Geom::Y] = 0.0;
+ ctrlline->item=NULL;
}
static void
SPCtrlLine *ctrlline = SP_CTRLLINE (object);
- if (ctrlline->shp) {
- delete ctrlline->shp;
- ctrlline->shp = NULL;
- }
+ ctrlline->item=NULL;
if (GTK_OBJECT_CLASS (parent_class)->destroy)
(* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
static void
sp_ctrlline_render (SPCanvasItem *item, SPCanvasBuf *buf)
{
- SPCtrlLine *ctrlline = SP_CTRLLINE (item);
+ SPCtrlLine *cl = SP_CTRLLINE (item);
- NRRectL area;
- area.x0=buf->rect.x0;
- area.x1=buf->rect.x1;
- area.y0=buf->rect.y0;
- area.y1=buf->rect.y1;
+ if (!buf->ct)
+ return;
- if (ctrlline->shp) {
- sp_canvas_prepare_buffer (buf);
- nr_pixblock_render_ctrl_rgba (ctrlline->shp,ctrlline->rgba,area,(char*)buf->buf, buf->buf_rowstride);
- }
+ if (cl->s == cl->e)
+ return;
+
+ sp_canvas_prepare_buffer (buf);
+
+ guint32 rgba = cl->rgba;
+ 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));
+
+ cairo_set_line_width(buf->ct, 1);
+ cairo_new_path(buf->ct);
+
+ Geom::Point s = cl->s * cl->affine;
+ Geom::Point e = cl->e * cl->affine;
+
+ cairo_move_to (buf->ct, s[Geom::X] - buf->rect.x0, s[Geom::Y] - buf->rect.y0);
+ cairo_line_to (buf->ct, e[Geom::X] - buf->rect.x0, e[Geom::Y] - buf->rect.y0);
+
+ cairo_stroke(buf->ct);
}
static void
-sp_ctrlline_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int flags)
+sp_ctrlline_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
{
- NRRect dbox;
-
SPCtrlLine *cl = SP_CTRLLINE (item);
sp_canvas_request_redraw (item->canvas, (int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
@@ -133,43 +134,23 @@ sp_ctrlline_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int f
sp_canvas_item_reset_bounds (item);
- dbox.x0=dbox.x1=dbox.y0=dbox.y1=0;
- if (cl->shp) {
- delete cl->shp;
- cl->shp = NULL;
- }
- Path* thePath = new Path;
- thePath->MoveTo(NR::Point(cl->s.x, cl->s.y) * affine);
- thePath->LineTo(NR::Point(cl->e.x, cl->e.y) * affine);
-
- NRRectL area;
- area.x0=(NR::ICoord)(double)item->x1;
- area.x1=(NR::ICoord)(double)item->x2;
- area.y0=(NR::ICoord)(double)item->y1;
- area.y1=(NR::ICoord)(double)item->y2;
- thePath->Convert(&area, 1.0);
- if ( cl->shp == NULL ) cl->shp=new Shape;
- thePath->Stroke(cl->shp,false,0.5,join_straight,butt_straight,20.0,false);
- cl->shp->CalcBBox();
- if ( cl->shp->leftX < cl->shp->rightX ) {
- if ( dbox.x0 >= dbox.x1 ) {
- dbox.x0=cl->shp->leftX;dbox.x1=cl->shp->rightX;
- dbox.y0=cl->shp->topY;dbox.y1=cl->shp->bottomY;
- } else {
- if ( cl->shp->leftX < dbox.x0 ) dbox.x0=cl->shp->leftX;
- if ( cl->shp->rightX > dbox.x1 ) dbox.x1=cl->shp->rightX;
- if ( cl->shp->topY < dbox.y0 ) dbox.y0=cl->shp->topY;
- if ( cl->shp->bottomY > dbox.y1 ) dbox.y1=cl->shp->bottomY;
- }
- }
- delete thePath;
+ cl->affine = affine;
- item->x1 = (int)dbox.x0;
- item->y1 = (int)dbox.y0;
- item->x2 = (int)dbox.x1;
- item->y2 = (int)dbox.y1;
+ if (cl->s == cl->e) {
+ item->x1 = item->x2 = item->y1 = item->y2 = 0;
+ } else {
- sp_canvas_request_redraw (item->canvas, (int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
+ Geom::Point s = cl->s * affine;
+ Geom::Point e = cl->e * affine;
+
+ item->x1 = round(MIN(s[Geom::X], e[Geom::X]) - 1);
+ item->y1 = round(MIN(s[Geom::Y], e[Geom::Y]) - 1);
+ item->x2 = round(MAX(s[Geom::X], e[Geom::X]) + 1);
+ item->y2 = round(MAX(s[Geom::Y], e[Geom::Y]) + 1);
+
+ sp_canvas_request_redraw (item->canvas, (int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2);
+
+ }
}
void
@@ -195,17 +176,17 @@ sp_ctrlline_set_coords (SPCtrlLine *cl, gdouble x0, gdouble y0, gdouble x1, gdou
g_return_if_fail (cl != NULL);
g_return_if_fail (SP_IS_CTRLLINE (cl));
- if (DIFFER (x0, cl->s.x) || DIFFER (y0, cl->s.y) || DIFFER (x1, cl->e.x) || DIFFER (y1, cl->e.y)) {
- cl->s.x = x0;
- cl->s.y = y0;
- cl->e.x = x1;
- cl->e.y = y1;
+ 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])) {
+ cl->s[Geom::X] = x0;
+ cl->s[Geom::Y] = y0;
+ cl->e[Geom::X] = x1;
+ cl->e[Geom::Y] = y1;
sp_canvas_item_request_update (SP_CANVAS_ITEM (cl));
}
}
void
-sp_ctrlline_set_coords (SPCtrlLine *cl, const NR::Point start, const NR::Point end)
+sp_ctrlline_set_coords (SPCtrlLine *cl, const Geom::Point start, const Geom::Point end)
{
sp_ctrlline_set_coords(cl, start[0], start[1], end[0], end[1]);
}
@@ -219,4 +200,4 @@ sp_ctrlline_set_coords (SPCtrlLine *cl, const NR::Point start, const NR::Point e
fill-column:99
End:
*/
-// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
+// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:fileencoding=utf-8:textwidth=99 :