From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: joakim@verona.se Newsgroups: gmane.emacs.devel Subject: Re: SVG support(again) ? Date: Thu, 09 Aug 2007 23:17:09 +0200 Message-ID: References: NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: sea.gmane.org 1186694247 31777 80.91.229.12 (9 Aug 2007 21:17:27 GMT) X-Complaints-To: usenet@sea.gmane.org NNTP-Posting-Date: Thu, 9 Aug 2007 21:17:27 +0000 (UTC) To: emacs-devel Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Thu Aug 09 23:17:24 2007 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1IJFNg-0006Ai-R0 for ged-emacs-devel@m.gmane.org; Thu, 09 Aug 2007 23:17:21 +0200 Original-Received: from localhost ([127.0.0.1] helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1IJFNf-0002Cw-NA for ged-emacs-devel@m.gmane.org; Thu, 09 Aug 2007 17:17:19 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1IJFNc-0002CR-3n for emacs-devel@gnu.org; Thu, 09 Aug 2007 17:17:16 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1IJFNZ-0002C7-Ig for emacs-devel@gnu.org; Thu, 09 Aug 2007 17:17:15 -0400 Original-Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1IJFNZ-0002C4-DH for emacs-devel@gnu.org; Thu, 09 Aug 2007 17:17:13 -0400 Original-Received: from proxy3.bredband.net ([195.54.101.73]) by monty-python.gnu.org with esmtp (Exim 4.60) (envelope-from ) id 1IJFNY-0007yS-QG for emacs-devel@gnu.org; Thu, 09 Aug 2007 17:17:13 -0400 Original-Received: from kurono.home (83.227.131.3) by proxy3.bredband.net (7.3.127) id 46BAC75900030489 for emacs-devel@gnu.org; Thu, 9 Aug 2007 23:17:10 +0200 In-Reply-To: (joakim@verona.se's message of "Thu\, 09 Aug 2007 01\:56\:44 +0200") User-Agent: Gnus/5.110006 (No Gnus v0.6) Emacs/22.1.50 (gnu/linux) X-Detected-Kernel: Genre and OS details not recognized. X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:76278 Archived-At: --=-=-= joakim@verona.se writes: > There was a patch for SVG support in Emacs in 2004. > This patch seems to no longer apply. I've adapted the SVG patch by Paul Pogonyshev for current emacs CVS. All I did was find the right place to insert the hunks, since the emacs source has changed a lot since the original patch. I tried it briefly on a Fedora 7 box. It seems to work nicely. What must be done in order for this patch to be applied? The only odd thing I can see is three lines like: #if 1 || defined (HAVE_RSVG) that ought to be the same as: #if defined (HAVE_RSVG) which should be ok on any plattform, since HAVE_RSVG will be defined only if you have librsvg2. I did try the configure script generated by autoconf once withouth the lib and once with. I tried making a SVG picture with Inkscape, viewing it in emacs using image-dired, and then editing it a bit with nxml mode, and it seemed to work nicely. --=-=-= Content-Type: text/x-patch Content-Disposition: inline; filename=emacs_svg.patch ? emacs_svg.patch Index: configure.in =================================================================== RCS file: /sources/emacs/emacs/configure.in,v retrieving revision 1.459 diff -r1.459 configure.in 112a113,114 > AC_ARG_WITH(rsvg, > [ --with-rsvg use -lrsvg-2 for displaying SVG images]) 116c118 < [ --with-pkg-config-prog Path to pkg-config to use for finding GTK]) --- > [ --with-pkg-config-prog Path to pkg-config to use for finding GTK and librsvg]) 2124a2127,2152 > ### Use -lrsvg-2 if available, unless `--with-rsvg=no' is specified. > HAVE_RSVG=no > if test "${HAVE_X11}" = "yes"; then > if test "${with_rsvg}" != "no"; then > dnl Check if `--with-pkg-config-prog' has been given. > if test "X${with_pkg_config_prog}" != X; then > PKG_CONFIG="${with_pkg_config_prog}" > fi > > RSVG_REQUIRED=2.0.0 > RSVG_MODULE="librsvg-2.0 >= $RSVG_REQUIRED" > > PKG_CHECK_MODULES(RSVG, $RSVG_MODULE, :, :) > AC_SUBST(RSVG_CFLAGS) > AC_SUBST(RSVG_LIBS) > > if test ".${RSVG_CFLAGS}" != "."; then > HAVE_RSVG=yes > AC_DEFINE(HAVE_RSVG, 1, [Define to 1 if using librsvg.]) > CFLAGS="$CFLAGS $RSVG_CFLAGS" > LIBS="$RSVG_LIBS $LIBS" > fi > fi > fi > > 3364a3393 > echo " Does Emacs use -lrsvg-2? ${HAVE_RSVG}" Index: lisp/image-file.el =================================================================== RCS file: /sources/emacs/emacs/lisp/image-file.el,v retrieving revision 1.29 diff -r1.29 image-file.el 42c42 < '("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm" "xpm" "pbm" "pgm" "ppm" "pnm") --- > '("png" "jpeg" "jpg" "gif" "tiff" "tif" "xbm" "xpm" "pbm" "pgm" "ppm" "pnm" "svg") Index: lisp/image.el =================================================================== RCS file: /sources/emacs/emacs/lisp/image.el,v retrieving revision 1.72 diff -r1.72 image.el 46c46,47 < ("\\`\xff\xd8" . (image-jpeg-p . jpeg))) --- > ("\\`\xff\xd8" . (image-jpeg-p . jpeg)) > ("\\`<\\?xml " . svg)) Index: src/Makefile.in =================================================================== RCS file: /sources/emacs/emacs/src/Makefile.in,v retrieving revision 1.346 diff -r1.346 Makefile.in 284c284 < ALL_CFLAGS=-Demacs -DHAVE_CONFIG_H $(TOOLKIT_DEFINES) $(MYCPPFLAGS) -I. -I${srcdir} C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_SITE C_SWITCH_X_SITE C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM C_SWITCH_SYSTEM_TEMACS ${CFLAGS_SOUND} ${CFLAGS} --- > ALL_CFLAGS=-Demacs -DHAVE_CONFIG_H $(TOOLKIT_DEFINES) $(MYCPPFLAGS) -I. -I${srcdir} C_SWITCH_MACHINE C_SWITCH_SYSTEM C_SWITCH_SITE @RSVG_CFLAGS@ C_SWITCH_X_SITE C_SWITCH_X_MACHINE C_SWITCH_X_SYSTEM C_SWITCH_SYSTEM_TEMACS ${CFLAGS_SOUND} ${CFLAGS} 453c453 < LIBX= $(LIBXMENU) $(X11_LDFLAGS) $(LIBXT) LIBTIFF LIBJPEG LIBPNG LIBGIF LIBXPM LIB_X11_LIB LIBX11_MACHINE LIBX11_SYSTEM $(XFT_LIBS) --- > LIBX= $(LIBXMENU) $(X11_LDFLAGS) $(LIBXT) LIBTIFF LIBJPEG LIBPNG LIBGIF LIBXPM @RSVG_LIBS@ LIB_X11_LIB LIBX11_MACHINE LIBX11_SYSTEM $(XFT_LIBS) Index: src/image.c =================================================================== RCS file: /sources/emacs/emacs/src/image.c,v retrieving revision 1.77 diff -r1.77 image.c 8201a8202,8474 > > /*********************************************************************** > SVG > ***********************************************************************/ > > #if 1 || defined (HAVE_RSVG) > > /* Function prototypes. */ > > static int svg_image_p P_ ((Lisp_Object object)); > static int svg_load P_ ((struct frame *f, struct image *img)); > > static int svg_load_image P_ ((struct frame *, struct image *, > unsigned char *, unsigned int)); > > /* The symbol `svg' identifying images of this type. */ > > Lisp_Object Qsvg; > > /* Indices of image specification fields in svg_format, below. */ > > enum svg_keyword_index > { > SVG_TYPE, > SVG_DATA, > SVG_FILE, > SVG_ASCENT, > SVG_MARGIN, > SVG_RELIEF, > SVG_ALGORITHM, > SVG_HEURISTIC_MASK, > SVG_MASK, > SVG_BACKGROUND, > SVG_LAST > }; > > /* Vector of image_keyword structures describing the format > of valid user-defined image specifications. */ > > static struct image_keyword svg_format[SVG_LAST] = > { > {":type", IMAGE_SYMBOL_VALUE, 1}, > {":data", IMAGE_STRING_VALUE, 0}, > {":file", IMAGE_STRING_VALUE, 0}, > {":ascent", IMAGE_ASCENT_VALUE, 0}, > {":margin", IMAGE_POSITIVE_INTEGER_VALUE_OR_PAIR, 0}, > {":relief", IMAGE_INTEGER_VALUE, 0}, > {":conversion", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, > {":heuristic-mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, > {":mask", IMAGE_DONT_CHECK_VALUE_TYPE, 0}, > {":background", IMAGE_STRING_OR_NIL_VALUE, 0} > }; > > /* Structure describing the image type `svg'. */ > > static struct image_type svg_type = > { > &Qsvg, > svg_image_p, > svg_load, > x_clear_image, > NULL > }; > > > /* Return non-zero if OBJECT is a valid SVG image specification. */ > > static int > svg_image_p (object) > Lisp_Object object; > { > struct image_keyword fmt[SVG_LAST]; > bcopy (svg_format, fmt, sizeof fmt); > > if (!parse_image_spec (object, fmt, SVG_LAST, Qsvg)) > return 0; > > /* Must specify either the :data or :file keyword. */ > return fmt[SVG_FILE].count + fmt[SVG_DATA].count == 1; > } > > #include > > /* DEF_IMGLIB_FN() here? */ > > #define fn_rsvg_handle_new rsvg_handle_new > #define fn_rsvg_handle_set_size_callback rsvg_handle_set_size_callback > #define fn_rsvg_handle_write rsvg_handle_write > #define fn_rsvg_handle_close rsvg_handle_close > #define fn_rsvg_handle_get_pixbuf rsvg_handle_get_pixbuf > #define fn_rsvg_handle_free rsvg_handle_free > > #define fn_gdk_pixbuf_get_width gdk_pixbuf_get_width > #define fn_gdk_pixbuf_get_height gdk_pixbuf_get_height > #define fn_gdk_pixbuf_get_pixels gdk_pixbuf_get_pixels > #define fn_gdk_pixbuf_get_rowstride gdk_pixbuf_get_rowstride > #define fn_gdk_pixbuf_get_colorspace gdk_pixbuf_get_colorspace > #define fn_gdk_pixbuf_get_n_channels gdk_pixbuf_get_n_channels > #define fn_gdk_pixbuf_get_has_alpha gdk_pixbuf_get_has_alpha > #define fn_gdk_pixbuf_get_bits_per_sample gdk_pixbuf_get_bits_per_sample > > > /* Load SVG image IMG for use on frame F. Value is non-zero if > successful. */ > > static int > svg_load (f, img) > struct frame *f; > struct image *img; > { > int success_p = 0; > Lisp_Object file_name; > > /* If IMG->spec specifies a file name, create a non-file spec from it. */ > file_name = image_spec_value (img->spec, QCfile, NULL); > if (STRINGP (file_name)) > { > Lisp_Object file; > unsigned char *contents; > int size; > struct gcpro gcpro1; > > file = x_find_image_file (file_name); > GCPRO1 (file); > if (!STRINGP (file)) > { > image_error ("Cannot find image file `%s'", file_name, Qnil); > UNGCPRO; > return 0; > } > > contents = slurp_file (SDATA (file), &size); > if (contents == NULL) > { > image_error ("Error loading SVG image `%s'", img->spec, Qnil); > UNGCPRO; > return 0; > } > > success_p = svg_load_image (f, img, contents, size); > xfree (contents); > UNGCPRO; > } > else > { > Lisp_Object data; > > data = image_spec_value (img->spec, QCdata, NULL); > success_p = svg_load_image (f, img, SDATA (data), SBYTES (data)); > } > > return success_p; > } > > > static int > svg_load_image (f, img, contents, size) > struct frame *f; > struct image *img; > unsigned char *contents; > unsigned int size; > { > RsvgHandle *rsvg_handle; > GError *error = NULL; > GdkPixbuf *pixbuf; > int width; > int height; > const guint8 *pixels; > int rowstride; > XImagePtr ximg; > XColor background; > int x; > int y; > > g_type_init (); > rsvg_handle = fn_rsvg_handle_new (); > > fn_rsvg_handle_write (rsvg_handle, contents, size, &error); > if (error) > goto rsvg_error; > > fn_rsvg_handle_close (rsvg_handle, &error); > if (error) > goto rsvg_error; > > pixbuf = fn_rsvg_handle_get_pixbuf (rsvg_handle); > eassert (pixbuf); > > width = fn_gdk_pixbuf_get_width (pixbuf); > height = fn_gdk_pixbuf_get_height (pixbuf); > pixels = fn_gdk_pixbuf_get_pixels (pixbuf); > rowstride = fn_gdk_pixbuf_get_rowstride (pixbuf); > > eassert (fn_gdk_pixbuf_get_colorspace (pixbuf) == GDK_COLORSPACE_RGB); > eassert (fn_gdk_pixbuf_get_n_channels (pixbuf) == 4); > eassert (fn_gdk_pixbuf_get_has_alpha (pixbuf)); > eassert (fn_gdk_pixbuf_get_bits_per_sample (pixbuf) == 8); > > if (!x_create_x_image_and_pixmap (f, width, height, 0, &ximg, &img->pixmap)) { > g_object_unref (pixbuf); > return 0; > } > > init_color_table (); > > #ifdef HAVE_X_WINDOWS > > background.pixel = FRAME_BACKGROUND_PIXEL (f); > x_query_color (f, &background); > > background.red >>= 8; > background.green >>= 8; > background.blue >>= 8; > > #else /* not HAVE_X_WINDOWS */ > #error FIXME > #endif > > for (y = 0; y < height; ++y) > { > for (x = 0; x < width; ++x) > { > unsigned red; > unsigned green; > unsigned blue; > unsigned opacity; > > red = *pixels++; > green = *pixels++; > blue = *pixels++; > opacity = *pixels++; > > red = ((red * opacity) > + (background.red * ((1 << 8) - opacity))); > green = ((green * opacity) > + (background.green * ((1 << 8) - opacity))); > blue = ((blue * opacity) > + (background.blue * ((1 << 8) - opacity))); > > XPutPixel (ximg, x, y, lookup_rgb_color (f, red, green, blue)); > } > > pixels += rowstride - 4 * width; > } > > #ifdef COLOR_TABLE_SUPPORT > /* Remember colors allocated for this image. */ > img->colors = colors_in_color_table (&img->ncolors); > free_color_table (); > #endif /* COLOR_TABLE_SUPPORT */ > > g_object_unref (pixbuf); > > /* Put the image into the pixmap, then free the X image and its buffer. */ > x_put_x_image (f, ximg, img->pixmap, width, height); > x_destroy_x_image (ximg); > > img->width = width; > img->height = height; > > return 1; > > rsvg_error: > /* FIXME: Use error->message. */ > image_error ("Error parsing SVG image `%s'", img->spec, Qnil); > g_error_free (error); > return 0; > } > > #endif /* defined (HAVE_RSVG) */ > > > 8593a8867,8871 > #if 1 || defined (HAVE_RSVG) > if (EQ (type, Qsvg)) > return CHECK_LIB_AVAILABLE (&svg_type, init_svg_functions, libraries); > #endif > 8735a9014,9020 > #if 1 || defined (HAVE_RSVG) > Qsvg = intern ("svg"); > staticpro (&Qsvg); > ADD_IMAGE_TYPE(Qsvg); > #endif > > --=-=-= > > Has anyone adopted it for the current tree? If so, coculd it be > applied? > > -- > Joakim Verona -- Joakim Verona --=-=-= Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Emacs-devel mailing list Emacs-devel@gnu.org http://lists.gnu.org/mailman/listinfo/emacs-devel --=-=-=--