28,7 → 28,6 |
__SIZE size; |
int left,top,width,height; |
byte bold,italic,smooth; |
byte no_bg_copy; |
dword bg_color; |
dword color; |
dword file_size; |
38,23 → 37,18 |
dword data; |
dword begin; |
byte load(...); |
byte symbol(word x,y;byte s;dword c); |
byte changeSIZE(); |
byte symbol(signed 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); |
void apply_smooth(); |
int write_center(dword x,y,w,h;dword txt); |
int write(int x,y;dword text1); |
void write_buf(int x,y,w,h, text1); |
void show_buf(); |
}; |
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; |
73,15 → 67,6 |
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; |
109,7 → 94,7 |
{ |
dword xi,yi; |
dword tmp,_; |
dword iii; |
dword iii = 0; |
byte rw=0; |
byte X; |
size.TMP_WEIGHT = math.ceil(size.text/17); |
126,7 → 111,6 |
return; |
} |
s = AnsiToCp866(s); |
iii = 0; |
tmp = 4*block*s + data; |
for(yi=0; yi<height; yi++) |
{ |
158,7 → 142,8 |
:byte FONT::symbol(signed x,y;byte s) |
{ |
dword xi,yi; |
dword iii; |
dword iii = 0; |
dword offs; |
float ital = -size.w_italic; |
dword ___x; |
byte rw=0; |
165,11 → 150,10 |
IF(s==32)return width/4; |
IF(s==9)return width; |
s = AnsiToCp866(s); |
iii = 0; |
EBX = block*s << 2 + data; |
for(yi=0; yi<height; yi++) |
{ |
EDI = size.offset.y + yi + y; |
EDI = size.offset.y + yi + y * size.width * 3 + buffer; |
for(xi=0; xi<width; xi++) |
{ |
IF(iii%32) $shr ecx,1 |
183,8 → 167,9 |
IF(xi>rw)rw=xi; |
___x = x+xi; |
IF(italic)___x+=math.ceil(ital); |
PixelRGB(___x,EDI); |
IF(bold) PixelRGB(___x+1,EDI); |
offs = ___x*3 + EDI; |
DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color; |
IF(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color; |
} |
iii++; |
} |
193,10 → 178,6 |
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; |
206,22 → 187,23 |
} |
|
inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; } |
:void SmoothFont(dword image, w, h) |
:void FONT::apply_smooth() |
{ |
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; |
line_w = font.size.width * 3; |
to = font.size.height - 1 * line_w + font.buffer - 3; |
for(i=font.buffer; i < to; i+=3) |
{ |
IF(i-font.buffer%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); |
ShadowPixel(i+3, 2); |
ShadowPixel(i+line_w, 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); |
ShadowPixel(i, 2); |
ShadowPixel(i+3+line_w, 2); |
} |
} |
} |
240,11 → 222,15 |
return true; |
} |
|
:dword FONT::prepare(int x,y;dword text1) |
:int FONT::write_center(dword x,y,w,h;dword txt) |
{ |
getsize(txt); |
return write(w-size.width/2+x,y,txt); |
} |
|
:int FONT::write(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; |
262,17 → 248,11 |
buffer_size = EDX; |
buffer = realloc(buffer,buffer_size); |
} |
IF (no_bg_copy) |
{ |
// Fill background color { |
EBX = bg_color; |
EAX = buffer_size+buffer; |
for (EDI=buffer; EDI<EAX; EDI+=3) ESDWORD[EDI] = EBX; |
} |
ELSE |
{ |
GetProcessInfo(#Form_SELF_FONTS, SelfInfo); |
CopyScreen(buffer,x+Form_SELF_FONTS.left+5,y+Form_SELF_FONTS.top+GetSkinHeight(),size.width,size.height); |
} |
// } |
len = size.offset.x; |
WHILE(DSBYTE[text1]) |
{ |
281,13 → 261,14 |
IF(bold)len+=math.ceil(size.text/17); |
text1++; |
} |
IF (smooth) SmoothFont(buffer, size.width, size.height); |
IF (smooth) apply_smooth(); |
show_buf(left,top); |
return len; |
} |
|
:void FONT::prepare_buf(int x,y,w,h; dword text1) |
:void FONT::write_buf(int x,y,w,h; dword text1) |
{ |
dword c, new_buffer_size; |
dword new_buffer_size; |
IF(!text1)return; |
IF(size.text)IF(!changeSIZE())return; |
getsize(text1); |
302,6 → 283,7 |
buffer_size = new_buffer_size; |
free(buffer); |
buffer = malloc(buffer_size); |
// Fill background color |
EBX = bg_color; |
EAX = buffer_size+buffer; |
for (EDI=buffer; EDI<EAX; EDI+=3) ESDWORD[EDI] = EBX; |
315,4 → 297,11 |
return; |
} |
|
:void FONT::show_buf(dword left1, top1){ |
_PutImage(left1,top1,size.width,size.height,buffer); |
} |
|
|
|
|
#endif |