Fix build breakage on Windows caused by the region changes

Patches by Sam Thursfield, from bug #623476.
This commit is contained in:
Tor Lillqvist 2010-07-05 12:56:02 +03:00
parent 1ac5011873
commit 34e8bd9dba
6 changed files with 54 additions and 47 deletions

View File

@ -512,14 +512,14 @@ generic_draw (GdkDrawable *drawable,
const GdkGCValuesMask blitting_mask = 0; const GdkGCValuesMask blitting_mask = 0;
GdkGCValuesMask drawing_mask = GDK_GC_FOREGROUND; GdkGCValuesMask drawing_mask = GDK_GC_FOREGROUND;
gint ts_x_origin = 0, ts_y_origin = 0; gint ts_x_origin = 0, ts_y_origin = 0;
cairo_rectangle_int_t region_extents;
gint width = region->extents.x2 - region->extents.x1; cairo_region_get_extents (region, &region_extents);
gint height = region->extents.y2 - region->extents.y1;
GdkPixmap *mask_pixmap = GdkPixmap *mask_pixmap =
gdk_pixmap_new (drawable, width, height, 1); gdk_pixmap_new (drawable, region_extents.width, region_extents.height, 1);
GdkPixmap *tile_pixmap = GdkPixmap *tile_pixmap =
gdk_pixmap_new (drawable, width, height, -1); gdk_pixmap_new (drawable, region_extents.width, region_extents.height, -1);
GdkPixmap *stipple_bitmap = NULL; GdkPixmap *stipple_bitmap = NULL;
GdkColor fg; GdkColor fg;
@ -542,13 +542,13 @@ generic_draw (GdkDrawable *drawable,
if (gcwin32->values_mask & GDK_GC_TS_Y_ORIGIN) if (gcwin32->values_mask & GDK_GC_TS_Y_ORIGIN)
ts_y_origin = gc->ts_y_origin; ts_y_origin = gc->ts_y_origin;
ts_x_origin -= region->extents.x1; ts_x_origin -= region_extents.x;
ts_y_origin -= region->extents.y1; ts_y_origin -= region_extents.y;
/* Fill mask bitmap with zeros */ /* Fill mask bitmap with zeros */
gdk_gc_set_function (mask_gc, GDK_CLEAR); gdk_gc_set_function (mask_gc, GDK_CLEAR);
gdk_draw_rectangle (mask_pixmap, mask_gc, TRUE, gdk_draw_rectangle (mask_pixmap, mask_gc, TRUE,
0, 0, width, height); 0, 0, region_extents.width, region_extents.height);
/* Paint into mask bitmap, drawing ones */ /* Paint into mask bitmap, drawing ones */
gdk_gc_set_function (mask_gc, GDK_COPY); gdk_gc_set_function (mask_gc, GDK_COPY);
@ -575,7 +575,7 @@ generic_draw (GdkDrawable *drawable,
mask_hdc = gdk_win32_hdc_get (mask_pixmap, mask_gc, drawing_mask); mask_hdc = gdk_win32_hdc_get (mask_pixmap, mask_gc, drawing_mask);
(*function) (GDK_GC_WIN32 (mask_gc), mask_hdc, (*function) (GDK_GC_WIN32 (mask_gc), mask_hdc,
region->extents.x1, region->extents.y1, args); region_extents.x, region_extents.y, args);
gdk_win32_hdc_release (mask_pixmap, mask_gc, drawing_mask); gdk_win32_hdc_release (mask_pixmap, mask_gc, drawing_mask);
if (fill_style == GDK_TILED) if (fill_style == GDK_TILED)
@ -584,21 +584,22 @@ generic_draw (GdkDrawable *drawable,
draw_tiles (tile_pixmap, tile_gc, SRCCOPY, draw_tiles (tile_pixmap, tile_gc, SRCCOPY,
_gdk_gc_get_tile (gc), _gdk_gc_get_tile (gc),
0, 0, ts_x_origin, ts_y_origin, 0, 0, ts_x_origin, ts_y_origin,
width, height); region_extents.width, region_extents.height);
} }
else else
{ {
/* Tile with stipple */ /* Tile with stipple */
GdkGC *stipple_gc; GdkGC *stipple_gc;
stipple_bitmap = gdk_pixmap_new (NULL, width, height, 1); stipple_bitmap =
gdk_pixmap_new (NULL, region_extents.width, region_extents.height, 1);
stipple_gc = gdk_gc_new (stipple_bitmap); stipple_gc = gdk_gc_new (stipple_bitmap);
/* Tile stipple bitmap */ /* Tile stipple bitmap */
draw_tiles (stipple_bitmap, stipple_gc, SRCCOPY, draw_tiles (stipple_bitmap, stipple_gc, SRCCOPY,
_gdk_gc_get_stipple (gc), _gdk_gc_get_stipple (gc),
0, 0, ts_x_origin, ts_y_origin, 0, 0, ts_x_origin, ts_y_origin,
width, height); region_extents.width, region_extents.height);
if (fill_style == GDK_OPAQUE_STIPPLED) if (fill_style == GDK_OPAQUE_STIPPLED)
{ {
@ -606,7 +607,8 @@ generic_draw (GdkDrawable *drawable,
fg.pixel = _gdk_gc_get_bg_pixel (gc); fg.pixel = _gdk_gc_get_bg_pixel (gc);
gdk_gc_set_foreground (tile_gc, &fg); gdk_gc_set_foreground (tile_gc, &fg);
gdk_draw_rectangle (tile_pixmap, tile_gc, TRUE, gdk_draw_rectangle (tile_pixmap, tile_gc, TRUE,
0, 0, width, height); 0, 0,
region_extents.width, region_extents.height);
} }
g_object_unref (stipple_gc); g_object_unref (stipple_gc);
} }
@ -662,14 +664,18 @@ generic_draw (GdkDrawable *drawable,
* Reading bottom-up: 11100010 = 0xE2. PSDK docs say this is * Reading bottom-up: 11100010 = 0xE2. PSDK docs say this is
* known as DSPDxax, with hex value 0x00E20746. * known as DSPDxax, with hex value 0x00E20746.
*/ */
GDI_CALL (BitBlt, (tile_hdc, 0, 0, width, height, GDI_CALL (BitBlt, (tile_hdc, 0, 0,
stipple_hdc, 0, 0, ROP3_DSPDxax)); region_extents.width, region_extents.height,
stipple_hdc, 0, 0,
ROP3_DSPDxax));
if (fill_style == GDK_STIPPLED) if (fill_style == GDK_STIPPLED)
{ {
/* Punch holes in mask where stipple is zero */ /* Punch holes in mask where stipple is zero */
GDI_CALL (BitBlt, (mask_hdc, 0, 0, width, height, GDI_CALL (BitBlt, (mask_hdc, 0, 0,
stipple_hdc, 0, 0, SRCAND)); region_extents.width, region_extents.height,
stipple_hdc, 0, 0,
SRCAND));
} }
GDI_CALL (SelectObject, (tile_hdc, old_tile_brush)); GDI_CALL (SelectObject, (tile_hdc, old_tile_brush));
@ -683,8 +689,8 @@ generic_draw (GdkDrawable *drawable,
* the areas where mask is one. (It is filled with said pattern.) * the areas where mask is one. (It is filled with said pattern.)
*/ */
GDI_CALL (MaskBlt, (hdc, region->extents.x1, region->extents.y1, GDI_CALL (MaskBlt, (hdc, region_extents.x, region_extents.y,
width, height, region_extents.width, region_extents.height,
tile_hdc, 0, 0, tile_hdc, 0, 0,
GDK_PIXMAP_HBITMAP (mask_pixmap), 0, 0, GDK_PIXMAP_HBITMAP (mask_pixmap), 0, 0,
MAKEROP4 (rop2_to_rop3 (gcwin32->rop2), ROP3_D))); MAKEROP4 (rop2_to_rop3 (gcwin32->rop2), ROP3_D)));

View File

@ -543,9 +543,9 @@ gdk_win32_gc_set_dashes (GdkGC *gc,
} }
void void
_gdk_windowing_gc_set_clip_region (GdkGC *gc, _gdk_windowing_gc_set_clip_region (GdkGC *gc,
const cairo_region_t *region, const cairo_region_t *region,
gboolean reset_origin) gboolean reset_origin)
{ {
GdkGCWin32 *win32_gc = GDK_GC_WIN32 (gc); GdkGCWin32 *win32_gc = GDK_GC_WIN32 (gc);
@ -556,9 +556,9 @@ _gdk_windowing_gc_set_clip_region (GdkGC *gc,
{ {
GDK_NOTE (GC, g_print ("gdk_gc_set_clip_region: %p: %s\n", GDK_NOTE (GC, g_print ("gdk_gc_set_clip_region: %p: %s\n",
win32_gc, win32_gc,
_gdk_win32_gdkregion_to_string (region))); _gdk_win32_cairo_region_to_string (region)));
win32_gc->hcliprgn = _gdk_win32_gdkregion_to_hrgn (region, 0, 0); win32_gc->hcliprgn = _gdk_win32_cairo_region_to_hrgn (region, 0, 0);
win32_gc->values_mask |= GDK_GC_CLIP_MASK; win32_gc->values_mask |= GDK_GC_CLIP_MASK;
} }
else else
@ -1055,16 +1055,16 @@ _gdk_win32_bitmap_to_hrgn (GdkPixmap *pixmap)
} }
HRGN HRGN
_gdk_win32_gdkregion_to_hrgn (const cairo_region_t *region, _gdk_win32_cairo_region_to_hrgn (const cairo_region_t *region,
gint x_origin, gint x_origin,
gint y_origin) gint y_origin)
{ {
HRGN hrgn; HRGN hrgn;
RGNDATA *rgndata; RGNDATA *rgndata;
RECT *rect; RECT *rect;
cairo_region_tBox *boxes = region->rects; cairo_rectangle_int_t cairo_rect;
guint nbytes = guint nbytes = sizeof (RGNDATAHEADER)
sizeof (RGNDATAHEADER) + (sizeof (RECT) * region->numRects); + (sizeof (RECT) * cairo_region_num_rectangles (region));
int i; int i;
rgndata = g_malloc (nbytes); rgndata = g_malloc (nbytes);
@ -1074,14 +1074,15 @@ _gdk_win32_gdkregion_to_hrgn (const cairo_region_t *region,
SetRect (&rgndata->rdh.rcBound, SetRect (&rgndata->rdh.rcBound,
G_MAXLONG, G_MAXLONG, G_MINLONG, G_MINLONG); G_MAXLONG, G_MAXLONG, G_MINLONG, G_MINLONG);
for (i = 0; i < region->numRects; i++) for (i = 0; i < cairo_region_num_rectangles (region); i++)
{ {
rect = ((RECT *) rgndata->Buffer) + rgndata->rdh.nCount++; rect = ((RECT *) rgndata->Buffer) + rgndata->rdh.nCount++;
cairo_region_get_rectangle (region, i, &cairo_rect);
rect->left = boxes[i].x1 + x_origin; rect->left = cairo_rect.x + x_origin;
rect->right = boxes[i].x2 + x_origin; rect->right = cairo_rect.x + cairo_rect.width + x_origin;
rect->top = boxes[i].y1 + y_origin; rect->top = cairo_rect.y + y_origin;
rect->bottom = boxes[i].y2 + y_origin; rect->bottom = cairo_rect.y + cairo_rect.height + y_origin;
if (rect->left < rgndata->rdh.rcBound.left) if (rect->left < rgndata->rdh.rcBound.left)
rgndata->rdh.rcBound.left = rect->left; rgndata->rdh.rcBound.left = rect->left;

View File

@ -282,7 +282,7 @@ gdk_window_post_scroll (GdkWindow *window,
{ {
GDK_NOTE (EVENTS, GDK_NOTE (EVENTS,
g_print ("gdk_window_clip_changed: invalidating region: %s\n", g_print ("gdk_window_clip_changed: invalidating region: %s\n",
_gdk_win32_gdkregion_to_string (new_clip_region))); _gdk_win32_cairo_region_to_string (new_clip_region)));
gdk_window_invalidate_region (window, new_clip_region, FALSE); gdk_window_invalidate_region (window, new_clip_region, FALSE);
g_print ("gdk_window_post_scroll\n"); g_print ("gdk_window_post_scroll\n");

View File

@ -517,7 +517,6 @@ _gdk_win32_gcvalues_mask_to_string (GdkGCValuesMask mask)
BIT (FOREGROUND); BIT (FOREGROUND);
BIT (BACKGROUND); BIT (BACKGROUND);
BIT (FONT);
BIT (FUNCTION); BIT (FUNCTION);
BIT (FILL); BIT (FILL);
BIT (TILE); BIT (TILE);
@ -1158,12 +1157,13 @@ _gdk_win32_gdkrectangle_to_string (const GdkRectangle *rect)
} }
gchar * gchar *
_gdk_win32_gdkregion_to_string (const cairo_region_t *rgn) _gdk_win32_cairo_region_to_string (const cairo_region_t *rgn)
{ {
cairo_rectangle_int_t extents;
cairo_region_get_extents (rgn, &extents);
return static_printf ("%dx%d@%+d%+d", return static_printf ("%dx%d@%+d%+d",
(rgn->extents.x2 - rgn->extents.x1), extents.width, extents.height,
(rgn->extents.y2 - rgn->extents.y1), extents.x, extents.y);
rgn->extents.x1, rgn->extents.y1);
} }
gchar * gchar *

View File

@ -267,9 +267,9 @@ COLORREF _gdk_win32_colormap_color (GdkColormap *colormap,
HRGN _gdk_win32_bitmap_to_hrgn (GdkPixmap *bitmap); HRGN _gdk_win32_bitmap_to_hrgn (GdkPixmap *bitmap);
HRGN _gdk_win32_gdkregion_to_hrgn (const cairo_region_t *region, HRGN _gdk_win32_cairo_region_to_hrgn (const cairo_region_t *region,
gint x_origin, gint x_origin,
gint y_origin); gint y_origin);
cairo_region_t *_gdk_win32_hrgn_to_region (HRGN hrgn); cairo_region_t *_gdk_win32_hrgn_to_region (HRGN hrgn);
@ -321,7 +321,7 @@ gchar *_gdk_win32_data_to_string (const guchar*data,
gchar *_gdk_win32_rect_to_string (const RECT *rect); gchar *_gdk_win32_rect_to_string (const RECT *rect);
gchar *_gdk_win32_gdkrectangle_to_string (const GdkRectangle *rect); gchar *_gdk_win32_gdkrectangle_to_string (const GdkRectangle *rect);
gchar *_gdk_win32_gdkregion_to_string (const cairo_region_t *box); gchar *_gdk_win32_cairo_region_to_string (const cairo_region_t *box);
void _gdk_win32_print_event (const GdkEvent *event); void _gdk_win32_print_event (const GdkEvent *event);

View File

@ -3149,7 +3149,7 @@ gdk_win32_window_shape_combine_region (GdkWindow *window,
{ {
HRGN hrgn; HRGN hrgn;
hrgn = _gdk_win32_gdkregion_to_hrgn (shape_region, 0, 0); hrgn = _gdk_win32_cairo_region_to_hrgn (shape_region, 0, 0);
GDK_NOTE (MISC, g_print ("gdk_win32_window_shape_combine_region: %p: %p\n", GDK_NOTE (MISC, g_print ("gdk_win32_window_shape_combine_region: %p: %p\n",
GDK_WINDOW_HWND (window), GDK_WINDOW_HWND (window),
@ -3269,11 +3269,11 @@ static gboolean
_gdk_win32_window_queue_antiexpose (GdkWindow *window, _gdk_win32_window_queue_antiexpose (GdkWindow *window,
cairo_region_t *area) cairo_region_t *area)
{ {
HRGN hrgn = _gdk_win32_gdkregion_to_hrgn (area, 0, 0); HRGN hrgn = _gdk_win32_cairo_region_to_hrgn (area, 0, 0);
GDK_NOTE (EVENTS, g_print ("_gdk_windowing_window_queue_antiexpose: ValidateRgn %p %s\n", GDK_NOTE (EVENTS, g_print ("_gdk_windowing_window_queue_antiexpose: ValidateRgn %p %s\n",
GDK_WINDOW_HWND (window), GDK_WINDOW_HWND (window),
_gdk_win32_gdkregion_to_string (area))); _gdk_win32_cairo_region_to_string (area)));
ValidateRgn (GDK_WINDOW_HWND (window), hrgn); ValidateRgn (GDK_WINDOW_HWND (window), hrgn);
@ -3306,7 +3306,7 @@ _gdk_win32_window_queue_translation (GdkWindow *window,
else if (ret != NULLREGION) else if (ret != NULLREGION)
{ {
/* Get current updateregion, move any part of it that intersects area by dx,dy */ /* Get current updateregion, move any part of it that intersects area by dx,dy */
HRGN update = _gdk_win32_gdkregion_to_hrgn (area, 0, 0); HRGN update = _gdk_win32_cairo_region_to_hrgn (area, 0, 0);
ret = CombineRgn (update, hrgn, update, RGN_AND); ret = CombineRgn (update, hrgn, update, RGN_AND);
if (ret == ERROR) if (ret == ERROR)
WIN32_API_FAILED ("CombineRgn"); WIN32_API_FAILED ("CombineRgn");