2013-03-27 32 views
0

我寫使用開羅,我需要從屏幕上改變座標使用下面的代碼爲笛卡爾程序繪製文本時:黑底白字開羅

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

但是,當我嘗試呈現文本(cairo_show_text) ,文本也被翻轉,因此不可讀。

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"); 

... 

我覺得矩陣需要一些調整,但我不知道如何:使用縮放字體(cairo_scaled_font_t)時

同樣的情況。任何幫助表示讚賞。提前致謝。

編輯:

的文字是上下顛倒。例如,'L'看起來像一個Gamma,'W'看起來像一個'M'。

+0

通過倒置,你的意思是沿着X軸還是Y軸? – 2013-03-27 16:10:19

+0

或者你的意思是顏色倒置? – 2013-03-27 16:17:27

+1

我認爲他的意思是顛倒,因爲有一個-1的Y比例。 – unwind 2013-03-27 16:17:55

回答

0

那麼,你正在翻轉的Y軸,因此文本也翻轉了。試試這個:

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

上面的代碼將在您的示例中替換cairo_show_text()調用。

+1

我相信你的代碼只會影響「剪輯區域」(這是'cairo_reset_clip'的作用),但是不能解決文本問題。要翻轉文字,需要擺弄座標變換矩陣。 – jochen 2014-08-11 14:56:15

+0

這不是說文本翻轉的問題,但他希望它被翻轉?但是,不知道我在用這個cairo_reset_clip()調用時的想法,我想我的意思是cairo_identify_transform()。 – 2014-08-12 14:52:28

+0

文本翻轉,因此添加第二次翻轉和非翻頁是同樣的事情。我同意基於cairo_identity_transform的解決方案可能會有效。 – jochen 2014-08-12 16:18:17

0

由於您顛倒了座標系統,文本也顯示爲顛倒。解決此問題的方法是手動翻轉文本,方法是爲垂直縮放設置一個帶有否定條目的字體矩陣。你可以這樣做,通過修改代碼設置字體大小是這樣的:

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

即使世界兩種方法可以做到這一點,我知道:

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,但這意味着文本不在表面上,所以用表面的高度平移,它應該坐在右側。