#ifndef INCLUDE_FONT_H #define INCLUDE_FONT_H #ifndef INCLUDE_MATH_H #include "../lib/math.h" #endif #ifndef INCLUDE_FS_H #include "../lib/obj/fs.h" #endif #define DEFAULT_FONT "/sys/fonts/Tahoma.kf" :struct __OFFSET_FONT { signed x,y; }; :struct __SIZE { dword width,height; __OFFSET_FONT offset; float offset_i,w_italic; byte text; byte TMP_WEIGHT; }; :struct FONT { __SIZE size; int left,top,width,height; byte bold,italic,smooth; byte no_bg_copy; dword bg_color; dword color; dword file_size; dword buffer; dword buffer_size; word block; dword data; dword begin; byte load(...); byte symbol(word x,y;byte s;dword c); byte symbol_size(byte s); dword prepare(word x,y;dword text1); void prepare_buf(dword x,y,w,h, text1); void show(); byte textcenter(word x,y,w,h;dword txt); dword getsize(dword text1); byte changeSIZE(); void PixelRGB(dword x,y); }; FONT font = 0; :void FONT::PixelRGB(dword x,y) { dword offs = y*size.width+x*3 + buffer; DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color; } :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; prepare(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.offset.y; size.height++; 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(bold) size.width+=size.TMP_WEIGHT; return; } IF(s==9) { size.width += width; IF(bold) size.width+=size.TMP_WEIGHT; return; } s = AnsiToCp866(s); iii = 0; tmp = 4*block*s + data; for(yi=0; yi>= 1; ELSE { tmp += 4; _ = DSDWORD[tmp]; } IF(_&1) { IF(xi>rw)rw=xi; IF(size.heightxi)X = xi; } iii++; } } size.width += rw; IF(bold) size.width+=size.TMP_WEIGHT; IF(s=='_') size.width--; IF(size.offset.x<0)size.offset.x = X; } :byte FONT::symbol(signed x,y;byte s) { dword xi,yi; dword iii; float ital = -size.w_italic; dword ___x; byte rw=0; IF(s==32)return width/4; IF(s==9)return width; s = AnsiToCp866(s); iii = 0; EBX = block*s << 2 + data; for(yi=0; yirw)rw=xi; ___x = x+xi; IF(italic)___x+=math.ceil(ital); PixelRGB(___x,EDI); IF(bold) PixelRGB(___x+1,EDI); } iii++; } if (italic) ital-=size.offset_i; } return rw; } :void FONT::show(){ _PutImage(left,top,size.width,size.height,buffer); } byte AnsiToCp866(byte s) { 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 return s; } inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; } :void SmoothFont(dword image, w, h) { dword i,line_w,to; line_w = w * 3; to = w*h*3 + image - line_w - 3; for(i = image; i < to; i+=3) { IF(i-image%line_w +3 == line_w) continue; IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000) { ShadowImage(i+3, 1, 1, 2); ShadowImage(i+line_w, 1, 1, 2); } ELSE IF(b24(i)!=0x000000) && (b24(i+3)==0x000000) && (b24(i+line_w)==0x000000) && (b24(i+3+line_w)!=0x000000) { ShadowImage(i, 1, 1, 2); ShadowImage(i+3+line_w, 1, 1, 2); } } } :byte FONT::load(dword path) { lib_init_fs(); buffer_size = 0; smooth = true; IF(data)free(data); IF(!fs.read(path)) { debug("Error while loading font: "); debugln(path); return false; } begin = data = EAX; EBX = begin + ECX; height = DSBYTE[EBX-1]; width = DSBYTE[EBX-2]; block = math.ceil(height*width/32); return true; } :dword FONT::prepare(int x,y;dword text1) { signed len=0; proc_info Form_SELF_FONTS; dword c; IF(!text1)return false; IF(size.text)IF(!changeSIZE())return false; left = x; getsize(text1); y -= size.offset.y; top = y; EDX = size.width*size.height*3; IF(!buffer_size) { buffer_size = EDX; buffer = malloc(buffer_size); } ELSE IF(buffer_size