From aa581a49058b37814305c2766b83dcf907add157 Mon Sep 17 00:00:00 2001 From: Keith Packard Date: Fri, 13 Mar 2020 22:09:46 -0700 Subject: [PATCH] Update to 2020 Use librsvg instead of libsvg. Use gdk_cairo_create instead of open-coding context creation. Switch from CAIRO_FORMAT_ARGB32 to CAIRO_CONTENT_COLOR_ALPHA. Surprisingly few changes required to bring this code forward seventeen years... Signed-off-by: Keith Packard --- configure.in | 2 +- src/Makefile.am | 2 +- src/grr_board_view.c | 17 ++++------------- src/grr_icon.c | 43 ++++++++++++++++++------------------------- src/grr_icon.h | 8 ++++---- 5 files changed, 28 insertions(+), 44 deletions(-) diff --git a/configure.in b/configure.in index 0761830..5c93e28 100644 --- a/configure.in +++ b/configure.in @@ -18,7 +18,7 @@ AC_STDC_HEADERS dnl =========================================================================== -PKG_CHECK_MODULES(GRROBOT, gtk+-2.0 libsvg-cairo librr cairo >= 0.1.1) +PKG_CHECK_MODULES(GRROBOT, gtk+-2.0 librsvg-2.0 librr cairo >= 0.1.1) AC_SUBST(GRROBOT_CFLAGS) AC_SUBST(GRROBOT_LIBS) diff --git a/src/Makefile.am b/src/Makefile.am index 93f7677..1a4a29d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -14,4 +14,4 @@ grrobot_SOURCES = \ grr_util.h INCLUDES = $(GRROBOT_CFLAGS) -DGRR_ICON_DIR=\"$(pkgdatadir)\" -LDFLAGS = $(GRROBOT_LIBS) +LIBS = $(GRROBOT_LIBS) diff --git a/src/grr_board_view.c b/src/grr_board_view.c index fc46a21..ca1d0e1 100644 --- a/src/grr_board_view.c +++ b/src/grr_board_view.c @@ -1,6 +1,6 @@ /* grr_board_view - GTK+ widget for displaying an rr_board * - * Copyright © 2003 Carl Worth + * Copyright © 2003 Carl Worth * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without @@ -31,7 +31,8 @@ #include #include -#include +#include +#include #include #include @@ -354,17 +355,7 @@ grr_board_view_expose (GtkWidget *widget, view = GRR_BOARD_VIEW (widget); board = view->board; - /* Unabstract X from GTK+ */ - gdk_window_get_internal_paint_info (widget->window, &real_drawable, &x_off, &y_off); - dpy = gdk_x11_drawable_get_xdisplay (real_drawable); - drawable = gdk_x11_drawable_get_xid (real_drawable); - - /* Ignore GTK+ and use Cairo for drawing. */ - visual = GDK_VISUAL_XVISUAL (gdk_drawable_get_visual (real_drawable)); - surface = cairo_xlib_surface_create (dpy, drawable, visual, - widget->allocation.width, - widget->allocation.height); - xrs = cairo_create (surface); + xrs = gdk_cairo_create (widget->window); new_cell_width = widget->allocation.width / view->board_width; if (new_cell_width == 0) diff --git a/src/grr_icon.c b/src/grr_icon.c index fa76331..c273bd7 100644 --- a/src/grr_icon.c +++ b/src/grr_icon.c @@ -1,6 +1,6 @@ /* grrobot - Ricochet Robot using GTK+ and Xr * - * Copyright © 2003 Carl Worth + * Copyright © 2003 Carl Worth * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without @@ -127,35 +127,28 @@ grr_icon_create (char *name) static rr_status_t _grr_icon_init (grr_icon_t *icon, char *name) { - svg_cairo_status_t status; char *file, *buf; int buflen; + GError *error = NULL; icon->surface = NULL; icon->surface_width = 0; icon->surface_height = 0; - status = svg_cairo_create (&icon->svg_cairo); - if (status) - return RR_STATUS_NO_MEMORY; - file = _grr_icon_find_file (name); - if (file) { - status = svg_cairo_parse (icon->svg_cairo, file); - if (status == SVG_CAIRO_STATUS_SUCCESS) { - free (file); - return RR_STATUS_SUCCESS; - } - fprintf (stderr, "Error parsing SVG icon: %s\n", file); - free (file); - } - - _grr_icon_find_buffer (name, &buf, &buflen); - status = svg_cairo_parse_buffer (icon->svg_cairo, buf, buflen); - if (status) { - fprintf (stderr, "Error parsing built-in SVG icon for: %s\n", name); - return RR_STATUS_PARSE_ERROR; + icon->rsvg = rsvg_handle_new_from_file(file, &error); + if (!icon->rsvg) { + fprintf (stderr, "Error parsing SVG icon: %s\n", file); + return RR_STATUS_PARSE_ERROR; + } + } else { + _grr_icon_find_buffer (name, &buf, &buflen); + icon->rsvg = rsvg_handle_new_from_data(buf, buflen, &error); + if (!icon->rsvg) { + fprintf (stderr, "Error parsing built-in SVG icon for: %s\n", name); + return RR_STATUS_PARSE_ERROR; + } } return RR_STATUS_SUCCESS; } @@ -225,13 +218,13 @@ grr_icon_target_name (rr_target_t target) void grr_icon_draw (grr_icon_t *icon, cairo_t *xrs) { - svg_cairo_status_t status; - - status = svg_cairo_render (icon->svg_cairo, xrs); + rsvg_handle_render_cairo(icon->rsvg, xrs); +#if 0 if (status) { fprintf (stderr, "svg_cairo_render error\n"); return; } +#endif } void @@ -246,7 +239,7 @@ grr_icon_predraw (grr_icon_t *icon, cairo_t *xrs, int width, int height) icon->surface_width = width; icon->surface_height = height; icon->surface = cairo_surface_create_similar (cairo_get_target (xrs), - CAIRO_FORMAT_ARGB32, + CAIRO_CONTENT_COLOR_ALPHA, width, height); } diff --git a/src/grr_icon.h b/src/grr_icon.h index ed16942..10a954f 100644 --- a/src/grr_icon.h +++ b/src/grr_icon.h @@ -1,6 +1,6 @@ /* grrobot - Ricochet Robot using GTK+ and Xr * - * Copyright © 2003 Carl Worth + * Copyright © 2003 Carl Worth * * Permission to use, copy, modify, distribute, and sell this software * and its documentation for any purpose is hereby granted without @@ -28,11 +28,11 @@ #define GRR_ICON_H #include -#include +#include +#include typedef struct grr_icon { - svg_cairo_t *svg_cairo; - + RsvgHandle *rsvg; cairo_surface_t *surface; int surface_width; int surface_height; -- 2.43.0