더 이상 이 블로그는 운영되지 않습니다. 새 블로그로 가 주세요.
또다른 삽질
2005/03/31 PM 09:55 | 개발 | 0 comments | 0 trackbacks | AllBlog: vote, to pocket
이 글 제목에서 "또다른 진심"을 생각해 냈다면 당신은 펌프잇업을 잊지 못 하는 사람... (어쨌다고)
angolmois 작업을 계속 하고 있다. 오늘은 글꼴 출력 부분을 구현해 봤는데, 최대한 코드가 작게 나오게 하려고 별의별 삽질을 했다. 그 결과 예상 코드 길이 1300바이트 정도로 글꼴 출력을 구현할 수 있었다. 다음은 해당하는 부분의 코드이다:
음... 슬슬 숙제 하러 가야 할 것 같다. 너무 시간이 많이 걸렸군 -_-
angolmois 작업을 계속 하고 있다. 오늘은 글꼴 출력 부분을 구현해 봤는데, 최대한 코드가 작게 나오게 하려고 별의별 삽질을 했다. 그 결과 예상 코드 길이 1300바이트 정도로 글꼴 출력을 구현할 수 있었다. 다음은 해당하는 부분의 코드이다:
/* font data */ Uint8 fontmap[]="\0\2\3\6\7\10\13\14\16\20\30\33\34\36$,03678;<>?@AFU]_`acfghkl" "nopsvwx{|~\177\201\237\303\333\361"; Uint8 fontinfo[]=">',\37==8==M\\\256\211\255K==========MNM{M==================>" "==========K=\26\315&]=]=]=_-=?==]]]``]]=]]]]_]-\20-7"; Uint8 fontdata[]=".::::..$...66662'67;O7;O64));IIH;*III;))CDE'+.4F?'8JJJ9IKFK9+\ ++.-+.444444.+4.++++++.4.YYT.TYY....T......4T...%'+.4C=;EEGLRNEE;0:3++++++<\ ;EEG,08MCU;EE&1&&EE;,16FFFFU''UCCCT&&EE;;EECTEEEE;U&&'+.....;EEE;EEEE;;EEEE\ <&EE;...$$$......$$$...4'+.4C4.+'T$$TC4.+'+.4C;EEE'+.$..;>A@@@B>E;)06EEEUEE\ ETEEETEEEET15ECCCCE51SFEEEEEEFSUCCCTCCCCUUCCCTCCCCC15ECCGEE51EEEEUEEEEET...\ .....T&&&&&&EEE;EFJQMMQJFECCCCCCCCCUEPUUIIEEEEEEENRLGEEE06EEEEEE60TEEEETCCC\ C;EEEEEIL;(&TEEEETEEEE;EEC;&&EE;T.........EEEEEEEEE;EEEEEEE60)EEEEIIIU66>EP\ ;00;PE>VXF:......U&&(,08MCU:44444444:=C4.+'%:++++++++:)06E>U4.+';&&<EEE<CCC\ TEEEEET;EECCEE;&&&<EEEEE<;EEEUCE;,//.T.....<EEEE<&EE;CCCTEEEEEEE..$.......&\ &$$&&&&EEE;CCEFJQQJFE0+++++++++OUIIIIEETEEEEEEE;EEEEEE;TEEEEEETCCC<EEEEEE<&\ &&TEECCCCC;EC;&&E;..T...///,EEEEEEE;EEEEE60)EEEIIIU6>E6006E>EEEE51+.4CU(,08\ MCU,....M....,................M....,....MMZW,"; int fontindex[96]={0}; /* screen manipulation function */ void putpixel(int x, int y, int c) { ((Uint32*)screen->pixels)[x+y*800]=c; } void drawhline(int x1, int x2, int y, int c) { while(x1<x2) putpixel(x1++, y, c); } void drawvline(int x, int y1, int y2, int c) { while(y1<y2) putpixel(x, y1++, c); } int blend(int x, int y, int a, int b) { int i=0;for(;i<24;i+=8)y+=((x>>i&255)-(y>>i&255))*a/b<<i;return y; } void putblendedpixel(int x, int y, int c, int o) { putpixel(x, y, blend(((Uint32*)screen->pixels)[x+y*800], c, o, 255)); } /* font data decompression */ void fontprocess() { int i,j=0; for(i=0; i<95; i++) { fontinfo[i]--; fontindex[i+1] = fontindex[i] + fontinfo[i]%16 - fontinfo[i]/16 + 1; } for(i=0; i<fontindex[95]; i++) { if(fontdata[i+j] == 32) i--,j++; else fontdata[i] = fontmap[fontdata[i+j]-36]; } } /* prints a character */ void printchar(int x, int y, char c) { int i, j, k; if(c < 33 || c > 126) return; for(i=fontindex[c-33],j=fontinfo[c-33]>>4; j<=(fontinfo[c-33]&15); i++,j++) { for(k=0; k<8; k++) { if(fontdata[i]&(1<<(7-k))) putpixel(x+k, y+j, blend(0xFF80FF, 0xFFFFFF, j, 15)); } } } /* prints a string */ void printstr(int x, int y, char *s) { while(*s) { printchar(x, y, *s++); x += 8; } }코드의 원리는 알 만한 사람은 다 알리라 생각한다. 글꼴 데이터 압축은 크게 신경 쓴 게 아니니까 코드 조금만 보면 풀 수 있을 것 같고... 글꼴 원본은 날개셋에서 가져 왔는데 너무 맘에 안 들어서 마구 뜯어 고쳤다.
음... 슬슬 숙제 하러 가야 할 것 같다. 너무 시간이 많이 걸렸군 -_-
TrackBack URL: http://sapzil.info/soojung/trackback.php?blogid=558