SVG support via libRSVG! (Now builds with SVG support on Ubuntu 07.04 (Fiesty))

This commit is contained in:
William Kendrick 2007-06-22 20:03:50 +00:00
parent b3805c4aea
commit 01fc74bd2d
4 changed files with 225 additions and 21 deletions

View file

@ -103,8 +103,12 @@ SDL_MIXER_LIB=-lSDL_mixer
SDL_CFLAGS=$(shell sdl-config --cflags) $(SVG_CFLAGS)
SVG_LIB=-lcairo
SVG_CFLAGS=-I/usr/include/cairo
SVG_LIB=-lrsvg-2 -lcairo
SVG_CFLAGS=-I/usr/include/librsvg-2/librsvg \
-I/usr/include/gtk-2.0 \
-I/usr/include/glib-2.0 \
-I/usr/lib/glib-2.0/include \
-I/usr/include/cairo
# The entire set of CFLAGS:

View file

@ -9,7 +9,7 @@ http://www.newbreedsoftware.com/tuxpaint/
$Id$
2007.June.12 (0.9.17)
2007.June.21 (0.9.17)
* Interface Improvements:
-----------------------
@ -50,12 +50,13 @@ $Id$
(Addresses SourceForge Bug #1070414)
Mark K. Kim <mkkim214@gmail.com>
* Stamps now supports SVG vector-based graphics! (Via Cairo library)
* Stamps now supports SVG vector-based graphics!
(Only SVG versions of stamps are loaded, when both PNG and SVG
variations are found.)
(Experimental; build with "make nosvg" to disable SVG support and
Cairo dependency.)
* By default, uses librsvg-2 and libcairo2 (requires glib & much more).
* Use "make oldsvg" to build with libsvg and libcairo1 (older libs).
* Use "make nosvg" to completely disable SVG support.
* Stamps now shown in groups. Use previous & next buttons to
cycle through stamp categories.

View file

@ -2,11 +2,11 @@ INSTALL.txt for Tux Paint
Tux Paint - A simple drawing program for children.
Copyright 2002-2006 by Bill Kendrick and others
Copyright 2002-2007 by Bill Kendrick and others
bill@newbreedsoftware.com
http://www.tuxpaint.org/
June 27, 2002 - December 16, 2006
June 27, 2002 - June 21, 2007
$Id$
@ -76,12 +76,38 @@ Requirements:
http://www.gnu.org/software/gettext/
Cairo, libsvg, svg-cairo [EXPERIMENTAL] [can be disabled]
----------------------------------------
As of Tux Paint 0.9.17, SVG vector graphics are supported by the
'Stamps' tool.
SVG graphics support
--------------------
As of Tux Paint 0.9.17, Tux Paint can load SVG
(Scalable Vector Graphics) images as stamps.
Two sets of libraries are supported, and SVG support can be
completely disabled (via "make nosvg")
http://www.cairographics.org/
librsvg-2, libCairo2 [newer libraries; default "make" target]
--------------------------------------------------------------
libRSVG 2
http://librsvg.sourceforge.net/
Cairo 2
http://www.cairographics.org/
Also depends on:
GdkPixbuf
GLib
http://www.gtk.org/
Pango
http://www.pango.org/
Older libraries ("make oldsvg")
-------------------------------
libcairo1
libsvg1
libsvg-cairo1
http://www.cairographics.org/
Also depends on:
libxml2
NetPBM Tools [OPTIONAL] [No longer used, by default]
------------------------

View file

@ -22,7 +22,7 @@
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
(See COPYING.txt)
June 14, 2002 - June 19, 2007
June 14, 2002 - June 21, 2007
$Id$
*/
@ -361,12 +361,13 @@ extern WrapperData macosx;
#else
#include "xyzsvg.h"
#ifndef XYZ_SVG_H
#include "rsvg.h"
#include "rsvg-cairo.h"
#if !defined(RSVG_H) || !defined(RSVG_CAIRO_H)
#error "---------------------------------------------------"
#error "If you installed libXYZ from packages, be sure"
#error "If you installed libRSVG from packages, be sure"
#error "to get the development package, as well!"
#error "(e.g., 'libXYZ-dev.rpm')"
#error "(e.g., 'librsvg2-dev.rpm')"
#error "---------------------------------------------------"
#endif
@ -16411,7 +16412,9 @@ int paintsound(int size)
#ifdef OLD_SVG
// Old libcairo1, svg and svg-cairo based code
// Based on cairo-demo/sdl/main.c from Cairo (GPL'd, (c) 2004 Eric Windisch):
SDL_Surface * load_svg(char * file)
{
svg_cairo_t * scr;
@ -16494,10 +16497,10 @@ SDL_Surface * load_svg(char * file)
#endif
// Create the cairo surface with the adjusted width and height
cairo_surface = cairo_image_surface_create_for_data(image,
CAIRO_FORMAT_ARGB32,
width, height, stride);
cr = cairo_create(cairo_surface);
if (cr == NULL)
{
@ -16571,11 +16574,181 @@ SDL_Surface * load_svg(char * file)
#else
// New libcairo2, rsvg and rsvg-cairo based code
SDL_Surface * load_svg(char * file)
{
printf("load_svg(%s)\n", file);
cairo_surface_t * cairo_surf;
cairo_t * cr;
RsvgHandle * rsvg_handle;
GError * gerr;
unsigned char * image;
int rwidth, rheight;
int width, height, stride;
float scale;
int bpp = 32, btpp = 4;
RsvgDimensionData dimensions;
SDL_Surface * sdl_surface, * sdl_surface_tmp;
Uint32 rmask, gmask, bmask, amask;
return (NULL);
#ifdef DEBUG
printf("load_svg(%s)\n", file);
#endif
/* Create an RSVG Handle from the SVG file: */
rsvg_init();
gerr = NULL;
rsvg_handle = rsvg_handle_new_from_file(file, &gerr);
if (rsvg_handle == NULL)
{
#ifdef DEBUG
fprintf(stderr, "rsvg_handle_new_from_file() failed\n");
#endif
return(NULL);
}
rsvg_handle_get_dimensions(rsvg_handle, &dimensions);
rwidth = dimensions.width;
rheight = dimensions.height;
#ifdef DEBUG
printf("SVG is %d x %d\n", rwidth, rheight);
#endif
// Pick best scale to render to (for the canvas in this instance of Tux Paint)
scale = pick_best_scape(rwidth, rheight, r_canvas.w, r_canvas.h);
#ifdef DEBUG
printf("best scale is %.4f\n", scale);
#endif
width = ((float) rwidth * scale);
height = ((float) rheight * scale);
#ifdef DEBUG
printf("scaling to %d x %d (%f scale)\n", width, height, scale);
#endif
// scanline width
stride = width * btpp;
// Allocate space for an image:
image = calloc(stride * height, 1);
if (image == NULL)
{
#ifdef DEBUG
fprintf(stderr, "Unable to allocate image buffer\n");
#endif
g_object_unref(rsvg_handle);
return(NULL);
}
/* Create a surface for Cairo to draw into: */
cairo_surf = cairo_image_surface_create_for_data(image,
CAIRO_FORMAT_ARGB32,
width, height, stride);
if (cairo_surface_status(cairo_surf) != CAIRO_STATUS_SUCCESS)
{
#ifdef DEBUG
fprintf(stderr, "cairo_image_surface_create() failed\n");
#endif
g_object_unref(rsvg_handle);
free(image);
return(NULL);
}
/* Create a new Cairo object: */
cr = cairo_create(cairo_surf);
if (cairo_status(cr) != CAIRO_STATUS_SUCCESS)
{
#ifdef DEBUG
fprintf(stderr, "cairo_create() failed\n");
#endif
g_object_unref(rsvg_handle);
cairo_surface_destroy(cairo_surf);
free(image);
return(NULL);
}
/* Ask RSVG to render the SVG into the Cairo object: */
cairo_scale(cr, scale, scale);
/* FIXME: We can use cairo_rotate() here to rotate stamps! -bjk 2007.06.21 */
rsvg_handle_render_cairo(rsvg_handle, cr);
cairo_surface_finish(cairo_surf);
// Adjust the SDL surface to match the cairo surface created
// (surface mask of ARGB) NOTE: Is this endian-agnostic? -bjk 2006.10.25
rmask = 0x00ff0000;
gmask = 0x0000ff00;
bmask = 0x000000ff;
amask = 0xff000000;
// Create the SDL surface using the pixel data stored:
sdl_surface_tmp = SDL_CreateRGBSurfaceFrom((void *) image, width, height,
bpp, stride,
rmask, gmask, bmask, amask);
if (sdl_surface_tmp == NULL)
{
#ifdef DEBUG
fprintf(stderr, "SDL_CreateRGBSurfaceFrom() failed\n");
#endif
g_object_unref(rsvg_handle);
cairo_surface_destroy(cairo_surf);
free(image);
cairo_destroy(cr);
return(NULL);
}
// Convert the SDL surface to the display format, for faster blitting:
sdl_surface = SDL_DisplayFormatAlpha(sdl_surface_tmp);
SDL_FreeSurface(sdl_surface_tmp);
if (sdl_surface == NULL)
{
#ifdef DEBUG
fprintf(stderr, "SDL_DisplayFormatAlpha() failed\n");
#endif
g_object_unref(rsvg_handle);
cairo_surface_destroy(cairo_surf);
free(image);
cairo_destroy(cr);
return(NULL);
}
#ifdef DEBUG
printf("SDL surface from %d x %d SVG is %d x %d\n",
rwidth, rheight, sdl_surface->w, sdl_surface->h);
#endif
/* Clean up: */
g_object_unref(rsvg_handle);
cairo_surface_destroy(cairo_surf);
free(image);
cairo_destroy(cr);
rsvg_term();
return(sdl_surface);
}
#endif