changeset 1155:be5942e385e5

original and CE version of mpfc
author arpi_esp
date Sun, 17 Jun 2001 23:58:38 +0000
parents 4bf4e057c82e
children 5dc01778e055
files TOOLS/mpfc/Makefile TOOLS/mpfc/mpfc-ce.c TOOLS/mpfc/mpfc-kr.c
diffstat 3 files changed, 554 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TOOLS/mpfc/Makefile	Sun Jun 17 23:58:38 2001 +0000
@@ -0,0 +1,15 @@
+
+TARGET = mpfc-ce mpfc-kr
+
+LIBS=-lgd -lttf -lpng
+
+all: $(TARGET)
+
+mpfc-ce: mpfc-ce.c
+	gcc -Wall -O2 -o $@ $< $(LIBS)
+
+mpfc-kr: mpfc-kr.c
+	gcc -Wall -O2 -o $@ $< $(LIBS)
+
+clean:
+	-rm -f $(TARGET)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TOOLS/mpfc/mpfc-ce.c	Sun Jun 17 23:58:38 2001 +0000
@@ -0,0 +1,284 @@
+/*
+  
+  mplayer font creator for central-europe (latin-1 etc) charset
+
+  This program uses gd & freetype2 library to draw each characters then
+  write the image to stdout.
+
+  Written by Sunjin Yang <lethean@realtime.ssu.ac.kr> May 03, 2001.
+  Modified by Arpad Gereoffy <arpi@thot.banki.hu> Jun 18, 2001.
+
+*/
+
+#include <gd.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#define UPSCALE_FACTOR 2
+
+#define X_ALIGN (8*UPSCALE_FACTOR)
+#define ALIGNED(x) (((x)+(X_ALIGN-1))&(~(X_ALIGN-1)))
+
+#define DEF_FONT_SIZE		16.0
+
+#define DEF_CHAR_GAP		6
+#define CHAR_SKIP(gap)		(gap / 4)
+
+#define AUTHOR			"Sunjin Yang <lethean@realtime.ssu.ac.kr>"
+#define VERSION			"0.1"
+
+struct code_range {
+	int start, end;
+};
+
+/* basic alphabet character range */
+//static struct code_range ascii_range = { 0x21, 0x7E };
+static struct code_range ascii_range = { 0x20, 0x1FF };
+
+#ifdef USE_UNIFIED_KOREAN
+
+/* Unified Hangul Code Encoding */
+static struct code_range first_byte_range[] = {
+	{ 0x81, 0xFE }, { 0, 0 }
+};
+static struct code_range second_byte_range[] = {
+	{ 0x41, 0x5A }, { 0x61, 0x7A }, { 0x81, 0x9F }, { 0xA0, 0xBF },
+	{ 0xC0, 0xDF }, { 0xE0, 0xFE },	{ 0, 0 }
+};
+
+#else
+
+/* KSX 1001:1992 */
+static struct code_range first_byte_range[] = {
+	{ 0xA1, 0xAC }, { 0xB0, 0xFD }, { 0, 0 }
+};
+static struct code_range second_byte_range[] = {
+	{ 0xA1, 0xAF }, { 0xB0, 0xBF }, { 0xC0, 0xCF }, { 0xD0, 0xDF },
+	{ 0xE0, 0xEF }, { 0xF0, 0xFE }, { 0, 0 }
+};
+
+#endif
+
+#define _output(msg...)	fprintf(stdout, ##msg)
+
+/* debugging macros */
+#define _print(msg...)	fprintf(stderr, ##msg)
+#define _info(msg...)	{ _print("mpfc: "); _print(##msg); _print("\n"); }
+#define _abort(msg...)	{ _info(##msg); exit(1); }
+
+static double size;
+static int gap,vgap;
+static char *name, *font, *eng_font, *kor_font;
+static int file_index;
+static char filename[20];
+
+static int base_x, char_count;
+static gdImagePtr char_image[65536];
+
+static gdImagePtr concat_char_images(void)
+{
+	gdImagePtr ret;
+	int width, height, i, x,black, white;
+
+	/* get image's width & height */
+	height = size + (vgap * 2);
+	for (width = 0, i = 0; i < char_count; i++)
+		width += ALIGNED(char_image[i]->sx);
+
+	ret = gdImageCreate(width, height);
+
+	/* background color (first allocated) */
+	black = gdImageColorResolve(ret, 0, 0, 0);
+//	white = gdImageColorResolve(ret, 255, 255, 255);
+	for(x=1;x<=255;x++)
+	    white = gdImageColorResolve(ret, x,x,x);
+
+	width = 0;
+	for (i = 0; i < char_count; i++) {
+		gdImageCopy(ret, char_image[i],	/* dst, src */
+			    width + 0, 0,	/* dstX, dstY */
+			    0, 0,	 	/* srcX, srcY */
+			    char_image[i]->sx, char_image[i]->sy); /* size */
+		width += ALIGNED(char_image[i]->sx);
+		gdImageDestroy(char_image[i]);
+	}
+	char_count = 0;
+
+	return ret;
+}
+
+static gdImagePtr create_char_image(int code)
+{
+	gdImagePtr im;
+	int rect[8], black, white, width, height, x, y;
+	char *err;
+	char s[10];
+	
+#if 1
+	sprintf(s,"&#%d;",code);
+#else
+	if(code>=0x100){
+	  s[0]=code>>8;
+	  s[1]=code&0xFF;
+	  s[2]=0;
+	} else {
+	  s[0]=code;
+	  s[1]=0;
+	}
+#endif
+
+	/* obtain border rectangle so that we can size the image. */
+	err = gdImageStringTTF(NULL, &rect[0], 0, font, size, .0, 0, 0, s);
+	if (err)
+		_abort("%s\n", err);
+
+	/* create an image big enough for a string plus a little whitespace. */
+	width = rect[2] - rect[6] + gap;
+	height = size + (vgap * 2);
+	im = gdImageCreate(width, height);
+
+	/* background color (first allocated) */
+	black = gdImageColorResolve(im, 0, 0, 0);
+	for(x=1;x<=255;x++)
+	    white = gdImageColorResolve(im, x,x,x);
+//	white = gdImageColorResolve(im, 255, 255, 255);
+
+	/* render the string, offset origin to center string.
+	   note that we use top-left coordinate for adjustment
+	   since gd origin is in top-left with y increasing downwards. */
+	x = (gap / 2) - rect[6];
+	y = (vgap) - rect[7] + (size + rect[7]);
+	err = gdImageStringTTF(im, &rect[0], white, font, size, .0, x, y, s);
+	if (err)
+		_abort("%s\n", err);
+
+	//if (*s == '"') _output("'%s' ", s); else _output("\"%s\" ", s);
+	_output("0x%x %d %d\n", code,
+		(base_x + CHAR_SKIP(gap))/UPSCALE_FACTOR -1, 
+		(base_x + width - CHAR_SKIP(gap))/UPSCALE_FACTOR - 0);
+	base_x += ALIGNED(width);
+//	base_x = (base_x+width+7)&(~7); // align to 8-pixel boundary for fast MMX code
+
+	return im;
+}
+
+void make_charset_font(struct code_range *first, struct code_range *second)
+{
+	gdImagePtr im;
+	FILE *fd;
+	int i, j;
+	
+	base_x = 0;
+	char_count = 0;
+
+	_output("[files]\n");
+	//_output("alpha %s%d_a.raw\n", name, file_index);
+	_output("alpha %s%02d_a.raw\n", name, file_index);
+	_output("bitmap %s%02d_b.raw\n\n", name, file_index);
+	_output("[characters]\n");
+
+	for (i = first->start; i <= first->end; i++) {
+		if (!second) {
+			char_image[char_count++] = create_char_image(i);
+		} else
+			for (j = second->start; j <= second->end; j++) {
+				char_image[char_count++]= create_char_image((i<<8)|j);
+			}
+	}
+
+	_output("\n");
+	
+	/* concatenate each character images into one image. */
+	im = concat_char_images();
+	
+	/* get filename and create one with it. */
+	sprintf(filename, "%s%02d_b.png", name, file_index++);
+	fd = fopen(filename, "w+");
+	if (!fd)
+		_abort(strerror(errno));
+
+	/* write image to the PNG file. */
+	gdImagePng(im, fd);
+
+	fclose(fd);
+
+	/* destroy it */
+	gdImageDestroy(im);
+}
+
+int main(int argc, char **argv)
+{
+	int i, j;
+
+	if (argc < 4)
+		_abort("usage:%s name eng-ttf kor-ttf [size gap vgap]",argv[0]);
+
+	/* get program parameter like font names, size... */
+	name = argv[1];
+	eng_font = argv[2];
+	kor_font = argv[3];
+	size = DEF_FONT_SIZE;
+	gap = DEF_CHAR_GAP;
+	vgap = DEF_CHAR_GAP;
+	if (argc > 4) {
+		float __s; sscanf(argv[4], "%f", &__s);
+		size = (double)__s;
+	}
+	if (argc > 5)
+		sscanf(argv[5], "%d", &gap);
+	if (argc > 6)
+		sscanf(argv[6], "%d", &vgap);
+
+	/* write basic font information. */
+	_output("[info]\n");
+	_output("name \"%s version %s - created by %s\"\n",
+		name, VERSION, AUTHOR);
+	_output("descversion 1\n");
+	_output("spacewidth %d\n", (int)(size / 2));
+	_output("charspace -%d\n", CHAR_SKIP(gap) + 1);
+	_output("; height %d\n\n", (int)size + DEF_CHAR_GAP);
+
+	/* write general OSD fonts information. */
+	_output("[files]\n");
+	_output("alpha arpi_osd_a.raw\n");
+	_output("bitmap arpi_osd_b.raw\n\n");
+	_output("[characters]\n");
+	_output("0x01 0 36\n");
+	_output("0x02 35 71\n");
+	_output("0x03 70 106\n");
+	_output("0x04 116 152\n");
+	_output("0x05 164 200\n");
+	_output("0x06 209 245\n");
+	_output("0x07 256 292\n");
+	_output("0x08 305 342\n");
+	_output("0x09 354 400\n");
+	_output("0x0A 407 442\n");
+	_output("0x0B 457 494\n");
+	_output("[files]\n");
+	_output("alpha arpi_progress_a.raw\n");
+	_output("bitmap arpi_progress_b.raw\n\n");
+	_output("[characters]\n");
+	_output("0x10 4 21\n");
+	_output("0x11 30 41\n");
+	_output("0x12 50 66\n");
+	_output("0x13 74 85\n\n");
+
+
+	file_index = 0;
+	
+	/* create basic alphabet character set. */
+	font = eng_font;
+	make_charset_font(&ascii_range, NULL);
+
+#if 0
+	/* create korean character set. */
+	font = kor_font;
+	for (i = 0; first_byte_range[i].start != 0; i++)
+		for (j = 0; second_byte_range[j].start != 0; j++)
+			make_charset_font(&first_byte_range[i], &second_byte_range[j]);
+#endif
+
+	return 0;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/TOOLS/mpfc/mpfc-kr.c	Sun Jun 17 23:58:38 2001 +0000
@@ -0,0 +1,255 @@
+/*
+  
+  mplayer font creator for korean(euc-kr) charset
+
+  This program uses gd & freetype2 library to draw each characters then
+  write the image to stdout.
+
+  Written by Sunjin Yang <lethean@realtime.ssu.ac.kr> May 03, 2001.
+
+*/
+
+#include <gd.h>
+#include <stdio.h>
+#include <string.h>
+#include <errno.h>
+
+#define DEF_FONT_SIZE		16.0
+
+#define DEF_CHAR_GAP		6
+#define CHAR_SKIP(gap)		(gap / 4)
+
+#define AUTHOR			"Sunjin Yang <lethean@realtime.ssu.ac.kr>"
+#define VERSION			"0.1"
+
+struct code_range {
+	int start, end;
+};
+
+/* basic alphabet character range */
+static struct code_range ascii_range = { 0x21, 0x7E };
+
+#ifdef USE_UNIFIED_KOREAN
+
+/* Unified Hangul Code Encoding */
+static struct code_range first_byte_range[] = {
+	{ 0x81, 0xFE }, { 0, 0 }
+};
+static struct code_range second_byte_range[] = {
+	{ 0x41, 0x5A }, { 0x61, 0x7A }, { 0x81, 0x9F }, { 0xA0, 0xBF },
+	{ 0xC0, 0xDF }, { 0xE0, 0xFE },	{ 0, 0 }
+};
+
+#else
+
+/* KSX 1001:1992 */
+static struct code_range first_byte_range[] = {
+	{ 0xA1, 0xAC }, { 0xB0, 0xFD }, { 0, 0 }
+};
+static struct code_range second_byte_range[] = {
+	{ 0xA1, 0xAF }, { 0xB0, 0xBF }, { 0xC0, 0xCF }, { 0xD0, 0xDF },
+	{ 0xE0, 0xEF }, { 0xF0, 0xFE }, { 0, 0 }
+};
+
+#endif
+
+#define _output(msg...)	fprintf(stdout, ##msg)
+
+/* debugging macros */
+#define _print(msg...)	fprintf(stderr, ##msg)
+#define _info(msg...)	{ _print("mpfc: "); _print(##msg); _print("\n"); }
+#define _abort(msg...)	{ _info(##msg); exit(1); }
+
+static double size;
+static int gap;
+static char *name, *font, *eng_font, *kor_font;
+static int file_index;
+static char filename[20], str[10];
+
+static int base_x, char_count;
+static gdImagePtr char_image[65536];
+
+static gdImagePtr concat_char_images(void)
+{
+	gdImagePtr ret;
+	int width, height, i, black, white;
+
+	/* get image's width & height */
+	height = size + (gap * 2);
+	for (width = 0, i = 0; i < char_count; i++)
+		width += char_image[i]->sx;
+
+	ret = gdImageCreate(width, height);
+
+	/* background color (first allocated) */
+	black = gdImageColorResolve(ret, 0, 0, 0);
+	white = gdImageColorResolve(ret, 255, 255, 255);
+
+	width = 0;
+	for (i = 0; i < char_count; i++) {
+		gdImageCopy(ret, char_image[i],	/* dst, src */
+			    width + 0, 0,	/* dstX, dstY */
+			    0, 0,	 	/* srcX, srcY */
+			    char_image[i]->sx, char_image[i]->sy); /* size */
+		width += char_image[i]->sx;
+		gdImageDestroy(char_image[i]);
+	}
+	char_count = 0;
+
+	return ret;
+}
+
+static gdImagePtr create_char_image(char *s)
+{
+	gdImagePtr im;
+	int rect[8], black, white, width, height, x, y;
+	char *err;
+
+	/* obtain border rectangle so that we can size the image. */
+	err = gdImageStringTTF(NULL, &rect[0], 0, font, size, .0, 0, 0, s);
+	if (err)
+		_abort("%s\n", err);
+
+	/* create an image big enough for a string plus a little whitespace. */
+	width = rect[2] - rect[6] + gap;
+	height = size + (gap * 2);
+	im = gdImageCreate(width, height);
+
+	/* background color (first allocated) */
+	black = gdImageColorResolve(im, 0, 0, 0);
+	white = gdImageColorResolve(im, 255, 255, 255);
+
+	/* render the string, offset origin to center string.
+	   note that we use top-left coordinate for adjustment
+	   since gd origin is in top-left with y increasing downwards. */
+	x = (gap / 2) - rect[6];
+	y = (gap / 2) - rect[7] + (size + rect[7]);
+	err = gdImageStringTTF(im, &rect[0], white, font, size, .0, x, y, s);
+	if (err)
+		_abort("%s\n", err);
+
+	if (*s == '"') _output("'%s' ", s); else _output("\"%s\" ", s);
+	_output("%d %d\n", 
+		base_x + CHAR_SKIP(gap), base_x + width - CHAR_SKIP(gap) - 1);
+	base_x += width;
+		
+	return im;
+}
+
+void make_charset_font(struct code_range *first, struct code_range *second)
+{
+	gdImagePtr im;
+	FILE *fd;
+	int i, j;
+	
+	base_x = 0;
+	char_count = 0;
+
+	_output("[files]\n");
+	//_output("alpha %s%d_a.raw\n", name, file_index);
+	_output("alpha %s%02d_b.raw\n", name, file_index);
+	_output("bitmap %s%02d_b.raw\n\n", name, file_index);
+	_output("[characters]\n");
+
+	for (i = first->start; i <= first->end; i++) {
+		str[0] = (char)i;
+		if (!second) {
+			str[1] = '\0';
+			char_image[char_count++] = create_char_image(str);
+		} else
+			for (j = second->start; j <= second->end; j++) {
+				str[1] = (char)j; str[2] = '\0';
+				char_image[char_count++]= create_char_image(str);
+			}
+	}
+
+	_output("\n");
+	
+	/* concatenate each character images into one image. */
+	im = concat_char_images();
+	
+	/* get filename and create one with it. */
+	sprintf(filename, "%s%02d_b.png", name, file_index++);
+	fd = fopen(filename, "w+");
+	if (!fd)
+		_abort(strerror(errno));
+
+	/* write image to the PNG file. */
+	gdImagePng(im, fd);
+
+	fclose(fd);
+
+	/* destroy it */
+	gdImageDestroy(im);
+}
+
+int main(int argc, char **argv)
+{
+	int i, j;
+
+	if (argc < 4)
+		_abort("usage:%s name eng-ttf kor-ttf [size gap]",argv[0]);
+
+	/* get program parameter like font names, size... */
+	name = argv[1];
+	eng_font = argv[2];
+	kor_font = argv[3];
+	size = DEF_FONT_SIZE;
+	gap = DEF_CHAR_GAP;
+	if (argc > 4) {
+		float __s; sscanf(argv[4], "%f", &__s);
+		size = (double)__s;
+	}
+	if (argc > 5)
+		sscanf(argv[5], "%d", &gap);
+
+	/* write basic font information. */
+	_output("[info]\n");
+	_output("name \"%s version %s - created by %s\"\n",
+		name, VERSION, AUTHOR);
+	_output("descversion 1\n");
+	_output("spacewidth %d\n", (int)(size / 2));
+	_output("charspace -%d\n", CHAR_SKIP(gap) + 1);
+	_output("height %d\n\n", (int)size + DEF_CHAR_GAP);
+
+	/* write general OSD fonts information. */
+	_output("[files]\n");
+	_output("alpha arpi_osd_a.raw\n");
+	_output("bitmap arpi_osd_b.raw\n\n");
+	_output("[characters]\n");
+	_output("0x01 0 36\n");
+	_output("0x02 35 71\n");
+	_output("0x03 70 106\n");
+	_output("0x04 116 152\n");
+	_output("0x05 164 200\n");
+	_output("0x06 209 245\n");
+	_output("0x07 256 292\n");
+	_output("0x08 305 342\n");
+	_output("0x09 354 400\n");
+	_output("0x0A 407 442\n");
+	_output("0x0B 457 494\n");
+	_output("[files]\n");
+	_output("alpha arpi_progress_a.raw\n");
+	_output("bitmap arpi_progress_b.raw\n\n");
+	_output("[characters]\n");
+	_output("0x10 4 21\n");
+	_output("0x11 30 41\n");
+	_output("0x12 50 66\n");
+	_output("0x13 74 85\n\n");
+
+
+	file_index = 0;
+	
+	/* create basic alphabet character set. */
+	font = eng_font;
+	make_charset_font(&ascii_range, NULL);
+
+	/* create korean character set. */
+	font = kor_font;
+	for (i = 0; first_byte_range[i].start != 0; i++)
+		for (j = 0; second_byte_range[j].start != 0; j++)
+			make_charset_font(&first_byte_range[i], &second_byte_range[j]);
+
+	return 0;
+}
+