WIP

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

結果

句読点の配置がちょっとおかしい気がする。あと、前にくる文字によって数字の描画が違うのも気になる。でも縦書きができたのでよかった。