From 3a1ba90507a6b16b0ad54c190ad3f3b8d9f7d42b Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Mon, 23 Aug 2010 20:39:22 +0200 Subject: [PATCH] app: port GimpDisplayShell cursor drawing to cairo Also add code to invalidate the new cursor location in gimp_display_shell_update_cursor(), which is needed with the new manual double buffering code. --- app/display/gimpcanvas.c | 35 ---------------------- app/display/gimpcanvas.h | 3 -- app/display/gimpdisplayshell-callbacks.c | 4 ++- app/display/gimpdisplayshell-cursor.c | 20 +++++++++---- app/display/gimpdisplayshell-draw.c | 37 ++++++++++++++++++++++-- app/display/gimpdisplayshell-draw.h | 3 +- app/display/gimpdisplayshell-style.c | 12 ++++++++ app/display/gimpdisplayshell-style.h | 2 ++ 8 files changed, 68 insertions(+), 48 deletions(-) diff --git a/app/display/gimpcanvas.c b/app/display/gimpcanvas.c index 500395d782..d252dd0bff 100644 --- a/app/display/gimpcanvas.c +++ b/app/display/gimpcanvas.c @@ -533,41 +533,6 @@ gimp_canvas_new (GimpDisplayConfig *config) NULL); } -/** - * gimp_canvas_draw_cursor: - * @canvas: the #GimpCanvas widget to draw on. - * @x: x coordinate - * @y: y coordinate - * - * Draws a plus-shaped black and white cursor, centered at the point - * @x, @y. - **/ -void -gimp_canvas_draw_cursor (GimpCanvas *canvas, - gint x, - gint y) -{ - GtkWidget *widget = GTK_WIDGET (canvas); - GdkWindow *window = gtk_widget_get_window (widget); - - if (! (gimp_canvas_ensure_style (canvas, GIMP_CANVAS_STYLE_BLACK) && - gimp_canvas_ensure_style (canvas, GIMP_CANVAS_STYLE_WHITE)) ) - return; - - gdk_draw_line (window, canvas->gc[GIMP_CANVAS_STYLE_WHITE], - x - 7, y - 1, x + 7, y - 1); - gdk_draw_line (window, canvas->gc[GIMP_CANVAS_STYLE_BLACK], - x - 7, y, x + 7, y ); - gdk_draw_line (window, canvas->gc[GIMP_CANVAS_STYLE_WHITE], - x - 7, y + 1, x + 7, y + 1); - gdk_draw_line (window, canvas->gc[GIMP_CANVAS_STYLE_WHITE], - x - 1, y - 7, x - 1, y + 7); - gdk_draw_line (window, canvas->gc[GIMP_CANVAS_STYLE_BLACK], - x, y - 7, x, y + 7); - gdk_draw_line (window, canvas->gc[GIMP_CANVAS_STYLE_WHITE], - x + 1, y - 7, x + 1, y + 7); -} - /** * gimp_canvas_draw_point: * @canvas: a #GimpCanvas widget diff --git a/app/display/gimpcanvas.h b/app/display/gimpcanvas.h index 81a09c232d..e085706302 100644 --- a/app/display/gimpcanvas.h +++ b/app/display/gimpcanvas.h @@ -86,9 +86,6 @@ GType gimp_canvas_get_type (void) G_GNUC_CONST; GtkWidget * gimp_canvas_new (GimpDisplayConfig *config); -void gimp_canvas_draw_cursor (GimpCanvas *canvas, - gint x, - gint y); void gimp_canvas_draw_point (GimpCanvas *canvas, GimpCanvasStyle style, gint x, diff --git a/app/display/gimpdisplayshell-callbacks.c b/app/display/gimpdisplayshell-callbacks.c index db5e4b651a..49e5e75690 100644 --- a/app/display/gimpdisplayshell-callbacks.c +++ b/app/display/gimpdisplayshell-callbacks.c @@ -2307,7 +2307,9 @@ gimp_display_shell_canvas_expose_image (GimpDisplayShell *shell, cairo_restore (cr); /* and the cursor (if we have a software cursor) */ - gimp_display_shell_draw_cursor (shell); + cairo_save (cr); + gimp_display_shell_draw_cursor (shell, cr); + cairo_restore (cr); /* restart (and recalculate) the selection boundaries */ gimp_display_shell_selection_control (shell, GIMP_SELECTION_ON); diff --git a/app/display/gimpdisplayshell-cursor.c b/app/display/gimpdisplayshell-cursor.c index 29be4cd25a..6acc305233 100644 --- a/app/display/gimpdisplayshell-cursor.c +++ b/app/display/gimpdisplayshell-cursor.c @@ -141,22 +141,32 @@ gimp_display_shell_update_cursor (GimpDisplayShell *shell, /* Erase old cursor, if necessary */ +#define CURSOR_SIZE 14 + if (shell->have_cursor && (! new_cursor || display_x != shell->cursor_x || display_y != shell->cursor_y)) { gimp_display_shell_expose_area (shell, - shell->cursor_x - 7, - shell->cursor_y - 7, - 15, 15); - if (! new_cursor) - shell->have_cursor = FALSE; + shell->cursor_x - CURSOR_SIZE, + shell->cursor_y - CURSOR_SIZE, + 2 * CURSOR_SIZE + 1, + 2 * CURSOR_SIZE + 1); } shell->have_cursor = new_cursor; shell->cursor_x = display_x; shell->cursor_y = display_y; + if (shell->have_cursor) + { + gimp_display_shell_expose_area (shell, + shell->cursor_x - CURSOR_SIZE, + shell->cursor_y - CURSOR_SIZE, + 2 * CURSOR_SIZE + 1, + 2 * CURSOR_SIZE + 1); + } + /* use the passed image_coords for the statusbar because they are * possibly snapped... */ diff --git a/app/display/gimpdisplayshell-draw.c b/app/display/gimpdisplayshell-draw.c index a0bc9de524..180cff36ec 100644 --- a/app/display/gimpdisplayshell-draw.c +++ b/app/display/gimpdisplayshell-draw.c @@ -605,13 +605,44 @@ gimp_display_shell_draw_vectors (GimpDisplayShell *shell) } void -gimp_display_shell_draw_cursor (GimpDisplayShell *shell) +gimp_display_shell_draw_cursor (GimpDisplayShell *shell, + cairo_t *cr) { g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); + g_return_if_fail (cr != NULL); if (shell->have_cursor) - gimp_canvas_draw_cursor (GIMP_CANVAS (shell->canvas), - shell->cursor_x, shell->cursor_y); + { + gimp_display_shell_set_cursor_style (shell, cr); + +#define CURSOR_SIZE 14 + + cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); + + cairo_move_to (cr, shell->cursor_x - CURSOR_SIZE, shell->cursor_y - 1); + cairo_line_to (cr, shell->cursor_x + CURSOR_SIZE, shell->cursor_y - 1); + + cairo_move_to (cr, shell->cursor_x - CURSOR_SIZE, shell->cursor_y + 1); + cairo_line_to (cr, shell->cursor_x + CURSOR_SIZE, shell->cursor_y + 1); + + cairo_move_to (cr, shell->cursor_x - 1, shell->cursor_y - CURSOR_SIZE); + cairo_line_to (cr, shell->cursor_x - 1, shell->cursor_y + CURSOR_SIZE); + + cairo_move_to (cr, shell->cursor_x + 1, shell->cursor_y - CURSOR_SIZE); + cairo_line_to (cr, shell->cursor_x + 1, shell->cursor_y + CURSOR_SIZE); + + cairo_stroke (cr); + + cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); + + cairo_move_to (cr, shell->cursor_x - CURSOR_SIZE, shell->cursor_y); + cairo_line_to (cr, shell->cursor_x + CURSOR_SIZE, shell->cursor_y); + + cairo_move_to (cr, shell->cursor_x, shell->cursor_y - CURSOR_SIZE); + cairo_line_to (cr, shell->cursor_x, shell->cursor_y + CURSOR_SIZE); + + cairo_stroke (cr); + } } void diff --git a/app/display/gimpdisplayshell-draw.h b/app/display/gimpdisplayshell-draw.h index fe11b68960..88e5fdec38 100644 --- a/app/display/gimpdisplayshell-draw.h +++ b/app/display/gimpdisplayshell-draw.h @@ -50,7 +50,8 @@ void gimp_display_shell_draw_sample_points (GimpDisplayShell *shell, void gimp_display_shell_draw_vector (GimpDisplayShell *shell, GimpVectors *vectors); void gimp_display_shell_draw_vectors (GimpDisplayShell *shell); -void gimp_display_shell_draw_cursor (GimpDisplayShell *shell); +void gimp_display_shell_draw_cursor (GimpDisplayShell *shell, + cairo_t *cr); void gimp_display_shell_draw_area (GimpDisplayShell *shell, gint x, gint y, diff --git a/app/display/gimpdisplayshell-style.c b/app/display/gimpdisplayshell-style.c index 97e7eb6448..25bb49faea 100644 --- a/app/display/gimpdisplayshell-style.c +++ b/app/display/gimpdisplayshell-style.c @@ -136,6 +136,18 @@ gimp_display_shell_set_grid_style (GimpDisplayShell *shell, } } +void +gimp_display_shell_set_cursor_style (GimpDisplayShell *shell, + cairo_t *cr) +{ + g_return_if_fail (GIMP_IS_DISPLAY_SHELL (shell)); + g_return_if_fail (cr != NULL); + + cairo_set_line_width (cr, 1.0); + cairo_set_line_cap (cr, CAIRO_LINE_CAP_SQUARE); + cairo_translate (cr, 0.5, 0.5); +} + /* private functions */ diff --git a/app/display/gimpdisplayshell-style.h b/app/display/gimpdisplayshell-style.h index 55959e9925..83bc3c5f1a 100644 --- a/app/display/gimpdisplayshell-style.h +++ b/app/display/gimpdisplayshell-style.h @@ -31,6 +31,8 @@ void gimp_display_shell_set_sample_point_style (GimpDisplayShell *shell, void gimp_display_shell_set_grid_style (GimpDisplayShell *shell, cairo_t *cr, GimpGrid *grid); +void gimp_display_shell_set_cursor_style (GimpDisplayShell *shell, + cairo_t *cr); #endif /* __GIMP_DISPLAY_SHELL_STYLE_H__ */