--- ../../../temp/cairo-0.5.0/src/cairo-win32-surface.c 2005-05-12 02:59:13.000000000 +0000 +++ cairo/src/cairo-win32-surface.c 2005-07-22 15:07:16.713115200 +0000 @@ -509,12 +509,48 @@ _cairo_win32_surface_release_dest_image SRCCOPY)) _cairo_win32_print_gdi_error ("_cairo_win32_surface_release_dest_image"); cairo_surface_destroy ((cairo_surface_t *)local); } +// AlphaBlend is not available or useable on older versions of Win32 + +/* for compatibility with VC++ 5 */ +#if !defined(AC_SRC_OVER) +#define AC_SRC_OVER 0x00 +#pragma pack(1) +typedef struct { + BYTE BlendOp; + BYTE BlendFlags; + BYTE SourceConstantAlpha; + BYTE AlphaFormat; +}BLENDFUNCTION; +#pragma pack() +#endif + +/* for compatibility with VC++ 6 */ +#ifndef AC_SRC_ALPHA +#define AC_SRC_ALPHA 0x01 +#endif + +typedef BOOL (WINAPI *ALPHABLENDPROC)( + HDC hdcDest, + int nXOriginDest, + int nYOriginDest, + int nWidthDest, + int hHeightDest, + HDC hdcSrc, + int nXOriginSrc, + int nYOriginSrc, + int nWidthSrc, + int nHeightSrc, + BLENDFUNCTION blendFunction); + +static unsigned gAlphaBlendChecked = FALSE; +static ALPHABLENDPROC gAlphaBlend; + static cairo_int_status_t _cairo_win32_surface_composite (cairo_operator_t operator, cairo_pattern_t *pattern, cairo_pattern_t *mask_pattern, void *abstract_dst, int src_x, @@ -530,12 +566,27 @@ _cairo_win32_surface_composite (cairo_op cairo_win32_surface_t *src; cairo_surface_pattern_t *src_surface_pattern; int alpha; int integer_transform; int itx, ity; + if (!gAlphaBlendChecked) { + OSVERSIONINFO os; + + os.dwOSVersionInfoSize = sizeof(os); + GetVersionEx(&os); + // If running on Win98, disable using AlphaBlend() + // to avoid Win98 AlphaBlend() bug + if (VER_PLATFORM_WIN32_WINDOWS != os.dwPlatformId || + os.dwMajorVersion != 4 || os.dwMinorVersion != 10) { + gAlphaBlend = (ALPHABLENDPROC)GetProcAddress(LoadLibrary("msimg32"), + "AlphaBlend"); + } + gAlphaBlendChecked = TRUE; + } + if (pattern->type != CAIRO_PATTERN_SURFACE || pattern->extend != CAIRO_EXTEND_NONE) return CAIRO_INT_STATUS_UNSUPPORTED; if (mask_pattern) { /* FIXME: When we fully support RENDER style 4-channel @@ -584,13 +635,16 @@ _cairo_win32_surface_composite (cairo_op blend_function.BlendOp = AC_SRC_OVER; blend_function.BlendFlags = 0; blend_function.SourceConstantAlpha = alpha; blend_function.AlphaFormat = src->format == CAIRO_FORMAT_ARGB32 ? AC_SRC_ALPHA : 0; - if (!AlphaBlend (dst->dc, + if (!gAlphaBlend) + return CAIRO_INT_STATUS_UNSUPPORTED; + + if (!gAlphaBlend(dst->dc, dst_x, dst_y, width, height, src->dc, src_x + itx, src_y + ity, width, height, blend_function))