? examples/TEST-ARABIC
? examples/TEST-IPA-I-GUESS
Index: pango/pango-types.h
===================================================================
RCS file: /cvs/gnome/pango/pango/pango-types.h,v
retrieving revision 1.26
diff -u -p -r1.26 pango-types.h
--- pango/pango-types.h	17 Nov 2005 04:56:14 -0000	1.26
+++ pango/pango-types.h	12 Dec 2005 23:21:43 -0000
@@ -123,6 +123,7 @@ void pango_matrix_rotate    (PangoMatrix
 			     double       degrees);
 void pango_matrix_concat    (PangoMatrix       *matrix,
 			     const PangoMatrix *new_matrix);
+double pango_matrix_get_font_scale_factor (PangoMatrix *matrix);
 
 #define PANGO_SCALE 1024
 #define PANGO_PIXELS(d) (((int)(d) + 512) >> 10)
Index: pango/pango-utils.c
===================================================================
RCS file: /cvs/gnome/pango/pango/pango-utils.c,v
retrieving revision 1.64
diff -u -p -r1.64 pango-utils.c
--- pango/pango-utils.c	23 Nov 2005 17:54:54 -0000	1.64
+++ pango/pango-utils.c	12 Dec 2005 23:21:43 -0000
@@ -1154,6 +1154,58 @@ pango_matrix_concat (PangoMatrix       *
   matrix->y0  = tmp.yx * new_matrix->y0 + tmp.yy * new_matrix->y0 + tmp.y0;
 }
 
+/**
+ * pango_matrix_get_font_scale_factor:
+ * @matrix: a #PangoMatrix, may be %NULL
+ * 
+ * Return value: the scale factor of @matrix on the height of the font.
+ * That is, the scale factor in the direction perpendicular to the
+ * vector that the X coordinate is mapped to, or 1.0 if @matrix is %NULL.
+ *
+ * Since: 1.12
+ **/
+double
+pango_matrix_get_font_scale_factor (PangoMatrix *matrix)
+{
+/*
+ * Based on cairo-matrix.c:_cairo_matrix_compute_scale_factors()
+ *
+ * Copyright 2005, Keith Packard
+ */
+  double det;
+  
+  if (!matrix)
+    return 1.0;
+  
+  det = matrix->xx * matrix->yy - matrix->yx * matrix->xy;
+
+  if (det == 0)
+    {
+      return 0.0;
+    }
+  else
+    {
+      double x = matrix->xx;
+      double y = matrix->yx;
+      double major, minor;
+
+      major = sqrt (x*x + y*y);
+      
+      /*
+       * ignore mirroring
+       */
+      if (det < 0)
+	det = - det;
+      
+      if (major)
+	minor = det / major;
+      else 
+	minor = 0.0;
+
+      return minor;
+    }
+}
+
 static const char canon_map[256] = {
    0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0, 
    0,   0,   0,   0,   0,   0,   0,   0,    0,   0,   0,   0,   0,   0,   0,   0, 
Index: pango/pangocairo-fcfont.c
===================================================================
RCS file: /cvs/gnome/pango/pango/pangocairo-fcfont.c,v
retrieving revision 1.21
diff -u -p -r1.21 pangocairo-fcfont.c
--- pango/pangocairo-fcfont.c	10 Dec 2005 07:42:18 -0000	1.21
+++ pango/pangocairo-fcfont.c	12 Dec 2005 23:21:43 -0000
@@ -536,7 +536,8 @@ static double
 get_font_size (PangoCairoFcFontMap        *cffontmap,
 	       PangoContext               *context,
 	       const PangoFontDescription *desc,
-	       FcPattern                  *pattern)
+	       FcPattern                  *pattern,
+	       PangoMatrix                *matrix)
 {
   double size;
 
@@ -554,7 +555,7 @@ get_font_size (PangoCairoFcFontMap      
   */
 
   if (FcPatternGetDouble (pattern, FC_PIXEL_SIZE, 0, &size) == FcResultMatch)
-    return size * PANGO_SCALE;
+    return size * PANGO_SCALE / pango_matrix_get_font_scale_factor (matrix);
 
   /* Just in case FC_PIXEL_SIZE got unset between pango_fc_make_pattern()
    * and here.
@@ -603,12 +604,13 @@ _pango_cairo_fc_font_new (PangoCairoFcFo
   else
     cairo_matrix_init_identity (&cffont->font_matrix);
 
-  size = get_font_size (cffontmap, context, desc, pattern);
+  pango_ctm = pango_context_get_matrix (context);
+
+  size = get_font_size (cffontmap, context, desc, pattern, pango_ctm);
 
   cairo_matrix_scale (&cffont->font_matrix,
 		      size / PANGO_SCALE, size / PANGO_SCALE);
 
-  pango_ctm = pango_context_get_matrix (context);
   if (pango_ctm)
     cairo_matrix_init (&cffont->ctm,
 		       pango_ctm->xx,
@@ -618,6 +620,7 @@ _pango_cairo_fc_font_new (PangoCairoFcFo
 		       0., 0.);
   else
     cairo_matrix_init_identity (&cffont->ctm);
+
 
   cffont->options = cairo_font_options_copy (_pango_cairo_context_get_merged_font_options (context));
   
Index: pango/pangofc-fontmap.c
===================================================================
RCS file: /cvs/gnome/pango/pango/pangofc-fontmap.c,v
retrieving revision 1.46
diff -u -p -r1.46 pangofc-fontmap.c
--- pango/pangofc-fontmap.c	8 Dec 2005 07:25:08 -0000	1.46
+++ pango/pangofc-fontmap.c	12 Dec 2005 23:21:43 -0000
@@ -1011,44 +1011,6 @@ get_unscaled_size (PangoFcFontMap       
     }
 }
 
-/*
- * Based on cairo-matrix.c:_cairo_matrix_compute_scale_factors()
- *
- * Copyright 2005, Keith Packard
- */
-static double
-get_scaled_size (FontsetHashKey *key)
-{
-  PangoMatrix *matrix = &key->matrix;
-  double det = matrix->xx * matrix->yy - matrix->yx * matrix->xy;
-
-  if (det == 0)
-    {
-      return 0.0;
-    }
-  else
-    {
-      double x = matrix->xx;
-      double y = matrix->yx;
-      double major, minor;
-
-      major = sqrt (x*x + y*y);
-      
-      /*
-       * ignore mirroring
-       */
-      if (det < 0)
-	det = - det;
-      
-      if (major)
-	minor = det / major;
-      else 
-	minor = 0.0;
-
-      return minor * key->size / 1024.;
-    }
-}
-
 static PangoFcPatternSet *
 pango_fc_font_map_get_patterns (PangoFontMap               *fontmap,
 				PangoContext               *context,
@@ -1083,8 +1045,10 @@ pango_fc_font_map_get_patterns (PangoFon
 
   if (patterns == NULL)
     {
+      double scale_factor = pango_matrix_get_font_scale_factor (&key.matrix);
+      double scaled_size = key.size * scale_factor / PANGO_SCALE;
       pattern = pango_fc_make_pattern (desc, language,
-				       get_scaled_size (&key),
+				       scaled_size,
 				       pango_fc_font_map_get_resolution (fcfontmap, context));
       
       pango_fc_default_substitute (fcfontmap, context, pattern);

