Shifting (scrolling) a translucent surface?
Stefan Salewski <[email protected]>
| Newsgroups | gmane.comp.lib.cairo |
|---|---|
| Message-ID | <[email protected]> |
I just tried to make scrolling faster for a small toy application, (http://www.ssalewski.de/PetEd.html.en). Indeed I was successful, I am reusing the background grid (with correct offset of course) instead of redrawing, and I draw the foreground some pixes larger, so that I can copy it with some offset to the GTK drawing area, for small scrolls. For larger scrolls I have to shift the cairo surface, before I paint to the uncovered stripe. Works fine, but now I have to cleanup (and better understand) the code... For translating/shifting the foreground I have currently code like this $ cat pet_canvas.rb [...] >elsif ((offx.abs < $OFFSET) and (offy.abs < $OFFSET)) > return >else > t = cr.target > cr.identity_matrix > cr.push_group > cr.set_source(t, offx, offy) > cr.paint > cr.pop_group_to_source > cr.set_operator(Cairo::OPERATOR_CLEAR) > cr.paint > cr.set_operator(Cairo::OPERATOR_OVER) > cr.paint > offx = 0 > offy = 0 >end I guess overlapping copies are not allowed for cairo, see http://old.nabble.com/is-self-copy-supposed-to-work--td28410811.html But is my code a good solution? My foreground picture is translucent, so I need that paint with operator_clear to erase all before copying back the translated content. Or is there an operator available which does the same with only one paint? And, I wonder how the OPERATOR_CLEAR depends on the source surface? First I tried cr.set_source_rgba(1,1,1,1) before the clear operation, to get a solid source for clearing operation. But it seems to be not necessary. Is the source ignored for clear operation? May it be a better approach to allocate an new cairo context with empty surface, copy the picture to that surface, discard the old and use the new one? Best regards, Stefan Salewski -- cairo mailing list [email protected] http://lists.cairographics.org/mailman/listinfo/cairo