gfx/cairo/wince-fixes.patch
author Benjamin Smedberg <benjamin@smedbergs.us>
Tue, 15 Dec 2009 20:33:05 -0500
changeset 36280 7f78246faad942dbb4157e994d3a1634f23dda5f
parent 22248 3ba7d5a29839fb5cc73c2a63c3bc3306a3fdc466
permissions -rw-r--r--
Electrolysis-plugin-only bookkeeping commit.

diff --git a/gfx/cairo/cairo/src/cairo-win32-private.h b/gfx/cairo/cairo/src/cairo-win32-private.h
--- a/gfx/cairo/cairo/src/cairo-win32-private.h
+++ b/gfx/cairo/cairo/src/cairo-win32-private.h
@@ -194,4 +194,22 @@
 cairo_bool_t
 _cairo_win32_scaled_font_is_bitmap (cairo_scaled_font_t *scaled_font);
 
+#ifdef WINCE
+
+// These are the required stubs for windows mobile
+#define ETO_GLYPH_INDEX 0
+#define ETO_PDY 0
+#define HALFTONE COLORONCOLOR
+#define GM_ADVANCED 2
+#define MWT_IDENTITY 1
+
+inline int SetGraphicsMode(HDC hdc, int iMode) {return 1;}
+inline int GetGraphicsMode(HDC hdc)            {return 1;} /*GM_COMPATIBLE*/
+inline void GdiFlush()                         {}
+inline BOOL SetWorldTransform(HDC hdc, CONST XFORM *lpXform) { return FALSE; }
+inline BOOL GetWorldTransform(HDC hdc, LPXFORM lpXform )     { return FALSE; }
+inline BOOL ModifyWorldTransform(HDC hdc, CONST XFORM * lpxf, DWORD mode) { return 1; }
+
+#endif
+
 #endif /* CAIRO_WIN32_PRIVATE_H */
diff --git a/gfx/cairo/cairo/src/cairo-win32-surface.c b/gfx/cairo/cairo/src/cairo-win32-surface.c
--- a/gfx/cairo/cairo/src/cairo-win32-surface.c
+++ b/gfx/cairo/cairo/src/cairo-win32-surface.c
@@ -1591,8 +1591,25 @@
 		return _cairo_error (CAIRO_STATUS_NO_MEMORY);
 
 	    /* AND the new region into our DC */
+
+#ifndef WINCE
 	    if (ExtSelectClipRgn (surface->dc, gdi_region, RGN_AND) == ERROR)
 		status = _cairo_win32_print_gdi_error ("_cairo_win32_surface_set_clip_region");
+#else
+	    // The ExtSelectClipRgn function combines the specified
+	    // region with the current clipping region using the
+	    // specified mode.  Here we do similar using basic 
+	    // functions available on WINCE.
+	    {
+	      HRGN currentClip, newClip;
+	      GetClipRgn(surface->dc, &currentClip);
+	      
+	      if (CombineRgn(newClip, currentClip, gdi_region, RGN_AND) != ERROR) {
+	        SelectClipRgn(surface->dc, newClip);
+	        DeleteObject(newClip);
+	      }
+	    }
+#endif
 
 	    DeleteObject (gdi_region);
 	}
@@ -1629,7 +1646,7 @@
 				  cairo_scaled_font_t	*scaled_font,
 				  int			*remaining_glyphs)
 {
-#if CAIRO_HAS_WIN32_FONT
+#if defined(CAIRO_HAS_WIN32_FONT) && !defined(WINCE)
     cairo_win32_surface_t *dst = surface;
 
     WORD glyph_buf_stack[STACK_GLYPH_SIZE];