emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] cairo 69a8655: Support RSVG and cairo.


From: Jan D.
Subject: [Emacs-diffs] cairo 69a8655: Support RSVG and cairo.
Date: Sun, 05 Apr 2015 16:34:20 +0000

branch: cairo
commit 69a8655d7190b1dc28de9cbc786a86e8966a45a4
Author: Jan D <address@hidden>
Commit: Jan D <address@hidden>

    Support RSVG and cairo.
    
    * configure.ac: Allow rsvg with cairo.  Move back HAVE_RSVG.
    
    * src/dispextern.h (struct image): add cr_data2 if cairo.
    
    * src/image.c: #undef COLOR_TABLE_SUPPORT when USE_CAIRO.
    (x_clear_image): Free cr_data and cr_data2 if set.
    (xpm_load): Assign data to cr_data2.
    (svg_load_image): Convert from GdkPixbuf to CAIRO_FORMAT_ARGB32.
---
 ChangeLog        |    4 +++
 configure.ac     |   46 +++++++++++++++++++++-----------------------
 src/ChangeLog    |    9 ++++++++
 src/dispextern.h |    1 +
 src/image.c      |   55 ++++++++++++++++++++++++++++++++++++++++++++++++-----
 5 files changed, 85 insertions(+), 30 deletions(-)

diff --git a/ChangeLog b/ChangeLog
index 6e8cade..b456cc4 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+2015-04-05  Jan Djärv  <address@hidden>
+
+       * configure.ac: Allow rsvg with cairo.  Move back HAVE_RSVG.
+
 2015-04-03  Jan Djärv  <address@hidden>
 
        * configure.ac (HAVE_RSVG): Move after cairo.
diff --git a/configure.ac b/configure.ac
index 9d4e375..79619c7 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2361,6 +2361,28 @@ fail;
 fi
 
 
+### Use -lrsvg-2 if available, unless `--with-rsvg=no' is specified.
+HAVE_RSVG=no
+if test "${HAVE_X11}" = "yes" || test "${HAVE_NS}" = "yes" || test "${opsys}" 
= "mingw32"; then
+  if test "${with_rsvg}" != "no"; then
+    RSVG_REQUIRED=2.11.0
+    RSVG_MODULE="librsvg-2.0 >= $RSVG_REQUIRED"
+
+    EMACS_CHECK_MODULES([RSVG], [$RSVG_MODULE])
+    AC_SUBST(RSVG_CFLAGS)
+    AC_SUBST(RSVG_LIBS)
+
+    if test $HAVE_RSVG = yes; then
+      AC_DEFINE(HAVE_RSVG, 1, [Define to 1 if using librsvg.])
+      CFLAGS="$CFLAGS $RSVG_CFLAGS"
+      # Windows loads librsvg dynamically
+      if test "${opsys}" = "mingw32"; then
+        RSVG_LIBS=
+      fi
+    fi
+  fi
+fi
+
 HAVE_IMAGEMAGICK=no
 if test "${HAVE_X11}" = "yes" || test "${HAVE_NS}" = "yes" || test 
"${HAVE_W32}" = "yes"; then
   if test "${with_imagemagick}" != "no"; then
@@ -3092,7 +3114,6 @@ if test "${HAVE_X11}" = "yes"; then
     with_jpeg=no
     with_gif=no
     with_tiff=no
-    with_rsvg=no
 
     CFLAGS="$CFLAGS $CAIRO_CFLAGS"
     LIBS="$LIBS $CAIRO_LIBS"
@@ -3101,29 +3122,6 @@ if test "${HAVE_X11}" = "yes"; then
   fi
 fi
 
-### Use -lrsvg-2 if available, unless `--with-rsvg=no' is specified.
-HAVE_RSVG=no
-if test "${HAVE_X11}" = "yes" || test "${HAVE_NS}" = "yes" || test "${opsys}" 
= "mingw32"; then
-  if test "${with_rsvg}" != "no"; then
-    RSVG_REQUIRED=2.11.0
-    RSVG_MODULE="librsvg-2.0 >= $RSVG_REQUIRED"
-
-    EMACS_CHECK_MODULES([RSVG], [$RSVG_MODULE])
-    AC_SUBST(RSVG_CFLAGS)
-    AC_SUBST(RSVG_LIBS)
-
-    if test $HAVE_RSVG = yes; then
-      AC_DEFINE(HAVE_RSVG, 1, [Define to 1 if using librsvg.])
-      CFLAGS="$CFLAGS $RSVG_CFLAGS"
-      # Windows loads librsvg dynamically
-      if test "${opsys}" = "mingw32"; then
-        RSVG_LIBS=
-      fi
-    fi
-  fi
-fi
-
-
 ### Use -lXpm if available, unless `--with-xpm=no'.
 ### mingw32 doesn't use -lXpm, since it loads the library dynamically.
 ### In the Cygwin-w32 build, we need to use /usr/include/noX/X11/xpm.h
diff --git a/src/ChangeLog b/src/ChangeLog
index 1a473e6..18e4b34 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,12 @@
+2015-04-05  Jan Djärv  <address@hidden>
+
+       * image.c: #undef COLOR_TABLE_SUPPORT when USE_CAIRO.
+       (x_clear_image): Free cr_data and cr_data2 if set.
+       (xpm_load): Assign data to cr_data2.
+       (svg_load_image): Convert from GdkPixbuf to CAIRO_FORMAT_ARGB32.
+
+       * dispextern.h (struct image): add cr_data2 if cairo.
+
 2015-04-03  Jan Djärv  <address@hidden>
 
        * image.c (prepare_image_for_display): Don't load if USE_CAIRO.
diff --git a/src/dispextern.h b/src/dispextern.h
index addb432..d9d4d23 100644
--- a/src/dispextern.h
+++ b/src/dispextern.h
@@ -2943,6 +2943,7 @@ struct image
 
 #ifdef USE_CAIRO
   void *cr_data;
+  void *cr_data2;
 #endif
 #ifdef HAVE_X_WINDOWS
   /* X images of the image, corresponding to the above Pixmaps.
diff --git a/src/image.c b/src/image.c
index e24bc58..895021c 100644
--- a/src/image.c
+++ b/src/image.c
@@ -88,6 +88,10 @@ typedef struct w32_bitmap_record Bitmap_Record;
 
 #endif /* HAVE_NTGUI */
 
+#ifdef USE_CAIRO
+#undef COLOR_TABLE_SUPPORT
+#endif
+
 #ifdef HAVE_NS
 #undef COLOR_TABLE_SUPPORT
 
@@ -1303,10 +1307,8 @@ x_clear_image (struct frame *f, struct image *img)
   block_input ();
 #ifdef USE_CAIRO
   if (img->cr_data)
-    {
-      cairo_surface_destroy ((cairo_surface_t *)img->cr_data);
-      if (img->ximg && img->ximg->obdata) xfree (img->ximg->obdata);
-    }
+    cairo_surface_destroy ((cairo_surface_t *)img->cr_data);
+  if (img->cr_data2) xfree (img->cr_data2);
 #endif
   x_clear_image_1 (f, img,
                   CLEAR_IMAGE_PIXMAP | CLEAR_IMAGE_MASK | CLEAR_IMAGE_COLORS);
@@ -3670,7 +3672,7 @@ xpm_load (struct frame *f, struct image *img)
       img->height = cairo_image_surface_get_height (surface);
       img->cr_data = surface;
       img->pixmap = 0;
-      img->ximg->obdata = (char *)data;
+      img->cr_data2 = data;
     }
   else
     {
@@ -8993,6 +8995,45 @@ svg_load_image (struct frame *f,         /* Pointer to 
emacs frame structure.  *
   eassert (gdk_pixbuf_get_has_alpha (pixbuf));
   eassert (gdk_pixbuf_get_bits_per_sample (pixbuf) == 8);
 
+#ifdef USE_CAIRO
+  {
+    cairo_surface_t *surface;
+    cairo_format_t format = CAIRO_FORMAT_ARGB32;
+    int stride = cairo_format_stride_for_width (format, width);
+    unsigned char *data = (unsigned char *) xmalloc (width*height*4);
+    int y;
+
+    for (y = 0; y < height; ++y)
+      {
+        const guchar *iconptr = pixels + y * rowstride;
+        uint32_t *dataptr = (uint32_t *) (data + y * rowstride);
+        int x;
+
+        for (x = 0; x < width; ++x)
+          {
+            *dataptr = (iconptr[0] << 16)
+              | (iconptr[1] << 8)
+              | iconptr[2]
+              | (iconptr[3] << 24);
+            iconptr += 4;
+            ++dataptr;
+          }
+      }
+
+    surface = cairo_image_surface_create_for_data (data,
+                                                   format,
+                                                   width,
+                                                   height,
+                                                   stride);
+
+    g_object_unref (pixbuf);
+    img->width  = width;
+    img->height = height;
+    img->cr_data = surface;
+    img->cr_data2 = data;
+    img->pixmap = 0;
+  }
+#else
   /* Try to create a x pixmap to hold the svg pixmap.  */
   if (!image_create_x_image_and_pixmap (f, img, width, height, 0, &ximg, 0))
     {
@@ -9064,6 +9105,7 @@ svg_load_image (struct frame *f,         /* Pointer to 
emacs frame structure.  *
 
   /* Put ximg into the image.  */
   image_put_x_image (f, img, ximg, 0);
+#endif /* ! USE_CAIRO */
 
   return 1;
 
@@ -9331,15 +9373,16 @@ x_kill_gs_process (Pixmap pixmap, struct frame *f)
          /* For each pixel of the image, look its color up in the
             color table.  After having done so, the color table will
             contain an entry for each color used by the image.  */
+#ifdef COLOR_TABLE_SUPPORT
          for (y = 0; y < img->height; ++y)
            for (x = 0; x < img->width; ++x)
              {
                unsigned long pixel = XGetPixel (ximg, x, y);
+
                lookup_pixel_color (f, pixel);
              }
 
          /* Record colors in the image.  Free color table and XImage.  */
-#ifdef COLOR_TABLE_SUPPORT
          img->colors = colors_in_color_table (&img->ncolors);
          free_color_table ();
 #endif



reply via email to

[Prev in Thread] Current Thread [Next in Thread]