diff options
author | Brian Cameron <brian.cameron@sun.com> | 2007-05-16 01:35:51 +0000 |
---|---|---|
committer | Brian Cameron <bcameron@src.gnome.org> | 2007-05-16 01:35:51 +0000 |
commit | 94dcec33c18664b4bc6e8e595c94e33a664b2ec2 (patch) | |
tree | 74c07b0732174019faefd2c5d377d3f4ced0c5ae /gdk | |
parent | 5e9e9fe4e0fe1e75f0da025ada55358cce5d4d9f (diff) | |
download | gdk-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.am | 11 | ||||
-rw-r--r-- | gdk/gdkdraw.c | 57 | ||||
-rw-r--r-- | gdk/gdkprivate.h | 3 | ||||
-rw-r--r-- | gdk/gdkrgb.c | 46 |
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) { |