[cairo] Font metrics problem?

Richard Cole rcole at itee.uq.edu.au
Tue Oct 5 17:49:35 PDT 2004


Hi,

I'm having trouble making sense out of the font metrics I'm getting from 
Cairo. I appologise that the following code is in Ocaml.

I have trouble these days going back to languages like C. I'll try to 
explain what its doing. The major thing to know about Ocaml is that 
functions don't have brackets, i.e. "insert(x,S)" is written "insert x 
S", the Some and None business is basically pointers being Null or not 
Null, the function "some x" derefences x and throws and exception if x 
is Null. Oh and method calls are marked with a '#' rather than a '.', 
i.e. self#select_font rather than self.select_font. The '.' is used to 
signify namespace, i.e. all that Cairo.something stuff used is access 
something in the Cairo package.

class text =
 object(self)
 ...
 val mutable text = "Hello"
 val mutable text_extents = None
 val mutable font_extents = None
 val mutable font_family = "Times"
 val mutable font_slant = Cairo.FONT_SLANT_NORMAL
 val mutable font_weight = Cairo.FONT_WEIGHT_NORMAL
 val mutable font_scale = 12.

 val mutable redraw_broker : redraw_event broker option = None

 ...

 method select_font cr =
   Cairo.select_font cr font_family font_slant font_weight;
   Cairo.scale_font cr font_scale;

 method update_rect cr =
   match text_extents, font_extents with
     | Some(t), Some(e) -> ()
     | _ ->
         Cairo.save cr;
         self#select_font cr;
         text_extents <- Some(Cairo.text_extents cr text);
         font_extents <- Some(Cairo.current_font_extents cr);
         Cairo.restore cr;
         rect <- {
           rect with
             width  = (some text_extents).text_width;
             height = (some font_extents).font_height;
         };
         fprintf stderr "Font size=%f, height=%f, ascent=%f\n"
           font_scale
           (some font_extents).font_height;
           (some font_extents).ascent
         flush stderr;
         broker#fire_event ResizeRect;
         self#fire_redraw

  ...

So basically the update_rect method gets the text_extents and the 
font_extents from Cairo. The font is set to 12pt Roman Normal Normal. 
But the font metric returned has a height of 24.857011 and an ascent of 
19.262864. This seems way to large and when I draw a rectangle of these 
dimentions the box looks very much too big.

Are these results to be expected from the current version of Cairo? I'm 
using the current HEAD of the cvs repository "Tue 5th Oct, 23:40 EST 
(Brisbane, Australia Time)".

Are there any tests of the font metrics? I couldn't find any samples 
that draw a font metrics determined bounding box around the text.

Oh and one more thing. I think there was some discussion previously 
about making font metrics indepedent of the display context. I'd like to 
echo calls for this. When I'm trying to position things like text I need 
to know how high the text is and how wide a sequence of glyphs is, but 
being in logical co-ordinate space these values seem independent of the 
display context.

On the other hand, the actual pixels accessed by the drawing functions 
are resolution dependent and I think someone said true-type fonts are 
also resolution sensitive. Even so it would be nice to have a best guess 
independent of the display context and perhaps exact pixel related 
information dependent on the display context, i.e. two interfaces to 
font metrics.

I've seen programs written using the Java 2D API that had large errors 
in the font metrics. I wonder if this is because resolution dependent 
differences might be small on the glyph level but they add up on 
paragraph level and become quite noticable. Does anyone have information 
about this?

regards,

Richard.



More information about the cairo mailing list