diff options
| author | Simon Robertshaw <simon@hardwired.org.uk> | 2011-05-26 10:40:08 (GMT) |
|---|---|---|
| committer | Simon Robertshaw <simon@hardwired.org.uk> | 2011-05-26 10:40:08 (GMT) |
| commit | a6fe1a48323464f1cf1b24ef1008f556cb23a323 (patch) | |
| tree | dc685196f06015ac1a82aee81a3ecebfb6572a7f | |
| parent | 7bf0ac10f666c753c57401887c478693233caf5f (diff) | |
| download | powder-a6fe1a48323464f1cf1b24ef1008f556cb23a323.zip powder-a6fe1a48323464f1cf1b24ef1008f556cb23a323.tar.gz | |
Add font editor from original source
| -rw-r--r-- | font/Makefile | 5 | ||||
| -rw-r--r-- | font/editor.c | 284 | ||||
| -rw-r--r-- | font/font.bin | bin | 0 -> 30980 bytes | |||
| -rw-r--r-- | font/packer.c | 100 |
4 files changed, 389 insertions, 0 deletions
diff --git a/font/Makefile b/font/Makefile new file mode 100644 index 0000000..e3b0c8c --- /dev/null +++ b/font/Makefile @@ -0,0 +1,5 @@ +editor: editor.c + gcc -oeditor -DSCALE=2 editor.c -lSDL -lm -O3 -ffast-math -march=k8 -Wall -std=c99 + +clean: + rm -f editor packer diff --git a/font/editor.c b/font/editor.c new file mode 100644 index 0000000..71c5aa0 --- /dev/null +++ b/font/editor.c @@ -0,0 +1,284 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> +#include <SDL/SDL.h> + +#define CELLW 12 +#define CELLH 10 + +#define XRES 800 +#define YRES 600 + +char xsize=CELLW, ysize=CELLH; +char base=7, top=2; +char font[256][CELLH][CELLW]; +char width[256]; + +void blendpixel(unsigned *vid, int x, int y, int r, int g, int b, int a) +{ + int t; + if(x<0 || y<0 || x>=XRES || y>=YRES) + return; + if(a!=255) { + t = vid[y*XRES+x]; + r = (a*r + (255-a)*((t>>16)&255)) >> 8; + g = (a*g + (255-a)*((t>>8)&255)) >> 8; + b = (a*b + (255-a)*(t&255)) >> 8; + } + vid[y*XRES+x] = (r<<16)|(g<<8)|b; +} + +int drawchar(unsigned *vid, int x, int y, int c, int r, int g, int b) +{ + int i, j; + for(j=0; j<CELLH; j++) + for(i=0; i<width[c]; i++) + blendpixel(vid, x+i, y+j, r, g, b, (font[c][j][i]*255)/3); + return x + width[c]; +} + +int drawtext(unsigned *vid, int x, int y, char *s, int r, int g, int b) +{ + for(;*s;s++) + x = drawchar(vid, x, y, *s, r, g, b); + return x; +} + +void drawline(unsigned *vid, int x1, int y1, int x2, int y2, int r, int g, int b, int a) +{ + int cp=abs(y2-y1)>abs(x2-x1), x, y, dx, dy, sy; + float e, de; + if(cp) { + y = x1; + x1 = y1; + y1 = y; + y = x2; + x2 = y2; + y2 = y; + } + if(x1 > x2) { + y = x1; + x1 = x2; + x2 = y; + y = y1; + y1 = y2; + y2 = y; + } + dx = x2 - x1; + dy = abs(y2 - y1); + e = 0.0f; + de = dy/(float)dx; + y = y1; + sy = (y1<y2) ? 1 : -1; + for(x=x1; x<=x2; x++) { + if(cp) + blendpixel(vid, y, x, r, g, b, a); + else + blendpixel(vid, x, y, r, g, b, a); + e += de; + if(e >= 0.5f) { + y += sy; + e -= 1.0f; + } + } +} + +void drawcell(unsigned *vid, int i, int j, int c, int m) +{ + int x,y,x0=i*32+64,y0=j*32+64; + for(y=1;y<32;y++) + for(x=1;x<32;x++) + blendpixel(vid, x0+x, y0+y, 127*m, 127*m, 127*m, c); + for(x=0;x<32;x+=2) { + if(!j) + blendpixel(vid, x0+x, y0, 64*m, 64*m, 64*m, 255); + if(!i) + blendpixel(vid, x0, y0+x, 64*m, 64*m, 64*m, 255); + blendpixel(vid, x0+x, y0+32, 64*m, 64*m, 64*m, 255); + blendpixel(vid, x0+32, y0+x, 64*m, 64*m, 64*m, 255); + } +} + +/*********************************************************** + * SDL OUTPUT * + ***********************************************************/ + +SDL_Surface *sdl_scrn; +int sdl_key; +void sdl_open(void) +{ + if(SDL_Init(SDL_INIT_VIDEO)<0) { + fprintf(stderr, "Initializing SDL: %s\n", SDL_GetError()); + exit(1); + } + atexit(SDL_Quit); + sdl_scrn=SDL_SetVideoMode(XRES*SCALE,YRES*SCALE + 40*SCALE,32,SDL_SWSURFACE); + if(!sdl_scrn) { + fprintf(stderr, "Creating window: %s\n", SDL_GetError()); + exit(1); + } +} + +void sdl_blit(int x, int y, int w, int h, unsigned int *src, int pitch) +{ + unsigned *dst,i,j,k; + if(SDL_MUSTLOCK(sdl_scrn)) + if(SDL_LockSurface(sdl_scrn)<0) + return; + dst=(unsigned *)sdl_scrn->pixels+y*sdl_scrn->pitch/4+x; + for(j=0;j<h;j++) { + for(k=0;k<SCALE;k++) { + for(i=0;i<w*SCALE;i++) + dst[i]=src[i/SCALE]; + dst+=sdl_scrn->pitch/4; + } + src+=pitch/4; + } + if(SDL_MUSTLOCK(sdl_scrn)) + SDL_UnlockSurface(sdl_scrn); + SDL_UpdateRect(sdl_scrn,0,0,0,0); +} + +int frame_idx=0; +void dump_frame(unsigned int *src, int w, int h, int pitch) +{ + char frame_name[32]; + unsigned j,i,c; + FILE *f; + sprintf(frame_name,"frame%04d.ppm",frame_idx); + f=fopen(frame_name,"w"); + fprintf(f,"P6\n%d %d\n255\n",w,h); + for(j=0;j<h;j++) { + for(i=0;i<w;i++) { + c=((src[i]&0xFF0000)>>16)|(src[i]&0x00FF00)|((src[i]&0x0000FF)<<16); + fwrite(&c,3,1,f); + } + src+=pitch/4; + } + fclose(f); + frame_idx++; +} + +int sdl_poll(void) +{ + SDL_Event event; + sdl_key=0; + while(SDL_PollEvent(&event)) { + switch (event.type) { + case SDL_KEYDOWN: + sdl_key=event.key.keysym.sym; + break; + case SDL_QUIT: + return 1; + } + } + return 0; +} + +/*********************************************************** + * MAIN PROGRAM * + ***********************************************************/ + +char *tag = "(c) 2008 Stanislaw Skowronek"; + +int main(int argc, char *argv[]) +{ + unsigned *vid_buf = calloc(XRES*YRES, sizeof(unsigned)); + int x, y, b = 0, lb, c = 0xA0, i, j, dc = 0; + int mode = 0; + FILE *f; + + f = fopen("font.bin", "r"); + if(f) { + fread(&xsize, 1, 1, f); + fread(&ysize, 1, 1, f); + fread(&base, 1, 1, f); + fread(&top, 1, 1, f); + fread(width, 1, 256, f); + fread(font, CELLW*CELLH, 256, f); + fclose(f); + } + + sdl_open(); + while(!sdl_poll()) { + if(sdl_key=='q' || sdl_key==SDLK_ESCAPE) + break; + if(sdl_key==' ' || sdl_key=='=') { + c++; + printf("Current: %02X '%c'\n", c, c); + } + if(sdl_key=='\b' || sdl_key=='-') { + c--; + printf("Current: %02X '%c'\n", c, c); + } + + lb = b; + b = SDL_GetMouseState(&x, &y); + if(b) { + x /= SCALE; + y /= SCALE; + } + + i = x/32-2; + j = y/32-2; + if(!lb && b && (i<0 || i>=CELLW)) { + if(abs(j-base) < abs(j-top)) + mode = 2; // BASE + else + mode = 3; // TOP + } else if(!lb && b && (j<0 || j>=CELLH)) + mode = 4; // LEFT + else if(!lb && b) { + mode = 1; // DRAW + if(b==1) + dc = (font[c][j][i]+3)%4; + else + dc = (font[c][j][i]+1)%4; + } + + if(b) + switch(mode) { + case 1: + if(i>=0 && j>=0 && i<CELLW && j<CELLH) + font[c][j][i] = dc; + break; + case 2: + base = j; + break; + case 3: + top = j; + break; + case 4: + width[c] = i; + break; + } + + memset(vid_buf, 0, XRES*YRES*4); + for(j=0; j<CELLH; j++) + for(i=0; i<CELLW; i++) + drawcell(vid_buf, i, j, (font[c][j][i]*255)/3, i>=width[c]?1:2); + drawline(vid_buf, 32, 64+base*32, 128+32*CELLW, 64+base*32, 128, 255, 128, 255); + drawline(vid_buf, 32, 64+top*32, 128+32*CELLW, 64+top*32, 128, 128, 255, 255); + drawline(vid_buf, 64+width[c]*32, 32, 64+width[c]*32, 128+32*CELLH, 255, 128, 128, 255); + + drawtext(vid_buf, 64, 192+32*CELLH, "A quick brown fox jumps over the lazy dog.", 255, 255, 255); + drawtext(vid_buf, 64, 192+33*CELLH, "A QUICK BROWN FOX JUMPS OVER THE LAZY DOG.", 255, 255, 255); + drawtext(vid_buf, 64, 192+34*CELLH, "0123456789 ~`!@#$%^&*()-=_+[]{}\\|;:'\",./<>?", 255, 255, 255); + + drawchar(vid_buf, 32, 192+32*CELLH, c, 255, 255, 255); + + sdl_blit(0, 0, XRES, YRES, vid_buf, XRES*4); + } + + f = fopen("font.bin", "w"); + fwrite(&xsize, 1, 1, f); + fwrite(&ysize, 1, 1, f); + fwrite(&base, 1, 1, f); + fwrite(&top, 1, 1, f); + fwrite(width, 1, 256, f); + fwrite(font, CELLW*CELLH, 256, f); + fclose(f); + + return 0; +} diff --git a/font/font.bin b/font/font.bin Binary files differnew file mode 100644 index 0000000..b81615a --- /dev/null +++ b/font/font.bin diff --git a/font/packer.c b/font/packer.c new file mode 100644 index 0000000..db57b1a --- /dev/null +++ b/font/packer.c @@ -0,0 +1,100 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <math.h> + +#define CELLW 12 +#define CELLH 10 + +char xsize=CELLW, ysize=CELLH; +char base=7, top=2; +char font[256][CELLH][CELLW]; +char width[256]; + +int bits_n = 0, bits_a = 0; +int flush_bits(void) +{ + if(bits_n) { + bits_a >>= 8-bits_n; + printf("0x%02X, ", bits_a); + bits_a = 0; + bits_n = 0; + return 1; + } + return 0; +} +int stock_bits(int b, int nb) +{ + bits_a >>= nb; + bits_a |= b << (8-nb); + bits_n += nb; + if(bits_n >= 8) { + printf("0x%02X, ", bits_a); + bits_a = 0; + bits_n = 0; + return 1; + } + return 0; +} + +int save_char(int c) +{ + int nb = 1; + int x, y; + + if(!width[c]) + return 0; + + printf(" 0x%02X, ", width[c]); + + for(y=0; y<CELLH; y++) + for(x=0; x<width[c]; x++) + nb += stock_bits(font[c][y][x]&3, 2); + nb += flush_bits(); + + printf("\n"); + + return nb; +} + +char *tag = "(c) 2008 Stanislaw Skowronek"; + +int main(int argc, char *argv[]) +{ + FILE *f; + int c, p[256], n = 0; + + memset(p, 0, 256*4); + + f = fopen("font.bin", "r"); + fread(&xsize, 1, 1, f); + fread(&ysize, 1, 1, f); + fread(&base, 1, 1, f); + fread(&top, 1, 1, f); + fread(width, 1, 256, f); + fread(font, CELLW*CELLH, 256, f); + fclose(f); + + printf("#define FONT_H %d\n", ysize); + + printf("char font_data[] = {\n"); + for(c=0; c<256; c++) { + p[c] = n; + n += save_char(c); + } + printf("};\n"); + + printf("short font_ptrs[] = {\n"); + for(c=0; c<256; c++) { + if(!(c%8)) + printf(" "); + printf("0x%04X,", p[c]); + if((c%8)==7) + printf("\n"); + else + printf(" "); + } + printf("};\n"); + + return 0; +} |
