[cairo] defining CLAMP extend mode
Vladimir Vukicevic
vladimir at pobox.com
Sat Oct 21 14:27:37 PDT 2006
A while back (I believe on IRC), we discussed defining a new extend mode
that would behave a bit more like people expect. That is, if the sample
point is within the bounds of the source image, it would be clamped to
its bounds; if outside, then it would be transparent. Right now, there
is a smooth transition between the two areas, which leads to artifacts
when upscaling.
EXTEND_PAD can help with this, but only if the destination is clipped to
the actual area of the transformed source image -- that is, calling
cairo_paint() with no clip and an image source with EXTEND_PAD would
cause bleed to the left and bottom. CAIRO_EXTEND_PAD is also not
implemented for image surfaces in pixman, so this may be moot anyway.
I've looked into implementing this in pixman, and it looks like most of
the work would be in fbFetchTransformed and/or fbFetch, but that's only
if one goes through pixman_compositeGeneral. I didn't get as far as
figuring out what would be necessary to implement either PAD or CLAMP in
the optimized paths.
However, there's still a problem. Even if CLAMP were to be implemented,
it would still be impossible to take a subrect of an image and scale it
up, treating the subrect's borders as a hard edge. This type of
functionality is used pretty often for storing multiple icons in one
image, and then rendering just the one that's relevant to the current
combinations of button state. As much as I hate to say this, but
pixman's source clipping would help here, so maybe CLAMP and PAD should
be defined to treat the source clip bounds as the bounds of the source
image (which I think is what the current pixman code does anyway). This
would require the image surface code to set the right source clip on the
source surface before calling pixman's composite function.
Any suggestions on how to resolve these problems? The upscaling issue
is, IMO, one of the biggest problems with cairo right now; for us with
Mozilla, we don't have the problem on OSX (since we treat EXTEND_NONE as
effectively what my proposed CLAMP would be, since Quartz has no way to
do the smear), but I haven't been able to take advantage of win32's
stretching functions (because they can only work with integer-aligned
source and destination rectangles). And on Linux, this would probably
require adding Clamp to Render/XAA.
- Vlad
More information about the cairo
mailing list