summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorBrian Cameron <brian.cameron@sun.com>2007-05-16 01:35:51 +0000
committerBrian Cameron <bcameron@src.gnome.org>2007-05-16 01:35:51 +0000
commit94dcec33c18664b4bc6e8e595c94e33a664b2ec2 (patch)
tree74c07b0732174019faefd2c5d377d3f4ced0c5ae /gdk
parent5e9e9fe4e0fe1e75f0da025ada55358cce5d4d9f (diff)
downloadgdk-pixbuf-94dcec33c18664b4bc6e8e595c94e33a664b2ec2.tar.gz
Add Sun mediaLib support so that hardware acceleration via mediaLib is
2007-05-16 Brian Cameron <brian.cameron@sun.com> * acconfig.h, configure.in, gdk/Makefile.am, gdkprivate.h, gdkrgb.c, gdkdraw.c, gdk-pixbuf/gdk-pixbuf-scale.c, gdk-pixbuf/pixops/Makefile.am, gdk-pixbuf/pixops/pixops.[ch], gdk-pixbuf/pixops/timescale.c: Add Sun mediaLib support so that hardware acceleration via mediaLib is enabled if mediaLib is detected via configure. Enhancement request #344813. I was given permission to commit in the bug report by Matthias Clasen. * gdk/medialib.[ch]: New files added for mediaLib support. * docs/reference/gdk-pixbuf/tmpl/scaling.sgml, docs/reference/gdk/tmpl/rgb.sgml, gdk/gdkdraw.c: Add docs for mediaLib support. svn path=/trunk/; revision=17855
Diffstat (limited to 'gdk')
-rw-r--r--gdk/Makefile.am11
-rw-r--r--gdk/gdkdraw.c57
-rw-r--r--gdk/gdkprivate.h3
-rw-r--r--gdk/gdkrgb.c46
4 files changed, 113 insertions, 4 deletions
diff --git a/gdk/Makefile.am b/gdk/Makefile.am
index 1290544f8..b300ad42c 100644
--- a/gdk/Makefile.am
+++ b/gdk/Makefile.am
@@ -45,6 +45,15 @@ LDADD = \
$(no_undefined) \
$(LIBTOOL_EXPORT_OPTIONS)
+if USE_MEDIALIB
+medialib_sources = \
+ gdkmedialib.c
+medialib_h_sources = \
+ gdkmedialib.h
+else
+medialib_sources =
+medialib_h_sources =
+endif
#
# setup source file variables
@@ -84,11 +93,13 @@ gdk_public_h_sources = \
gdk_headers = \
$(gdk_public_h_sources) \
+ $(medialib_h_sources) \
gdkenumtypes.h \
gdkprivate.h \
gdkalias.h
gdk_c_sources = \
+ $(medialib_sources) \
gdk.c \
gdkcairo.c \
gdkcolor.c \
diff --git a/gdk/gdkdraw.c b/gdk/gdkdraw.c
index ab4d8530e..39c8f7f22 100644
--- a/gdk/gdkdraw.c
+++ b/gdk/gdkdraw.c
@@ -730,7 +730,13 @@ gdk_draw_image (GdkDrawable *drawable,
*
* The clip mask of @gc is ignored, but clip rectangles and clip regions work
* fine.
- *
+ *
+ * If GDK is built with the Sun mediaLib library, the gdk_draw_pixbuf
+ * function is accelerated using mediaLib, which provides hardware
+ * acceleration on Intel, AMD, and Sparc chipsets. If desired, mediaLib
+ * support can be turned off by setting the GDK_DISABLE_MEDIALIB environment
+ * variable.
+ *
* Since: 2.2
**/
void
@@ -1361,6 +1367,44 @@ composite_0888 (guchar *src_buf,
}
}
+#ifdef USE_MEDIALIB
+static void
+composite_0888_medialib (guchar *src_buf,
+ gint src_rowstride,
+ guchar *dest_buf,
+ gint dest_rowstride,
+ GdkByteOrder dest_byte_order,
+ gint width,
+ gint height)
+{
+ guchar *src = src_buf;
+ guchar *dest = dest_buf;
+
+ mlib_image img_src, img_dst;
+
+ mlib_ImageSetStruct (&img_dst,
+ MLIB_BYTE,
+ 4,
+ width,
+ height,
+ dest_rowstride,
+ dest_buf);
+
+ mlib_ImageSetStruct (&img_src,
+ MLIB_BYTE,
+ 4,
+ width,
+ height,
+ src_rowstride,
+ src_buf);
+
+ if (dest_byte_order == GDK_LSB_FIRST)
+ mlib_ImageBlendRGBA2BGRA (&img_dst, &img_src);
+ else
+ mlib_ImageBlendRGBA2ARGB (&img_dst, &img_src);
+}
+#endif
+
static void
composite_565 (guchar *src_buf,
gint src_rowstride,
@@ -1558,7 +1602,16 @@ gdk_drawable_real_draw_pixbuf (GdkDrawable *drawable,
visual->red_mask == 0xff0000 &&
visual->green_mask == 0x00ff00 &&
visual->blue_mask == 0x0000ff)
- composite_func = composite_0888;
+ {
+#ifdef USE_MEDIALIB
+ if (_gdk_use_medialib ())
+ composite_func = composite_0888_medialib;
+ else
+ composite_func = composite_0888;
+#else
+ composite_func = composite_0888;
+#endif
+ }
}
/* We can't use our composite func if we are required to dither
diff --git a/gdk/gdkprivate.h b/gdk/gdkprivate.h
index 95af2e151..29fc346e4 100644
--- a/gdk/gdkprivate.h
+++ b/gdk/gdkprivate.h
@@ -35,6 +35,9 @@
#include <gdk/gdkregion.h>
#include <gdk/gdkvisual.h>
#include <gdk/gdkwindow.h>
+#ifdef USE_MEDIALIB
+#include <gdk/gdkmedialib.h>
+#endif
G_BEGIN_DECLS
diff --git a/gdk/gdkrgb.c b/gdk/gdkrgb.c
index 97b2f15c2..6b9b84c76 100644
--- a/gdk/gdkrgb.c
+++ b/gdk/gdkrgb.c
@@ -2158,6 +2158,29 @@ gdk_rgb_convert_0888 (GdkRgbInfo *image_info, GdkImage *image,
}
}
+#ifdef USE_MEDIALIB25
+/* convert 24-bit packed to 32-bit unpacked */
+static void
+gdk_rgb_convert_0888_medialib (GdkRgbInfo *image_info, GdkImage *image,
+ gint x0, gint y0, gint width, gint height,
+ guchar *buf, int rowstride,
+ gint x_align, gint y_align, GdkRgbCmap *cmap)
+{
+ int y, w;
+ guchar *obuf, *p;
+ gint bpl;
+ guchar *bptr, *bp2;
+
+ bptr = buf;
+ bpl = image->bpl;
+ obuf = ((guchar *)image->mem) + y0 * bpl + x0 * 4;
+
+ mlib_VideoColorRGBint_to_BGRAint (obuf, bptr, NULL, 0xff,
+ width, height, bpl,
+ rowstride, 0);
+}
+#endif
+
static void
gdk_rgb_convert_0888_br (GdkRgbInfo *image_info, GdkImage *image,
gint x0, gint y0, gint width, gint height,
@@ -3131,7 +3154,17 @@ gdk_rgb_select_conv (GdkRgbInfo *image_info)
(depth == 24 || depth == 32) &&
vtype == GDK_VISUAL_TRUE_COLOR &&
(mask_rgb && byte_order == GDK_LSB_FIRST))
- conv = gdk_rgb_convert_0888;
+ {
+#ifdef USE_MEDIALIB25
+ if (_gdk_use_medialib ())
+ conv = gdk_rgb_convert_0888_medialib;
+ else
+ conv = gdk_rgb_convert_0888;
+#else
+ conv = gdk_rgb_convert_0888;
+#endif
+ }
+
#if G_BYTE_ORDER == G_BIG_ENDIAN
else if (bpp == 32 && depth == 24 && vtype == GDK_VISUAL_TRUE_COLOR &&
(mask_bgr && byte_order == GDK_MSB_FIRST))
@@ -3148,7 +3181,16 @@ gdk_rgb_select_conv (GdkRgbInfo *image_info)
conv = gdk_rgb_convert_8880_br;
else if (bpp == 32 && depth == 32 && vtype == GDK_VISUAL_TRUE_COLOR &&
(mask_rgb && byte_order == GDK_LSB_FIRST))
- conv = gdk_rgb_convert_0888;
+ {
+#ifdef USE_MEDIALIB25
+ if (_gdk_use_medialib ())
+ conv = gdk_rgb_convert_0888_medialib;
+ else
+ conv = gdk_rgb_convert_0888;
+#else
+ conv = gdk_rgb_convert_0888;
+#endif
+ }
#endif
else if (vtype == GDK_VISUAL_TRUE_COLOR && byte_order == GDK_LSB_FIRST)
{