在Cairo中渲染文本时的反转文本

时间:2013-03-27 16:08:50

标签: c++ c cairo

我正在使用Cairo编写程序,我需要使用以下代码将坐标从屏幕更改为Cartesian:

cairo_translate( cr, x, height );
cairo_scale( cr, 1.0, -1.0 ); // FLIP the Y axis

但是当我尝试渲染文本(cairo_show_text)时,文本也会被反转,因此不可读。

使用缩放字体(cairo_scaled_font_t)时会发生同样的情况:

cairo_font_options_t *font_options;
cairo_matrix_t ctm, font_matrix;
cairo_scaled_font_t *scaled_font;


font_options = cairo_font_options_create();
cairo_get_matrix( cr, &ctm );
cairo_get_font_matrix( cr, &font_matrix );

font_matrix.xx = font_matrix.yy = 20.0; // font size

// font_face initialized elsewhere and is valid

scaled_font = cairo_scaled_font_create( font_face, &font_matrix, &ctm, font_options );

cairo_set_scaled_font( cr, scaled_font );

cairo_move_to( cr, 1, 50 );

cairo_show_text( cr, "some text" );

...

我认为矩阵需要一些调整,但我不知道如何。任何帮助表示赞赏。提前谢谢。

修改

文字颠倒了。例如,'L'看起来像Gamma,'W'看起来像'M'。

3 个答案:

答案 0 :(得分:2)

我知道有两种方法可以做到这一点:

cairo_matrix_t ms, mt, m;
cairo_matrix_init_scale(&ms, 1.0f, -1.0f);
cairo_matrix_init_translate(&mt, 0.0f, -m_height);
cairo_matrix_multiply(&m, &mt, &ms);
cairo_set_matrix(cr, &m);

或:

cairo_scale(cr, 1.0f, -1.0f);
cairo_translate(cr, 0.0f, -m_height);

两者都解决了我的问题。在y上将cr缩放-1,但这意味着文本不在表面上,因此通过表面的高度进行平移,它应该是正确的。

答案 1 :(得分:0)

嗯,你正在翻转Y轴,因此文本也会被翻转。试试这个:

cairo_save(cr);
cairo_reset_clip(cr);
cairo_show_text(cr, "Some Text");
cairo_restore(cr);

上面替换了你的例子中的cairo_show_text()调用。

答案 2 :(得分:0)

由于您将坐标系翻转过来,文本也会颠倒显示。该问题的解决方案是通过设置具有垂直标度的负条目的字体矩阵来手动翻转文本。您可以通过修改用于设置字体大小的代码来执行此操作:

double font_size = 20.0;
font_matrix.xx = font_size;
font_matrix.yy = -font_size; // negative size to vertically flip text