rendered paste body/*======================================================================
// caps.c - A paps like program
//
// Dov Grobgeld <dov.grobgeld@gmail.com>
// Tue Sep 5 21:06:50 2006
//----------------------------------------------------------------------
*/
#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#include <string.h>
#include <pango/pango.h>
#include <pango/pangocairo.h>
#include <cairo-ps.h>
#include <cairo-svg.h>
#include <cairo-pdf.h>
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;
}