diff --git a/configure.ac b/configure.ac
index 7614ea8..b36d45a 100644
--- a/configure.ac
+++ b/configure.ac
@@ -835,27 +835,18 @@ AC_CHECK_HEADER(sys/sysinfo.h,
AC_DEFINE(HAVE_SYS_SYSINFO_H, 1,
[Define to 1 if sys/sysinfo.h is available]))
-AC_MSG_CHECKING(for mediaLib 2.3)
-use_mlib25=no
-# Check for a mediaLib 2.3 function since that is what the GTK+ mediaLib
+# Check for a mediaLib 2.5 function since that is what the GTK+ mediaLib
# patch requires.
-AC_CHECK_LIB(mlib, mlib_ImageSetStruct, use_mlib=yes, use_mlib=no)
+AC_MSG_CHECKING(for mediaLib 2.5)
+use_mlib=no
+# Check for a mediaLib 2.5 function since that is what is needed for
+# gdk_rgb_convert integration.
+AC_CHECK_LIB(mlib, mlib_VideoColorRGBint_to_BGRAint, use_mlib=yes, use_mlib=no)
if test $use_mlib = yes; then
AC_DEFINE(USE_MEDIALIB, 1,
- [Define to 1 if medialib is available and should be used])
- MEDIA_LIB=-lmlib
-
- AC_MSG_CHECKING(for mediaLib 2.5)
- # Check for a mediaLib 2.5 function since that is what is needed for
- # gdk_rgb_convert integration.
- AC_CHECK_LIB(mlib, mlib_VideoColorRGBint_to_BGRAint, use_mlib25=yes, use_mlib25=no)
- if test $use_mlib25 = yes; then
- AC_DEFINE(USE_MEDIALIB25, 1,
- [Define to 1 if medialib 2.5 is available])
- fi
+ [Define to 1 if medialib 2.5 is available])
fi
AM_CONDITIONAL(USE_MEDIALIB, test $use_mlib = yes)
-AM_CONDITIONAL(USE_MEDIALIB25, test $use_mlib25 = yes)
# Checks to see if we should compile in MMX support (there will be
# a runtime test when the code is actually run to see if it should
@@ -916,7 +907,7 @@ if test $cross_compiling = yes; then
fi
GDK_PIXBUF_PACKAGES="gmodule-no-export-2.0 gobject-2.0 gio-2.0"
-GDK_PIXBUF_EXTRA_LIBS="$STATIC_LIB_DEPS $MATH_LIB $MEDIA_LIB"
+GDK_PIXBUF_EXTRA_LIBS="$STATIC_LIB_DEPS $MATH_LIB"
GDK_PIXBUF_EXTRA_CFLAGS=
GDK_PIXBUF_DEP_LIBS="`$PKG_CONFIG --libs $GDK_PIXBUF_PACKAGES $PNG_DEP_CFLAGS_PACKAGES` $GDK_PIXBUF_EXTRA_LIBS"
GDK_PIXBUF_DEP_CFLAGS="`$PKG_CONFIG --cflags gthread-2.0 $GDK_PIXBUF_PACKAGES $PNG_DEP_CFLAGS_PACKAGES` $GDK_PIXBUF_EXTRA_CFLAGS"
--- a/gdk-pixbuf/pixops/pixops.c
+++ b/gdk-pixbuf/pixops/pixops.c
@@ -146,6 +146,89 @@ static void pixops_medialib_scale (guchar *dest_buf,
typedef struct _mlInterp mlInterp;
+typedef mlib_image* (*ml_ImageSetStruct) (mlib_image *image,
+ mlib_type type,
+ mlib_s32 channels,
+ mlib_s32 width,
+ mlib_s32 height,
+ mlib_s32 stride,
+ const void *data);
+typedef mlib_status (*ml_ImageChannelExtract) (mlib_image *dst,
+ mlib_image *src,
+ mlib_s32 cmask);
+typedef void * (*ml_InterpTableCreate) (mlib_type type,
+ mlib_s32 width,
+ mlib_s32 height,
+ mlib_s32 leftPadding,
+ mlib_s32 topPadding,
+ mlib_s32 subsampleBitsH,
+ mlib_s32 subsampleBitsV,
+ mlib_s32 precisionBits,
+ void * dataH,
+ void * dataV);
+typedef void (*ml_InterpTableDelete) (void *);
+typedef mlib_status (*ml_ZoomTranslateTable)(mlib_image * dst,
+ mlib_image * src,
+ mlib_d64 zoomx,
+ mlib_d64 zoomy,
+ mlib_d64 tx,
+ mlib_d64 ty,
+ void *interp_table,
+ mlib_edge edge);
+typedef mlib_status (*ml_ZoomTranslate) (mlib_image * dst,
+ mlib_image * src,
+ mlib_d64 zoomx,
+ mlib_d64 zoomy,
+ mlib_d64 tx,
+ mlib_d64 ty,
+ mlib_filter filter,
+ mlib_edge edge);
+typedef mlib_status (*ml_ZoomTranslateBlend) (mlib_image *dst,
+ const mlib_image *src,
+ mlib_d64 zoomx,
+ mlib_d64 zoomy,
+ mlib_d64 tx,
+ mlib_d64 ty,
+ mlib_filter filter,
+ mlib_edge edge,
+ mlib_blend blend,
+ mlib_s32 alpha,
+ mlib_s32 cmask);
+typedef mlib_status (*ml_ZoomTranslateTableBlend) (mlib_image *dst,
+ const mlib_image *src,
+ mlib_d64 zoomx,
+ mlib_d64 zoomy,
+ mlib_d64 tx,
+ mlib_d64 ty,
+ const void *table,
+ mlib_edge edge,
+ mlib_blend blend,
+ mlib_s32 cmask);
+typedef void (*ml_ColorRGBint_to_BGRAint) (mlib_u8 *bgra,
+ const mlib_u8 *rgb,
+ const mlib_u8 *a_array,
+ mlib_u8 a_const,
+ mlib_s32 w,
+ mlib_s32 h,
+ mlib_s32 dlb,
+ mlib_s32 slb,
+ mlib_s32 alb);
+
+
+
+static ml_ImageSetStruct _medialib_ImageSetStruct = NULL;
+static ml_ImageChannelExtract _medialib_ImageChannelExtract = NULL;
+static ml_ZoomTranslate _medialib_ZoomTranslate = NULL;
+static ml_InterpTableCreate _medialib_InterpTableCreate = NULL;
+static ml_InterpTableDelete _medialib_InterpTableDelete = NULL;
+static ml_ZoomTranslateTable _medialib_ZoomTranslateTable = NULL;
+static ml_ZoomTranslateBlend _medialib_ZoomTranslateBlend = NULL;
+static ml_ZoomTranslateTableBlend _medialib_ZoomTranslateTableBlend = NULL;
+static ml_ColorRGBint_to_BGRAint _medialib_ColorRGBint_to_BGRAint = NULL;
+
+static gboolean medialib_initialized = FALSE;
+static gboolean use_medialib = TRUE;
+
struct _mlInterp
{
double tx;
@@ -154,82 +237,152 @@ struct _mlInterp
void *interp_table;
};
-static gboolean medialib_initialized = FALSE;
-static gboolean use_medialib = TRUE;
+static void *
+dlopen_mlib (void)
+{
+ void *handle = NULL;
-/*
- * Sun mediaLib(tm) support.
- *
- * http://www.sun.com/processors/vis/mlib.html
- *
- */
-static void
-_pixops_use_medialib ()
+ if ((handle = dlopen ("libmlib.so.2", RTLD_LAZY)) != NULL)
+ return handle;
+ if ((handle = dlopen ("/usr/lib/libmlib.so.2", RTLD_LAZY)) != NULL)
+ return handle;
+
+ return NULL;
+}
+
+static gboolean
+initialize_mediaLib (void *handle)
+{
+ _medialib_ImageSetStruct = (ml_ImageSetStruct)dlsym (handle,
+ "mlib_ImageSetStruct");
+ _medialib_ImageChannelExtract = (ml_ImageChannelExtract)dlsym (
+ handle,
+ "mlib_ImageChannelExtract");
+ _medialib_ZoomTranslate = (ml_ZoomTranslate)dlsym (handle,
+ "mlib_ImageZoomTranslate");
+
+ _medialib_InterpTableCreate = (ml_InterpTableCreate)dlsym (handle,
+ "mlib_ImageInterpTableCreate");
+ _medialib_InterpTableDelete = (ml_InterpTableDelete)dlsym (handle,
+ "mlib_ImageInterpTableDelete");
+ _medialib_ZoomTranslateTable = (ml_ZoomTranslateTable)dlsym (handle,
+ "mlib_ImageZoomTranslateTable");
+
+ _medialib_ZoomTranslateBlend = (ml_ZoomTranslateBlend)dlsym (handle,
+ "mlib_ImageZoomTranslateBlend");
+ _medialib_ZoomTranslateTableBlend = (ml_ZoomTranslateTableBlend)dlsym (
+ handle,
+ "mlib_ImageZoomTranslateTableBlend");
+
+ if (_medialib_ImageSetStruct == NULL || _medialib_ImageChannelExtract == NULL ||
+ _medialib_ZoomTranslate == NULL || _medialib_InterpTableCreate == NULL ||
+ _medialib_InterpTableDelete == NULL || _medialib_ZoomTranslateTable == NULL ||
+ _medialib_ZoomTranslateBlend == NULL ||
+ _medialib_ZoomTranslateTableBlend == NULL)
+ return FALSE;
+
+ return TRUE;
+}
+
+static gboolean
+mlib_x86_checks (void *handle)
{
+ typedef char * (*ml_version) (void);
+ ml_version medialib_version;
char *mlib_version_string;
- char sys_info[257];
- long count;
+ char *mlib_target_isa;
- medialib_initialized = TRUE;
-
- if (getenv ("GDK_DISABLE_MEDIALIB"))
- {
- use_medialib = FALSE;
- return;
- }
+ medialib_version = (ml_version)dlsym (handle, "mlib_version");
+ if (medialib_version == NULL)
+ return FALSE;
/*
- * The imaging functions we want to use were added in mediaLib version 2.
- * So turn off mediaLib support if the user has an older version.
* mlib_version returns a string in this format:
*
* mediaLib:0210:20011101:v8plusa
* ^^^^^^^^ ^^^^ ^^^^^^^^ ^^^^^^^
* libname vers build ISALIST identifier
* date (in this case sparcv8plus+vis)
- *
+ *
* The first 2 digits of the version are the major version. The 3rd digit
* is the minor version, and the 4th digit is the micro version. So the
- * above string corresponds to version 2.1.0. In the following test we only
- * care about the major version.
+ * above string corresponds to version 2.1.0.
*/
- mlib_version_string = mlib_version ();
+ mlib_version_string = medialib_version ();
+ mlib_target_isa = &mlib_version_string[23];
- count = sysinfo (SI_ARCHITECTURE, &sys_info[0], 257);
+ /*
+ * For x86 processors mediaLib generic C implementation
+ * does not give any performance advantage so disable it.
+ */
+ if (strncmp (mlib_target_isa, "sse", 3) != 0)
+ return FALSE;
+
+ /*
+ * For x86 processors use of libumem conflicts with
+ * mediaLib, so avoid using it.
+ */
+ if (dlsym (RTLD_PROBE, "umem_alloc") != NULL)
+ return FALSE;
+
+ return TRUE;
+}
+
+/*
+ * Sun mediaLib(tm) support.
+ *
+ * http://www.sun.com/processors/vis/mlib.html
+ *
+ */
+gboolean
+_pixops_use_medialib (void)
+{
+ void *medialib_handle = NULL;
+ char sys_info[257];
+ long count;
+ if (medialib_initialized == TRUE)
+ return TRUE;
+
+ if (use_medialib == FALSE)
+ return FALSE;
+
+ if (getenv ("GDK_DISABLE_MEDIALIB"))
+ {
+ use_medialib = FALSE;
+ return FALSE;
+ }
+
+ medialib_handle = dlopen_mlib ();
+ if (medialib_handle == NULL)
+ goto fail;
+
+ count = sysinfo (SI_ARCHITECTURE, &sys_info[0], 257);
+
if (count != -1)
{
if (strcmp (sys_info, "i386") == 0)
{
- char *mlib_target_isa = &mlib_version_string[23];
-
- /*
- * For x86 processors mediaLib generic C implementation
- * does not give any performance advantage so disable it
- */
- if (strncmp (mlib_target_isa, "sse", 3) != 0)
- {
- use_medialib = FALSE;
- return;
- }
-
- /*
- * For x86 processors use of libumem conflicts with
- * mediaLib, so avoid using it.
- */
- if (dlsym (RTLD_PROBE, "umem_alloc") != NULL)
- {
- use_medialib = FALSE;
- return;
- }
+ if (mlib_x86_checks (medialib_handle) == FALSE)
+ goto fail;
}
}
else
{
- /* Failed to get system architecture, disable mediaLib anyway */
- use_medialib = FALSE;
- return;
+ /* Failed to get system architecture, disable mediaLib */
+ goto fail;
}
+
+ if (initialize_mediaLib (medialib_handle) == FALSE)
+ goto fail;
+
+ medialib_initialized = TRUE;
+ return TRUE;
+
+fail:
+ dlclose (medialib_handle);
+ use_medialib = FALSE;
+ return FALSE;
}
#endif
@@ -1850,9 +2003,7 @@ _pixops_composite (guchar *dest_buf,
dest_region_width, dest_region_height, offset_x,
offset_y, scale_x, scale_y,
(PixopsInterpType)interp_type, overall_alpha);
- return;
-#endif
-
+#else
new_dest_buf = dest_buf + dest_y * dest_rowstride + dest_x * dest_channels;
render_x0 = dest_x - offset_x;
render_y0 = dest_y - offset_y;
@@ -1865,6 +2016,7 @@ _pixops_composite (guchar *dest_buf,
src_rowstride, src_channels, src_has_alpha, scale_x,
scale_y, (PixopsInterpType)interp_type,
overall_alpha);
+#endif
}
#ifdef USE_MEDIALIB
@@ -1967,7 +2119,7 @@ medialib_get_interpolation (mlInterp * ml_interp,
ml_interp->po_filter.y.weights[i] *= sqrt_alpha;
}
- ml_interp->interp_table = (void *) mlib_ImageInterpTableCreate (MLIB_DOUBLE,
+ ml_interp->interp_table = (void *) _medialib_InterpTableCreate (MLIB_DOUBLE,
ml_interp->po_filter.x.n, ml_interp->po_filter.y.n, leftPadding,
topPadding, SUBSAMPLE_BITS, SUBSAMPLE_BITS, 8,
ml_interp->po_filter.x.weights, ml_interp->po_filter.y.weights);
@@ -2042,25 +2194,25 @@ pixops_medialib_composite (guchar *dest_buf,
return;
}
- mlib_ImageSetStruct (&img_src, MLIB_BYTE, src_channels,
- src_width, src_height, src_rowstride, src_buf);
+ _medialib_ImageSetStruct (&img_src, MLIB_BYTE, src_channels,
+ src_width, src_height, src_rowstride, src_buf);
if (dest_x == 0 && dest_y == 0 &&
dest_width == dest_region_width &&
dest_height == dest_region_height)
{
- mlib_ImageSetStruct (&img_dest, MLIB_BYTE, dest_channels,
- dest_width, dest_height, dest_rowstride,
- dest_buf);
+ _medialib_ImageSetStruct (&img_dest, MLIB_BYTE, dest_channels,
+ dest_width, dest_height, dest_rowstride,
+ dest_buf);
}
else
{
mlib_u8 *data = dest_buf + (dest_y * dest_rowstride) +
(dest_x * dest_channels);
- mlib_ImageSetStruct (&img_dest, MLIB_BYTE, dest_channels,
- dest_region_width, dest_region_height,
- dest_rowstride, data);
+ _medialib_ImageSetStruct (&img_dest, MLIB_BYTE, dest_channels,
+ dest_region_width, dest_region_height,
+ dest_rowstride, data);
}
ml_offset_x = floor (offset_x) - dest_x;
@@ -2070,7 +2222,7 @@ pixops_medialib_composite (guchar *dest_buf,
{
blend = src_has_alpha ? MLIB_BLEND_GTK_SRC_OVER2 : MLIB_BLEND_GTK_SRC;
- mlib_ImageZoomTranslateBlend (&img_dest,
+ _medialib_ZoomTranslateBlend (&img_dest,
&img_src,
scale_x,
scale_y,
@@ -2089,7 +2241,7 @@ pixops_medialib_composite (guchar *dest_buf,
if (interp_type == PIXOPS_INTERP_BILINEAR &&
scale_x > 1.0 && scale_y > 1.0)
{
- mlib_ImageZoomTranslateBlend (&img_dest,
+ _medialib_ZoomTranslateBlend (&img_dest,
&img_src,
scale_x,
scale_y,
@@ -2108,7 +2260,7 @@ pixops_medialib_composite (guchar *dest_buf,
if (ml_interp.interp_table != NULL)
{
- mlib_ImageZoomTranslateTableBlend (&img_dest,
+ _medialib_ZoomTranslateTableBlend (&img_dest,
&img_src,
scale_x,
scale_y,
@@ -2118,7 +2270,7 @@ pixops_medialib_composite (guchar *dest_buf,
MLIB_EDGE_SRC_EXTEND_INDEF,
blend,
1);
- mlib_ImageInterpTableDelete (ml_interp.interp_table);
+ _medialib_InterpTableDelete (ml_interp.interp_table);
}
else
{
@@ -2231,12 +2383,6 @@ _pixops_scale (guchar *dest_buf,
double scale_y,
PixopsInterpType interp_type)
{
- guchar *new_dest_buf;
- int render_x0;
- int render_y0;
- int render_x1;
- int render_y1;
-
#ifdef USE_MEDIALIB
pixops_medialib_scale (dest_buf, dest_width, dest_height, dest_rowstride,
dest_channels, dest_has_alpha, src_buf, src_width,
@@ -2244,8 +2390,12 @@ _pixops_scale (guchar *dest_buf,
src_has_alpha, dest_x, dest_y, dest_region_width,
dest_region_height, offset_x, offset_y, scale_x,
scale_y, (PixopsInterpType)interp_type);
- return;
-#endif
+#else
+ guchar *new_dest_buf;
+ int render_x0;
+ int render_y0;
+ int render_x1;
+ int render_y1;
new_dest_buf = dest_buf + dest_y * dest_rowstride + dest_x * dest_channels;
render_x0 = dest_x - offset_x;
@@ -2258,6 +2408,7 @@ _pixops_scale (guchar *dest_buf,
dest_has_alpha, src_buf, src_width, src_height,
src_rowstride, src_channels, src_has_alpha,
scale_x, scale_y, (PixopsInterpType)interp_type);
+#endif
}
#ifdef USE_MEDIALIB
@@ -2290,15 +2441,6 @@ pixops_medialib_scale (guchar *dest_buf,
if (!medialib_initialized)
_pixops_use_medialib ();
- /*
- * We no longer support mediaLib 2.1 because it has a core dumping problem
- * in the mlib_ImageZoomTranslateTable function that has been corrected in
- * 2.2. Although the mediaLib_zoom function could be used, it does not
- * work properly if the source and destination images have different
- * values for "has_alpha" or "num_channels". The complicated if-logic
- * required to support both versions is not worth supporting
- * mediaLib 2.1 moving forward.
- */
if (!use_medialib)
{
_pixops_scale_real (dest_buf + dest_y * dest_rowstride + dest_x *
@@ -2317,25 +2459,25 @@ pixops_medialib_scale (guchar *dest_buf,
double ml_offset_x, ml_offset_y;
guchar *tmp_buf = NULL;
- mlib_ImageSetStruct (&img_orig_src, MLIB_BYTE, src_channels, src_width,
- src_height, src_rowstride, src_buf);
+ _medialib_ImageSetStruct (&img_orig_src, MLIB_BYTE, src_channels, src_width,
+ src_height, src_rowstride, src_buf);
if (dest_x == 0 && dest_y == 0 &&
dest_width == dest_region_width &&
dest_height == dest_region_height)
{
- mlib_ImageSetStruct (&img_dest, MLIB_BYTE, dest_channels,
- dest_width, dest_height, dest_rowstride,
- dest_buf);
+ _medialib_ImageSetStruct (&img_dest, MLIB_BYTE, dest_channels,
+ dest_width, dest_height, dest_rowstride,
+ dest_buf);
}
else
{
mlib_u8 *data = dest_buf + (dest_y * dest_rowstride) +
(dest_x * dest_channels);
- mlib_ImageSetStruct (&img_dest, MLIB_BYTE, dest_channels,
- dest_region_width, dest_region_height,
- dest_rowstride, data);
+ _medialib_ImageSetStruct (&img_dest, MLIB_BYTE, dest_channels,
+ dest_region_width, dest_region_height,
+ dest_rowstride, data);
}
ml_offset_x = floor (offset_x) - dest_x;
@@ -2373,10 +2515,10 @@ pixops_medialib_scale (guchar *dest_buf,
src_channels = channels;
src_rowstride = rowstride;
- mlib_ImageSetStruct (&img_src, MLIB_BYTE, src_channels,
- src_width, src_height, src_rowstride,
- tmp_buf);
- mlib_ImageChannelExtract (&img_src, &img_orig_src, 0xE);
+ _medialib_ImageSetStruct (&img_src, MLIB_BYTE, src_channels,
+ src_width, src_height, src_rowstride,
+ tmp_buf);
+ _medialib_ImageChannelExtract (&img_src, &img_orig_src, 0xE);
}
}
}
@@ -2385,7 +2527,7 @@ pixops_medialib_scale (guchar *dest_buf,
{
if (src_channels == dest_channels)
{
- mlib_ImageZoomTranslate (&img_dest,
+ _medialib_ZoomTranslate (&img_dest,
&img_src,
scale_x,
scale_y,
@@ -2396,7 +2538,7 @@ pixops_medialib_scale (guchar *dest_buf,
}
else
{
- mlib_ImageZoomTranslateBlend (&img_dest,
+ _medialib_ZoomTranslateBlend (&img_dest,
&img_src,
scale_x,
scale_y,
@@ -2414,7 +2556,7 @@ pixops_medialib_scale (guchar *dest_buf,
if (interp_type == PIXOPS_INTERP_BILINEAR &&
scale_x > 1.0 && scale_y > 1.0)
{
- mlib_ImageZoomTranslate (&img_dest,
+ _medialib_ZoomTranslate (&img_dest,
&img_src,
scale_x,
scale_y,
@@ -2430,7 +2572,7 @@ pixops_medialib_scale (guchar *dest_buf,
if (ml_interp.interp_table != NULL)
{
- mlib_ImageZoomTranslateTable (&img_dest,
+ _medialib_ZoomTranslateTable (&img_dest,
&img_src,
scale_x,
scale_y,
@@ -2439,7 +2581,7 @@ pixops_medialib_scale (guchar *dest_buf,
ml_interp.interp_table,
MLIB_EDGE_SRC_EXTEND_INDEF);
- mlib_ImageInterpTableDelete (ml_interp.interp_table);
+ _medialib_InterpTableDelete (ml_interp.interp_table);
}
else
{
@@ -2461,7 +2603,7 @@ pixops_medialib_scale (guchar *dest_buf,
break;
}
- mlib_ImageZoomTranslate (&img_dest,
+ _medialib_ZoomTranslate (&img_dest,
&img_src,
scale_x,
scale_y,
@@ -2477,7 +2619,7 @@ pixops_medialib_scale (guchar *dest_buf,
else if (interp_type == PIXOPS_INTERP_BILINEAR &&
scale_x > 1.0 && scale_y > 1.0)
{
- mlib_ImageZoomTranslateBlend (&img_dest,
+ _medialib_ZoomTranslateBlend (&img_dest,
&img_src,
scale_x,
scale_y,
@@ -2496,7 +2638,7 @@ pixops_medialib_scale (guchar *dest_buf,
if (ml_interp.interp_table != NULL)
{
- mlib_ImageZoomTranslateTableBlend (&img_dest,
+ _medialib_ZoomTranslateTableBlend (&img_dest,
&img_src,
scale_x,
scale_y,
@@ -2506,7 +2648,7 @@ pixops_medialib_scale (guchar *dest_buf,
MLIB_EDGE_SRC_EXTEND_INDEF,
MLIB_BLEND_GTK_SRC,
1);
- mlib_ImageInterpTableDelete (ml_interp.interp_table);
+ _medialib_InterpTableDelete (ml_interp.interp_table);
}
else
{
@@ -2517,7 +2659,7 @@ pixops_medialib_scale (guchar *dest_buf,
case PIXOPS_INTERP_BILINEAR:
ml_filter = MLIB_BILINEAR;
break;
-
+
case PIXOPS_INTERP_TILES:
ml_filter = MLIB_BILINEAR;
break;
@@ -2527,7 +2669,7 @@ pixops_medialib_scale (guchar *dest_buf,
break;
}
- mlib_ImageZoomTranslate (&img_dest,
+ _medialib_ZoomTranslate (&img_dest,
&img_src,
scale_x,
scale_y,