From: Simon Tatham Date: Sat, 23 Apr 2005 17:09:19 +0000 (+0000) Subject: Simplify clip region handling under Windows, which also makes Solo's X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ian/git?p=sgt-puzzles.git;a=commitdiff_plain;h=c7085f0ffb980798894d6aedd8adc2fdf5337132 Simplify clip region handling under Windows, which also makes Solo's clipping policy work properly. I haven't proved why it didn't work the previous way, but I have a good guess: I think that clip regions are handled by reference. So I saved the old clip region out of the DC, then did an IntersectClipRect, and then selected the old clip region back in again - but the old clip region had never been _de_-selected, because IntersectClipRect didn't change which object was selected but rather it modified-in-place the one that already was selected. So my attempt to restore the old clip region did nothing whatsoever, and thus clipping to two different rectangles during the same draw sequence failed. Now I'm completely destroying the clip region during unclip(), which seems to work better. [originally from svn r5662] --- diff --git a/windows.c b/windows.c index 127311e..bf7c210 100644 --- a/windows.c +++ b/windows.c @@ -154,18 +154,12 @@ void frontend_default_colour(frontend *fe, float *output) void clip(frontend *fe, int x, int y, int w, int h) { - if (!fe->clip) { - fe->clip = CreateRectRgn(0, 0, 1, 1); - GetClipRgn(fe->hdc_bm, fe->clip); - } - IntersectClipRect(fe->hdc_bm, x, y, x+w, y+h); } void unclip(frontend *fe) { - assert(fe->clip); - SelectClipRgn(fe->hdc_bm, fe->clip); + SelectClipRgn(fe->hdc_bm, NULL); } void draw_text(frontend *fe, int x, int y, int fonttype, int fontsize,