sodipodi-ctrlrect.cpp revision 6b76ef6bb3e9b4e1cc83e01cd81a55bbd0450989
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#define __INKSCAPE_CTRLRECT_C__
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz/*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Simple non-transformed rectangle, usable for rubberband
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm *
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Author:
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Lauris Kaplinski <lauris@ximian.com>
f4a94b19c3c5d7d1e7bd926de1eb7e6c077babb2johanengelen * bulia byak <buliabyak@users.sf.net>
f4a94b19c3c5d7d1e7bd926de1eb7e6c077babb2johanengelen * Carl Hetherington <inkscape@carlh.net>
f4a94b19c3c5d7d1e7bd926de1eb7e6c077babb2johanengelen *
f4a94b19c3c5d7d1e7bd926de1eb7e6c077babb2johanengelen * Copyright (C) 1999-2001 Lauris Kaplinski
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Copyright (C) 2000-2001 Ximian, Inc.
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen *
5c45bb188ab729e501e48732842cb9de6a9813beAlex Valavanis * Released under GNU GPL
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen *
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud */
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud#include "display-forward.h"
06cd6b0ab2dbe286184e35d1078bab18c966b0d2jfbarraud#include "sp-canvas-util.h"
081a89987d4cb46e707c9dd5648a7a24a01a750djfbarraud#include "sodipodi-ctrlrect.h"
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm#include "libnr/nr-pixops.h"
136203b42d18389e16f7e30427dd6424e555149dJabiertxo Arraiza Cenoz
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm/*
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm * Currently we do not have point method, as it should always be painted
8d9f5d586a04809427ce1df284a5720112177991cilix * during some transformation, which takes care of events...
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix *
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak * Corner coords can be in any order - i.e. x1 < x0 is allowed
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen */
09d98e945b8105f64767a305e727300b9aaddd4aJabiertxof
80db4eb7f4fe34ba6f42344c71338dc8a98302bbJabiertxofstatic void sp_ctrlrect_class_init(SPCtrlRectClass *c);
0cc5b8d2f7b87c4222ee3662071bef1cb1f22b06bgkstatic void sp_ctrlrect_init(CtrlRect *ctrlrect);
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelenstatic void sp_ctrlrect_destroy(GtkObject *object);
f4db63be4e929f4706410914295deccaceea19cdcilix
ab99111a42436818e6902e044c8f3af2b724263bcilixstatic void sp_ctrlrect_update(SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags);
76db360f5f052775326e6d406b9e1e9e2966e11acilixstatic void sp_ctrlrect_render(SPCanvasItem *item, SPCanvasBuf *buf);
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilix
64aee804a6a47424f7994e60558351b8cf2ea4dbcilixstatic SPCanvasItemClass *parent_class;
b320a8d186114a5122ddc3afbe95110eb6cb10cecilix
044d712d4d03f8354962d54e47cfac2346a69ccccilixstatic const guint DASH_LENGTH = 4;
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix
2f5c0701b333a695eedb1680beb1adf95c0723dacilixGType sp_ctrlrect_get_type()
add2ffae3c4686b50d888775bbdf083a4726a210johanengelen{
0a75b58e47d3de42550c4f7960e253ea3befc09ajohanengelen static GType type = 0;
4afe3fc6b9c122bc5c02b27aea3845ba41384d2acilix
ecf048161ae0284d01d34ca5844204775c0d3fdecilix if (!type) {
3515994554d167522343ce57417648b39370ccabcilix GTypeInfo info = {
afa1e71af5a64b54df797ac1f0bcf32c6613b371johanengelen sizeof(SPCtrlRectClass),
b62895f15526ccefdf1e274c49c02aa043895ee9johanengelen 0, // base_init
4fe8248cd521387d0829c423bf4492e2cbdfd7cdJohan Engelen 0, // base_finalize
05e1ec4d6f1ccc3a0db3cc13e8a3b18489714f14Johan Engelen (GClassInitFunc)sp_ctrlrect_class_init,
5ca48c4a31a249352a2685fbc2a576f1e0d041a0Jabiertxof 0, // class_finalize
081a89987d4cb46e707c9dd5648a7a24a01a750djfbarraud 0, // class_data
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis sizeof(CtrlRect),
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis 0, // n_preallocs
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis (GInstanceInitFunc)sp_ctrlrect_init,
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis 0 // value_table
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis };
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis type = g_type_register_static(SP_TYPE_CANVAS_ITEM, "SPCtrlRect", &info, static_cast<GTypeFlags>(0));
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis }
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis return type;
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis}
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis
d1561c248f49dc3508ae9e6557fc0d371928e394Markus Engelstatic void sp_ctrlrect_class_init(SPCtrlRectClass *c)
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis{
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis GtkObjectClass *object_class = (GtkObjectClass *) c;
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis SPCanvasItemClass *item_class = (SPCanvasItemClass *) c;
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis parent_class = (SPCanvasItemClass*) gtk_type_class(sp_canvas_item_get_type());
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis object_class->destroy = sp_ctrlrect_destroy;
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis item_class->update = sp_ctrlrect_update;
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis item_class->render = sp_ctrlrect_render;
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis}
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanisstatic void sp_ctrlrect_init(CtrlRect *cr)
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis{
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis cr->init();
1b3a8414f17dc95fc921d999ea715c99d10dd4aaAlex Valavanis}
1c88ed492df4a0bcb37006a6cc36127897cd847ejfbarraud
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmstatic void sp_ctrlrect_destroy(GtkObject *object)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (GTK_OBJECT_CLASS(parent_class)->destroy) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm (* GTK_OBJECT_CLASS(parent_class)->destroy)(object);
72b7b31db250f20b90730d2888e6a554b434a407johanengelen }
06cd6b0ab2dbe286184e35d1078bab18c966b0d2jfbarraud}
790674255fb54e588b4b6d73ee9e15050b45d1a4johanengelen
790674255fb54e588b4b6d73ee9e15050b45d1a4johanengelen/* FIXME: use definitions from somewhere else */
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen#define RGBA_R(v) ((v) >> 24)
2b2321eb83f7bd0173589734d6f40b4fe90961f9helix#define RGBA_G(v) (((v) >> 16) & 0xff)
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen#define RGBA_B(v) (((v) >> 8) & 0xff)
f555c315692d0a6b221636e8a7004fe9eda0b2cbcilix#define RGBA_A(v) ((v) & 0xff)
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelenstatic void sp_ctrlrect_hline(SPCanvasBuf *buf, gint y, gint xs, gint xe, guint32 rgba, guint dashed)
b62895f15526ccefdf1e274c49c02aa043895ee9johanengelen{
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen if (y >= buf->rect.y0 && y < buf->rect.y1) {
3515994554d167522343ce57417648b39370ccabcilix guint const r = RGBA_R(rgba);
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen guint const g = RGBA_G(rgba);
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen guint const b = RGBA_B(rgba);
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen guint const a = RGBA_A(rgba);
ecf048161ae0284d01d34ca5844204775c0d3fdecilix gint const x0 = MAX(buf->rect.x0, xs);
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen gint const x1 = MIN(buf->rect.x1, xe + 1);
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen guchar *p = buf->buf + (y - buf->rect.y0) * buf->buf_rowstride + (x0 - buf->rect.x0) * 4;
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen for (gint x = x0; x < x1; x++) {
afa1e71af5a64b54df797ac1f0bcf32c6613b371johanengelen if (!dashed || ((x / DASH_LENGTH) % 2)) {
9de5f3bfa8e35ad5e6adcd6eaad4d0d49e7043a3johanengelen p[0] = INK_COMPOSE(r, a, p[0]);
4afe3fc6b9c122bc5c02b27aea3845ba41384d2acilix p[1] = INK_COMPOSE(g, a, p[1]);
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen p[2] = INK_COMPOSE(b, a, p[2]);
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen }
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen p += 4;
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen }
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen }
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen}
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen
032f369baeef7d4a3b8769997df5dcd6dd874830jfbarraudstatic void sp_ctrlrect_vline(SPCanvasBuf *buf, gint x, gint ys, gint ye, guint32 rgba, guint dashed)
3533ac02ef26a49e50514b619886467fd53c28fbjohanengelen{
4d2f452da50c83a3bced2bab8cb9e2b287c6efd1johanengelen if (x >= buf->rect.x0 && x < buf->rect.x1) {
3533ac02ef26a49e50514b619886467fd53c28fbjohanengelen guint const r = RGBA_R(rgba);
4daaa4a6cb870ab0b4f6fbd66943a7535535f1adjohanengelen guint const g = RGBA_G(rgba);
1ba2d157b7006f2f1a6043bc29e9c66be6386373johanengelen guint const b = RGBA_B(rgba);
0c4410dc5d53461e85445298c1f5d08d2d823c98jfbarraud guint const a = RGBA_A(rgba);
3cb0f0262354a11d123e45ad10b027bebf957e46jfbarraud gint const y0 = MAX(buf->rect.y0, ys);
822f89451bdca5665d48668154c774a45ec30c85jfbarraud gint const y1 = MIN(buf->rect.y1, ye + 1);
a2887d4a3493b24349a0f1390ed069ca1d2b1d61JazzyNico guchar *p = buf->buf + (y0 - buf->rect.y0) * buf->buf_rowstride + (x - buf->rect.x0) * 4;
a2887d4a3493b24349a0f1390ed069ca1d2b1d61JazzyNico for (gint y = y0; y < y1; y++) {
a2887d4a3493b24349a0f1390ed069ca1d2b1d61JazzyNico if (!dashed || ((y / DASH_LENGTH) % 2)) {
136203b42d18389e16f7e30427dd6424e555149dJabiertxo Arraiza Cenoz p[0] = INK_COMPOSE(r, a, p[0]);
80db4eb7f4fe34ba6f42344c71338dc8a98302bbJabiertxof p[1] = INK_COMPOSE(g, a, p[1]);
09d98e945b8105f64767a305e727300b9aaddd4aJabiertxof p[2] = INK_COMPOSE(b, a, p[2]);
5ca48c4a31a249352a2685fbc2a576f1e0d041a0Jabiertxof }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm p += buf->buf_rowstride;
72b7b31db250f20b90730d2888e6a554b434a407johanengelen }
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm }
a45e91fd09273632e9acf849bb72621832156f07cilix}
494c671e141564431d7d05f141c885d9a2789db5cilix
a45e91fd09273632e9acf849bb72621832156f07cilix/** Fills the pixels in [xs, xe)*[ys,ye) clipped to the tile with rgb * a. */
eac94793745a61429b52a4b489e148737d091749cilixstatic void sp_ctrlrect_area(SPCanvasBuf *buf, gint xs, gint ys, gint xe, gint ye, guint32 rgba)
a45e91fd09273632e9acf849bb72621832156f07cilix{
a45e91fd09273632e9acf849bb72621832156f07cilix guint const r = RGBA_R(rgba);
a45e91fd09273632e9acf849bb72621832156f07cilix guint const g = RGBA_G(rgba);
8791d7447034c34fdedc50f261bf5c89c34e59f5cilix guint const b = RGBA_B(rgba);
8791d7447034c34fdedc50f261bf5c89c34e59f5cilix guint const a = RGBA_A(rgba);
a45e91fd09273632e9acf849bb72621832156f07cilix gint const x0 = MAX(buf->rect.x0, xs);
a45e91fd09273632e9acf849bb72621832156f07cilix gint const x1 = MIN(buf->rect.x1, xe + 1);
a45e91fd09273632e9acf849bb72621832156f07cilix gint const y0 = MAX(buf->rect.y0, ys);
a45e91fd09273632e9acf849bb72621832156f07cilix gint const y1 = MIN(buf->rect.y1, ye + 1);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm for (gint y = y0; y < y1; y++) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm guchar *p = buf->buf + (y - buf->rect.y0) * buf->buf_rowstride + (x0 - buf->rect.x0) * 4;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm for (gint x = x0; x < x1; x++) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm p[0] = INK_COMPOSE(r, a, p[0]);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm p[1] = INK_COMPOSE(g, a, p[1]);
8c39cbeab9949a0a7d6ae66b768a7352019e42f8johanengelen p[2] = INK_COMPOSE(b, a, p[2]);
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen p += 4;
29f9623ba77fc735b89765ae3a13e0c06aabafcecilix }
072916d0ef7dccd696b59381f50bcf776abccefbjohanengelen }
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen}
42e99769805c14a5cc01c805faa3c3b03f9dd1c0johanengelen
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraudstatic void sp_ctrlrect_render(SPCanvasItem *item, SPCanvasBuf *buf)
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen{
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud SP_CTRLRECT(item)->render(buf);
06cd6b0ab2dbe286184e35d1078bab18c966b0d2jfbarraud}
06cd6b0ab2dbe286184e35d1078bab18c966b0d2jfbarraud
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraudstatic void sp_ctrlrect_update(SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen{
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud SP_CTRLRECT(item)->update(affine, flags);
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud}
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen
dc98accfae7a38326b92d74fa4330ac8ccb5b778jfbarraud
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
92fe3142613d000eff89db8a983b3b18b14eee79johanengelenvoid CtrlRect::init()
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm _has_fill = false;
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen _dashed = false;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm _shadow = 0;
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen _area.x0 = _area.y0 = 0;
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen _area.x1 = _area.y1 = 0;
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen _rect = Geom::Rect(Geom::Point(0,0),Geom::Point(0,0));
0563fd55cbad59e8a878e6d4cbbdd8e47f74488djohanengelen
8d9f5d586a04809427ce1df284a5720112177991cilix _shadow_size = 0;
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen
8d9f5d586a04809427ce1df284a5720112177991cilix _border_color = 0x000000ff;
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix _fill_color = 0xffffffff;
92fe3142613d000eff89db8a983b3b18b14eee79johanengelen _shadow_color = 0x000000ff;
70eb1fc448cb08acf3468f80fa2296c03b32afd2cilix}
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyak
c169f6cddd2da06cfb761339f445bbd8866f72a8buliabyakvoid CtrlRect::render(SPCanvasBuf *buf)
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen{
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen if ((_area.x0 != 0 || _area.x1 != 0 || _area.y0 != 0 || _area.y1 != 0) &&
6f4a90e526af850ffc36064f58f09c190f3b633fjohanengelen (_area.x0 < buf->rect.x1) &&
f4db63be4e929f4706410914295deccaceea19cdcilix (_area.y0 < buf->rect.y1) &&
f4db63be4e929f4706410914295deccaceea19cdcilix ((_area.x1 + _shadow_size) >= buf->rect.x0) &&
f4db63be4e929f4706410914295deccaceea19cdcilix ((_area.y1 + _shadow_size) >= buf->rect.y0)) {
ab99111a42436818e6902e044c8f3af2b724263bcilix sp_canvas_prepare_buffer(buf);
ab99111a42436818e6902e044c8f3af2b724263bcilix
ab99111a42436818e6902e044c8f3af2b724263bcilix /* Top */
76db360f5f052775326e6d406b9e1e9e2966e11acilix sp_ctrlrect_hline(buf, _area.y0, _area.x0, _area.x1, _border_color, _dashed);
76db360f5f052775326e6d406b9e1e9e2966e11acilix /* Bottom */
b0c42c0dfcd02cc05126371948489a5a88b2e4b3cilix sp_ctrlrect_hline(buf, _area.y1, _area.x0, _area.x1, _border_color, _dashed);
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilix /* Left */
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilix sp_ctrlrect_vline(buf, _area.x0, _area.y0 + 1, _area.y1 - 1, _border_color, _dashed);
3d0482af18ffb591c1d8ddecf516629e1bcd2ae4cilix /* Right */
64aee804a6a47424f7994e60558351b8cf2ea4dbcilix sp_ctrlrect_vline(buf, _area.x1, _area.y0 + 1, _area.y1 - 1, _border_color, _dashed);
64aee804a6a47424f7994e60558351b8cf2ea4dbcilix if (_shadow_size > 0) {
64aee804a6a47424f7994e60558351b8cf2ea4dbcilix /* Right shadow */
b320a8d186114a5122ddc3afbe95110eb6cb10cecilix sp_ctrlrect_area(buf, _area.x1 + 1, _area.y0 + _shadow_size,
b320a8d186114a5122ddc3afbe95110eb6cb10cecilix _area.x1 + _shadow_size, _area.y1 + _shadow_size, _shadow_color);
b320a8d186114a5122ddc3afbe95110eb6cb10cecilix /* Bottom shadow */
044d712d4d03f8354962d54e47cfac2346a69ccccilix sp_ctrlrect_area(buf, _area.x0 + _shadow_size, _area.y1 + 1,
044d712d4d03f8354962d54e47cfac2346a69ccccilix _area.x1, _area.y1 + _shadow_size, _shadow_color);
044d712d4d03f8354962d54e47cfac2346a69ccccilix }
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix if (_has_fill) {
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix /* Fill */
61cfd957cd023c4f432ea0c7307784a56bf978e9cilix sp_ctrlrect_area(buf, _area.x0 + 1, _area.y0 + 1,
2f5c0701b333a695eedb1680beb1adf95c0723dacilix _area.x1 - 1, _area.y1 - 1, _fill_color);
2f5c0701b333a695eedb1680beb1adf95c0723dacilix }
2f5c0701b333a695eedb1680beb1adf95c0723dacilix }
add2ffae3c4686b50d888775bbdf083a4726a210johanengelen}
add2ffae3c4686b50d888775bbdf083a4726a210johanengelen
add2ffae3c4686b50d888775bbdf083a4726a210johanengelen
0a75b58e47d3de42550c4f7960e253ea3befc09ajohanengelenvoid CtrlRect::update(Geom::Matrix const &affine, unsigned int flags)
0a75b58e47d3de42550c4f7960e253ea3befc09ajohanengelen{
0a75b58e47d3de42550c4f7960e253ea3befc09ajohanengelen if (((SPCanvasItemClass *) parent_class)->update) {
4afe3fc6b9c122bc5c02b27aea3845ba41384d2acilix ((SPCanvasItemClass *) parent_class)->update(this, affine, flags);
4afe3fc6b9c122bc5c02b27aea3845ba41384d2acilix }
4afe3fc6b9c122bc5c02b27aea3845ba41384d2acilix
ecf048161ae0284d01d34ca5844204775c0d3fdecilix sp_canvas_item_reset_bounds(this);
ecf048161ae0284d01d34ca5844204775c0d3fdecilix
ecf048161ae0284d01d34ca5844204775c0d3fdecilix if (_area.x0 != 0 || _area.x1 != 0 || _area.y0 != 0 || _area.y1 != 0) {
3515994554d167522343ce57417648b39370ccabcilix /* Request redraw old */
3515994554d167522343ce57417648b39370ccabcilix if (!_has_fill) {
3515994554d167522343ce57417648b39370ccabcilix /* Top */
790674255fb54e588b4b6d73ee9e15050b45d1a4johanengelen sp_canvas_request_redraw(canvas,
790674255fb54e588b4b6d73ee9e15050b45d1a4johanengelen _area.x0 - 1, _area.y0 - 1,
790674255fb54e588b4b6d73ee9e15050b45d1a4johanengelen _area.x1 + 1, _area.y0 + 1);
136203b42d18389e16f7e30427dd6424e555149dJabiertxo Arraiza Cenoz /* Left */
136203b42d18389e16f7e30427dd6424e555149dJabiertxo Arraiza Cenoz sp_canvas_request_redraw(canvas,
136203b42d18389e16f7e30427dd6424e555149dJabiertxo Arraiza Cenoz _area.x0 - 1, _area.y0 - 1,
081a89987d4cb46e707c9dd5648a7a24a01a750djfbarraud _area.x0 + 1, _area.y1 + 1);
081a89987d4cb46e707c9dd5648a7a24a01a750djfbarraud /* Right */
081a89987d4cb46e707c9dd5648a7a24a01a750djfbarraud sp_canvas_request_redraw(canvas,
afa1e71af5a64b54df797ac1f0bcf32c6613b371johanengelen _area.x1 - 1, _area.y0 - 1,
afa1e71af5a64b54df797ac1f0bcf32c6613b371johanengelen _area.x1 + _shadow_size + 1, _area.y1 + _shadow_size + 1);
afa1e71af5a64b54df797ac1f0bcf32c6613b371johanengelen /* Bottom */
b62895f15526ccefdf1e274c49c02aa043895ee9johanengelen sp_canvas_request_redraw(canvas,
b62895f15526ccefdf1e274c49c02aa043895ee9johanengelen _area.x0 - 1, _area.y1 - 1,
b62895f15526ccefdf1e274c49c02aa043895ee9johanengelen _area.x1 + _shadow_size + 1, _area.y1 + _shadow_size + 1);
4fe8248cd521387d0829c423bf4492e2cbdfd7cdJohan Engelen } else {
4fe8248cd521387d0829c423bf4492e2cbdfd7cdJohan Engelen sp_canvas_request_redraw(canvas,
4fe8248cd521387d0829c423bf4492e2cbdfd7cdJohan Engelen _area.x0 - 1, _area.y0 - 1,
05e1ec4d6f1ccc3a0db3cc13e8a3b18489714f14Johan Engelen _area.x1 + _shadow_size + 1, _area.y1 + _shadow_size + 1);
05e1ec4d6f1ccc3a0db3cc13e8a3b18489714f14Johan Engelen }
05e1ec4d6f1ccc3a0db3cc13e8a3b18489714f14Johan Engelen }
80db4eb7f4fe34ba6f42344c71338dc8a98302bbJabiertxof
80db4eb7f4fe34ba6f42344c71338dc8a98302bbJabiertxof Geom::Rect bbox(_rect.min() * affine, _rect.max() * affine);
80db4eb7f4fe34ba6f42344c71338dc8a98302bbJabiertxof
09d98e945b8105f64767a305e727300b9aaddd4aJabiertxof _area.x0 = (int) floor(bbox.min()[Geom::X] + 0.5);
09d98e945b8105f64767a305e727300b9aaddd4aJabiertxof _area.y0 = (int) floor(bbox.min()[Geom::Y] + 0.5);
09d98e945b8105f64767a305e727300b9aaddd4aJabiertxof _area.x1 = (int) floor(bbox.max()[Geom::X] + 0.5);
5ca48c4a31a249352a2685fbc2a576f1e0d041a0Jabiertxof _area.y1 = (int) floor(bbox.max()[Geom::Y] + 0.5);
5ca48c4a31a249352a2685fbc2a576f1e0d041a0Jabiertxof
5ca48c4a31a249352a2685fbc2a576f1e0d041a0Jabiertxof _shadow_size = _shadow;
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof if (_area.x0 != 0 || _area.x1 != 0 || _area.y0 != 0 || _area.y1 != 0) {
19715d9462f14c8543082f8df232e3c99a8453caJabiertxof /* Request redraw new */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm if (!_has_fill) {
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm /* Top */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm sp_canvas_request_redraw(canvas,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm _area.x0 - 1, _area.y0 - 1,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm _area.x1 + 1, _area.y0 + 1);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm /* Left */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm sp_canvas_request_redraw(canvas,
f68aabe351946119c80978525cd86564dd33e02fJon A. Cruz _area.x0 - 1, _area.y0 - 1,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm _area.x0 + 1, _area.y1 + 1);
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm /* Right */
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm sp_canvas_request_redraw(canvas,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm _area.x1 - 1, _area.y0 - 1,
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm _area.x1 + _shadow_size + 1, _area.y1 + _shadow_size + 1);
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz /* Bottom */
6656f193fdace606d1b162d6dea0223bc295f0a6cilix sp_canvas_request_redraw(canvas,
6656f193fdace606d1b162d6dea0223bc295f0a6cilix _area.x0 - 1, _area.y1 - 1,
9dc68827cbd515262ecb8d5ae8547d9e82c72e00Jon A. Cruz _area.x1 + _shadow_size + 1, _area.y1 + _shadow_size + 1);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix } else {
6656f193fdace606d1b162d6dea0223bc295f0a6cilix sp_canvas_request_redraw(canvas,
6656f193fdace606d1b162d6dea0223bc295f0a6cilix _area.x0 - 1, _area.y0 - 1,
07b7f1aaaf1087716e784a50cf574a059f7018d3Jon A. Cruz _area.x1 + _shadow_size + 1, _area.y1 + _shadow_size + 1);
6656f193fdace606d1b162d6dea0223bc295f0a6cilix }
6656f193fdace606d1b162d6dea0223bc295f0a6cilix
6656f193fdace606d1b162d6dea0223bc295f0a6cilix x1 = _area.x0 - 1;
6656f193fdace606d1b162d6dea0223bc295f0a6cilix y1 = _area.y0 - 1;
f4ce66b44581cea80a736cf20244c0539a7525daJohan B. C. Engelen x2 = _area.x1 + _shadow_size + 1;
6656f193fdace606d1b162d6dea0223bc295f0a6cilix y2 = _area.y1 + _shadow_size + 1;
6656f193fdace606d1b162d6dea0223bc295f0a6cilix }
6656f193fdace606d1b162d6dea0223bc295f0a6cilix}
6656f193fdace606d1b162d6dea0223bc295f0a6cilix
09ba3247163582bf2e30e17c4c154aa259ce038acilix
6656f193fdace606d1b162d6dea0223bc295f0a6cilixvoid CtrlRect::setColor(guint32 b, bool h, guint f)
6656f193fdace606d1b162d6dea0223bc295f0a6cilix{
6656f193fdace606d1b162d6dea0223bc295f0a6cilix _border_color = b;
6656f193fdace606d1b162d6dea0223bc295f0a6cilix _has_fill = h;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm _fill_color = f;
3cfad782faf34c654ec837780ed7b3fe95e82c2eJohan B. C. Engelen _requestUpdate();
3cfad782faf34c654ec837780ed7b3fe95e82c2eJohan B. C. Engelen}
71146abe8aba032d73788a625fee5769a581bd3ccilix
04c99c338ffdc6e10cb6f5c18f6f06b3f555e8ebcilixvoid CtrlRect::setShadow(int s, guint c)
fbb4eb8b63e74d9441220a73a8ca858425be4bd4johanengelen{
9ce14357bb94b9dd92ad40bf43ef435a257b355acilix _shadow = s;
c27006137a3ad49e074b97b3297db753e1ac8eefcilix _shadow_color = c;
c27006137a3ad49e074b97b3297db753e1ac8eefcilix _requestUpdate();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
71146abe8aba032d73788a625fee5769a581bd3ccilix
96ef6190a69e8101a3c3a8ef8b01cb35042d1f9dcilixvoid CtrlRect::setRectangle(Geom::Rect const &r)
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm _rect = r;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm _requestUpdate();
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid CtrlRect::setDashed(bool d)
eaa9bdc7bf7b73397e536edd47490d84e4420bd8bryce{
0b2d8abc1011ad865fce3b883ccb2587cb15cc90Johan B. C. Engelen _dashed = d;
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm _requestUpdate();
72b7b31db250f20b90730d2888e6a554b434a407johanengelen}
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrmvoid CtrlRect::_requestUpdate()
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm{
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm sp_canvas_item_request_update(SP_CANVAS_ITEM(this));
f07bfd5a05d43a6d11f7cd442f085149092dea88pjrm}
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix
507f5de177a9e789927e7ac3e80ac05b27720084Johan B. C. Engelen/*
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix Local Variables:
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix mode:c++
c90010388b0d4045c26e81c2be28beedcb36c7d3cilix c-file-style:"stroustrup"
77a4a003111bd5cfb771d4849801c898aeb889b0cilix c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
77a4a003111bd5cfb771d4849801c898aeb889b0cilix indent-tabs-mode:nil
77a4a003111bd5cfb771d4849801c898aeb889b0cilix fill-column:99
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilix End:
a39c187369a59e887255e3f704a3ababf2b10678Johan B. C. Engelen*/
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilix// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :
262d0c3f05130d86368d95f110aa8ccab5f83e5ccilix