Pango で縦書き
Pango は縦書きをサポートしているということなので Pango cairo で試してみた。
結局 PangoContext に対して PangoGravity を指定すればいいらしい。日本語の縦書きだったら PANGO_GRAVITY_EAST。
ただそれだけだと、横方向に描画される (各文字は縦書きの向きになっている) ので、上から下に文字を並べなくてはならない。この方法がわからなかったので cairo 側で回転かけた。
#include <stdio.h> #include <stdlib.h> #include <cairo.h> #include <pango/pangocairo.h> #define WIDTH 120 #define HEIGHT 480 int main(int argc, char** argv) { cairo_surface_t *surface; cairo_t *cr; PangoContext *context; PangoLayout *layout; const char* png = "verticaltext.png"; const char* str = "<span size='24576'>縦書き、123 Vertical</span>\n<span size='24576'>Vertical 123 縦書き。</span>"; surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, WIDTH, HEIGHT); cr = cairo_create(surface); cairo_translate(cr, WIDTH, 0.0); cairo_rotate(cr, G_PI / 2.0); layout = pango_cairo_create_layout(cr); context = pango_layout_get_context(layout); pango_context_set_base_gravity(context, PANGO_GRAVITY_EAST); pango_layout_set_markup(layout, str, -1); pango_cairo_show_layout(cr, layout); cairo_destroy(cr); cairo_surface_write_to_png(surface, png); cairo_surface_destroy(surface); }