From 64e09f16a76b3bc808bf1fe224f6efeb8c7963d1 Mon Sep 17 00:00:00 2001 From: Michael Orlitzky Date: Fri, 4 Aug 2023 09:05:00 -0400 Subject: [PATCH] example.c,Makefile.am: begin adding GdkPixbufModule parts. --- Makefile.am | 3 +- example.c | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 1 deletion(-) diff --git a/Makefile.am b/Makefile.am index e79da67..c1e0a7d 100644 --- a/Makefile.am +++ b/Makefile.am @@ -2,7 +2,8 @@ bin_PROGRAMS = example example_CPPFLAGS = $(CAIRO_CFLAGS) \ $(GDKPIXBUF_CFLAGS) \ $(GTK4_CFLAGS) \ - $(LIBSVGTINY_CFLAGS) + $(LIBSVGTINY_CFLAGS) \ + -DGDK_PIXBUF_ENABLE_BACKEND example_LDADD = $(CAIRO_LIBS) \ $(GDKPIXBUF_LIBS) \ $(GTK4_LIBS) \ diff --git a/example.c b/example.c index 74a6658..7c69182 100644 --- a/example.c +++ b/example.c @@ -305,3 +305,85 @@ int main(int argc, char** argv) { return 0; } + + +static GdkPixbuf* gdk_pixbuf_from_svg_file_stream(FILE *fp, GError **error) { + diagram_t* diagram; + cairo_t* cr = 0; + + GdkPixbuf* pb; + + diagram = svgtiny_diagram_from_file(fp, VIEWPORT_WIDTH, VIEWPORT_HEIGHT); + if (!diagram) { + return NULL; + } + + cr = cairo_context_from_diagram(diagram); + if (!cr) { + svgtiny_free(diagram); + return NULL; + } + + /* We're using the diagram width and height and not the viewport + * width/height for the image. This has the potential to create an + * image with a different size and aspect ratio than the viewport, + * but since our viewport is entirely made-up... I don't know. This + * relies on libsvgtiny being good at scaling/stretching/etc an SVG + * that may only have partial width/height/viewBox information. + */ + pb = gdk_pixbuf_get_from_surface(cairo_get_target(cr), + 0, + 0, + diagram->width, + diagram->height); + + + if (!pb) { + fprintf(stderr, "gdk_pixbuf_get_from_surface failed!\n"); + } + + return pb; +} + + +G_MODULE_EXPORT void fill_vtable(GdkPixbufModule* module); +void fill_vtable(GdkPixbufModule* module) { + module->load = gdk_pixbuf_from_svg_file_stream; +} + +G_MODULE_EXPORT void fill_info(GdkPixbufFormat *info); +void fill_info(GdkPixbufFormat* info) { + /* Borrowed from librsvg-2.40.21 */ + static const GdkPixbufModulePattern signature[] = { + { " name = "svg"; + info->signature = (GdkPixbufModulePattern*) signature; + info->description = "Scalable Vector Graphics"; + info->mime_types = (gchar**) mime_types; + info->extensions = (gchar**) extensions; + info->flags = GDK_PIXBUF_FORMAT_SCALABLE; + info->license = "AGPL3"; +} + -- 2.43.2