win32: Bug in partial redrawing triggered by InvalidateRect
Matthias Bolte <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <CABBrozi5U4f_yKnwncBsRp4MV=CjLBkgP2OZh_RBTjKmCJe4Rw@mail.gmail.com> |
I came across this problem while updating from cairo 1.8 to 1.10. In 1.8 Triggering partial redraws via InvalidateRect works as expected. In 1.10 it doesn't. The size of the rect is correct but the offset is lost and the top-left corner of the window is redrawn with the wrong content as the content comes from the correct offset. I tracked the problem down to this commit b713510f213d0a83cb0575d6870416a0f13786c9 surface-fallback: Convert to composite rectangles http://cgit.freedesktop.org/cairo/commit/?id=b713510f213d0a83cb0575d6870416a0f13786c9 But I could not understand why this commit breaks partial redraws. Today I found a mail on the mailing list about this problem http://lists.cairographics.org/archives/cairo/2011-March/021800.html that refers to a bug report from 2010 about this problem https://bugs.freedesktop.org/show_bug.cgi?id=28541 that has a working patch attached http://sprunge.us/KOZU The offending commit seems to have broken the handling of surfaces that don't have their origin in (0,0) as it switched to the _cairo_composite_rectangles_init* functions that assume that the surface has it's origin in (0,0). The problem seems to be that a BeginPaint call (as a reaction to a WM_PAINT message triggered by a InvalidateRect) can return a DC with an origin equal to the offset given in the InvalidateRect. So there is a DC with an origin different from (0,0). The referenced patch makes _cairo_composite_rectangles_init* honor this offset and fixes the problem. Now I wonder why this patch from October 2010 has neither been reviewed nor been applied yet. This mail is an attempt to finally get this problem fixed. -- Matthias Bolte http://photron.blogspot.com -- cairo mailing list [email protected] http://lists.cairographics.org/mailman/listinfo/cairo