[cairo] OVER / SOURCE optimization for cairo_paint
behdad at behdad.org
Tue Feb 19 12:05:24 PST 2008
On Tue, 2008-02-19 at 14:14 -0500, Owen Taylor wrote:
> On Sat, 2008-02-16 at 03:29 -0500, Antoine Azar wrote:
> > [ I hope this message doesn't land 3 times on the mailing list. For
> > some reason the first two attempts didn't go through ]
> > Hey all,
> > I've got a working optimization that speeds up paint operations for
> > opaque sources. The optimization replaces an OVER operator by a
> > SOURCE operator, and in the case of EXTEND_NONE, creates a path
> > around the source's extents and calls a fill operation instead. The
> > speedups can be huge, espescially in the case of copying a small
> > surface onto a much larger one.
> I was hoping someone else would pick up this topic, but since nobody
> else has: is this really a legitimate optimization when the
> source is scaled or transformed?
> - It will produce clearly incorrect results unless you replace
> EXTEND_NONE with the (not yet implemented?) EXTEND_PAD, since
> SOURCE for EXTEND_NONE is going to give 0,0,0,0 pixels outside
> the edge.
> - It will produce very different, though in many cases arguably
> better, results if you do that substitution. Is a 1x1 source
> scaled up to 20x20 a fuzzy dot or a rectangle?
> In my opinion, optimizations should not change appearance in such
> a way ... even if the appearance is better .... because it means
> that you get discontinuities between the optimized path and when
> you can't optimize for one reason or the other.
Right. Maybe this should be done for solids only for now?
> The other thing I wonder about the patch in general: what's it going to
> do for a backend where OVER is normal and SOURCE abnormal? Does the
> backend have to reverse the optimization? (In other words, the
> question is: should this optimization be in the image backend
> at a low level or even inside libpixman, rather than in cairo-gstate.c?)
I had this concern but didn't know how to articulate it. The fact that
it didn't really fit in gstate or surface layer, but I couldn't think of
any other layer that this would fit without having to duplicate in every
backend. But now I totally agree with you that this probably should
simply go in libpixman. IIUC the change in fact may have negative
effect on PS/PDF, unless they undo the optimization as you pointed out.
So yeah, by fixing in pixman we've fixed all backends except for quartz.
I guess quartz already optimizes this kind of operations. So, no loss.
> - Owen
"Those who would give up Essential Liberty to purchase a little
Temporary Safety, deserve neither Liberty nor Safety."
-- Benjamin Franklin, 1759
More information about the cairo