2016-03-31 25 views
1

私は、アジア言語の文字をUTF-8でレンダリングするプログラムを作成しようとしています。ターミナルまたはテキストエディタ環境で文字をレンダリングしようとすると、正しくレンダリングされます。カイロでレンダリングしようとすると、私の出力にレンダリングされた長方形が得られます(私が期待したUTF8文字ではありません)。CairoでCairoを使用してアジア文字を描画していますか?

以下は、レンダリングされたテキストを含むPNGファイル出力を生成する実行中のコードの例です。 gccでコンパイルしてコードを実行すると、期待される文字「と」が得られず、代わりに矩形が得られます。私は現在、http://cairographics.org/tutorial/から例を実行しており、レンダリングする特殊文字を入力しています。

#include <math.h> 
#include <stdio.h> 
#include <cairo.h> 

int 
main (int argc, char *argv[]) 
{ 
//CODE FROM http://cairographics.org/tutorial/textextents.c 
    /* Variable declarations */ 
    cairo_surface_t *surface; 
    cairo_t *cr; 
    double x, y, px, ux=1, uy=1, dashlength; 
    char text[]= u8"と"; 
    cairo_font_extents_t fe; 
    cairo_text_extents_t te; 

    /* Prepare drawing area */ 
    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 240, 240); 
    cr = cairo_create (surface); 
    /* Example is in 26.0 x 1.0 coordinate space */ 
    cairo_scale (cr, 240, 240); 
    cairo_set_font_size (cr, 0.5); 

    /* Drawing code goes here */ 
    cairo_set_source_rgb (cr, 0.0, 0.0, 0.0); 
    cairo_select_font_face (cr, "Sans", 
      CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD); 
    cairo_font_extents (cr, &fe); 

    cairo_device_to_user_distance (cr, &ux, &uy); 
    if (ux > uy) 
     px = ux; 
    else 
     px = uy; 
    cairo_font_extents (cr, &fe); 
    cairo_text_extents (cr, text, &te); 
    x = 0.5 - te.x_bearing - te.width/2; 
    y = 0.5 - fe.descent + fe.height/2; 

    /* baseline, descent, ascent, height */ 
    cairo_set_line_width (cr, 4*px); 
    dashlength = 9*px; 
    cairo_set_dash (cr, &dashlength, 1, 0); 
    cairo_set_source_rgba (cr, 0, 0.6, 0, 0.5); 
    cairo_move_to (cr, x + te.x_bearing, y); 
    cairo_rel_line_to (cr, te.width, 0); 
    cairo_move_to (cr, x + te.x_bearing, y + fe.descent); 
    cairo_rel_line_to (cr, te.width, 0); 
    cairo_move_to (cr, x + te.x_bearing, y - fe.ascent); 
    cairo_rel_line_to (cr, te.width, 0); 
    cairo_move_to (cr, x + te.x_bearing, y - fe.height); 
    cairo_rel_line_to (cr, te.width, 0); 
    cairo_stroke (cr); 

    /* extents: width & height */ 
    cairo_set_source_rgba (cr, 0, 0, 0.75, 0.5); 
    cairo_set_line_width (cr, px); 
    dashlength = 3*px; 
    cairo_set_dash (cr, &dashlength, 1, 0); 
    cairo_rectangle (cr, x + te.x_bearing, y + te.y_bearing, te.width, te.height); 
    cairo_stroke (cr); 

    /* text */ 
    cairo_move_to (cr, x, y); 
    cairo_set_source_rgb (cr, 0, 0, 0); 
    cairo_show_text (cr, text); 

    /* bearing */ 
    cairo_set_dash (cr, NULL, 0, 0); 
    cairo_set_line_width (cr, 2 * px); 
    cairo_set_source_rgba (cr, 0, 0, 0.75, 0.5); 
    cairo_move_to (cr, x, y); 
    cairo_rel_line_to (cr, te.x_bearing, te.y_bearing); 
    cairo_stroke (cr); 

    /* text's advance */ 
    cairo_set_source_rgba (cr, 0, 0, 0.75, 0.5); 
    cairo_arc (cr, x + te.x_advance, y + te.y_advance, 5 * px, 0, 2 * M_PI); 
    cairo_fill (cr); 

    /* reference point */ 
    cairo_arc (cr, x, y, 5 * px, 0, 2 * M_PI); 
    cairo_set_source_rgba (cr, 0.75, 0, 0, 0.5); 
    cairo_fill (cr); 

    /* Write output and clean up */ 
    cairo_surface_write_to_png (surface, "textextents.png"); 
    cairo_destroy (cr); 
    cairo_surface_destroy (surface); 

    return 0; 
} 

は、私は私が特殊文字を表現する必要があります動作するように、これを取得するには、C++の文字がわずか8ビットで、私はレンダリングしようとしている特殊な文字セットに拡張することが期待できないことを実現します別の方法ですか?ここで

は、私は、コードを実行したときに私が得る画像は、次のとおりです。Rendition of と

は、どのように私はカイロの特殊文字をレンダリングすることができますか?代わりにPangoを使用する必要がありますか、C++での表現は根本的に正しくありませんか?

通常の「A」のような文字と「A」は正しく

をレンダリング私はPangoのを使用してGtkDrawingAreaウィジェット上でレンダリングするためにいくつかの文字を得ることができたので、これはカイロに問題があるように思われます。

+0

リンクが無効です。 – oldtechaa

+0

これはCコードへの直接リンクです。私はウェブサイトを表示するためにそれを更新しています – Arlington

+0

正しいフォントがインストールされていますか? –

答えて

1

the Cairo documentationによると、テキスト操作にCairoを使用することは推奨されません。彼らはそれをおもちゃのテキストAPIとして記述し、すでにPangoをテキストとして使用することをお勧めします。私はこれがあなたの問題だと確信することはできませんが、リンクされたページの記述では、カイロはフォントの問題をうまく処理しないと言います。選択したフォントがこの文字をサポートしていない可能性があります。

関連する問題