Rev 5981 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5981 | Rev 5985 | ||
---|---|---|---|
Line 26... | Line 26... | ||
26 | :struct FONT |
26 | :struct FONT |
27 | { |
27 | { |
28 | __SIZE size; |
28 | __SIZE size; |
29 | int left,top,width,height; |
29 | int left,top,width,height; |
30 | byte bold,italic,smooth; |
30 | byte bold,italic,smooth; |
31 | byte no_bg_copy; |
- | |
32 | dword bg_color; |
31 | dword bg_color; |
33 | dword color; |
32 | dword color; |
34 | dword file_size; |
33 | dword file_size; |
35 | dword buffer; |
34 | dword buffer; |
36 | dword buffer_size; |
35 | dword buffer_size; |
37 | word block; |
36 | word block; |
38 | dword data; |
37 | dword data; |
39 | dword begin; |
38 | dword begin; |
40 | byte load(...); |
39 | byte load(...); |
- | 40 | byte changeSIZE(); |
|
41 | byte symbol(word x,y;byte s;dword c); |
41 | byte symbol(signed x,y;byte s;dword c); |
42 | byte symbol_size(byte s); |
42 | byte symbol_size(byte s); |
43 | dword prepare(word x,y;dword text1); |
- | |
44 | void prepare_buf(dword x,y,w,h, text1); |
- | |
45 | void show(); |
- | |
46 | byte textcenter(word x,y,w,h;dword txt); |
- | |
47 | dword getsize(dword text1); |
43 | dword getsize(dword text1); |
48 | byte changeSIZE(); |
44 | void apply_smooth(); |
- | 45 | int write_center(dword x,y,w,h;dword txt); |
|
49 | void PixelRGB(dword x,y); |
46 | int write(int x,y;dword text1); |
- | 47 | void write_buf(int x,y,w,h, text1); |
|
- | 48 | void show_buf(); |
|
50 | }; |
49 | }; |
51 | FONT font = 0; |
50 | FONT font = 0; |
Line 52... | Line -... | ||
52 | - | ||
53 | :void FONT::PixelRGB(dword x,y) |
- | |
54 | { |
- | |
55 | dword offs = y*size.width+x*3 + buffer; |
- | |
56 | DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color; |
- | |
57 | } |
51 | |
58 | :byte FONT::changeSIZE() |
52 | :byte FONT::changeSIZE() |
59 | { |
53 | { |
60 | dword TMP_DATA; |
54 | dword TMP_DATA; |
61 | dword ofs; |
55 | dword ofs; |
Line 71... | Line 65... | ||
71 | height = DSBYTE[TMP_DATA - 1]; |
65 | height = DSBYTE[TMP_DATA - 1]; |
72 | width = DSBYTE[TMP_DATA - 2]; |
66 | width = DSBYTE[TMP_DATA - 2]; |
73 | block = math.ceil(height*width/32); |
67 | block = math.ceil(height*width/32); |
74 | return true; |
68 | return true; |
75 | } |
69 | } |
76 | :byte FONT::textcenter(word x,y,w,h;dword txt) |
- | |
77 | { |
- | |
78 | getsize(txt); |
- | |
79 | EDX = w/2; |
- | |
80 | ECX = size.width/2; |
- | |
81 | EDX -= ECX; |
- | |
82 | x += EDX; |
- | |
83 | prepare(x,y,txt); |
- | |
84 | } |
- | |
85 | :dword FONT::getsize(dword text1) |
70 | :dword FONT::getsize(dword text1) |
86 | { |
71 | { |
87 | size.height = size.width = 0; |
72 | size.height = size.width = 0; |
88 | size.offset.x = size.offset.y = -1; |
73 | size.offset.x = size.offset.y = -1; |
89 | IF(size.text)IF(!changeSIZE())return 0; |
74 | IF(size.text)IF(!changeSIZE())return 0; |
Line 107... | Line 92... | ||
107 | } |
92 | } |
108 | :byte FONT::symbol_size(byte s) |
93 | :byte FONT::symbol_size(byte s) |
109 | { |
94 | { |
110 | dword xi,yi; |
95 | dword xi,yi; |
111 | dword tmp,_; |
96 | dword tmp,_; |
112 | dword iii; |
97 | dword iii = 0; |
113 | byte rw=0; |
98 | byte rw=0; |
114 | byte X; |
99 | byte X; |
115 | size.TMP_WEIGHT = math.ceil(size.text/17); |
100 | size.TMP_WEIGHT = math.ceil(size.text/17); |
116 | IF(s==32) |
101 | IF(s==32) |
117 | { |
102 | { |
Line 124... | Line 109... | ||
124 | size.width += width; |
109 | size.width += width; |
125 | IF(bold) size.width+=size.TMP_WEIGHT; |
110 | IF(bold) size.width+=size.TMP_WEIGHT; |
126 | return; |
111 | return; |
127 | } |
112 | } |
128 | s = AnsiToCp866(s); |
113 | s = AnsiToCp866(s); |
129 | iii = 0; |
- | |
130 | tmp = 4*block*s + data; |
114 | tmp = 4*block*s + data; |
131 | for(yi=0; yi |
115 | for(yi=0; yi |
132 | { |
116 | { |
133 | for(xi=0; xi |
117 | for(xi=0; xi |
134 | { |
118 | { |
Line 156... | Line 140... | ||
156 | IF(size.offset.x<0)size.offset.x = X; |
140 | IF(size.offset.x<0)size.offset.x = X; |
157 | } |
141 | } |
158 | :byte FONT::symbol(signed x,y;byte s) |
142 | :byte FONT::symbol(signed x,y;byte s) |
159 | { |
143 | { |
160 | dword xi,yi; |
144 | dword xi,yi; |
161 | dword iii; |
145 | dword iii = 0; |
- | 146 | dword offs; |
|
162 | float ital = -size.w_italic; |
147 | float ital = -size.w_italic; |
163 | dword ___x; |
148 | dword ___x; |
164 | byte rw=0; |
149 | byte rw=0; |
165 | IF(s==32)return width/4; |
150 | IF(s==32)return width/4; |
166 | IF(s==9)return width; |
151 | IF(s==9)return width; |
167 | s = AnsiToCp866(s); |
152 | s = AnsiToCp866(s); |
168 | iii = 0; |
- | |
169 | EBX = block*s << 2 + data; |
153 | EBX = block*s << 2 + data; |
170 | for(yi=0; yi |
154 | for(yi=0; yi |
171 | { |
155 | { |
172 | EDI = size.offset.y + yi + y; |
156 | EDI = size.offset.y + yi + y * size.width * 3 + buffer; |
173 | for(xi=0; xi |
157 | for(xi=0; xi |
174 | { |
158 | { |
175 | IF(iii%32) $shr ecx,1 |
159 | IF(iii%32) $shr ecx,1 |
176 | ELSE |
160 | ELSE |
177 | { |
161 | { |
Line 181... | Line 165... | ||
181 | IF(ECX&true) |
165 | IF(ECX&true) |
182 | { |
166 | { |
183 | IF(xi>rw)rw=xi; |
167 | IF(xi>rw)rw=xi; |
184 | ___x = x+xi; |
168 | ___x = x+xi; |
185 | IF(italic)___x+=math.ceil(ital); |
169 | IF(italic)___x+=math.ceil(ital); |
186 | PixelRGB(___x,EDI); |
170 | offs = ___x*3 + EDI; |
- | 171 | DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color; |
|
187 | IF(bold) PixelRGB(___x+1,EDI); |
172 | IF(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color; |
188 | } |
173 | } |
189 | iii++; |
174 | iii++; |
190 | } |
175 | } |
191 | if (italic) ital-=size.offset_i; |
176 | if (italic) ital-=size.offset_i; |
192 | } |
177 | } |
193 | return rw; |
178 | return rw; |
194 | } |
179 | } |
Line 195... | Line -... | ||
195 | - | ||
196 | :void FONT::show(){ |
- | |
197 | _PutImage(left,top,size.width,size.height,buffer); |
- | |
198 | } |
- | |
199 | 180 | ||
200 | byte AnsiToCp866(byte s) { |
181 | byte AnsiToCp866(byte s) { |
201 | IF(s>=128)&&(s<=175)s+=64; |
182 | IF(s>=128)&&(s<=175)s+=64; |
202 | ELSE IF(s>=224)&&(s<=239)s+=16; |
183 | ELSE IF(s>=224)&&(s<=239)s+=16; |
203 | ELSE IF(s==241)s=184; //yo |
184 | ELSE IF(s==241)s=184; //yo |
204 | ELSE IF(s==240)s=168; //YO |
185 | ELSE IF(s==240)s=168; //YO |
205 | return s; |
186 | return s; |
Line 206... | Line 187... | ||
206 | } |
187 | } |
207 | 188 | ||
208 | inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; } |
189 | inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; } |
209 | :void SmoothFont(dword image, w, h) |
190 | :void FONT::apply_smooth() |
210 | { |
191 | { |
211 | dword i,line_w,to; |
192 | dword i,line_w,to; |
212 | line_w = w * 3; |
193 | line_w = font.size.width * 3; |
- | 194 | to = font.size.height - 1 * line_w + font.buffer - 3; |
|
213 | to = w*h*3 + image - line_w - 3; |
195 | for(i=font.buffer; i < to; i+=3) |
214 | for(i = image; i < to; i+=3) { |
196 | { |
215 | IF(i-image%line_w +3 == line_w) continue; |
197 | IF(i-font.buffer%line_w +3 == line_w) continue; |
216 | IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000) |
198 | IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000) |
217 | { |
199 | { |
218 | ShadowImage(i+3, 1, 1, 2); |
200 | ShadowPixel(i+3, 2); |
219 | ShadowImage(i+line_w, 1, 1, 2); |
201 | ShadowPixel(i+line_w, 2); |
220 | } |
202 | } |
221 | ELSE IF(b24(i)!=0x000000) && (b24(i+3)==0x000000) && (b24(i+line_w)==0x000000) && (b24(i+3+line_w)!=0x000000) |
203 | ELSE IF(b24(i)!=0x000000) && (b24(i+3)==0x000000) && (b24(i+line_w)==0x000000) && (b24(i+3+line_w)!=0x000000) |
222 | { |
204 | { |
223 | ShadowImage(i, 1, 1, 2); |
205 | ShadowPixel(i, 2); |
224 | ShadowImage(i+3+line_w, 1, 1, 2); |
206 | ShadowPixel(i+3+line_w, 2); |
225 | } |
207 | } |
226 | } |
208 | } |
227 | } |
209 | } |
Line 238... | Line 220... | ||
238 | width = DSBYTE[EBX-2]; |
220 | width = DSBYTE[EBX-2]; |
239 | block = math.ceil(height*width/32); |
221 | block = math.ceil(height*width/32); |
240 | return true; |
222 | return true; |
241 | } |
223 | } |
Line -... | Line 224... | ||
- | 224 | ||
- | 225 | :int FONT::write_center(dword x,y,w,h;dword txt) |
|
- | 226 | { |
|
- | 227 | getsize(txt); |
|
- | 228 | return write(w-size.width/2+x,y,txt); |
|
- | 229 | } |
|
242 | 230 | ||
243 | :dword FONT::prepare(int x,y;dword text1) |
231 | :int FONT::write(int x,y; dword text1) |
244 | { |
232 | { |
245 | signed len=0; |
- | |
246 | proc_info Form_SELF_FONTS; |
- | |
247 | dword c; |
233 | signed len=0; |
248 | IF(!text1)return false; |
234 | IF(!text1)return false; |
249 | IF(size.text)IF(!changeSIZE())return false; |
235 | IF(size.text)IF(!changeSIZE())return false; |
250 | left = x; |
236 | left = x; |
251 | getsize(text1); |
237 | getsize(text1); |
Line 260... | Line 246... | ||
260 | ELSE IF(buffer_size |
246 | ELSE IF(buffer_size |
261 | { |
247 | { |
262 | buffer_size = EDX; |
248 | buffer_size = EDX; |
263 | buffer = realloc(buffer,buffer_size); |
249 | buffer = realloc(buffer,buffer_size); |
264 | } |
250 | } |
265 | IF (no_bg_copy) |
251 | // Fill background color { |
266 | { |
- | |
267 | EBX = bg_color; |
252 | EBX = bg_color; |
268 | EAX = buffer_size+buffer; |
253 | EAX = buffer_size+buffer; |
269 | for (EDI=buffer; EDI |
254 | for (EDI=buffer; EDI |
270 | } |
255 | // } |
271 | ELSE |
- | |
272 | { |
- | |
273 | GetProcessInfo(#Form_SELF_FONTS, SelfInfo); |
- | |
274 | CopyScreen(buffer,x+Form_SELF_FONTS.left+5,y+Form_SELF_FONTS.top+GetSkinHeight(),size.width,size.height); |
- | |
275 | } |
- | |
276 | len = size.offset.x; |
256 | len = size.offset.x; |
277 | WHILE(DSBYTE[text1]) |
257 | WHILE(DSBYTE[text1]) |
278 | { |
258 | { |
279 | IF(DSBYTE[text1]=='_') len--; |
259 | IF(DSBYTE[text1]=='_') len--; |
280 | len+=symbol(len,0,DSBYTE[text1]); |
260 | len+=symbol(len,0,DSBYTE[text1]); |
281 | IF(bold)len+=math.ceil(size.text/17); |
261 | IF(bold)len+=math.ceil(size.text/17); |
282 | text1++; |
262 | text1++; |
283 | } |
263 | } |
284 | IF (smooth) SmoothFont(buffer, size.width, size.height); |
264 | IF (smooth) apply_smooth(); |
- | 265 | show_buf(left,top); |
|
285 | return len; |
266 | return len; |
286 | } |
267 | } |
Line 287... | Line 268... | ||
287 | 268 | ||
288 | :void FONT::prepare_buf(int x,y,w,h; dword text1) |
269 | :void FONT::write_buf(int x,y,w,h; dword text1) |
289 | { |
270 | { |
290 | dword c, new_buffer_size; |
271 | dword new_buffer_size; |
291 | IF(!text1)return; |
272 | IF(!text1)return; |
292 | IF(size.text)IF(!changeSIZE())return; |
273 | IF(size.text)IF(!changeSIZE())return; |
293 | getsize(text1); |
274 | getsize(text1); |
Line 300... | Line 281... | ||
300 | IF(buffer_size != w*h*3) |
281 | IF(buffer_size != w*h*3) |
301 | { |
282 | { |
302 | buffer_size = new_buffer_size; |
283 | buffer_size = new_buffer_size; |
303 | free(buffer); |
284 | free(buffer); |
304 | buffer = malloc(buffer_size); |
285 | buffer = malloc(buffer_size); |
- | 286 | // Fill background color |
|
305 | EBX = bg_color; |
287 | EBX = bg_color; |
306 | EAX = buffer_size+buffer; |
288 | EAX = buffer_size+buffer; |
307 | for (EDI=buffer; EDI |
289 | for (EDI=buffer; EDI |
308 | } |
290 | } |
309 | WHILE(DSBYTE[text1]) |
291 | WHILE(DSBYTE[text1]) |
Line 313... | Line 295... | ||
313 | text1++; |
295 | text1++; |
314 | } |
296 | } |
315 | return; |
297 | return; |
316 | } |
298 | } |
Line -... | Line 299... | ||
- | 299 | ||
- | 300 | :void FONT::show_buf(dword left1, top1){ |
|
- | 301 | _PutImage(left1,top1,size.width,size.height,buffer); |
|
- | 302 | } |
|
- | 303 | ||
- | 304 | ||
- | 305 | ||
317 | 306 | ||
318 | #endif |
307 | #endif |