/*====================================================================== // caps.c - A paps like program // // Dov Grobgeld // Tue Sep 5 21:06:50 2006 //---------------------------------------------------------------------- */ #include #include #include #include #include #include #include #include #include static int draw_text(cairo_t *cr, const gchar *text); cairo_status_t caps_cairo_write(void *closure, const unsigned char *data, unsigned int length); static void die(const char *fmt, ...) { va_list ap; va_start(ap,fmt); vfprintf(stderr, fmt, ap); exit(-1); } int main(int argc, char **argv) { cairo_surface_t *surface; cairo_t *cr; int width = 595; int height = 842; const gchar *output_file = "-"; FILE *CAPS_OUT = NULL; gchar *text = NULL; GError *error = NULL; /* Prerequisite when using glib. */ g_type_init(); if (argc > 1) { gchar *filename = argv[1]; gsize length; g_file_get_contents(filename, &text, &length, &error); if (error) die("Error: %s\n", error->message); } else text = g_strdup ("你好,这是中文竖排测试。\n" "欢迎来到中国北京。\n" "白日依山尽,\n" "Roses are Red,\n" "Grass is Green. 2006\n" "Arabic is گل‌ها قرمزند،‏\n" "چمن سبز. ۲۰۰۶\n" "白日依山尽, 2006\n"); if (strcmp(output_file, "-") == 0) CAPS_OUT = stdout; else CAPS_OUT = fopen(output_file, "w"); surface = cairo_pdf_surface_create_for_stream (caps_cairo_write, CAPS_OUT, width, height); cr = cairo_create (surface); cairo_rotate (cr, G_PI / 2); cairo_move_to (cr, 0, -500); draw_text(cr, text); cairo_destroy (cr); cairo_surface_destroy (surface); exit(0); return(0); } static int draw_text(cairo_t *cr, const gchar *text) { PangoFontDescription *font_description; PangoLayout *layout; PangoContext *context; /* Create a PangoLayout, set the font and text */ layout = pango_cairo_create_layout (cr); context = pango_layout_get_context (layout); pango_context_set_base_gravity (context, PANGO_GRAVITY_AUTO); pango_layout_set_markup (layout, text, -1); pango_layout_set_width (layout, (int)(500 * PANGO_SCALE)); pango_cairo_show_layout(cr, layout); cairo_show_page(cr); return 0; } cairo_status_t caps_cairo_write(void *closure, const unsigned char *data, unsigned int length) { FILE *CAPS_OUT = (FILE*)closure; fwrite(data,length,1,CAPS_OUT); return CAIRO_STATUS_SUCCESS; }