From a6fe1a48323464f1cf1b24ef1008f556cb23a323 Mon Sep 17 00:00:00 2001 From: Simon Robertshaw Date: Thu, 26 May 2011 11:40:08 +0100 Subject: [PATCH] Add font editor from original source --- font/Makefile | 5 + font/editor.c | 284 ++++++++++++++++++++++++++++++++++++++++++++++++++ font/font.bin | Bin 0 -> 30980 bytes font/packer.c | 100 ++++++++++++++++++ 4 files changed, 389 insertions(+) create mode 100644 font/Makefile create mode 100644 font/editor.c create mode 100644 font/font.bin create mode 100644 font/packer.c diff --git a/font/Makefile b/font/Makefile new file mode 100644 index 000000000..e3b0c8c16 --- /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 000000000..71c5aa039 --- /dev/null +++ b/font/editor.c @@ -0,0 +1,284 @@ +#include +#include +#include +#include +#include + +#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; jabs(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= 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;jpitch/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>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=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 new file mode 100644 index 0000000000000000000000000000000000000000..b81615a3d7ad7e8a7aab2b62ac92e7c02939bfd5 GIT binary patch literal 30980 zcmeHO4R_l(4ovLS&9?dfzxQVFIdnu>a+2G-_o&ykKoFP#K#-E%?#G|suP+a-U)Nu^ z+wa@;?d^7Z`*pqDF!bvR&F%IcquU#--hcnbC+*)My#0dH^%t)<{K4=>`N|Qcx69k@ z?fv89&&MCXK5o3f|NZ;%@lRiW{{DTZ{-3w2gAoMY82x?_{F+`BSQS_mSQS_mSQS_m zSQS_mSQS_mSQS_mSQYqJD{z%x9tK&Wx{7=eSw-~~NHrPd>r27DUSCVTyv!Iz_iq_p zUN04^#B;ggN&?YSUD1giD5Xxf&-X%nc@=!ZWDMX<@r6bS`U;!$7FSTD_A^^*UV(B6 zGomEJ1vPK7P8Ym%u?wqG#0Jw22|v9f{IUjp1=`s%#Y;_qD8r<#oQYF|DVt0b6Y*Pr z3ZvbQOG2grE3bsp34%fGhoBFzEB+ium=DBxfEGbl+cM-1L${PRtLR7j#yP}0808M3 zvUBAA?U~lU{5Q{*Ax;@cII3sQ;5dmtzS~P~1LC`ksaW5Cbq|M=c+o5paEA`wK)mY^t zylljz)qd8zG#AywvFOz1yLfGrG+1$Qb7jp>^ETcfRS}@gdJG14dbPi|J2h6I8F41d z7(^EF6lEA!pQFxoUS0dm9z||FeA@mQwhbTdqpcif`VEM~s)0zJS*U1lD$x)22UxTZ zxulsF#Ku=q7gF(OdbLrR2V9W(qs#|<6z6GeubI(jcoxInmwRYE!syy7$CfP5O^5{r zp)z13SqH+Gta_2RXzq24GIhYK+Cpw#80A(P^b?!J+r49f6B9(u1*g47EG*5fp3nvY5hlTb) z&7>a{Dwn~Yu(Q7DW_u?F#7_?G`P1twy)j@a{#{LqS8W6*LfpM|CkY5W68xY%;Lzvc zHF%t2(-cvXY>kJEG|)AY?F)T}AZ>**3_Vr@!>R6jOs!Ei)A2HAl5Bw!w6ToN$Woy% zEm*vrU&>zp#bAC=roKviyj%8B!U(x-?0 zi|-~;xFH@|HgDludBXnm{*^wQp3l;_T*q2dNvxEj+ZBg=k;>zItJOc{o6ft0K6w{^ zEs?EV_|qn#@O`aiSyED-pk-r}Ip0$fw3Hy^+9fYW^=^R1t|0jKll5=gxdih9C2RW% zRYgObiN027&ZRSk5>Q9wOcI;A*iQGeWI)~s!R{r??>6A zMQU0-m&FINpa*?xsmw%#15lR z;hYhh=j9PcASa@>jJ6VX$i(A+OMSAfhFvjyef^ixmB%ul6}|BN7@@NCr_bl!f(?Qt z1bofhJ#&jodDZ?a9WWk^{r9;=%GmHMP7bwC-Tqz9L#Z2o#z;RL)Flr&_G^N@8&rYP z@rk>x@4zJoTm=Js*jMgH=(Ik)qMA6@x*?TokiR2Y1}tQtEeZ%FBj%Fnk$ED7lCfNy z5tV^D8g1LlUn>!?Tm~6yy-AS4+~3uB;yLL&iGb^?K=&k%#+Axwc!api0N=)`ccKwd zEX=xs=5HElDsMbk_A-HQ4_Nb_NzeJcz+rM)#`mT~)_sw>XYTm!P>%^bAFI;#Y8ilc ze_vTP&+w&>p0_Aqm4fvwn?e2-TAn{u!#QtrseQ)v%>7ut%{$l&VHHPodm_)GO!#2F zN->lBFC8c3!yc&!#?3MVpFkc{ce-q(OdZ6{24xLUo@2OarRE|JIHGSR07xCacu;0E zge+9h7V{`~Uui!S$P>bdue{BL(?lN3Ej~e4E=aZr#&fA(dh{HFan+|lo)GFwH+=QE zujj+??2t3<3A%Eb)>-i7*uHxJS33;PuL9o@(9h)zs$RTNto^0-JFq>~k6GzjOc(1Q zjsvlg$8}@xNS(+WQsIxtRfHX0DchWQmb?Tp;Oy`{n&Nv})5WDlI`(YRD z_@r)jc@&`kdxo*)no-Vy$uV%*2PVf`66AhgDyib*@!G3p-^t7yZOU(Dthn9cTLe!q zJI~xDf zDPS4BodB*!+04hH6TOK;zA)>{V0?(|_%}HgF@KfDqI$_YKun@QdC57&0WI z=aOEow+P(kdSPAc57WSavj3LoQ;|{k1F&dQSF$HZOmLVs-zf);-=yYu>uWWL_3eB; zpvcz-E;Cfd>+74oJL?PLTxz^9)fZNrGxdzeFIa|X$wSP}Nk;PFfZ-pCIG2cM%Ry@n zSZDMFdb_KKyZ zTwP`7PZ*hDdVCsCv2%GAZtxTGK;8cmmJ7zEMB2Wcu&3QLiD7N^`DF()dR=h&n3Bpsv#6?XzoukDZZ!;hD`?_y&~i!4 z$S!JfV6z5NCA3L1VeMgvPj7{i=@5D##(NL3&BHK1eb_=;`^0y64#AOXq^7_(HLmys}TR=f^{7`k!t)$Ov^FMLbh#Z^S&6)=D|^o%OY}7 zKl!Ni$E6vS%;zMwgqc##uS=>&tC|&!xWzc~D?^Oo_Dy~(7ZHIvE1Y<4<$%c)JoJ$k z^I}o#V)7Aki>6TTtIb zJm;M;pCS%;-}{kw*e^(77liQf zKcIrt2eiT z&BzvEq5M@G0IFB}v6_P4q-G++9~GHa5}+OH>SsGt@m<3w%N)Z4viK^da>X%Z@bOA# za+aQh15BfhJoFV)xok;|>E}O=aMfXD`TE(+$dG%bKge=+sqgu03LZ=?VCs9P-c84o+1-t?F|4Hj)ViE=7ml1ex=Uy8qS(Yg02WecTm)rXSw`DzB69! zD}EJ|G)g|ZzFOO#kR`@Jtbn1_Oui%!46}hSe~C#cD|(t>-^pFlvpN=H;C<4 zGQvq&f*Wi^FOW-I6<8Hm6<8Hm6<8Hm6<8Hm6<8Hm6<8Hm6<8Hm6<8Hm6<8Hm6<8Hm a6<8Hm6<8Hm6<8Hm6<8Hm75Klez<&Tpk|~z} literal 0 HcmV?d00001 diff --git a/font/packer.c b/font/packer.c new file mode 100644 index 000000000..db57b1a08 --- /dev/null +++ b/font/packer.c @@ -0,0 +1,100 @@ +#include +#include +#include +#include + +#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