Rev 6786 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 6786 | Rev 6803 | ||
---|---|---|---|
Line 16... | Line 16... | ||
16 | 16 | ||
17 | :struct __SIZE |
17 | :struct __SIZE |
18 | { |
18 | { |
19 | dword width,height; |
19 | dword width,height; |
20 | signed offset_x, offset_y; |
- | |
21 | float offset_i,w_italic; |
20 | signed offset_x, offset_y; |
22 | byte pt; |
- | |
23 | byte TMP_WEIGHT; |
21 | byte pt; |
24 | }; |
22 | }; |
25 | :struct LABEL |
23 | :struct LABEL |
26 | { |
24 | { |
27 | __SIZE size; |
25 | __SIZE size; |
28 | int width,height; |
26 | int width,height; |
29 | byte bold,italic,smooth; |
27 | byte bold,smooth; |
30 | dword color, background; |
28 | dword color, background; |
31 | dword font,font_begin; |
29 | dword font,font_begin; |
- | 30 | word block; |
|
- | 31 | dword raw; |
|
- | 32 | dword raw_size; |
|
32 | word block; |
33 | |
33 | byte init(); |
34 | byte init(); |
34 | byte changeSIZE(); |
35 | bool changeSIZE(); |
35 | byte symbol(); |
36 | byte symbol(); |
36 | byte symbol_size(); |
37 | byte symbol_size(); |
Line 37... | Line -... | ||
37 | dword getsize(); |
- | |
38 | - | ||
39 | dword raw; |
38 | dword getsize(); |
40 | dword raw_size; |
39 | |
41 | void apply_smooth(); |
40 | void ApplySmooth(); |
42 | int write_center(); |
41 | int WriteIntoWindow(); |
43 | int write(); |
42 | int WriteIntoWindowCenter(); |
44 | void write_buf(); |
43 | void WriteIntoBuffer(); |
Line 45... | Line 44... | ||
45 | void show_buf(); |
44 | void show_buf(); |
46 | } label; |
45 | } label; |
47 | 46 | ||
48 | :byte LABEL::changeSIZE() |
- | |
49 | { |
47 | :bool LABEL::changeSIZE() |
50 | dword file_size; |
48 | { |
51 | dword TMP_DATA; |
49 | dword file_size; |
52 | dword ofs; |
- | |
53 | IF(size.pt<9) size.pt = 8; |
50 | dword ofs; |
54 | TMP_DATA = font = font_begin; |
51 | if(size.pt<9) size.pt = 8; |
55 | TMP_DATA +=size.pt-8*4; |
52 | font = font_begin; |
56 | ofs = DSDWORD[TMP_DATA]; |
- | |
57 | IF(ofs==-1)return false; |
53 | ofs = DSDWORD[calc(size.pt-8<<2+font_begin)]; |
58 | font += ofs + 156; |
- | |
59 | TMP_DATA = font; |
54 | if(ofs==-1)return false; |
60 | file_size = DSDWORD[TMP_DATA]; |
55 | font += ofs + 156; |
61 | TMP_DATA = font + file_size; |
56 | file_size = DSDWORD[calc(font)]; |
62 | height = DSBYTE[TMP_DATA - 1]; |
57 | height = DSBYTE[calc(font+file_size) - 1]; |
63 | width = DSBYTE[TMP_DATA - 2]; |
58 | width = DSBYTE[calc(font+file_size) - 2]; |
64 | block = math.ceil(height*width/32); |
59 | block = math.ceil(height*width/32); |
65 | return true; |
60 | return true; |
66 | } |
61 | } |
67 | :dword LABEL::getsize(dword text1) |
62 | :dword LABEL::getsize(dword text1) |
68 | { |
63 | { |
69 | size.height = size.width = 0; |
64 | size.height = size.width = 0; |
70 | size.offset_x = size.offset_y = -1; |
65 | size.offset_x = size.offset_y = -1; |
71 | IF(size.pt)IF(!changeSIZE())return 0; |
66 | if(size.pt)if(!changeSIZE())return 0; |
72 | WHILE(DSBYTE[text1]) |
67 | WHILE(DSBYTE[text1]) |
73 | { |
68 | { |
74 | symbol_size(DSBYTE[text1]); |
69 | symbol_size(DSBYTE[text1]); |
75 | text1++; |
70 | text1++; |
76 | } |
71 | } |
77 | $neg size.offset_y |
72 | $neg size.offset_y |
78 | $neg size.offset_x |
- | |
79 | size.height += size.offset_y+1; |
- | |
80 | size.width += size.offset_x+1; |
- | |
81 | IF(italic) |
- | |
82 | { |
- | |
83 | size.w_italic = size.height/3; |
- | |
84 | size.offset_i = size.w_italic/size.height; |
- | |
85 | size.width += size.w_italic; |
73 | $neg size.offset_x |
86 | size.w_italic = -size.w_italic; |
74 | size.height += size.offset_y+1; |
87 | } |
75 | size.width += size.offset_x+1; |
88 | return size.width; |
76 | return size.width; |
89 | } |
77 | } |
90 | :byte LABEL::symbol_size(byte s) |
78 | :byte LABEL::symbol_size(byte s) |
91 | { |
79 | { |
92 | dword xi,yi; |
80 | dword xi,yi; |
93 | dword tmp,_; |
81 | dword tmp,_; |
94 | dword iii = 0; |
82 | dword iii = 0; |
95 | byte rw=0; |
83 | byte rw=0; |
96 | byte X; |
84 | byte X; |
97 | size.TMP_WEIGHT = math.ceil(size.pt/17); |
85 | if(bold) size.width+=math.ceil(size.pt/17); |
98 | IF(s==32) |
- | |
99 | { |
86 | if(s==32) |
100 | size.width += width/4; |
87 | { |
101 | IF(bold) size.width+=size.TMP_WEIGHT; |
88 | size.width += width/4; |
102 | return; |
89 | return; |
103 | } |
90 | } |
104 | IF(s==9) |
- | |
105 | { |
91 | if(s==9) |
106 | size.width += width; |
92 | { |
107 | IF(bold) size.width+=size.TMP_WEIGHT; |
93 | size.width += width; |
108 | return; |
94 | return; |
109 | } |
95 | } |
110 | s = Cp866ToAnsi(s); |
96 | s = Cp866ToAnsi(s); |
111 | tmp = 4*block*s + font; |
97 | tmp = block*s << 2 + font; |
112 | for(yi=0; yi |
98 | for(yi=0; yi |
113 | { |
99 | { |
114 | for(xi=0; xi |
100 | for(xi=0; xi |
115 | { |
101 | { |
116 | IF(iii%32) _ >>= 1; |
102 | if(iii%32) _ >>= 1; |
117 | ELSE |
103 | else |
118 | { |
104 | { |
119 | tmp += 4; |
105 | tmp += 4; |
120 | _ = DSDWORD[tmp]; |
106 | _ = DSDWORD[tmp]; |
121 | } |
107 | } |
122 | IF(_&1) |
108 | if(_&1) |
123 | { |
109 | { |
124 | IF(xi>rw)rw=xi; |
110 | if(xi>rw)rw=xi; |
125 | IF(size.height |
111 | if(size.height |
126 | IF(size.offset_y<0)size.offset_y = yi; |
112 | if(size.offset_y<0)size.offset_y = yi; |
127 | ELSE IF(yi |
113 | else if(yi |
128 | IF(!X) X = xi; |
114 | if(!X) X = xi; |
129 | ELSE IF(X>xi)X = xi; |
115 | else if(X>xi)X = xi; |
130 | } |
116 | } |
131 | iii++; |
117 | iii++; |
132 | } |
- | |
133 | } |
- | |
134 | size.width += rw; |
118 | } |
135 | IF(bold) size.width+=size.TMP_WEIGHT; |
119 | } |
136 | //IF(s=='_') size.width--; //http://board.kolibrios.org/viewtopic.php?f=44&t=973&start=645 |
120 | size.width += rw; |
137 | IF(size.offset_x<0)size.offset_x = X; |
121 | if(size.offset_x<0)size.offset_x = X; |
138 | } |
122 | } |
139 | :byte LABEL::symbol(signed x,y; byte s; dword image_raw) |
123 | :byte LABEL::symbol(signed x,y; byte s; dword image_raw) |
140 | { |
124 | { |
141 | dword xi,yi; |
- | |
142 | dword iii = 0; |
- | |
143 | dword offs; |
125 | dword xi,yi; |
144 | float ital = -size.w_italic; |
126 | dword iii = 0; |
145 | dword ___x; |
127 | dword offs; |
146 | byte rw=0; |
128 | byte rw=0; |
147 | IF(s==32)return width/4; |
129 | if(s==32)return width/4; |
148 | IF(s==9)return width; |
130 | if(s==9)return width; |
149 | s = Cp866ToAnsi(s); |
131 | s = Cp866ToAnsi(s); |
150 | EBX = block*s << 2 + font; |
132 | EBX = block*s << 2 + font; |
151 | for(yi=0; yi |
133 | for(yi=0; yi |
152 | { |
134 | { |
153 | EDI = size.offset_y + yi + y * size.width * 3 + image_raw; |
135 | EDI = size.offset_y + yi + y * size.width * 3 + image_raw; |
154 | for(xi=0; xi |
136 | for(xi=0; xi |
155 | { |
137 | { |
156 | IF(iii%32) $shr ecx,1 |
138 | if(iii%32) $shr ecx,1 |
157 | ELSE |
139 | else |
158 | { |
140 | { |
159 | EBX += 4; |
141 | EBX += 4; |
160 | ECX = DSDWORD[EBX]; |
142 | ECX = DSDWORD[EBX]; |
161 | } |
143 | } |
162 | IF(ECX&true) |
- | |
163 | { |
- | |
164 | IF(xi>rw)rw=xi; |
144 | if(ECX&true) |
165 | ___x = x+xi; |
145 | { |
166 | IF(italic)___x+=math.ceil(ital); |
146 | if(xi>rw)rw=xi; |
167 | offs = ___x*3 + EDI; |
147 | offs = x + xi *3 + EDI; |
168 | DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color; |
148 | DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color; |
169 | IF(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color; |
149 | if(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color; |
170 | } |
- | |
171 | iii++; |
150 | } |
172 | } |
151 | iii++; |
173 | if (italic) ital-=size.offset_i; |
152 | } |
Line 174... | Line 153... | ||
174 | } |
153 | } |
175 | return rw; |
154 | return rw; |
176 | } |
155 | } |
177 | 156 | ||
178 | byte Cp866ToAnsi(byte s) { |
157 | inline fastcall Cp866ToAnsi(AL) { |
179 | IF(s>=128)&&(s<=175)s+=64; |
158 | if (AL>=128)&&(AL<=175) return AL+64; |
180 | ELSE IF(s>=224)&&(s<=239)s+=16; |
159 | if (AL>=224)&&(AL<=239) return AL+16; |
181 | ELSE IF(s==241)s=184; //e rus with dots (yo) |
160 | if (AL==241) return 184; //e ruAL with dotAL (yo) |
182 | ELSE IF(s==240)s=168; //E rus with dots (yo) |
161 | if (AL==240) return 168; //E ruAL with dotAL (yo) |
183 | ELSE IF(s==242)s='E'; //E ukr (ye) |
162 | if (AL==242) return 'E'; //E ukr (ye) |
184 | ELSE IF(s==243)s=186; //e ukr (ye) |
163 | if (AL==243) return 186; //e ukr (ye) |
Line 185... | Line 164... | ||
185 | ELSE IF(s==244)s='I'; //I ukr (yi) |
164 | if (AL==244) return 'I'; //I ukr (yi) |
186 | ELSE IF(s==245)s=191; //i ukr (yi) |
165 | if (AL==245) return 191; //i ukr (yi) |
187 | return s; |
166 | return AL; |
188 | } |
167 | } |
189 | 168 | ||
190 | :byte LABEL::init(dword font_path) |
169 | :byte LABEL::init(dword font_path) |
191 | { |
170 | { |
192 | IO label_io; |
171 | IO label_io; |
193 | IF(font)free(font); |
172 | if(font)free(font); |
194 | label_io.read(font_path); |
173 | label_io.read(font_path); |
195 | IF(!EAX) { |
174 | if(!EAX) { |
196 | debugln(font_path); |
- | |
197 | label_io.run("/sys/@notify", "'Error: KFONT is not loaded.' -E"); |
175 | debugln(font_path); |
198 | return false; |
176 | label_io.run("/sys/@notify", "'Error: KFONT is not loaded.' -E"); |
199 | } |
177 | return false; |
200 | font_begin = font = label_io.buffer_data; |
178 | } |
201 | height = DSBYTE[calc(font_begin+label_io.FILES_SIZE)-1]; |
179 | font_begin = label_io.buffer_data; |
Line 212... | Line 190... | ||
212 | =========================== =========================== |
190 | =========================== =========================== |
213 | =====================================================================================*/ |
191 | =====================================================================================*/ |
Line 214... | Line 192... | ||
214 | 192 | ||
215 | 193 | ||
216 | inline fastcall dword b24(EAX) { return DSDWORD[EAX] & 0x00FFFFFF; } |
194 | inline fastcall dword b24(EAX) { return DSDWORD[EAX] & 0x00FFFFFF; } |
217 | :void LABEL::apply_smooth() |
195 | :void LABEL::ApplySmooth() |
218 | { |
196 | { |
219 | dword i,line_w,to,dark_background; |
197 | dword i,line_w,to,dark_background; |
220 | line_w = size.width * 3; |
198 | line_w = size.width * 3; |
Line 240... | Line 218... | ||
240 | DSDWORD[i+3+line_w] = DSDWORD[i+3+line_w] & 0xFF000000 | dark_background; |
218 | DSDWORD[i+3+line_w] = DSDWORD[i+3+line_w] & 0xFF000000 | dark_background; |
241 | } |
219 | } |
242 | } |
220 | } |
243 | } |
221 | } |
Line 244... | Line 222... | ||
244 | 222 | ||
245 | :int LABEL::write_center(dword x,y,w,h; dword _background, _color; byte fontSizePoints; dword txt) |
223 | :int LABEL::WriteIntoWindowCenter(dword x,y,w,h; dword _background, _color; byte fontSizePoints; dword txt) |
246 | { |
224 | { |
247 | size.pt = fontSizePoints; |
225 | size.pt = fontSizePoints; |
248 | getsize(txt); |
226 | getsize(txt); |
249 | return write(w-size.width/2+x,y, _background, _color, fontSizePoints, txt); |
227 | return WriteIntoWindow(w-size.width/2+x,y, _background, _color, fontSizePoints, txt); |
Line 250... | Line 228... | ||
250 | } |
228 | } |
251 | 229 | ||
252 | :int LABEL::write(int x,y; dword _background, _color; byte fontSizePoints; dword text1) |
230 | :int LABEL::WriteIntoWindow(int x,y; dword _background, _color; byte fontSizePoints; dword text1) |
253 | { |
231 | { |
254 | signed len=0; |
232 | signed len=0; |
255 | IF(!text1)return false; |
233 | if(!text1)return false; |
256 | IF(size.pt)IF(!changeSIZE())return false; |
234 | if(size.pt)if(!changeSIZE())return false; |
257 | size.pt = fontSizePoints; |
235 | size.pt = fontSizePoints; |
258 | getsize(text1); |
236 | getsize(text1); |
259 | color = _color; |
237 | color = _color; |
260 | background = _background; |
238 | background = _background; |
261 | y -= size.offset_y; |
239 | y -= size.offset_y; |
262 | EDX = size.width*size.height*3; |
240 | EDX = size.width*size.height*3; |
263 | IF(!raw_size) |
241 | if(!raw_size) |
264 | { |
242 | { |
265 | raw_size = EDX; |
243 | raw_size = EDX; |
266 | raw = malloc(raw_size); |
244 | raw = malloc(raw_size); |
267 | } |
245 | } |
268 | ELSE IF(raw_size |
246 | else if(raw_size |
269 | { |
247 | { |
270 | raw_size = EDX; |
248 | raw_size = EDX; |
271 | raw = realloc(raw,raw_size); |
249 | raw = realloc(raw,raw_size); |
Line 276... | Line 254... | ||
276 | for (EDI=raw; EDI |
254 | for (EDI=raw; EDI |
277 | // } |
255 | // } |
278 | len = size.offset_x; |
256 | len = size.offset_x; |
279 | WHILE(DSBYTE[text1]) |
257 | WHILE(DSBYTE[text1]) |
280 | { |
258 | { |
281 | //IF(DSBYTE[text1]=='_') len--; //http://board.kolibrios.org/viewtopic.php?f=44&t=973&start=645 |
- | |
282 | len+=symbol(len,0,DSBYTE[text1], raw); |
259 | len+=symbol(len,0,DSBYTE[text1], raw); |
283 | IF(bold)len+=math.ceil(size.pt/17); |
260 | if(bold)len+=math.ceil(size.pt/17); |
284 | text1++; |
261 | text1++; |
285 | } |
262 | } |
286 | IF (smooth) apply_smooth(); |
263 | IF (smooth) ApplySmooth(); |
287 | show_buf(x,y); |
264 | show_buf(x,y); |
288 | return len; |
265 | return len; |
289 | } |
266 | } |
Line 290... | Line 267... | ||
290 | 267 | ||
291 | :void LABEL::write_buf(int x,y,w,h; dword _background, _color; byte fontSizePoints; dword text1) |
268 | :void LABEL::WriteIntoBuffer(int x,y,w,h; dword _background, _color; byte fontSizePoints; dword text1) |
292 | { |
269 | { |
293 | dword new_raw_size; |
270 | dword new_raw_size; |
294 | IF(!text1)return; |
271 | if(!text1)return; |
Line 295... | Line 272... | ||
295 | IF(size.pt)IF(!changeSIZE())return; |
272 | if(size.pt)if(!changeSIZE())return; |
296 | 273 | ||
297 | if (size.pt != fontSizePoints) { |
274 | if (size.pt != fontSizePoints) { |
298 | size.pt = fontSizePoints; |
275 | size.pt = fontSizePoints; |
Line 304... | Line 281... | ||
304 | 281 | ||
305 | size.width = w; |
282 | size.width = w; |
Line 306... | Line 283... | ||
306 | size.height = h; |
283 | size.height = h; |
307 | 284 | ||
308 | new_raw_size = w*h*3; |
285 | new_raw_size = w*h*3; |
309 | IF(raw_size != new_raw_size) |
286 | if(raw_size != new_raw_size) |
310 | { |
287 | { |
311 | raw_size = new_raw_size; |
288 | raw_size = new_raw_size; |
312 | free(raw); |
289 | free(raw); |
Line 317... | Line 294... | ||
317 | for (EDI=raw; EDI |
294 | for (EDI=raw; EDI |
318 | } |
295 | } |
319 | WHILE(DSBYTE[text1]) |
296 | WHILE(DSBYTE[text1]) |
320 | { |
297 | { |
321 | x+=symbol(x,y,DSBYTE[text1], raw); |
298 | x+=symbol(x,y,DSBYTE[text1], raw); |
322 | IF(bold)x+=math.ceil(size.pt/17); |
299 | if(bold)x+=math.ceil(size.pt/17); |
323 | text1++; |
300 | text1++; |
324 | } |
301 | } |
325 | return; |
302 | return; |
326 | } |
303 | } |