私は、アジア言語の文字を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ビットで、私はレンダリングしようとしている特殊な文字セットに拡張することが期待できないことを実現します別の方法ですか?ここで
は、私は、コードを実行したときに私が得る画像は、次のとおりです。
は、どのように私はカイロの特殊文字をレンダリングすることができますか?代わりにPangoを使用する必要がありますか、C++での表現は根本的に正しくありませんか?
通常の「A」のような文字と「A」は正しく
をレンダリング私はPangoのを使用してGtkDrawingAreaウィジェット上でレンダリングするためにいくつかの文字を得ることができたので、これはカイロに問題があるように思われます。
リンクが無効です。 – oldtechaa
これはCコードへの直接リンクです。私はウェブサイトを表示するためにそれを更新しています – Arlington
正しいフォントがインストールされていますか? –