summaryrefslogtreecommitdiffstats
path: root/src/display/guideline.cpp
diff options
context:
space:
mode:
authorKrzysztof Kosi??ski <tweenk.pl@gmail.com>2010-08-05 00:49:51 +0000
committerKrzysztof KosiƄski <tweenk.pl@gmail.com>2010-08-05 00:49:51 +0000
commit77dc5f1acd4a6b66b2d6fc5c81f7e5c61ef95785 (patch)
tree15c3b32afa8a124f69644c8bd279dd361680974e /src/display/guideline.cpp
parentWholesale cruft removal part 3 (diff)
downloadinkscape-77dc5f1acd4a6b66b2d6fc5c81f7e5c61ef95785.tar.gz
inkscape-77dc5f1acd4a6b66b2d6fc5c81f7e5c61ef95785.zip
Wholesale cruft removal part 4; fix crash when rendering guides
(bzr r9508.1.48)
Diffstat (limited to 'src/display/guideline.cpp')
-rw-r--r--src/display/guideline.cpp138
1 files changed, 21 insertions, 117 deletions
diff --git a/src/display/guideline.cpp b/src/display/guideline.cpp
index f1b85b556..9c68cd8af 100644
--- a/src/display/guideline.cpp
+++ b/src/display/guideline.cpp
@@ -15,13 +15,12 @@
* Released under GNU GPL, read the file 'COPYING' for more information
*/
-
-#include <libnr/nr-pixops.h>
#include <2geom/transforms.h>
#include "display-forward.h"
#include "sp-canvas-util.h"
#include "sp-ctrlpoint.h"
#include "guideline.h"
+#include "display/cairo-utils.h"
static void sp_guideline_class_init(SPGuideLineClass *c);
static void sp_guideline_init(SPGuideLine *guideline);
@@ -104,47 +103,20 @@ static void sp_guideline_render(SPCanvasItem *item, SPCanvasBuf *buf)
{
SPGuideLine const *gl = SP_GUIDELINE (item);
- sp_canvas_prepare_buffer(buf);
-
- unsigned int const r = NR_RGBA32_R (gl->rgba);
- unsigned int const g = NR_RGBA32_G (gl->rgba);
- unsigned int const b = NR_RGBA32_B (gl->rgba);
- unsigned int const a = NR_RGBA32_A (gl->rgba);
+ cairo_save(buf->ct);
+ cairo_translate(buf->ct, -buf->rect.x0, -buf->rect.y0);
+ ink_cairo_set_source_rgba32(buf->ct, gl->rgba);
if (gl->is_vertical()) {
int position = (int) Inkscape::round(gl->point_on_line[Geom::X]);
- if (position < buf->rect.x0 || position >= buf->rect.x1) {
- return;
- }
-
- int p0 = buf->rect.y0;
- int p1 = buf->rect.y1;
- int step = buf->buf_rowstride;
- unsigned char *d = buf->buf + 4 * (position - buf->rect.x0);
-
- for (int p = p0; p < p1; p++) {
- d[0] = NR_COMPOSEN11_1111(r, a, d[0]);
- d[1] = NR_COMPOSEN11_1111(g, a, d[1]);
- d[2] = NR_COMPOSEN11_1111(b, a, d[2]);
- d += step;
- }
+ cairo_move_to(buf->ct, position + 0.5, buf->rect.y0 + 0.5);
+ cairo_line_to(buf->ct, position + 0.5, buf->rect.y1 - 0.5);
+ cairo_stroke(buf->ct);
} else if (gl->is_horizontal()) {
int position = (int) Inkscape::round(gl->point_on_line[Geom::Y]);
- if (position < buf->rect.y0 || position >= buf->rect.y1) {
- return;
- }
-
- int p0 = buf->rect.x0;
- int p1 = buf->rect.x1;
- int step = 4;
- unsigned char *d = buf->buf + (position - buf->rect.y0) * buf->buf_rowstride;
-
- for (int p = p0; p < p1; p++) {
- d[0] = NR_COMPOSEN11_1111(r, a, d[0]);
- d[1] = NR_COMPOSEN11_1111(g, a, d[1]);
- d[2] = NR_COMPOSEN11_1111(b, a, d[2]);
- d += step;
- }
+ cairo_move_to(buf->ct, buf->rect.x0 + 0.5, position + 0.5);
+ cairo_line_to(buf->ct, buf->rect.x1 - 0.5, position + 0.5);
+ cairo_stroke(buf->ct);
} else {
// render angled line, once intersection has been detected, draw from there.
Geom::Point parallel_to_line( gl->normal_to_line[Geom::Y],
@@ -156,7 +128,7 @@ static void sp_guideline_render(SPCanvasItem *item, SPCanvasBuf *buf)
// intersects with left vertical!
double y_intersect_right = (buf->rect.x1 - gl->point_on_line[Geom::X]) * parallel_to_line[Geom::Y] / parallel_to_line[Geom::X] + gl->point_on_line[Geom::Y];
sp_guideline_drawline (buf, buf->rect.x0, static_cast<gint>(round(y_intersect_left)), buf->rect.x1, static_cast<gint>(round(y_intersect_right)), gl->rgba);
- return;
+ goto end;
}
//try to intersect with right vertical of rect
@@ -164,7 +136,7 @@ static void sp_guideline_render(SPCanvasItem *item, SPCanvasBuf *buf)
if ( (y_intersect_right >= buf->rect.y0) && (y_intersect_right <= buf->rect.y1) ) {
// intersects with right vertical!
sp_guideline_drawline (buf, buf->rect.x1, static_cast<gint>(round(y_intersect_right)), buf->rect.x0, static_cast<gint>(round(y_intersect_left)), gl->rgba);
- return;
+ goto end;
}
//try to intersect with top horizontal of rect
@@ -173,7 +145,7 @@ static void sp_guideline_render(SPCanvasItem *item, SPCanvasBuf *buf)
// intersects with top horizontal!
double x_intersect_bottom = (buf->rect.y1 - gl->point_on_line[Geom::Y]) * parallel_to_line[Geom::X] / parallel_to_line[Geom::Y] + gl->point_on_line[Geom::X];
sp_guideline_drawline (buf, static_cast<gint>(round(x_intersect_top)), buf->rect.y0, static_cast<gint>(round(x_intersect_bottom)), buf->rect.y1, gl->rgba);
- return;
+ goto end;
}
//try to intersect with bottom horizontal of rect
@@ -181,9 +153,11 @@ static void sp_guideline_render(SPCanvasItem *item, SPCanvasBuf *buf)
if ( (x_intersect_top >= buf->rect.x0) && (x_intersect_top <= buf->rect.x1) ) {
// intersects with bottom horizontal!
sp_guideline_drawline (buf, static_cast<gint>(round(x_intersect_bottom)), buf->rect.y1, static_cast<gint>(round(x_intersect_top)), buf->rect.y0, gl->rgba);
- return;
+ goto end;
}
}
+ end:
+ cairo_restore(buf->ct);
}
static void sp_guideline_update(SPCanvasItem *item, Geom::Matrix const &affine, unsigned int flags)
@@ -215,7 +189,7 @@ static double sp_guideline_point(SPCanvasItem *item, Geom::Point p, SPCanvasItem
SPGuideLine *gl = SP_GUIDELINE (item);
if (!gl->sensitive) {
- return NR_HUGE;
+ return Geom::infinity();
}
*actual_item = item;
@@ -277,82 +251,12 @@ void sp_guideline_delete(SPGuideLine *gl)
gtk_object_destroy(GTK_OBJECT(gl));
}
-//##########################################################
-// Line rendering
-#define SAFE_SETPIXEL //undefine this when it is certain that setpixel is never called with invalid params
-
-/**
- \brief This function renders a pixel on a particular buffer.
-
- The topleft of the buffer equals
- ( rect.x0 , rect.y0 ) in screen coordinates
- ( 0 , 0 ) in setpixel coordinates
- The bottomright of the buffer equals
- ( rect.x1 , rect,y1 ) in screen coordinates
- ( rect.x1 - rect.x0 , rect.y1 - rect.y0 ) in setpixel coordinates
-*/
static void
-sp_guideline_setpixel (SPCanvasBuf *buf, gint x, gint y, guint32 rgba)
+sp_guideline_drawline (SPCanvasBuf *buf, gint x0, gint y0, gint x1, gint y1, guint32 /*rgba*/)
{
-#ifdef SAFE_SETPIXEL
- if ( (x >= buf->rect.x0) && (x < buf->rect.x1) && (y >= buf->rect.y0) && (y < buf->rect.y1) ) {
-#endif
- guint r, g, b, a;
- r = NR_RGBA32_R (rgba);
- g = NR_RGBA32_G (rgba);
- b = NR_RGBA32_B (rgba);
- a = NR_RGBA32_A (rgba);
- guchar * p = buf->buf + (y - buf->rect.y0) * buf->buf_rowstride + (x - buf->rect.x0) * 4;
- p[0] = NR_COMPOSEN11_1111 (r, a, p[0]);
- p[1] = NR_COMPOSEN11_1111 (g, a, p[1]);
- p[2] = NR_COMPOSEN11_1111 (b, a, p[2]);
-#ifdef SAFE_SETPIXEL
- }
-#endif
-}
-
-/**
- \brief This function renders a line on a particular canvas buffer,
- using Bresenham's line drawing function.
- http://www.cs.unc.edu/~mcmillan/comp136/Lecture6/Lines.html
- Coordinates are interpreted as SCREENcoordinates
-*/
-static void
-sp_guideline_drawline (SPCanvasBuf *buf, gint x0, gint y0, gint x1, gint y1, guint32 rgba)
-{
- int dy = y1 - y0;
- int dx = x1 - x0;
- int stepx, stepy;
-
- if (dy < 0) { dy = -dy; stepy = -1; } else { stepy = 1; }
- if (dx < 0) { dx = -dx; stepx = -1; } else { stepx = 1; }
- dy <<= 1; // dy is now 2*dy
- dx <<= 1; // dx is now 2*dx
-
- sp_guideline_setpixel(buf, x0, y0, rgba);
- if (dx > dy) {
- int fraction = dy - (dx >> 1); // same as 2*dy - dx
- while (x0 != x1) {
- if (fraction >= 0) {
- y0 += stepy;
- fraction -= dx; // same as fraction -= 2*dx
- }
- x0 += stepx;
- fraction += dy; // same as fraction -= 2*dy
- sp_guideline_setpixel(buf, x0, y0, rgba);
- }
- } else {
- int fraction = dx - (dy >> 1);
- while (y0 != y1) {
- if (fraction >= 0) {
- x0 += stepx;
- fraction -= dy;
- }
- y0 += stepy;
- fraction += dx;
- sp_guideline_setpixel(buf, x0, y0, rgba);
- }
- }
+ cairo_move_to(buf->ct, x0 + 0.5, y0 + 0.5);
+ cairo_line_to(buf->ct, x1 - 0.5, y1 - 0.5);
+ cairo_stroke(buf->ct);
}
/*