gfontlib.c

来自「linux下的MPEG1」· C语言 代码 · 共 231 行

C
231
字号
#include "goom_config.h"#include "gfontrle.c"#include "gfontlib.h"#include <string.h>#include <stdlib.h>static Pixel  ***font_chars;static int    *font_width;static int    *font_height;static Pixel  ***small_font_chars;static int    *small_font_width;static int    *small_font_height;void gfont_load (void) {	unsigned char *gfont;	unsigned int i = 0, j = 0;	unsigned int nba = 0;	unsigned int current = 32;        int    *font_pos;	/* decompress le rle */                	gfont = malloc (the_font.width*the_font.height*the_font.bytes_per_pixel);	while (i<the_font.rle_size) {		unsigned char c = the_font.rle_pixel [i++];		if (c == 0) {			unsigned int nb = the_font.rle_pixel [i++];			while (nb--)				gfont[j++] = 0;		}		else			gfont [j++] = c;	}	/* determiner les positions de chaque lettre. */        font_height = calloc (256,sizeof(int));        small_font_height = calloc (256,sizeof(int));        font_width = calloc (256,sizeof(int));        small_font_width = calloc (256,sizeof(int));        font_chars = calloc (256,sizeof(int**));        small_font_chars = calloc (256,sizeof(int**));        font_pos = calloc (256,sizeof(int));	for (i=0;i<the_font.width;i++) {		unsigned char a = gfont [i*4 + 3];		if (a)			nba ++;		else			nba = 0;		if (nba == 2) {                    font_width [current] = i - font_pos [current];                    small_font_width [current] = font_width [current]/2;                        font_pos [++current] = i;                        font_height [current] = the_font.height - 2;                        small_font_height [current] = font_height [current]/2;		}	}	font_pos [current] = 0;        font_height [current] = 0;        small_font_height [current] = 0;		/* charger les lettres et convertir au format de la machine */		for (i=33;i<current;i++) {		int x; int y;                font_chars [i] = malloc (font_height[i]*sizeof(int *));                small_font_chars [i] = malloc (font_height[i]*sizeof(int *)/2);                for (y = 0; y < font_height[i]; y++) {                    font_chars [i][y] = malloc (font_width[i]*sizeof(int));                    for (x = 0; x < font_width[i]; x++) {                        unsigned int r,g,b,a;                        r = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4)];                        g = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+1)];                        b = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+2)];                        a = gfont[(y+2)*(the_font.width*4)+(x*4+font_pos[i]*4+3)];                        font_chars [i][y][x].val =                            (r<<(ROUGE*8))|(g<<(VERT*8))|(b<<(BLEU*8))|(a<<(ALPHA*8));                    }                }                for (y = 0; y < font_height[i]/2; y++) {                    small_font_chars [i][y] = malloc (font_width[i]*sizeof(int)/2);                    for (x = 0; x < font_width[i]/2; x++) {                        unsigned int r1,g1,b1,a1,r2,g2,b2,a2,r3,g3,b3,a3,r4,g4,b4,a4;                        r1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4)];                        g1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+1)];                        b1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+2)];                        a1 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+3)];                        r2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+4)];                        g2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+5)];                        b2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+6)];                        a2 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+7)];                        r3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4)];                        g3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+1)];                        b3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+2)];                        a3 = gfont[(2*y+3)*(the_font.width*4)+(x*8+font_pos[i]*4+3)];                        r4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+4)];                        g4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+5)];                        b4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+6)];                        a4 = gfont[2*(y+1)*(the_font.width*4)+(x*8+font_pos[i]*4+7)];                        small_font_chars [i][y][x].val =                            (((r1 + r2 + r3 + r4)>>2)<<(ROUGE*8))|                            (((g1 + g2 + g3 + g4)>>2)<<(VERT*8))|                            (((b1 + b2 + b3 + b4)>>2)<<(BLEU*8))|                            (((a1 + a2 + a3 + a4)>>2)<<(ALPHA*8));                    }                }        }	/* definir les lettres restantes */ 		for (i=0;i<256;i++) {		if (font_chars[i]==0) {                    font_chars[i]=font_chars[42];                    small_font_chars[i]=small_font_chars[42];                    font_width[i]=font_width[42];                    font_pos[i]=font_pos[42];                    font_height[i]=font_height[42];                    small_font_width[i]=small_font_width[42];                    small_font_height[i]=small_font_height[42];                }	}        font_width [32] = (the_font.height / 2) - 1;        small_font_width [32] = font_width [32]/2;        font_chars [32] = 0;        small_font_chars [32] = 0;	free(font_pos);}void    goom_draw_text (Pixel * buf,int resolx,int resoly,												int x, int y,												const char *str, float charspace, int center) {	float   fx = (float) x;	int     fin = 0;        Pixel  ***cur_font_chars;        int    *cur_font_width;        int    *cur_font_height;        if (resolx>320)        {            /* printf("use big\n"); */            cur_font_chars = font_chars;            cur_font_width = font_width;            cur_font_height = font_height;        }        else        {            /* printf ("use small\n"); */            cur_font_chars = small_font_chars;            cur_font_width = small_font_width;            cur_font_height = small_font_height;        }        if (cur_font_chars == NULL)		return ;	if (center) {		unsigned char   *tmp = (unsigned char*)str;		float   lg = -charspace;		while (*tmp != '\0')			lg += cur_font_width[*(tmp++)] + charspace;		fx -= lg / 2;	}	while (!fin) {		unsigned char    c = *str;		x = (int) fx;		if (c == '\0')			fin = 1;		else if (cur_font_chars[c]==0) {			fx += cur_font_width[c] + charspace;		}		else {			int     xx, yy;			int     xmin = x;			int     xmax = x + cur_font_width[c];			int     ymin = y - cur_font_height[c];			int     ymax = y;			yy = ymin;			if (xmin < 0)				xmin = 0;			if (xmin >= resolx - 1)				return;			if (xmax >= (int) resolx)				xmax = resolx - 1;			if (yy < 0)				yy = 0;			if (yy <= (int) resoly - 1) {				if (ymax >= (int) resoly - 1)					ymax = resoly - 1;        for (; yy < ymax; yy++)          for (xx = xmin; xx < xmax; xx++)          {              Pixel color = cur_font_chars[c][yy - ymin][xx - x];              Pixel transparency;              transparency.val = color.val & A_CHANNEL;              if (transparency.val)              {                  if (transparency.val==A_CHANNEL) buf[yy * resolx + xx] = color;                  else                  {                      Pixel back =  buf[yy * resolx + xx];                      unsigned int a1 = color.channels.a;                      unsigned int a2 = 255 - a1;                      buf[yy * resolx + xx].channels.r = (unsigned char)((((unsigned int)color.channels.r * a1) + ((unsigned int)back.channels.r * a2)) >> 8);                      buf[yy * resolx + xx].channels.g = (unsigned char)((((unsigned int)color.channels.g * a1) + ((unsigned int)back.channels.g * a2)) >> 8);                      buf[yy * resolx + xx].channels.b = (unsigned char)((((unsigned int)color.channels.b * a1) + ((unsigned int)back.channels.b * a2)) >> 8);                  }              }          }			}			fx += cur_font_width[c] + charspace;		}		str++;	}}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?