Strict Standards: Non-static method Soojung::addReferer() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/settings.php on line 79

Warning: Cannot modify header information - headers already sent by (output started at /home/lifthrasiir/sites/sapzil.info/soojung/settings.php:79) in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Counter.class.php on line 63

Strict Standards: Non-static method Entry::getEntry() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/entry.php on line 51

Strict Standards: Non-static method Soojung::entryIdToFilename() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Entry.class.php on line 182

Strict Standards: Non-static method Soojung::queryFilenameMatch() should not be called statically in /home/lifthrasiir/sites/sapzil.info/soojung/classes/Soojung.class.php on line 55
TokigunStudio3 | 블로그: 또다른 삽질

내용으로 바로 넘어 가기


TokigunStudio3

228 / 3282   


더 이상 이 블로그는 운영되지 않습니다. 새 블로그로 가 주세요.

또다른 삽질

2005/03/31 PM 09:55 | 개발 | 0 comments | 0 trackbacks | AllBlog: vote, to pocket

이 글 제목에서 "또다른 진심"을 생각해 냈다면 당신은 펌프잇업을 잊지 못 하는 사람... (어쨌다고)

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

Copyright (c) 1995-2005, Kang Seonghoon (Tokigun).