[cairo] Rendering underlines / overbars with pangocairo
Behdad Esfahbod
behdad at behdad.org
Fri Dec 19 22:05:54 PST 2008
Peter, you're right. Somehow I assumed that you had hinting off.
Please file a bug on bugzilla.gnome.org and I fix it in a few days.
behdad
Peter Clifton wrote:
> On Thu, 2008-12-18 at 15:45 +0000, Peter Clifton wrote:
>> On Thu, 2008-12-18 at 01:36 -0500, Behdad Esfahbod wrote:
>>> Peter Clifton wrote:
>>>
>>>> However, it appears that the overbar doesn't fade out. When zoomed far
>>>> out, you see very bold pixel aligned overbars, with some faded
>>>> anti-aliased text in the few pixels below.
>>>>
>>>> Poking in Pango, (and I'm a complete noob there), I'm wondering if the
>>>> font metrics are coming through pangogc-font.c 's get_face_metrics()
>>>> function. (The platform is Linux, and text is being rendered via
>>>> cairo).
>>> Hi Peter,
>>>
>>> I think you are hitting this bug:
>>>
>>> http://bugzilla.gnome.org/show_bug.cgi?id=457990
>>>
>>> It's a very ugly bug. I'll see if I can fix it soon.
>>>
>>> One way to work around it is to make sure your ctm is identity and modify the
>>> font matrix instead. Ugly, I know.
>> I think my CTM is identity already.. my user spece coodinates are in
>> pixels, since that was easiest for transitioning away from the old GDK
>> drawing routines, and because we do hinting of lines to the pixel grid.
>>
>> Is pangofc-font.c likely to be involved for the cairo backend? If so,
>> then I can't hope to get an underline thickness metric less than
>> PANGO_SCALE due to the quantisation here:
>>
>> if (fcfont->is_hinted)
>> {
>> pango_quantize_line_geometry (&metrics->underline_thickness,
>> &metrics->underline_position);
>> pango_quantize_line_geometry (&metrics->strikethrough_thickness,
>> &metrics->strikethrough_position);
>> }
>>
>> It would appear that the strokes in the font aren't being quantized at
>> small sizes though, since they fade as the font becomes unreadably
>> small.
>
> The following patch gives me the desired behaviour, my overbar (made
> with thickness underline metrics), now fades (due to width < 1
> anti-aliasing) with the stroke of the font, looking much more uniform
> than before. It still achieves the desired non-blurred look buy hinting
> the position, and only allowing non-integer widths for width < 1.
>
> --- pango-utils.c.old 2008-12-18 16:00:18.000000000 +0000
> +++ pango-utils.c 2008-12-18 16:04:03.000000000 +0000
> @@ -1488,9 +1488,11 @@
> * multiples of %PANGO_SCALE. The purpose of this function is to avoid
> * such lines looking blurry.
> *
> - * Care is taken to make sure @thickness is at least one pixel when this
> - * function returns, but returned @position may become zero as a result
> - * of rounding.
> + * If the input @thickness is less than one pixel, it is passed through
> + * unchanged to allow the intensity of the resulting line to fade with
> + * the stroke of the font.
> + *
> + * The returned @position may become zero as a result of rounding.
> *
> * Since: 1.12
> */
> @@ -1513,7 +1515,8 @@
> *position = new_center + (PANGO_SCALE * thickness_pixels) / 2;
> }
>
> - *thickness = thickness_pixels * PANGO_SCALE;
> + if (*thickness > PANGO_SCALE)
> + *thickness = thickness_pixels * PANGO_SCALE;
> }
>
> /**
>
>
More information about the cairo
mailing list