sodipodi-ctrl.cpp revision 208e5a33acc4a8ad9d8c0488f047c260346f1258
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang#define INKSCAPE_CTRL_C
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang/*
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang * SPCtrl
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang * We render it by hand to reduce allocing/freeing svps & to get clean
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang * (non-aa) images
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang *
3e4305eb6432c65bb0dfe8d9af9707dfc92383eaChristian Maeder */
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang#include "sp-canvas-util.h"
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang#include "display-forward.h"
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang#include "sodipodi-ctrl.h"
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangenum {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ARG_0,
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ARG_SHAPE,
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski ARG_MODE,
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ARG_ANCHOR,
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ARG_SIZE,
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ARG_FILLED,
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ARG_FILL_COLOR,
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ARG_STROKED,
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ARG_STROKE_COLOR,
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ARG_PIXBUF
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang};
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiangstatic void sp_ctrl_class_init (SPCtrlClass *klass);
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiangstatic void sp_ctrl_init (SPCtrl *ctrl);
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiangstatic void sp_ctrl_destroy (GtkObject *object);
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiangstatic void sp_ctrl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id);
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiangstatic void sp_ctrl_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int flags);
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiangstatic void sp_ctrl_render (SPCanvasItem *item, SPCanvasBuf *buf);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangstatic double sp_ctrl_point (SPCanvasItem *item, NR::Point p, SPCanvasItem **actual_item);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangstatic SPCanvasItemClass *parent_class;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng JiangGtkType
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangsp_ctrl_get_type (void)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang{
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang static GtkType ctrl_type = 0;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang if (!ctrl_type) {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang static GTypeInfo const ctrl_info = {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang sizeof (SPCtrlClass),
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang NULL, /* base_init */
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang NULL, /* base_finalize */
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (GClassInitFunc) sp_ctrl_class_init,
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang NULL, /* class_finalize */
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang NULL, /* class_data */
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang sizeof (SPCtrl),
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang 0, /* n_preallocs */
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (GInstanceInitFunc) sp_ctrl_init,
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang NULL
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang };
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang ctrl_type = g_type_register_static (SP_TYPE_CANVAS_ITEM, "SPCtrl", &ctrl_info, (GTypeFlags)0);
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang }
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang return ctrl_type;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang}
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangstatic void
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangsp_ctrl_class_init (SPCtrlClass *klass)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang{
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang GtkObjectClass *object_class;
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang SPCanvasItemClass *item_class;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang object_class = (GtkObjectClass *) klass;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang item_class = (SPCanvasItemClass *) klass;
c10df434f8e16b46ccf703bf2e38b799f7bcb38bHeng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang parent_class = (SPCanvasItemClass *)gtk_type_class (sp_canvas_item_get_type ());
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gtk_object_add_arg_type ("SPCtrl::shape", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_SHAPE);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gtk_object_add_arg_type ("SPCtrl::mode", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_MODE);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gtk_object_add_arg_type ("SPCtrl::anchor", GTK_TYPE_ANCHOR_TYPE, GTK_ARG_READWRITE, ARG_ANCHOR);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gtk_object_add_arg_type ("SPCtrl::size", GTK_TYPE_DOUBLE, GTK_ARG_READWRITE, ARG_SIZE);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gtk_object_add_arg_type ("SPCtrl::pixbuf", GTK_TYPE_POINTER, GTK_ARG_READWRITE, ARG_PIXBUF);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gtk_object_add_arg_type ("SPCtrl::filled", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_FILLED);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gtk_object_add_arg_type ("SPCtrl::fill_color", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_FILL_COLOR);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gtk_object_add_arg_type ("SPCtrl::stroked", GTK_TYPE_BOOL, GTK_ARG_READWRITE, ARG_STROKED);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gtk_object_add_arg_type ("SPCtrl::stroke_color", GTK_TYPE_INT, GTK_ARG_READWRITE, ARG_STROKE_COLOR);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang object_class->destroy = sp_ctrl_destroy;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang object_class->set_arg = sp_ctrl_set_arg;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang item_class->update = sp_ctrl_update;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang item_class->render = sp_ctrl_render;
c10df434f8e16b46ccf703bf2e38b799f7bcb38bHeng Jiang item_class->point = sp_ctrl_point;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang}
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
b0905caf30330ed73d5363e67c9f1f4576737ee1Heng Jiangstatic void
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangsp_ctrl_init (SPCtrl *ctrl)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang{
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang ctrl->shape = SP_CTRL_SHAPE_SQUARE;
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang ctrl->mode = SP_CTRL_MODE_COLOR;
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang ctrl->anchor = GTK_ANCHOR_CENTER;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ctrl->span = 3;
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang ctrl->defined = TRUE;
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang ctrl->shown = FALSE;
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang ctrl->build = FALSE;
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang ctrl->filled = 1;
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang ctrl->stroked = 0;
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang ctrl->fill_color = 0x000000ff;
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang ctrl->stroke_color = 0x000000ff;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->_moved = false;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->box.x0 = ctrl->box.y0 = ctrl->box.x1 = ctrl->box.y1 = 0;
31ac08a9e5233b83a63fd5aaac494c32305c4c77Heng Jiang ctrl->cache = NULL;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->pixbuf = NULL;
3e4305eb6432c65bb0dfe8d9af9707dfc92383eaChristian Maeder}
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
f0a4ace924cef940ca4cc646fa180df70ef405d8Klaus Luettichstatic void
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangsp_ctrl_destroy (GtkObject *object)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang{
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang SPCtrl *ctrl;
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang g_return_if_fail (object != NULL);
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang g_return_if_fail (SP_IS_CTRL (object));
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang ctrl = SP_CTRL (object);
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang
0b31ea5ec0e20f17d55845a5d803c48466e01ca3Heng Jiang if (GTK_OBJECT_CLASS (parent_class)->destroy)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang}
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangstatic void
31ac08a9e5233b83a63fd5aaac494c32305c4c77Heng Jiangsp_ctrl_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
31ac08a9e5233b83a63fd5aaac494c32305c4c77Heng Jiang{
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang SPCanvasItem *item;
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang SPCtrl *ctrl;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang GdkPixbuf * pixbuf = NULL;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang item = SP_CANVAS_ITEM (object);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl = SP_CTRL (object);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang switch (arg_id) {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang case ARG_SHAPE:
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang ctrl->shape = (SPCtrlShapeType)(GTK_VALUE_INT (*arg));
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang ctrl->build = FALSE;
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang sp_canvas_item_request_update (item);
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang break;
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang case ARG_MODE:
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang ctrl->mode = (SPCtrlModeType)(GTK_VALUE_INT (*arg));
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang ctrl->build = FALSE;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang sp_canvas_item_request_update (item);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang case ARG_ANCHOR:
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->anchor = (GtkAnchorType)(GTK_VALUE_INT (*arg));
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->build = FALSE;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang sp_canvas_item_request_update (item);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang case ARG_SIZE:
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->span = (gint) ((GTK_VALUE_DOUBLE (*arg) - 1.0) / 2.0 + 0.5);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->defined = (ctrl->span > 0);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->build = FALSE;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang sp_canvas_item_request_update (item);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang case ARG_FILLED:
806bce66335c88260a63e7524b1efc68d8dfacc1Heng Jiang ctrl->filled = GTK_VALUE_BOOL (*arg);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->build = FALSE;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang sp_canvas_item_request_update (item);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang case ARG_FILL_COLOR:
f0a4ace924cef940ca4cc646fa180df70ef405d8Klaus Luettich ctrl->fill_color = GTK_VALUE_INT (*arg);
f0a4ace924cef940ca4cc646fa180df70ef405d8Klaus Luettich ctrl->build = FALSE;
f0a4ace924cef940ca4cc646fa180df70ef405d8Klaus Luettich sp_canvas_item_request_update (item);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang case ARG_STROKED:
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->stroked = GTK_VALUE_BOOL (*arg);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->build = FALSE;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang sp_canvas_item_request_update (item);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang case ARG_STROKE_COLOR:
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->stroke_color = GTK_VALUE_INT (*arg);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->build = FALSE;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang sp_canvas_item_request_update (item);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang case ARG_PIXBUF:
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang pixbuf = (GdkPixbuf*)(GTK_VALUE_POINTER (*arg));
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang if (gdk_pixbuf_get_has_alpha (pixbuf)) {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->pixbuf = pixbuf;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang } else {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->pixbuf = gdk_pixbuf_add_alpha (pixbuf, FALSE, 0, 0, 0);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gdk_pixbuf_unref (pixbuf);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang }
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->build = FALSE;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang default:
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang }
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang}
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangstatic void
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangsp_ctrl_update (SPCanvasItem *item, NR::Matrix const &affine, unsigned int flags)
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang{
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang SPCtrl *ctrl;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gint x, y;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl = SP_CTRL (item);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
36089fe7ad5167b48f702514056071fd8739faeaHeng Jiang if (((SPCanvasItemClass *) parent_class)->update)
175c9e5fde43fc804a8d25198133288669b9d54cKlaus Luettich (* ((SPCanvasItemClass *) parent_class)->update) (item, affine, flags);
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
175c9e5fde43fc804a8d25198133288669b9d54cKlaus Luettich sp_canvas_item_reset_bounds (item);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang if (!ctrl->_moved) return;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang if (ctrl->shown) {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang sp_canvas_request_redraw (item->canvas, ctrl->box.x0, ctrl->box.y0, ctrl->box.x1 + 1, ctrl->box.y1 + 1);
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang }
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang if (!ctrl->defined) return;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang x = (gint) ((affine[4] > 0) ? (affine[4] + 0.5) : (affine[4] - 0.5)) - ctrl->span;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang y = (gint) ((affine[5] > 0) ? (affine[5] + 0.5) : (affine[5] - 0.5)) - ctrl->span;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang switch (ctrl->anchor) {
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang case GTK_ANCHOR_N:
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang case GTK_ANCHOR_CENTER:
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang case GTK_ANCHOR_S:
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang break;
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_NW:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_W:
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang case GTK_ANCHOR_SW:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang x += ctrl->span;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang break;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_NE:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_E:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_SE:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang x -= (ctrl->span + 1);
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang break;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang switch (ctrl->anchor) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_W:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_CENTER:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_E:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang break;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_NW:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_N:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_NE:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang y += ctrl->span;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang break;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_SW:
f4152ab9d084afebd592edfcde4bf5a0d8556eddKlaus Luettich case GTK_ANCHOR_S:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case GTK_ANCHOR_SE:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang y -= (ctrl->span + 1);
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang break;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ctrl->box.x0 = x;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ctrl->box.y0 = y;
c51b5677113ce7260c44afb3c5932eea6c875e27Heng Jiang ctrl->box.x1 = ctrl->box.x0 + 2 * ctrl->span;
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski ctrl->box.y1 = ctrl->box.y0 + 2 * ctrl->span;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski sp_canvas_update_bbox (item, ctrl->box.x0, ctrl->box.y0, ctrl->box.x1 + 1, ctrl->box.y1 + 1);
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski}
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowskistatic double
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowskisp_ctrl_point (SPCanvasItem *item, NR::Point p, SPCanvasItem **actual_item)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang{
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang SPCtrl *ctrl = SP_CTRL (item);
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *actual_item = item;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang double const x = p[NR::X];
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski double const y = p[NR::Y];
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski if ((x >= ctrl->box.x0) && (x <= ctrl->box.x1) && (y >= ctrl->box.y0) && (y <= ctrl->box.y1)) return 0.0;
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski return 1e18;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang}
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowskistatic void
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiangsp_ctrl_build_cache (SPCtrl *ctrl)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang{
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang guchar * p, *q;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang gint size, x, y, z, s, a, side, c;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang guint8 fr, fg, fb, fa, sr, sg, sb, sa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang if (ctrl->filled) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang fr = (ctrl->fill_color >> 24) & 0xff;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang fg = (ctrl->fill_color >> 16) & 0xff;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang fb = (ctrl->fill_color >> 8) & 0xff;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang fa = (ctrl->fill_color) & 0xff;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang } else {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang fr = 0x00; fg = 0x00; fb = 0x00; fa = 0x00;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang if (ctrl->stroked) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang sr = (ctrl->stroke_color >> 24) & 0xff;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang sg = (ctrl->stroke_color >> 16) & 0xff;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang sb = (ctrl->stroke_color >> 8) & 0xff;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang sa = (ctrl->stroke_color) & 0xff;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang } else {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang sr = fr; sg = fg; sb = fb; sa = fa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
f4152ab9d084afebd592edfcde4bf5a0d8556eddKlaus Luettich
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang side = (ctrl->span * 2 +1);
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang c = ctrl->span ;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang g_free (ctrl->cache);
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang size = (side) * (side) * 4;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ctrl->cache = (guchar*)g_malloc (size);
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang if (side < 2) return;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang switch (ctrl->shape) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case SP_CTRL_SHAPE_SQUARE:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang p = ctrl->cache;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang for (x=0; x < side; x++) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = sr; *p++ = sg; *p++ = sb; *p++ = sa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang for (y = 2; y < side; y++) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = sr; *p++ = sg; *p++ = sb; *p++ = sa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang for (x=2; x < side; x++) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = fr; *p++ = fg; *p++ = fb; *p++ = fa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = sr; *p++ = sg; *p++ = sb; *p++ = sa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang for (x=0; x < side; x++) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = sr; *p++ = sg; *p++ = sb; *p++ = sa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ctrl->build = TRUE;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang break;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case SP_CTRL_SHAPE_DIAMOND:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang p = ctrl->cache;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang for (y = 0; y < side; y++) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang z = abs (c - y);
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang for (x = 0; x < z; x++) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = sr; *p++ = sg; *p++ = sb; *p++ = sa; x++;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang for (; x < side - z -1; x++) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = fr; *p++ = fg; *p++ = fb; *p++ = fa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang if (z != c) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = sr; *p++ = sg; *p++ = sb; *p++ = sa; x++;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang for (; x < side; x++) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang break;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case SP_CTRL_SHAPE_CIRCLE:
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang p = ctrl->cache;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang q = p + size -1;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang s = -1;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang for (y = 0; y <= c ; y++) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang a = abs (c - y);
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang z = (gint)(0.0 + sqrt ((c+.4)*(c+.4) - a*a));
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang x = 0;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang while (x < c-z) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *q-- = 0x00; *q-- = 0x00; *q-- = 0x00; *q-- = 0x00;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang x++;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang do {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = sr; *p++ = sg; *p++ = sb; *p++ = sa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *q-- = sa; *q-- = sb; *q-- = sg; *q-- = sr;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang x++;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang } while (x < c-s);
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang while (x < MIN(c+s+1, c+z)) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = fr; *p++ = fg; *p++ = fb; *p++ = fa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *q-- = fa; *q-- = fb; *q-- = fg; *q-- = fr;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang x++;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang do {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = sr; *p++ = sg; *p++ = sb; *p++ = sa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *q-- = sa; *q-- = sb; *q-- = sg; *q-- = sr;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang x++;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang } while (x <= c+z);
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang while (x < side) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *q-- = 0x00; *q-- = 0x00; *q-- = 0x00; *q-- = 0x00;
6c8dc7ab7cb52a12cba748fe0f6b8d8d17a95eb9Heng Jiang x++;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang s = z;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ctrl->build = TRUE;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang break;
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski
67d5e49547d78aa56a8f9ba5e64a950b730eba66Till Mossakowski case SP_CTRL_SHAPE_CROSS:
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang p = ctrl->cache;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang for (y = 0; y < side; y++) {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang z = abs (c - y);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang for (x = 0; x < c-z; x++) {
c10df434f8e16b46ccf703bf2e38b799f7bcb38bHeng Jiang *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang *p++ = sr; *p++ = sg; *p++ = sb; *p++ = sa; x++;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang for (; x < c + z; x++) {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang }
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang if (z != 0) {
3d59ee7815197f19948fc512cd90f9f26fd4d78fHeng Jiang *p++ = sr; *p++ = sg; *p++ = sb; *p++ = sa; x++;
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang }
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang for (; x < side; x++) {
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang *p++ = 0x00; *p++ = 0x00; *p++ = 0x00; *p++ = 0x00;
c51b5677113ce7260c44afb3c5932eea6c875e27Heng Jiang }
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang }
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang ctrl->build = TRUE;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang case SP_CTRL_SHAPE_BITMAP:
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang if (ctrl->pixbuf) {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang unsigned char *px;
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang unsigned int rs;
c51b5677113ce7260c44afb3c5932eea6c875e27Heng Jiang px = gdk_pixbuf_get_pixels (ctrl->pixbuf);
c51b5677113ce7260c44afb3c5932eea6c875e27Heng Jiang rs = gdk_pixbuf_get_rowstride (ctrl->pixbuf);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang for (y = 0; y < side; y++){
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang unsigned char *s, *d;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang s = px + y * rs;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang d = ctrl->cache + 4 * side * y;
3d59ee7815197f19948fc512cd90f9f26fd4d78fHeng Jiang for (x = 0; x < side; x++) {
3d59ee7815197f19948fc512cd90f9f26fd4d78fHeng Jiang if (s[3] < 0x80) {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang d[0] = 0x00;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang d[1] = 0x00;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang d[2] = 0x00;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang d[3] = 0x00;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang } else if (s[0] < 0x80) {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang d[0] = sr;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang d[1] = sg;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang d[2] = sb;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang d[3] = sa;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang } else {
b91c4dbd00294ce29ab1ae84ad4e8c93ca5ad943Heng Jiang d[0] = fr;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang d[1] = fg;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang d[2] = fb;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang d[3] = fa;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang }
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang s += 4;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang d += 4;
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang } else {
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang g_print ("control has no pixmap\n");
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang }
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang ctrl->build = TRUE;
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang break;
c51b5677113ce7260c44afb3c5932eea6c875e27Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang case SP_CTRL_SHAPE_IMAGE:
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang if (ctrl->pixbuf) {
b3c65285705f6d184b5f8b00b1a328d96b6b19c5Heng Jiang guint r = gdk_pixbuf_get_rowstride (ctrl->pixbuf);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang guchar * pix;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang q = gdk_pixbuf_get_pixels (ctrl->pixbuf);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang p = ctrl->cache;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang for (y = 0; y < side; y++){
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang pix = q + (y * r);
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang for (x = 0; x < side; x++) {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang *p++ = *pix++;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang *p++ = *pix++;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang *p++ = *pix++;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang *p++ = *pix++;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang }
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang }
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang } else {
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang g_print ("control has no pixmap\n");
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang }
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang ctrl->build = TRUE;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang default:
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang break;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang }
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang}
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang// composite background, foreground, alpha for xor mode
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang#define COMPOSE_X(b,f,a) ( ( ((guchar) b) * ((guchar) (0xff - a)) + ((guchar) ((b ^ ~f) + b/4 - (b>127? 63 : 0))) * ((guchar) a) ) / 0xff )
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang// composite background, foreground, alpha for color mode
36089fe7ad5167b48f702514056071fd8739faeaHeng Jiang#define COMPOSE_N(b,f,a) ( ( ((guchar) b) * ((guchar) (0xff - a)) + ((guchar) f) * ((guchar) a) ) / 0xff )
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangstatic void
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiangsp_ctrl_render (SPCanvasItem *item, SPCanvasBuf *buf)
44ea7e3effe9200ccc6abd3231ae56cf5cfb0fb8Heng Jiang{
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang gint y0, y1, y, x0,x1,x;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang guchar *p, *q, a;
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang
95242ab07e9aa13b37c16cac36a75d190e1766e4Heng Jiang SPCtrl *ctrl = SP_CTRL (item);
if (!ctrl->defined) return;
if ((!ctrl->filled) && (!ctrl->stroked)) return;
sp_canvas_prepare_buffer (buf);
// the control-image is rendered into ctrl->cache
if (!ctrl->build) {
sp_ctrl_build_cache (ctrl);
}
// then we render from ctrl->cache
y0 = MAX (ctrl->box.y0, buf->rect.y0);
y1 = MIN (ctrl->box.y1, buf->rect.y1 - 1);
x0 = MAX (ctrl->box.x0, buf->rect.x0);
x1 = MIN (ctrl->box.x1, buf->rect.x1 - 1);
bool colormode;
for (y = y0; y <= y1; y++) {
p = buf->buf + (y - buf->rect.y0) * buf->buf_rowstride + (x0 - buf->rect.x0) * 3;
q = ctrl->cache + ((y - ctrl->box.y0) * (ctrl->span*2+1) + (x0 - ctrl->box.x0)) * 4;
for (x = x0; x <= x1; x++) {
a = *(q + 3);
// 00000000 is the only way to get invisible; all other colors with alpha 00 are treated as mode_color with alpha ff
colormode = false;
if (a == 0x00 && !(q[0] == 0x00 && q[1] == 0x00 && q[2] == 0x00)) {
a = 0xff;
colormode = true;
}
if (ctrl->mode == SP_CTRL_MODE_COLOR || colormode) {
p[0] = COMPOSE_N (p[0], q[0], a);
p[1] = COMPOSE_N (p[1], q[1], a);
p[2] = COMPOSE_N (p[2], q[2], a);
q += 4;
p += 3;
} else if (ctrl->mode == SP_CTRL_MODE_XOR) {
p[0] = COMPOSE_X (p[0], q[0], a);
p[1] = COMPOSE_X (p[1], q[1], a);
p[2] = COMPOSE_X (p[2], q[2], a);
q += 4;
p += 3;
}
}
}
ctrl->shown = TRUE;
}
void SPCtrl::moveto (NR::Point const p) {
sp_canvas_item_affine_absolute (SP_CANVAS_ITEM (this), NR::Matrix(NR::translate (p)));
_moved = true;
}
/*
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:encoding=utf-8:textwidth=99 :