X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fdisplay%2Fsp-ctrlquadr.cpp;h=c29aecb96d2ebb6f162980c2c8580bb3112b8bad;hb=0dc33d4ce43e0bb49c63aa53b826ec4a1ff68e28;hp=e9488cdb5c3d54dd9e49fca55a6fc36ebbdf1b73;hpb=6b15695578f07a3f72c4c9475c1a261a3021472a;p=inkscape.git diff --git a/src/display/sp-ctrlquadr.cpp b/src/display/sp-ctrlquadr.cpp index e9488cdb5..c29aecb96 100644 --- a/src/display/sp-ctrlquadr.cpp +++ b/src/display/sp-ctrlquadr.cpp @@ -1,5 +1,3 @@ -#define __INKSCAPE_CTRLQUADR_C__ - /* * Quadrilateral * @@ -11,20 +9,19 @@ * Released under GNU GPL */ -#include "display-forward.h" -#include "sp-canvas-util.h" -#include "sp-ctrlquadr.h" - #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include -#include +#include "sp-canvas-util.h" +#include "sp-canvas-item.h" +#include "sp-ctrlquadr.h" +#include "display/inkscape-cairo.h" +#include "color.h" struct SPCtrlQuadr : public SPCanvasItem{ guint32 rgba; - NR::Point p1, p2, p3, p4; - Shape* shp; + Geom::Point p1, p2, p3, p4; + Geom::Matrix affine; }; struct SPCtrlQuadrClass : public SPCanvasItemClass{}; @@ -33,26 +30,27 @@ static void sp_ctrlquadr_class_init (SPCtrlQuadrClass *klass); static void sp_ctrlquadr_init (SPCtrlQuadr *ctrlquadr); static void sp_ctrlquadr_destroy (GtkObject *object); -static void sp_ctrlquadr_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int flags); +static void sp_ctrlquadr_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags); static void sp_ctrlquadr_render (SPCanvasItem *item, SPCanvasBuf *buf); static SPCanvasItemClass *parent_class; -GtkType +GType sp_ctrlquadr_get_type (void) { - static GtkType type = 0; - + static GType type = 0; if (!type) { - GtkTypeInfo info = { - "SPCtrlQuadr", - sizeof (SPCtrlQuadr), - sizeof (SPCtrlQuadrClass), - (GtkClassInitFunc) sp_ctrlquadr_class_init, - (GtkObjectInitFunc) sp_ctrlquadr_init, - NULL, NULL, NULL + GTypeInfo info = { + sizeof(SPCtrlQuadrClass), + NULL, NULL, + (GClassInitFunc) sp_ctrlquadr_class_init, + NULL, NULL, + sizeof(SPCtrlQuadr), + 0, + (GInstanceInitFunc) sp_ctrlquadr_init, + NULL }; - type = gtk_type_unique (SP_TYPE_CANVAS_ITEM, &info); + type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPCtrlQuadr", &info, (GTypeFlags)0); } return type; } @@ -75,11 +73,10 @@ static void sp_ctrlquadr_init (SPCtrlQuadr *ctrlquadr) { ctrlquadr->rgba = 0x000000ff; - ctrlquadr->p1 = NR::Point(0, 0); - ctrlquadr->p2 = NR::Point(0, 0); - ctrlquadr->p3 = NR::Point(0, 0); - ctrlquadr->p4 = NR::Point(0, 0); - ctrlquadr->shp=NULL; + ctrlquadr->p1 = Geom::Point(0, 0); + ctrlquadr->p2 = Geom::Point(0, 0); + ctrlquadr->p3 = Geom::Point(0, 0); + ctrlquadr->p4 = Geom::Point(0, 0); } static void @@ -88,13 +85,6 @@ sp_ctrlquadr_destroy (GtkObject *object) g_return_if_fail (object != NULL); g_return_if_fail (SP_IS_CTRLQUADR (object)); - SPCtrlQuadr *ctrlquadr = SP_CTRLQUADR (object); - - if (ctrlquadr->shp) { - delete ctrlquadr->shp; - ctrlquadr->shp = NULL; - } - if (GTK_OBJECT_CLASS (parent_class)->destroy) (* GTK_OBJECT_CLASS (parent_class)->destroy) (object); } @@ -102,26 +92,53 @@ sp_ctrlquadr_destroy (GtkObject *object) static void sp_ctrlquadr_render (SPCanvasItem *item, SPCanvasBuf *buf) { - SPCtrlQuadr *ctrlquadr = SP_CTRLQUADR (item); + SPCtrlQuadr *cq = SP_CTRLQUADR (item); - NRRectL area; - area.x0=buf->rect.x0; - area.x1=buf->rect.x1; - area.y0=buf->rect.y0; - area.y1=buf->rect.y1; + //Geom::Rect area (Geom::Point(buf->rect.x0, buf->rect.y0), Geom::Point(buf->rect.x1, buf->rect.y1)); - if (ctrlquadr->shp) { - sp_canvas_prepare_buffer (buf); - nr_pixblock_render_ctrl_rgba (ctrlquadr->shp,ctrlquadr->rgba,area,(char*)buf->buf, buf->buf_rowstride); - } + if (!buf->ct) + return; + + // RGB / BGR + cairo_new_path(buf->ct); + + Geom::Point min = Geom::Point(buf->rect.x0, buf->rect.y0); + + Geom::Point p1 = (cq->p1 * cq->affine) - min; + Geom::Point p2 = (cq->p2 * cq->affine) - min; + Geom::Point p3 = (cq->p3 * cq->affine) - min; + Geom::Point p4 = (cq->p4 * cq->affine) - min; + + cairo_move_to(buf->ct, p1[Geom::X], p1[Geom::Y]); + cairo_line_to(buf->ct, p2[Geom::X], p2[Geom::Y]); + cairo_line_to(buf->ct, p3[Geom::X], p3[Geom::Y]); + cairo_line_to(buf->ct, p4[Geom::X], p4[Geom::Y]); + cairo_line_to(buf->ct, p1[Geom::X], p1[Geom::Y]); + + // FIXME: this is supposed to draw inverse but cairo apparently is unable of this trick :( + //cairo_set_operator (buf->ct, CAIRO_OPERATOR_XOR); + + cairo_set_source_rgba(buf->ct, SP_RGBA32_B_F(cq->rgba), SP_RGBA32_G_F(cq->rgba), SP_RGBA32_R_F(cq->rgba), SP_RGBA32_A_F(cq->rgba)); + cairo_fill(buf->ct); } +#define MIN4(a,b,c,d)\ + ((a <= b && a <= c && a <= d) ? a : \ + (b <= a && b <= c && b <= d) ? b : \ + (c <= a && c <= b && c <= d) ? c : \ + d ) + +#define MAX4(a,b,c,d)\ + ((a >= b && a >= c && a >= d) ? a : \ + (b >= a && b >= c && b >= d) ? b : \ + (c >= a && c >= b && c >= d) ? c : \ + d ) + + static void -sp_ctrlquadr_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int flags) +sp_ctrlquadr_update (SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags) { - NRRect dbox; - - SPCtrlQuadr *cl = SP_CTRLQUADR (item); + SPCtrlQuadr *cq = SP_CTRLQUADR (item); sp_canvas_request_redraw (item->canvas, (int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2); @@ -130,41 +147,17 @@ sp_ctrlquadr_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int 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(cl->p1 * affine); - thePath->LineTo(cl->p2 * affine); - thePath->LineTo(cl->p3 * affine); - thePath->LineTo(cl->p4 * affine); - thePath->LineTo(cl->p1 * affine); - - thePath->Convert(1.0); - - if ( cl->shp == NULL ) cl->shp=new Shape; - thePath->Fill(cl->shp, 0); - - 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; - - item->x1 = (int)dbox.x0; - item->y1 = (int)dbox.y0; - item->x2 = (int)dbox.x1; - item->y2 = (int)dbox.y1; + cq->affine = affine; + + Geom::Point p1(cq->p1 * affine); + Geom::Point p2(cq->p2 * affine); + Geom::Point p3(cq->p3 * affine); + Geom::Point p4(cq->p4 * affine); + + item->x1 = (int)(MIN4(p1[Geom::X], p2[Geom::X], p3[Geom::X], p4[Geom::X])); + item->y1 = (int)(MIN4(p1[Geom::Y], p2[Geom::Y], p3[Geom::Y], p4[Geom::Y])); + item->x2 = (int)(MAX4(p1[Geom::X], p2[Geom::X], p3[Geom::X], p4[Geom::X])); + item->y2 = (int)(MAX4(p1[Geom::Y], p2[Geom::Y], p3[Geom::Y], p4[Geom::Y])); sp_canvas_request_redraw (item->canvas, (int)item->x1, (int)item->y1, (int)item->x2, (int)item->y2); } @@ -184,7 +177,7 @@ sp_ctrlquadr_set_rgba32 (SPCtrlQuadr *cl, guint32 rgba) } void -sp_ctrlquadr_set_coords (SPCtrlQuadr *cl, NR::Point p1, NR::Point p2, NR::Point p3, NR::Point p4) +sp_ctrlquadr_set_coords (SPCtrlQuadr *cl, Geom::Point p1, Geom::Point p2, Geom::Point p3, Geom::Point p4) { g_return_if_fail (cl != NULL); g_return_if_fail (SP_IS_CTRLQUADR (cl)); @@ -207,4 +200,4 @@ sp_ctrlquadr_set_coords (SPCtrlQuadr *cl, NR::Point p1, NR::Point p2, NR::Point 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 :