diff options
Diffstat (limited to 'gdk/win32/gdkdrawable-win32.c')
-rw-r--r-- | gdk/win32/gdkdrawable-win32.c | 117 |
1 files changed, 88 insertions, 29 deletions
diff --git a/gdk/win32/gdkdrawable-win32.c b/gdk/win32/gdkdrawable-win32.c index fb347c4cad..514172095e 100644 --- a/gdk/win32/gdkdrawable-win32.c +++ b/gdk/win32/gdkdrawable-win32.c @@ -203,26 +203,27 @@ gdk_draw_arc (GdkDrawable *drawable, if (height == -1) height = drawable_private->height; - hdc = gdk_gc_predraw (drawable_private, gc_private); - - nXStartArc = x + width/2 + (int) (sin(angle1/64.*M_TWOPI)*width); - nYStartArc = y + height/2 + (int) (cos(angle1/64.*M_TWOPI)*height); - nXEndArc = x + width/2 + (int) (sin(angle2/64.*M_TWOPI)*width); - nYEndArc = y + height/2 + (int) (cos(angle2/64.*M_TWOPI)*height); - - if (filled) + if (width != 0 && height != 0) { - if (!Pie (hdc, x, y, x+width, y+height, - nXStartArc, nYStartArc, nXEndArc, nYEndArc)) - g_warning ("gdk_draw_arc: Pie failed"); - } - else - { - if (!Arc (hdc, x, y, x+width, y+height, - nXStartArc, nYStartArc, nXEndArc, nYEndArc)) - g_warning ("gdk_draw_arc: Arc failed"); + hdc = gdk_gc_predraw (drawable_private, gc_private); + + nXStartArc = x + width/2 + (int) (sin(angle1/64.*M_TWOPI)*width); + nYStartArc = y + height/2 + (int) (cos(angle1/64.*M_TWOPI)*height); + nXEndArc = x + width/2 + (int) (sin(angle2/64.*M_TWOPI)*width); + nYEndArc = y + height/2 + (int) (cos(angle2/64.*M_TWOPI)*height); + + if (filled) + { + Pie (hdc, x, y, x+width, y+height, + nXStartArc, nYStartArc, nXEndArc, nYEndArc); + } + else + { + Arc (hdc, x, y, x+width, y+height, + nXStartArc, nYStartArc, nXEndArc, nYEndArc); + } + gdk_gc_postdraw (drawable_private, gc_private); } - gdk_gc_postdraw (drawable_private, gc_private); } void @@ -246,13 +247,16 @@ gdk_draw_polygon (GdkDrawable *drawable, return; gc_private = (GdkGCPrivate*) gc; - hdc = gdk_gc_predraw (drawable_private, gc_private); - pts = g_malloc ((npoints+1) * sizeof (POINT)); - GDK_NOTE (MISC, g_print ("gdk_draw_polygon: %#x (%d) %d\n", drawable_private->xwindow, gc_private, npoints)); + if (npoints < 2) + return; + + hdc = gdk_gc_predraw (drawable_private, gc_private); + pts = g_malloc ((npoints+1) * sizeof (POINT)); + for (i = 0; i < npoints; i++) { pts[i].x = points[i].x; @@ -424,6 +428,8 @@ gdk_draw_pixmap (GdkDrawable *drawable, HDC hdc; HDC srcdc; HGDIOBJ hgdiobj; + HRGN src_rgn, draw_rgn, outside_rgn; + RECT r; g_return_if_fail (drawable != NULL); g_return_if_fail (src != NULL); @@ -436,17 +442,70 @@ gdk_draw_pixmap (GdkDrawable *drawable, gc_private = (GdkGCPrivate*) gc; if (width == -1) - width = src_private->width; + width = src_private->width; /* Or should we subtract xsrc? */ if (height == -1) - height = src_private->height; - - hdc = gdk_gc_predraw (drawable_private, gc_private); + height = src_private->height; /* Ditto? */ GDK_NOTE (MISC, g_print ("gdk_draw_pixmap: dest: %#x destdc: (%d) %#x " - "src: %#x %dx%d@+%d+%d\n", + "src: %#x %dx%d@+%d+%d" + " dest: %#x @+%d+%d\n", drawable_private->xwindow, gc_private, hdc, src_private->xwindow, - width, height, xdest, ydest)); + width, height, xsrc, ysrc, + drawable_private->xwindow, xdest, ydest)); + + hdc = gdk_gc_predraw (drawable_private, gc_private); + + src_rgn = CreateRectRgn (0, 0, src_private->width + 1, src_private->height + 1); + draw_rgn = CreateRectRgn (xsrc, ysrc, xsrc + width + 1, ysrc + height + 1); + SetRectEmpty (&r); + outside_rgn = CreateRectRgnIndirect (&r); + + if (drawable_private->window_type != GDK_WINDOW_PIXMAP) + { + /* If we are drawing on a window, calculate the region that is + * outside the source pixmap, and invalidate that, causing it to + * be cleared. XXX + */ + if (CombineRgn (outside_rgn, draw_rgn, src_rgn, RGN_DIFF) != NULLREGION) + { + OffsetRgn (outside_rgn, xdest, ydest); + GDK_NOTE (MISC, (GetRgnBox (outside_rgn, &r), + g_print ("...calling InvalidateRgn, " + "bbox: %dx%d@+%d+%d\n", + r.right - r.left - 1, r.bottom - r.top - 1, + r.left, r.top))); + InvalidateRgn (drawable_private->xwindow, outside_rgn, TRUE); + } + } + +#if 1 /* Don't know if this is necessary */ + if (CombineRgn (draw_rgn, draw_rgn, src_rgn, RGN_AND) == COMPLEXREGION) + g_warning ("gdk_draw_pixmap: CombineRgn returned a COMPLEXREGION"); + + GetRgnBox (draw_rgn, &r); + if (r.left != xsrc + || r.top != ysrc + || r.right != xsrc + width + 1 + || r.bottom != ysrc + height + 1) + { + xdest += r.left - xsrc; + xsrc = r.left; + ydest += r.top - ysrc; + ysrc = r.top; + width = r.right - xsrc - 1; + height = r.bottom - ysrc - 1; + + GDK_NOTE (MISC, g_print ("... restricted to src: %dx%d@+%d+%d, " + "dest: @+%d+%d\n", + width, height, xsrc, ysrc, + xdest, ydest)); + } +#endif + + DeleteObject (src_rgn); + DeleteObject (draw_rgn); + DeleteObject (outside_rgn); /* Strangely enough, this function is called also to bitblt * from a window. @@ -602,7 +661,7 @@ gdk_draw_lines (GdkDrawable *drawable, POINT *pts; int i; - if (npoints <= 0) + if (npoints < 2) return; g_return_if_fail (drawable != NULL); @@ -623,7 +682,7 @@ gdk_draw_lines (GdkDrawable *drawable, } if (!Polyline (hdc, pts, npoints)) - g_warning ("gdk_draw_lines: Polyline failed"); + g_warning ("gdk_draw_lines: Polyline(,,%d) failed", npoints); g_free (pts); |