<div style="color:black;font: 10pt arial;">
<div> <font size="2"><br>
Hi Johann,<br>
<br>
Have you tested on another back end? If so, are the results different?<br>
<br>
I gave it a try and got similar results. <br>
<br>
cairo_scaled_font_create() says<br>
<br>
"Creates a cairo_scaled_font_t object from a font face and matrices that describe the size of the font and the environment in which it will be used."<br>
<br>
Then cairo_set_scaled_font() says<br>
<br>
"the current CTM of the cairo_t should be the same as that of the cairo_scaled_font_t, which can be accessed using cairo_scaled_font_get_ctm()."<br>
<br>
It sounds like you should get the ctm from the cairo_scaled_font_t pointer and this does work. It is confusing though when you don't get a ctm back with a cairo_set_scaled_font()/cairo_get_scaled_font() pair. Seems like a bug to me.<br>
<br>
Eric<br>
</font></div>

<div><br>
</div>

<div><font size="2"><br>
/*<br>
    Test a scaled font. A problem getting the scaled font ctm back with a cairo_set_scaled_font()<br>
cairo_get_scaled_font() pair.<br>
<br>
    gcc -Wall -g font_scale1.c -o font_scale1 -I/usr/include/freetype2 `pkg-config --cflags --libs cairo fontconfig` -lfreetype<br>
<br>
    Tested on Ubuntu18.04<br>
*/<br>
<br>
#include<cairo.h><br>
#include<cairo-ft.h><br>
#include<stdio.h><br>
#include<ft2build.h><br>
#include FT_FREETYPE_H<br>
#include<fontconfig/fontconfig.h><br>
<br>
static double width=500.0;<br>
static double height=500.0;<br>
<br>
static void draw_font(cairo_t *cr, double scale_ctm_x, double scale_ctm_y, cairo_scaled_font_t *sf);<br>
<br>
int main()<br>
  {<br>
    //Starting font.<br>
    char *font="/usr/share/fonts/truetype/freefont/FreeSansBold.ttf";<br>
    FT_Error error;<br>
    FT_Library library;<br>
    FT_Face face;<br>
<br>
    error=FT_Init_FreeType(&library);<br>
    if(error) printf("Init_FreeType Error\n");<br>
<br>
    error=FT_New_Face(library, font, 0, &face);<br>
    if(error==FT_Err_Ok) printf("New font face.\n");<br>
    else printf("Cannot open font.\n");<br>
<br>
    cairo_surface_t *surface=cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height);<br>
    cairo_t *cr=cairo_create(surface);<br>
   <br>
    //Paint the background.<br>
    cairo_set_source_rgba(cr, 1.0, 1.0, 1.0, 1.0);<br>
    cairo_paint(cr);<br>
<br>
    //Cartesian coordinates.<br>
    cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, 1.0);<br>
    cairo_move_to(cr, 0.0, height/2.0);<br>
    cairo_line_to(cr, width, height/2.0);<br>
    cairo_stroke(cr);<br>
    cairo_move_to(cr, width/2.0, 0.0);<br>
    cairo_line_to(cr, width/2.0, height);<br>
    cairo_stroke(cr);<br>
<br>
    //Test changing the scale values for the scaled font.<br>
    cairo_matrix_t fm, cm, sm;<br>
    double scale_ctm_x=1.5;<br>
    double scale_ctm_y=1.5;<br>
    cairo_matrix_init_scale(&fm, 30.0, 30.0);<br>
    cairo_matrix_init_scale(&cm, scale_ctm_x, scale_ctm_y);<br>
    cairo_font_options_t *fo=cairo_font_options_create();<br>
    cairo_font_face_t *ff=cairo_ft_font_face_create_for_ft_face(face, 0);<br>
    cairo_scaled_font_t *sf=cairo_scaled_font_create(ff, &fm, &cm, fo);    <br>
<br>
    //Draw the scaled font.<br>
    cairo_save(cr);<br>
    cairo_translate(cr, width/2.0, height/2.0);<br>
    cairo_set_scaled_font(cr, sf);<br>
    cairo_transform(cr, &cm);<br>
    cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0);<br>
    cairo_text_extents_t ex;<br>
    cairo_text_extents(cr, "Scaled Font", &ex);<br>
    cairo_move_to(cr, -0.5*ex.width, 0.0);<br>
    cairo_show_text(cr, "Scaled Font");<br>
    cairo_restore(cr);<br>
<br>
    //Look at the matrices.<br>
    printf("font matrix1 %f %f %f %f %f %f\n", fm.xx, fm.xy, fm.x0, fm.yx, fm.yy, fm.y0);<br>
    printf("current matrix2 %f %f %f %f %f %f\n", cm.xx, cm.xy, cm.x0, cm.yx, cm.yy, cm.y0);<br>
    cairo_matrix_multiply(&sm, &fm, &cm);<br>
    printf("scale matrix3 %f %f %f %f %f %f\n", sm.xx, sm.xy, sm.x0, sm.yx, sm.yy, sm.y0);<br>
<br>
    //Draw some extra text.<br>
    draw_font(cr, scale_ctm_x, scale_ctm_y, sf);<br>
<br>
    //Output the results.<br>
    printf("Output to font_scale1.png\n");<br>
    cairo_surface_write_to_png(surface, "font_scale1.png");<br>
<br>
    //Clean up.<br>
    cairo_font_options_destroy(fo);<br>
    cairo_font_face_destroy(ff);<br>
    cairo_scaled_font_destroy(sf);<br>
    cairo_destroy(cr);<br>
    cairo_surface_destroy(surface);<br>
    if(face!=NULL) FT_Done_Face(face);<br>
    if(library!=NULL) FT_Done_FreeType(library);<br>
<br>
    //Clear some caches for valgrind.<br>
    cairo_debug_reset_static_data();<br>
    FcFini();<br>
 <br>
    return 0;<br>
  }<br>
static void draw_font(cairo_t *cr, double scale_ctm_x, double scale_ctm_y, cairo_scaled_font_t *sf)<br>
  {<br>
    //Use sf pointer to get the matrices.<br>
    cairo_matrix_t fm, cm, sm;<br>
    cairo_scaled_font_get_font_matrix(sf, &fm);<br>
    cairo_scaled_font_get_ctm(sf, &cm);<br>
    cairo_scaled_font_get_scale_matrix(sf, &sm);<br>
    printf("font matrix2 %f %f %f %f %f %f\n", fm.xx, fm.xy, fm.x0, fm.yx, fm.yy, fm.y0);<br>
    printf("current matrix2 %f %f %f %f %f %f\n", cm.xx, cm.xy, cm.x0, cm.yx, cm.yy, cm.y0);<br>
    printf("scale matrix2 %f %f %f %f %f %f\n", sm.xx, sm.xy, sm.x0, sm.yx, sm.yy, sm.y0);<br>
<br>
    cairo_save(cr);<br>
    cairo_text_extents_t ex;<br>
    cairo_translate(cr, width/2.0, height/2.0);<br>
    cairo_set_scaled_font(cr, sf);<br>
    cairo_transform(cr, &cm);<br>
    cairo_set_source_rgba(cr, 0.0, 1.0, 0.0, 1.0);<br>
    cairo_text_extents(cr, "Scaled Font", &ex);<br>
    cairo_move_to(cr, -0.5*ex.width, ex.height);<br>
    cairo_show_text(cr, "Scaled Font");<br>
    cairo_restore(cr);<br>
<br>
    //Set the scaled font and then get it back. This doesn't get the scaled font ctm.<br>
    cairo_set_scaled_font(cr, sf);<br>
    cairo_scaled_font_t* sf2=cairo_get_scaled_font(cr);<br>
    cairo_scaled_font_get_font_matrix(sf2, &fm);<br>
    cairo_scaled_font_get_ctm(sf2, &cm);<br>
    cairo_scaled_font_get_scale_matrix(sf2, &sm);<br>
    printf("font matrix3 %f %f %f %f %f %f\n", fm.xx, fm.xy, fm.x0, fm.yx, fm.yy, fm.y0);<br>
    printf("current matrix3 %f %f %f %f %f %f\n", cm.xx, cm.xy, cm.x0, cm.yx, cm.yy, cm.y0);<br>
    printf("scale matrix3 %f %f %f %f %f %f\n", sm.xx, sm.xy, sm.x0, sm.yx, sm.yy, sm.y0);<br>
<br>
    cairo_translate(cr, width/2.0, height/2.0);<br>
    cairo_set_scaled_font(cr, sf);<br>
    cairo_transform(cr, &cm);<br>
    cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 1.0);<br>
    cairo_text_extents(cr, "Scaled Font", &ex);<br>
    cairo_move_to(cr, -0.5*ex.width, 3.0*ex.height);<br>
    cairo_show_text(cr, "Scaled Font");<br>
  }</font><br>
</div>

<div> <br>
</div>
<br>
</div>