#ifndef INCLUDE_FONT_H #define INCLUDE_FONT_H #ifndef INCLUDE_MATH_H #include "../lib/math.h" #endif #ifndef INCLUDE_IO_H #include "../lib/io.h" #endif :struct __SIZE { word width,height; signed offset_x,offset_y; float offset_i,w_italic; byte text; byte TMP_WEIGHT; }; :struct FONT { __SIZE size; byte r,g,b,weight,italic; byte width,height; byte encoding; dword color; dword file_size; dword buffer; dword buffer_size; word block; dword data; dword begin; dword size_file; byte load(...); byte symbol(word x;byte s;dword c); byte symbol_size(byte s); dword prepare(word x,y;dword text1); void prepare_buf(word x,y,w,h;dword text1); void show(word x,y); byte textcenter(word x,y,w,h;dword txt); dword getsize(dword text1); byte changeSIZE(); void PixelRGB(word x,y); //dword GetPixel(word x,y); byte no_bg_copy; dword bg_color; }; FONT font = 0; /* :dword FONT::GetPixel(word x,y) { dword tmp = y*size.width*3; tmp += x*3 + buffer; r = DSBYTE[tmp]; tmp++; g = DSBYTE[tmp]; tmp++; b = DSBYTE[tmp]; }*/ :void FONT::PixelRGB(dword x,y) { $push ebx EBX = y*size.width+x*3 + buffer; DSBYTE[EBX] = r; EBX++; DSBYTE[EBX] = g; EBX++; DSBYTE[EBX] = b; $pop ebx } :byte FONT::changeSIZE() { dword TMP_DATA; dword ofs; IF(size.text<9) size.text = 8; TMP_DATA = data = begin; TMP_DATA +=size.text-8*4; ofs = DSDWORD[TMP_DATA]; IF(ofs==-1)return false; data += ofs + 156; TMP_DATA = data; file_size = DSDWORD[TMP_DATA]; TMP_DATA = data + file_size; height = DSBYTE[TMP_DATA - 1]; width = DSBYTE[TMP_DATA - 2]; block = math.ceil(height*width/32); return true; } :byte FONT::textcenter(word x,y,w,h;dword txt) { getsize(txt); EDX = w/2; ECX = size.width/2; EDX -= ECX; x += EDX; return text(x,y,txt); } :dword FONT::getsize(dword text1) { size.height = size.width = 0; size.offset_x = size.offset_y = -1; IF(size.text)IF(!changeSIZE())return 0; WHILE(DSBYTE[text1]) { symbol_size(DSBYTE[text1]); text1++; } $neg size.offset_y $neg size.offset_x size.height++; size.height += size.offset_y; size.width += size.offset_x; size.width++; IF(italic) { size.w_italic = size.height/3; size.offset_i = size.w_italic/size.height; size.width += size.w_italic; size.w_italic = -size.w_italic; } return size.width; } :byte FONT::symbol_size(byte s) { dword xi,yi; dword tmp,_; dword iii; byte rw=0; byte X; size.TMP_WEIGHT = math.ceil(size.text/17); IF(s==32) { size.width += width/4; IF(weight) size.width+=size.TMP_WEIGHT; return; } IF(s==9) { size.width += width; IF(weight) size.width+=size.TMP_WEIGHT; return; } IF(!encoding){ IF(s>=128)&&(s<=175)s+=64; ELSE IF(s>=224)&&(s<=239)s+=16; ELSE IF(s==241)s=184; //yo ELSE IF(s==240)s=168; //YO } yi = 0; iii = 0; tmp = 4*block*s + data; while(yi>= 1; ELSE { tmp += 4; _ = DSDWORD[tmp]; } IF(_&1) { IF(xi>rw)rw=xi; IF(size.heightxi)X = xi; } xi++; iii++; } yi++; } size.width += rw; IF(weight) size.width+=size.TMP_WEIGHT; IF(s=='_') size.width--; IF(size.offset_x<0)size.offset_x = X; } :dword FONT::prepare(word x,y;dword text1) { signed len=0; proc_info Form_SELF_FONTS; dword c; c = color; IF(!text1)return false; IF(size.text)IF(!changeSIZE())return false; AX = c; r = AL; g = AH; c>>=16; AX = c; b = AL; getsize(text1); y -= size.offset_y; EDX = size.width*size.height*3; IF(!buffer_size) { buffer_size = EDX; buffer = malloc(buffer_size); } ELSE IF(buffer_size=128)&&(s<=175)s+=64; ELSE IF(s>=224)&&(s<=239)s+=16; ELSE IF(s==241)s=184; //yo ELSE IF(s==240)s=168; //YO } yi = 0; iii = 0; tmp = 4*block*s; tmp +=data; while(yi>= 1; ELSE { tmp += 4; _ = DSDWORD[tmp]; } if(_&1) { IF(xi>rw)rw=xi; ___x = x+xi; IF(italic)___x+=math.ceil(ital); PixelRGB(___x,TMP); _TMP_WEIGHT = size.TMP_WEIGHT; WHILE(_TMP_WEIGHT) { IF(weight) PixelRGB(___x+_TMP_WEIGHT,TMP); _TMP_WEIGHT--; } } xi++; iii++; } yi++; IF(italic) ital-=size.offset_i; } return rw; } :byte FONT::load(dword path) { buffer_size = 0; IF(data)free(data); if (!io.readKPACK(path)) { debug("Error while loading font: "); debugln(path); return false; } begin = data = io.buffer_data; size_file = io.FILES_SIZE; EBX = begin + size_file; height = DSBYTE[EBX - 1]; width = DSBYTE[EBX - 2]; block = math.ceil(height*width/32); return true; } :void FONT::prepare_buf(word x,y,w,h; dword text1) { signed len=0; dword c; c = color; IF(!text1)return; IF(size.text)IF(!changeSIZE())return; AX = c; r = AL; g = AH; c>>=16; AX = c; b = AL; getsize(text1); y -= size.offset_y; size.width = w; size.height = h; EDX = size.width*size.height*3; IF(!buffer_size) { buffer_size = EDX; buffer = malloc(buffer_size); EBX = bg_color; EDI = buffer; EAX = buffer_size+EDI; WHILE (EDI