#include <math.h>
#include <stdio.h>

#include <ft2build.h>
#include <freetype/freetype.h>

#include <cairo.h>
#include <cairo-ft.h>

FT_Library ft;

char *(text[])={
	"다람쥐 헌 쳇바퀴에 타고파. 아햏햏 똠방각하",
	"abcdefghijklmnopqrstuvwxyz",
	"ABCDEFGHIJKLMNOPQRSTUVWXYZ",
	"1234567890!@#$%^&*()"
};

void draw_text( char* out, char* font, double size ){

	cairo_surface_t *surface;
	cairo_t *cr;

	int i;
	
	double pos;
	double x, y;
	
	FT_Face face;
	FT_Open_Args fags;

	cairo_font_face_t* cairo_face;

	cairo_font_extents_t fe;
	cairo_text_extents_t te;

	static const cairo_user_data_key_t key;

	/* Prepare drawing area */
	surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 500, 500);
	cr = cairo_create (surface);

	cairo_set_font_size (cr, size);
	cairo_set_source_rgb (cr, 0, 0, 0);

	fags.flags = FT_OPEN_PATHNAME;
	fags.pathname = font;

	//if( FT_Open_Face( ft, &fags, 0, &face ) )
	if( FT_New_Face( ft, font, 0, &face ) )
		fprintf( stderr, "error in open face\n");

	cairo_face = cairo_ft_font_face_create_for_ft_face( face, 0 );
	cairo_set_font_face( cr, cairo_face );

	//cairo_select_font_face (cr, font,
	//		CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
	
	cairo_font_extents (cr, &fe);

	x = 6.0;
	pos = 3.0;
	for( i = 0 ; i < 4 ; i++ ){
		cairo_text_extents (cr, text[i], &te);

		pos += te.height + 3.0;

		if( te.width > x )
			x = te.width + 6.0;

		cairo_move_to (cr, 3.0, pos);
		cairo_show_text (cr, text[i]);
	}
	y = pos + te.height + 3.0;

	cairo_destroy (cr);
	cairo_surface_destroy (surface);

	/* Prepare drawing area */
	surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, x, y);
	cr = cairo_create (surface);

	cairo_set_font_size (cr, size);
	cairo_set_source_rgb (cr, 0, 0, 0);

	cairo_set_font_face( cr, cairo_face );

	cairo_font_extents (cr, &fe);

	x = 6.0;
	pos = 3.0;
	for( i = 0 ; i < 4 ; i++ ){
		cairo_text_extents (cr, text[i], &te);

		pos += te.height + 3.0;

		cairo_move_to (cr, 3.0, pos);
		cairo_show_text (cr, text[i]);
	}

	cairo_font_face_destroy(cairo_face);
	FT_Done_Face(face);

	cairo_surface_write_to_png(surface, out );
	cairo_destroy (cr);
	cairo_surface_destroy (surface);
}

int main (int argc, char *argv[]){

	char* font[] = {
		"font/Arial Unicode.ttf",
		"font/Bandal.ttf",
		"font/Bangwool.ttf",
		"font/Daum_Regular.ttf",
		"font/Daum_SemiBold.ttf",
		"font/Eunjin.ttf",
		"font/EunjinNakseo.ttf",
		"font/Guseul.ttf",
		"font/LexiGulim.ttf",
		"font/NanumGothic_Coding.ttf",
		"font/NanumGothic_Coding_Bold.ttf",
		"font/SOONCHUNHYANG.TTF",
		"font/SeoulHangangL.ttf",
		"font/SeoulHangangM.ttf",
		"font/SeoulNamsanB.ttf",
		"font/SeoulNamsanEB.ttf",
		"font/SeoulNamsanL.ttf",
		"font/SeoulNamsanM.ttf",
		"font/UnBatang.ttf",
		"font/UnBatangBold.ttf",
		"font/UnDotum.ttf",
		"font/UnDotumBold.ttf",
		"font/UnGraphic.ttf",
		"font/UnGraphicBold.ttf",
		"font/UnGungseo.ttf",
		"font/UnPilgi.ttf",
		"font/UnPilgiBold.ttf",
		"font/[HaN-mfs].ttf",
		"font/arittaB.otf",
		"font/arittaL.otf",
		"font/arittaM.otf",
		"font/arittaSB.otf",
		"font/batang.ttf",
		"font/dotum.ttf",
		"font/gulim.ttf",
		"font/han.ttf",
		"font/hline.ttf",
		"font/나눔고딕.ttf",
		"font/나눔고딕Bold.ttf",
		"font/나눔명조.ttf",
		"font/나눔명조Bold.ttf",
		"font/한겨레결체.TTF",
		"font/YONSLOGO.TTF",
		"font/YonseiBold.TTF",
		"font/YonseiLight.TTF",
		"font/NAVERDIC.TTF",
		"font/ChosunM.ttf",
		NULL
	};

	double size[] = {
		12.0,
		14.0,
		20.0,
		32.0,
		-1.0	
	};

	int i, j;
	char filename[1024];

	if( FT_Init_FreeType(&ft) ){
		fprintf( stderr, "Can't initialize freetype\n" );
		return -1;
	}

	for( i = 0 ; font[i] ; i++ ){
		for( j = 0 ; size[j] > 0.0 ; j++ ){
			sprintf( filename, "%s-%2.f.png", font[i], size[j] );
			draw_text( filename, font[i], size[j] );
		}
	}
	return 0;
}
