diff options
Diffstat (limited to 'src/display/sp-canvas.h')
| -rw-r--r-- | src/display/sp-canvas.h | 186 |
1 files changed, 186 insertions, 0 deletions
diff --git a/src/display/sp-canvas.h b/src/display/sp-canvas.h new file mode 100644 index 000000000..905c9272f --- /dev/null +++ b/src/display/sp-canvas.h @@ -0,0 +1,186 @@ +#ifndef __SP_CANVAS_H__ +#define __SP_CANVAS_H__ + +/** \file + * SPCanvas, SPCanvasBuf, and SPCanvasItem. + * + * Authors: + * Federico Mena <federico@nuclecu.unam.mx> + * Raph Levien <raph@gimp.org> + * Lauris Kaplinski <lauris@kaplinski.com> + * + * Copyright (C) 1998 The Free Software Foundation + * Copyright (C) 2002 Lauris Kaplinski + * + * Released under GNU GPL, read the file 'COPYING' for more information + */ + +#include <stdint.h> +#include <glib/gtypes.h> +#include <gdk/gdkevents.h> +#include <gdk/gdkgc.h> +#include <gtk/gtkobject.h> +#include <gtk/gtkwidget.h> + +#include <libnr/nr-matrix.h> +#include <libnr/nr-rect.h> +#include <libnr/nr-rect-l.h> + +struct SPCanvas; +struct SPCanvasGroup; + +enum { + SP_CANVAS_UPDATE_REQUESTED = 1 << 0, + SP_CANVAS_UPDATE_AFFINE = 1 << 1 +}; + +/** + * The canvas buf contains the actual pixels. + */ +struct SPCanvasBuf{ + guchar *buf; + int buf_rowstride; + NRRectL rect; + /// Background color, given as 0xrrggbb + guint32 bg_color; + // If empty, ignore contents of buffer and use a solid area of bg_color + bool is_empty; +}; + +/** + * An SPCanvasItem refers to a SPCanvas and to its parent item; it has + * four coordinates, a bounding rectangle, and a transformation matrix. + */ +struct SPCanvasItem : public GtkObject { + SPCanvas *canvas; + SPCanvasItem *parent; + + double x1, y1, x2, y2; + NR::Rect bounds; + NR::Matrix xform; +}; + +/** + * The vtable of an SPCanvasItem. + */ +struct SPCanvasItemClass : public GtkObjectClass { + void (* update) (SPCanvasItem *item, NR::Matrix const &affine, unsigned int flags); + + void (* render) (SPCanvasItem *item, SPCanvasBuf *buf); + double (* point) (SPCanvasItem *item, NR::Point p, SPCanvasItem **actual_item); + + int (* event) (SPCanvasItem *item, GdkEvent *event); +}; + +SPCanvasItem *sp_canvas_item_new(SPCanvasGroup *parent, GtkType type, const gchar *first_arg_name, ...); + +#define sp_canvas_item_set gtk_object_set + +void sp_canvas_item_affine_absolute(SPCanvasItem *item, NR::Matrix const &aff); + +void sp_canvas_item_raise(SPCanvasItem *item, int positions); +void sp_canvas_item_lower(SPCanvasItem *item, int positions); +void sp_canvas_item_show(SPCanvasItem *item); +void sp_canvas_item_hide(SPCanvasItem *item); +int sp_canvas_item_grab(SPCanvasItem *item, unsigned int event_mask, GdkCursor *cursor, guint32 etime); +void sp_canvas_item_ungrab(SPCanvasItem *item, guint32 etime); + +NR::Matrix sp_canvas_item_i2w_affine(SPCanvasItem const *item); + +void sp_canvas_item_grab_focus(SPCanvasItem *item); + +void sp_canvas_item_request_update(SPCanvasItem *item); + +/* get item z-order in parent group */ + +gint sp_canvas_item_order(SPCanvasItem * item); + + +// SPCanvas ------------------------------------------------- +/** + * Port of GnomeCanvas for inkscape needs. + */ +struct SPCanvas { + GtkWidget widget; + + guint idle_id; + + SPCanvasItem *root; + + double dx0, dy0; + int x0, y0; + + /* Area that needs redrawing, stored as a microtile array */ + int tLeft,tTop,tRight,tBottom; + int tileH,tileV; + uint8_t *tiles; + + /* Last known modifier state, for deferred repick when a button is down */ + int state; + + /* The item containing the mouse pointer, or NULL if none */ + SPCanvasItem *current_item; + + /* Item that is about to become current (used to track deletions and such) */ + SPCanvasItem *new_current_item; + + /* Item that holds a pointer grab, or NULL if none */ + SPCanvasItem *grabbed_item; + + /* Event mask specified when grabbing an item */ + guint grabbed_event_mask; + + /* If non-NULL, the currently focused item */ + SPCanvasItem *focused_item; + + /* Event on which selection of current item is based */ + GdkEvent pick_event; + + int close_enough; + + /* GC for temporary draw pixmap */ + GdkGC *pixmap_gc; + + unsigned int need_update : 1; + unsigned int need_redraw : 1; + unsigned int need_repick : 1; + + /* For use by internal pick_current_item() function */ + unsigned int left_grabbed_item : 1; + /* For use by internal pick_current_item() function */ + unsigned int in_repick : 1; + + int rendermode; + + NR::Rect getViewbox() const; +}; + +GtkWidget *sp_canvas_new_aa(); + +SPCanvasGroup *sp_canvas_root(SPCanvas *canvas); + +void sp_canvas_scroll_to(SPCanvas *canvas, double cx, double cy, unsigned int clear); +void sp_canvas_update_now(SPCanvas *canvas); + +void sp_canvas_request_redraw(SPCanvas *canvas, int x1, int y1, int x2, int y2); + +void sp_canvas_window_to_world(SPCanvas const *canvas, double winx, double winy, double *worldx, double *worldy); +void sp_canvas_world_to_window(SPCanvas const *canvas, double worldx, double worldy, double *winx, double *winy); + +NR::Point sp_canvas_window_to_world(SPCanvas const *canvas, NR::Point const win); +NR::Point sp_canvas_world_to_window(SPCanvas const *canvas, NR::Point const world); + +bool sp_canvas_world_pt_inside_window(SPCanvas const *canvas, NR::Point const &world); + +#endif + +/* + Local Variables: + mode:c++ + c-file-style:"stroustrup" + c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) + indent-tabs-mode:nil + fill-column:99 + End: +*/ +// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 : |
