[cairo] [PATCH] Improve handling of degenerate font matrices

Behdad Esfahbod behdad at behdad.org
Mon Feb 7 14:38:12 PST 2011


On 02/07/11 12:20, Andrea Canciani wrote:
> On Mon, Feb 7, 2011 at 5:40 PM, Behdad Esfahbod <behdad at behdad.org> wrote:
>> On 02/07/11 04:51, Andrea Canciani wrote:
>>
>>>> I took a quick look to see if we can completely remove scale_inverse.  It may
>>>> be possible, but I check the current uses and they are mostly harmless, so its
>>>> not a big deal.
>>>
>>> I had a commit performing that. It should be quite trivial as soon as
>>> I manage to get rid of it in cairo-user-font.c
>>
>> I have a feeling that we are using the wrong matrix there.  I have a feeling
>> that we should be using ctm_inverse, not scale_inverse there, since our target
>> is to have user-space extents.
> 
> It could be.

I've studied the code again, and no, it's correct.  More below.


> I just started looking at the code around it and noticed that
> _cairo_recording_surface_get_bbox probably contains the problem pointed out in
> http://lists.cairographics.org/archives/cairo/2008-May/014152.html
> 
> _recording_surface_get_ink_bbox seems to avoid that problem.

No.  get_bbox calls get_ink_bbox.  The problem lies in analysis-surface.c's
design of extent collection.  If you are asking for an operation's extent
without passing down the ctm, that's the bug.  And it's all over that code.

That said, our scaled-font code also has a variety of this problem.  But it's
less severe since rotated font matrices are not that useful.


> I expected the user-font code to record a glyph in font space and then transform
> it when replaying the recorded surface,

That would have been really nice... Except that with things like hinting, we
can't do that.  We have to record/render it in real device space :(.


> but I see that the documentation
> specifies that users are allowed to change the matrix to draw directly in user
> space. This means that (if the scale matrix is degenerate) glyphs can have
> infinite font-space extents, which breaks the assumptions I was making.

Right.  But that can also be called a user error...

Ok, the reason for the whole extent_scale matrix in cairo-user-font is that we
record in device space, but _cairo_scaled_glyph_set_metrics() expects numbers
in font space, just to convert them to user space itself.  If we changed that
function (or added a new one) to take extents in user space directly, we can
clean up things a bit.  But then need to add ctm_inverse to scaled-font or
user-scaled-font.  No big deal since at least for now ctm is always invertible.


>>> I'll try to fix the doc and maybe inline
>>> a couple of comments expaining the geometrical meaning of the
>>> computations.
>>
>> Feel free to rename it, and remove the case of x_basis==FALSE as the output
>> looks inverted and wrong for that case, and we don't currently use that case
>> anyway (may do in the future for vertical text).
> 
> You mean for laying out vertical text in the toy font API?

Not exactly sure when we would need it.

behdad

> Andrea
> 


More information about the cairo mailing list