Rev 5985 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5985 | Rev 5987 | ||
---|---|---|---|
Line 1... | Line 1... | ||
1 | #ifndef INCLUDE_FONT_H |
1 | #ifndef INCLUDE_LABEL_H |
2 | #define INCLUDE_FONT_H |
2 | #define INCLUDE_LABEL_H |
Line 3... | Line 3... | ||
3 | 3 | ||
4 | #ifndef INCLUDE_MATH_H |
4 | #ifndef INCLUDE_MATH_H |
5 | #include "../lib/math.h" |
5 | #include "../lib/math.h" |
Line 9... | Line 9... | ||
9 | #include "../lib/obj/fs.h" |
9 | #include "../lib/obj/fs.h" |
10 | #endif |
10 | #endif |
Line 11... | Line 11... | ||
11 | 11 | ||
Line 12... | Line -... | ||
12 | #define DEFAULT_FONT "/sys/fonts/Tahoma.kf" |
- | |
13 | - | ||
14 | :struct __OFFSET_FONT |
- | |
15 | { |
- | |
16 | signed x,y; |
12 | #define DEFAULT_FONT "/sys/fonts/Tahoma.kf" |
17 | }; |
13 | |
18 | :struct __SIZE |
14 | :struct __SIZE |
19 | { |
15 | { |
20 | dword width,height; |
16 | dword width,height; |
21 | __OFFSET_FONT offset; |
17 | signed offset_x, offset_y; |
22 | float offset_i,w_italic; |
18 | float offset_i,w_italic; |
23 | byte text; |
19 | byte points; |
24 | byte TMP_WEIGHT; |
20 | byte TMP_WEIGHT; |
25 | }; |
21 | }; |
26 | :struct FONT |
22 | :struct LABEL |
27 | { |
23 | { |
28 | __SIZE size; |
24 | __SIZE size; |
29 | int left,top,width,height; |
- | |
30 | byte bold,italic,smooth; |
25 | int width,height; |
31 | dword bg_color; |
- | |
32 | dword color; |
- | |
33 | dword file_size; |
26 | byte bold,italic,smooth; |
34 | dword buffer; |
27 | dword color; |
35 | dword buffer_size; |
- | |
36 | word block; |
- | |
37 | dword data; |
28 | dword font,font_begin; |
38 | dword begin; |
29 | word block; |
39 | byte load(...); |
30 | byte init(); |
40 | byte changeSIZE(); |
31 | byte changeSIZE(); |
41 | byte symbol(signed x,y;byte s;dword c); |
32 | byte symbol(); |
- | 33 | byte symbol_size(); |
|
- | 34 | dword getsize(); |
|
- | 35 | ||
42 | byte symbol_size(byte s); |
36 | dword raw; |
43 | dword getsize(dword text1); |
37 | dword raw_size; |
44 | void apply_smooth(); |
38 | void apply_smooth(); |
45 | int write_center(dword x,y,w,h;dword txt); |
39 | int write_center(); |
46 | int write(int x,y;dword text1); |
40 | int write(); |
47 | void write_buf(int x,y,w,h, text1); |
41 | void write_buf(); |
48 | void show_buf(); |
- | |
Line 49... | Line 42... | ||
49 | }; |
42 | void show_buf(); |
50 | FONT font = 0; |
43 | } label; |
- | 44 | ||
51 | 45 | :byte LABEL::changeSIZE() |
|
52 | :byte FONT::changeSIZE() |
46 | { |
53 | { |
47 | dword file_size; |
54 | dword TMP_DATA; |
48 | dword TMP_DATA; |
55 | dword ofs; |
49 | dword ofs; |
56 | IF(size.text<9) size.text = 8; |
50 | IF(size.pt<9) size.pt = 8; |
57 | TMP_DATA = data = begin; |
51 | TMP_DATA = font = font_begin; |
58 | TMP_DATA +=size.text-8*4; |
52 | TMP_DATA +=size.pt-8*4; |
59 | ofs = DSDWORD[TMP_DATA]; |
53 | ofs = DSDWORD[TMP_DATA]; |
60 | IF(ofs==-1)return false; |
54 | IF(ofs==-1)return false; |
61 | data += ofs + 156; |
55 | font += ofs + 156; |
62 | TMP_DATA = data; |
56 | TMP_DATA = font; |
63 | file_size = DSDWORD[TMP_DATA]; |
57 | file_size = DSDWORD[TMP_DATA]; |
64 | TMP_DATA = data + file_size; |
58 | TMP_DATA = font + file_size; |
65 | height = DSBYTE[TMP_DATA - 1]; |
59 | height = DSBYTE[TMP_DATA - 1]; |
66 | width = DSBYTE[TMP_DATA - 2]; |
60 | width = DSBYTE[TMP_DATA - 2]; |
67 | block = math.ceil(height*width/32); |
61 | block = math.ceil(height*width/32); |
68 | return true; |
62 | return true; |
69 | } |
63 | } |
70 | :dword FONT::getsize(dword text1) |
64 | :dword LABEL::getsize(dword text1) |
71 | { |
65 | { |
72 | size.height = size.width = 0; |
66 | size.height = size.width = 0; |
73 | size.offset.x = size.offset.y = -1; |
67 | size.offset_x = size.offset_y = -1; |
74 | IF(size.text)IF(!changeSIZE())return 0; |
68 | IF(size.pt)IF(!changeSIZE())return 0; |
75 | WHILE(DSBYTE[text1]) |
69 | WHILE(DSBYTE[text1]) |
76 | { |
70 | { |
77 | symbol_size(DSBYTE[text1]); |
71 | symbol_size(DSBYTE[text1]); |
78 | text1++; |
72 | text1++; |
79 | } |
73 | } |
80 | $neg size.offset.y |
74 | $neg size.offset_y |
81 | $neg size.offset.x |
75 | $neg size.offset_x |
82 | size.height += size.offset.y; size.height++; |
76 | size.height += size.offset_y; size.height++; |
83 | size.width += size.offset.x; size.width++; |
77 | size.width += size.offset_x; size.width++; |
84 | IF(italic) |
78 | IF(italic) |
85 | { |
79 | { |
86 | size.w_italic = size.height/3; |
80 | size.w_italic = size.height/3; |
87 | size.offset_i = size.w_italic/size.height; |
81 | size.offset_i = size.w_italic/size.height; |
88 | size.width += size.w_italic; |
82 | size.width += size.w_italic; |
89 | size.w_italic = -size.w_italic; |
83 | size.w_italic = -size.w_italic; |
90 | } |
84 | } |
91 | return size.width; |
85 | return size.width; |
92 | } |
86 | } |
93 | :byte FONT::symbol_size(byte s) |
87 | :byte LABEL::symbol_size(byte s) |
94 | { |
88 | { |
95 | dword xi,yi; |
89 | dword xi,yi; |
96 | dword tmp,_; |
90 | dword tmp,_; |
97 | dword iii = 0; |
91 | dword iii = 0; |
98 | byte rw=0; |
92 | byte rw=0; |
99 | byte X; |
93 | byte X; |
100 | size.TMP_WEIGHT = math.ceil(size.text/17); |
94 | size.TMP_WEIGHT = math.ceil(size.pt/17); |
101 | IF(s==32) |
95 | IF(s==32) |
102 | { |
96 | { |
Line 108... | Line 102... | ||
108 | { |
102 | { |
109 | size.width += width; |
103 | size.width += width; |
110 | IF(bold) size.width+=size.TMP_WEIGHT; |
104 | IF(bold) size.width+=size.TMP_WEIGHT; |
111 | return; |
105 | return; |
112 | } |
106 | } |
113 | s = AnsiToCp866(s); |
107 | s = Cp866ToAnsi(s); |
114 | tmp = 4*block*s + data; |
108 | tmp = 4*block*s + font; |
115 | for(yi=0; yi |
109 | for(yi=0; yi |
116 | { |
110 | { |
117 | for(xi=0; xi |
111 | for(xi=0; xi |
118 | { |
112 | { |
119 | IF(iii%32) _ >>= 1; |
113 | IF(iii%32) _ >>= 1; |
Line 124... | Line 118... | ||
124 | } |
118 | } |
125 | IF(_&1) |
119 | IF(_&1) |
126 | { |
120 | { |
127 | IF(xi>rw)rw=xi; |
121 | IF(xi>rw)rw=xi; |
128 | IF(size.height |
122 | IF(size.height |
129 | IF(size.offset.y<0)size.offset.y = yi; |
123 | IF(size.offset_y<0)size.offset_y = yi; |
130 | ELSE IF(yi |
124 | ELSE IF(yi |
131 | IF(!X) X = xi; |
125 | IF(!X) X = xi; |
132 | ELSE IF(X>xi)X = xi; |
126 | ELSE IF(X>xi)X = xi; |
133 | } |
127 | } |
134 | iii++; |
128 | iii++; |
135 | } |
129 | } |
136 | } |
130 | } |
137 | size.width += rw; |
131 | size.width += rw; |
138 | IF(bold) size.width+=size.TMP_WEIGHT; |
132 | IF(bold) size.width+=size.TMP_WEIGHT; |
139 | IF(s=='_') size.width--; |
133 | IF(s=='_') size.width--; |
140 | IF(size.offset.x<0)size.offset.x = X; |
134 | IF(size.offset_x<0)size.offset_x = X; |
141 | } |
135 | } |
142 | :byte FONT::symbol(signed x,y;byte s) |
136 | :byte LABEL::symbol(signed x,y; byte s; dword image_raw) |
143 | { |
137 | { |
144 | dword xi,yi; |
138 | dword xi,yi; |
145 | dword iii = 0; |
139 | dword iii = 0; |
146 | dword offs; |
140 | dword offs; |
147 | float ital = -size.w_italic; |
141 | float ital = -size.w_italic; |
148 | dword ___x; |
142 | dword ___x; |
149 | byte rw=0; |
143 | byte rw=0; |
150 | IF(s==32)return width/4; |
144 | IF(s==32)return width/4; |
151 | IF(s==9)return width; |
145 | IF(s==9)return width; |
- | 146 | debugch(s); |
|
152 | s = AnsiToCp866(s); |
147 | s = Cp866ToAnsi(s); |
153 | EBX = block*s << 2 + data; |
148 | EBX = block*s << 2 + font; |
154 | for(yi=0; yi |
149 | for(yi=0; yi |
155 | { |
150 | { |
156 | EDI = size.offset.y + yi + y * size.width * 3 + buffer; |
151 | EDI = size.offset_y + yi + y * size.width * 3 + image_raw; |
157 | for(xi=0; xi |
152 | for(xi=0; xi |
158 | { |
153 | { |
159 | IF(iii%32) $shr ecx,1 |
154 | IF(iii%32) $shr ecx,1 |
160 | ELSE |
155 | ELSE |
161 | { |
156 | { |
Line 176... | Line 171... | ||
176 | if (italic) ital-=size.offset_i; |
171 | if (italic) ital-=size.offset_i; |
177 | } |
172 | } |
178 | return rw; |
173 | return rw; |
179 | } |
174 | } |
Line 180... | Line 175... | ||
180 | 175 | ||
181 | byte AnsiToCp866(byte s) { |
176 | byte Cp866ToAnsi(byte s) { |
182 | IF(s>=128)&&(s<=175)s+=64; |
177 | IF(s>=128)&&(s<=175)s+=64; |
183 | ELSE IF(s>=224)&&(s<=239)s+=16; |
178 | ELSE IF(s>=224)&&(s<=239)s+=16; |
184 | ELSE IF(s==241)s=184; //yo |
179 | ELSE IF(s==241)s=184; //yo |
185 | ELSE IF(s==240)s=168; //YO |
180 | ELSE IF(s==240)s=168; //YO |
186 | return s; |
181 | return s; |
Line -... | Line 182... | ||
- | 182 | } |
|
- | 183 | ||
- | 184 | :byte LABEL::init(dword font_path) |
|
- | 185 | { |
|
- | 186 | lib_init_fs(); |
|
- | 187 | IF(font)free(font); |
|
- | 188 | IF(!fs.read(font_path)) { |
|
- | 189 | debug("Error while loading font: "); |
|
- | 190 | debugln(font_path); |
|
- | 191 | //io.run("/sys/@notify","'Error: Font is not loaded.' -E"); |
|
- | 192 | return false; |
|
- | 193 | } |
|
- | 194 | font_begin = font = EAX; |
|
- | 195 | EBX = font_begin + ECX; |
|
- | 196 | height = DSBYTE[EBX-1]; |
|
- | 197 | width = DSBYTE[EBX-2]; |
|
- | 198 | block = math.ceil(height*width/32); |
|
- | 199 | smooth = true; |
|
- | 200 | return true; |
|
- | 201 | } |
|
- | 202 | ||
- | 203 | ||
- | 204 | /*===================================================================================== |
|
- | 205 | =========================== =========================== |
|
- | 206 | =========================== RAW =========================== |
|
- | 207 | =========================== =========================== |
|
- | 208 | =====================================================================================*/ |
|
187 | } |
209 | |
188 | 210 | ||
189 | inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; } |
211 | inline fastcall dword b24(EBX) { return DSDWORD[EBX] << 8; } |
190 | :void FONT::apply_smooth() |
212 | :void LABEL::apply_smooth() |
191 | { |
213 | { |
192 | dword i,line_w,to; |
214 | dword i,line_w,to; |
193 | line_w = font.size.width * 3; |
215 | line_w = size.width * 3; |
194 | to = font.size.height - 1 * line_w + font.buffer - 3; |
216 | to = size.height - 1 * line_w + raw - 3; |
195 | for(i=font.buffer; i < to; i+=3) |
217 | for(i=raw; i < to; i+=3) |
196 | { |
218 | { |
197 | IF(i-font.buffer%line_w +3 == line_w) continue; |
219 | IF(i-raw%line_w +3 == line_w) continue; |
198 | IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000) |
220 | IF(b24(i)==0x000000) && (b24(i+3)!=0x000000) && (b24(i+line_w)!=0x000000) && (b24(i+3+line_w)==0x000000) |
199 | { |
221 | { |
200 | ShadowPixel(i+3, 2); |
222 | ShadowPixel(i+3, 2); |
Line 205... | Line 227... | ||
205 | ShadowPixel(i, 2); |
227 | ShadowPixel(i, 2); |
206 | ShadowPixel(i+3+line_w, 2); |
228 | ShadowPixel(i+3+line_w, 2); |
207 | } |
229 | } |
208 | } |
230 | } |
209 | } |
231 | } |
210 | :byte FONT::load(dword path) |
- | |
211 | { |
- | |
212 | lib_init_fs(); |
- | |
213 | buffer_size = 0; |
- | |
214 | smooth = true; |
- | |
215 | IF(data)free(data); |
- | |
216 | IF(!fs.read(path)) { debug("Error while loading font: "); debugln(path); return false; } |
- | |
217 | begin = data = EAX; |
- | |
218 | EBX = begin + ECX; |
- | |
219 | height = DSBYTE[EBX-1]; |
- | |
220 | width = DSBYTE[EBX-2]; |
- | |
221 | block = math.ceil(height*width/32); |
- | |
222 | return true; |
- | |
223 | } |
- | |
Line 224... | Line 232... | ||
224 | 232 | ||
225 | :int FONT::write_center(dword x,y,w,h;dword txt) |
233 | :int LABEL::write_center(dword x,y,w,h; dword background, color1; byte fontSizePoints; dword txt) |
- | 234 | { |
|
226 | { |
235 | size.pt = fontSizePoints; |
227 | getsize(txt); |
236 | getsize(txt); |
228 | return write(w-size.width/2+x,y,txt); |
237 | return write(w-size.width/2+x,y, background, color1, fontSizePoints, txt); |
Line 229... | Line 238... | ||
229 | } |
238 | } |
230 | 239 | ||
231 | :int FONT::write(int x,y; dword text1) |
240 | :int LABEL::write(int x,y; dword background, color1; byte fontSizePoints; dword text1) |
232 | { |
241 | { |
233 | signed len=0; |
242 | signed len=0; |
234 | IF(!text1)return false; |
243 | IF(!text1)return false; |
235 | IF(size.text)IF(!changeSIZE())return false; |
244 | IF(size.pt)IF(!changeSIZE())return false; |
- | 245 | size.pt = fontSizePoints; |
|
236 | left = x; |
246 | getsize(text1); |
237 | getsize(text1); |
- | |
238 | y -= size.offset.y; |
247 | color = color1; |
239 | top = y; |
248 | y -= size.offset_y; |
240 | EDX = size.width*size.height*3; |
249 | EDX = size.width*size.height*3; |
241 | IF(!buffer_size) |
250 | IF(!raw_size) |
242 | { |
251 | { |
243 | buffer_size = EDX; |
252 | raw_size = EDX; |
244 | buffer = malloc(buffer_size); |
253 | raw = malloc(raw_size); |
245 | } |
254 | } |
246 | ELSE IF(buffer_size |
255 | ELSE IF(raw_size |
247 | { |
256 | { |
248 | buffer_size = EDX; |
257 | raw_size = EDX; |
249 | buffer = realloc(buffer,buffer_size); |
258 | raw = realloc(raw,raw_size); |
250 | } |
259 | } |
251 | // Fill background color { |
260 | // Fill background color { |
252 | EBX = bg_color; |
261 | EBX = background; |
253 | EAX = buffer_size+buffer; |
262 | EAX = raw_size+raw; |
254 | for (EDI=buffer; EDI |
263 | for (EDI=raw; EDI |
255 | // } |
264 | // } |
256 | len = size.offset.x; |
265 | len = size.offset_x; |
257 | WHILE(DSBYTE[text1]) |
266 | WHILE(DSBYTE[text1]) |
258 | { |
267 | { |
259 | IF(DSBYTE[text1]=='_') len--; |
268 | IF(DSBYTE[text1]=='_') len--; |
260 | len+=symbol(len,0,DSBYTE[text1]); |
269 | len+=symbol(len,0,DSBYTE[text1], raw); |
261 | IF(bold)len+=math.ceil(size.text/17); |
270 | IF(bold)len+=math.ceil(size.pt/17); |
262 | text1++; |
271 | text1++; |
263 | } |
272 | } |
264 | IF (smooth) apply_smooth(); |
273 | IF (smooth) apply_smooth(); |
265 | show_buf(left,top); |
274 | show_buf(x,y); |
Line 266... | Line 275... | ||
266 | return len; |
275 | return len; |
267 | } |
276 | } |
268 | 277 | ||
269 | :void FONT::write_buf(int x,y,w,h; dword text1) |
278 | :void LABEL::write_buf(int x,y,w,h; dword background, color1; byte fontSizePoints; dword text1) |
270 | { |
279 | { |
- | 280 | dword new_raw_size; |
|
- | 281 | IF(!text1)return; |
|
271 | dword new_buffer_size; |
282 | IF(size.pt)IF(!changeSIZE())return; |
272 | IF(!text1)return; |
283 | |
- | 284 | size.pt = fontSizePoints; |
|
Line 273... | Line 285... | ||
273 | IF(size.text)IF(!changeSIZE())return; |
285 | getsize(text1); |
274 | getsize(text1); |
286 | y -= size.offset_y; |
Line 275... | Line 287... | ||
275 | y -= size.offset.y; |
287 | color = color1; |
276 | 288 | ||
277 | size.width = w; |
289 | size.width = w; |
278 | size.height = h; |
290 | size.height = h; |
279 | 291 | ||
280 | new_buffer_size = w*h*3; |
292 | new_raw_size = w*h*3; |
281 | IF(buffer_size != w*h*3) |
293 | IF(raw_size != new_raw_size) |
282 | { |
294 | { |
283 | buffer_size = new_buffer_size; |
295 | raw_size = new_raw_size; |
284 | free(buffer); |
296 | free(raw); |
285 | buffer = malloc(buffer_size); |
297 | raw = malloc(raw_size); |
286 | // Fill background color |
298 | // Fill background color |
287 | EBX = bg_color; |
299 | EBX = background; |
288 | EAX = buffer_size+buffer; |
300 | EAX = raw_size+raw; |
289 | for (EDI=buffer; EDI |
301 | for (EDI=raw; EDI |
290 | } |
302 | } |
291 | WHILE(DSBYTE[text1]) |
303 | WHILE(DSBYTE[text1]) |
292 | { |
304 | { |
293 | x+=symbol(x,y,DSBYTE[text1]); |
305 | x+=symbol(x,y,DSBYTE[text1], raw); |
Line 294... | Line 306... | ||
294 | IF(bold)x+=math.ceil(size.text/17); |
306 | IF(bold)x+=math.ceil(size.pt/17); |
295 | text1++; |
307 | text1++; |
296 | } |
308 | } |
Line 297... | Line -... | ||
297 | return; |
- | |
298 | } |
309 | return; |
299 | 310 | } |