Rev 6786 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5987 | leency | 1 | #ifndef INCLUDE_LABEL_H |
2 | #define INCLUDE_LABEL_H |
||
5730 | pavelyakov | 3 | |
4 | #ifndef INCLUDE_MATH_H |
||
5 | #include "../lib/math.h" |
||
6 | #endif |
||
7 | |||
6784 | leency | 8 | #ifndef INCLUDE_IO_H |
9 | #include "../lib/io.h" |
||
5730 | pavelyakov | 10 | #endif |
11 | |||
6021 | leency | 12 | #include "../lib/patterns/rgb.h" |
13 | |||
14 | |||
5981 | leency | 15 | #define DEFAULT_FONT "/sys/fonts/Tahoma.kf" |
16 | |||
5753 | leency | 17 | :struct __SIZE |
18 | { |
||
5816 | leency | 19 | dword width,height; |
5987 | leency | 20 | signed offset_x, offset_y; |
5988 | leency | 21 | byte pt; |
5753 | leency | 22 | }; |
5987 | leency | 23 | :struct LABEL |
5730 | pavelyakov | 24 | { |
5753 | leency | 25 | __SIZE size; |
5987 | leency | 26 | int width,height; |
6803 | leency | 27 | byte bold,smooth; |
5997 | leency | 28 | dword color, background; |
5987 | leency | 29 | dword font,font_begin; |
5730 | pavelyakov | 30 | word block; |
6803 | leency | 31 | dword raw; |
32 | dword raw_size; |
||
33 | |||
5987 | leency | 34 | byte init(); |
6803 | leency | 35 | bool changeSIZE(); |
5987 | leency | 36 | byte symbol(); |
37 | byte symbol_size(); |
||
38 | dword getsize(); |
||
39 | |||
6803 | leency | 40 | void ApplySmooth(); |
41 | int WriteIntoWindow(); |
||
42 | int WriteIntoWindowCenter(); |
||
43 | void WriteIntoBuffer(); |
||
5985 | leency | 44 | void show_buf(); |
5987 | leency | 45 | } label; |
5981 | leency | 46 | |
6803 | leency | 47 | :bool LABEL::changeSIZE() |
5730 | pavelyakov | 48 | { |
5987 | leency | 49 | dword file_size; |
5736 | pavelyakov | 50 | dword ofs; |
6803 | leency | 51 | if(size.pt<9) size.pt = 8; |
52 | font = font_begin; |
||
53 | ofs = DSDWORD[calc(size.pt-8<<2+font_begin)]; |
||
54 | if(ofs==-1)return false; |
||
5987 | leency | 55 | font += ofs + 156; |
6803 | leency | 56 | file_size = DSDWORD[calc(font)]; |
57 | height = DSBYTE[calc(font+file_size) - 1]; |
||
58 | width = DSBYTE[calc(font+file_size) - 2]; |
||
5754 | pavelyakov | 59 | block = math.ceil(height*width/32); |
60 | return true; |
||
5736 | pavelyakov | 61 | } |
5987 | leency | 62 | :dword LABEL::getsize(dword text1) |
5736 | pavelyakov | 63 | { |
5753 | leency | 64 | size.height = size.width = 0; |
5987 | leency | 65 | size.offset_x = size.offset_y = -1; |
6803 | leency | 66 | if(size.pt)if(!changeSIZE())return 0; |
5742 | pavelyakov | 67 | WHILE(DSBYTE[text1]) |
68 | { |
||
5753 | leency | 69 | symbol_size(DSBYTE[text1]); |
5742 | pavelyakov | 70 | text1++; |
71 | } |
||
5987 | leency | 72 | $neg size.offset_y |
73 | $neg size.offset_x |
||
5996 | leency | 74 | size.height += size.offset_y+1; |
75 | size.width += size.offset_x+1; |
||
5753 | leency | 76 | return size.width; |
5742 | pavelyakov | 77 | } |
5987 | leency | 78 | :byte LABEL::symbol_size(byte s) |
5742 | pavelyakov | 79 | { |
5981 | leency | 80 | dword xi,yi; |
81 | dword tmp,_; |
||
5985 | leency | 82 | dword iii = 0; |
5981 | leency | 83 | byte rw=0; |
5753 | leency | 84 | byte X; |
6803 | leency | 85 | if(bold) size.width+=math.ceil(size.pt/17); |
86 | if(s==32) |
||
5753 | leency | 87 | { |
88 | size.width += width/4; |
||
89 | return; |
||
90 | } |
||
6803 | leency | 91 | if(s==9) |
5753 | leency | 92 | { |
93 | size.width += width; |
||
94 | return; |
||
95 | } |
||
5987 | leency | 96 | s = Cp866ToAnsi(s); |
6803 | leency | 97 | tmp = block*s << 2 + font; |
5981 | leency | 98 | for(yi=0; yi |
99 | { |
||
100 | for(xi=0; xi |
||
101 | { |
||
6803 | leency | 102 | if(iii%32) _ >>= 1; |
103 | else |
||
5784 | leency | 104 | { |
5981 | leency | 105 | tmp += 4; |
106 | _ = DSDWORD[tmp]; |
||
107 | } |
||
6803 | leency | 108 | if(_&1) |
5784 | leency | 109 | { |
6803 | leency | 110 | if(xi>rw)rw=xi; |
111 | if(size.height |
||
112 | if(size.offset_y<0)size.offset_y = yi; |
||
113 | else if(yi |
||
114 | if(!X) X = xi; |
||
115 | else if(X>xi)X = xi; |
||
5784 | leency | 116 | } |
5981 | leency | 117 | iii++; |
118 | } |
||
119 | } |
||
5753 | leency | 120 | size.width += rw; |
6803 | leency | 121 | if(size.offset_x<0)size.offset_x = X; |
5742 | pavelyakov | 122 | } |
5987 | leency | 123 | :byte LABEL::symbol(signed x,y; byte s; dword image_raw) |
5981 | leency | 124 | { |
125 | dword xi,yi; |
||
5985 | leency | 126 | dword iii = 0; |
127 | dword offs; |
||
5981 | leency | 128 | byte rw=0; |
6803 | leency | 129 | if(s==32)return width/4; |
130 | if(s==9)return width; |
||
5987 | leency | 131 | s = Cp866ToAnsi(s); |
132 | EBX = block*s << 2 + font; |
||
5981 | leency | 133 | for(yi=0; yi |
134 | { |
||
5987 | leency | 135 | EDI = size.offset_y + yi + y * size.width * 3 + image_raw; |
5981 | leency | 136 | for(xi=0; xi |
137 | { |
||
6803 | leency | 138 | if(iii%32) $shr ecx,1 |
139 | else |
||
5981 | leency | 140 | { |
141 | EBX += 4; |
||
142 | ECX = DSDWORD[EBX]; |
||
143 | } |
||
6803 | leency | 144 | if(ECX&true) |
5981 | leency | 145 | { |
6803 | leency | 146 | if(xi>rw)rw=xi; |
147 | offs = x + xi *3 + EDI; |
||
5985 | leency | 148 | DSDWORD[offs] = DSDWORD[offs] & 0xFF000000 | color; |
6803 | leency | 149 | if(bold) DSDWORD[offs+3] = DSDWORD[offs+3] & 0xFF000000 | color; |
5981 | leency | 150 | } |
151 | iii++; |
||
152 | } |
||
153 | } |
||
154 | return rw; |
||
155 | } |
||
156 | |||
6803 | leency | 157 | inline fastcall Cp866ToAnsi(AL) { |
158 | if (AL>=128)&&(AL<=175) return AL+64; |
||
159 | if (AL>=224)&&(AL<=239) return AL+16; |
||
160 | if (AL==241) return 184; //e ruAL with dotAL (yo) |
||
161 | if (AL==240) return 168; //E ruAL with dotAL (yo) |
||
162 | if (AL==242) return 'E'; //E ukr (ye) |
||
163 | if (AL==243) return 186; //e ukr (ye) |
||
164 | if (AL==244) return 'I'; //I ukr (yi) |
||
165 | if (AL==245) return 191; //i ukr (yi) |
||
166 | return AL; |
||
5981 | leency | 167 | } |
168 | |||
5987 | leency | 169 | :byte LABEL::init(dword font_path) |
170 | { |
||
6784 | leency | 171 | IO label_io; |
6803 | leency | 172 | if(font)free(font); |
6784 | leency | 173 | label_io.read(font_path); |
6803 | leency | 174 | if(!EAX) { |
6785 | leency | 175 | debugln(font_path); |
6786 | leency | 176 | label_io.run("/sys/@notify", "'Error: KFONT is not loaded.' -E"); |
5987 | leency | 177 | return false; |
178 | } |
||
6803 | leency | 179 | font_begin = label_io.buffer_data; |
180 | size.pt = 9; |
||
181 | changeSIZE(); |
||
5987 | leency | 182 | smooth = true; |
183 | return true; |
||
184 | } |
||
185 | |||
186 | |||
187 | /*===================================================================================== |
||
188 | =========================== =========================== |
||
189 | =========================== RAW =========================== |
||
190 | =========================== =========================== |
||
191 | =====================================================================================*/ |
||
192 | |||
193 | |||
6053 | leency | 194 | inline fastcall dword b24(EAX) { return DSDWORD[EAX] & 0x00FFFFFF; } |
6803 | leency | 195 | :void LABEL::ApplySmooth() |
5981 | leency | 196 | { |
6053 | leency | 197 | dword i,line_w,to,dark_background; |
5987 | leency | 198 | line_w = size.width * 3; |
199 | to = size.height - 1 * line_w + raw - 3; |
||
200 | for(i=raw; i < to; i+=3) |
||
5985 | leency | 201 | { |
5997 | leency | 202 | if(i-raw%line_w +3 == line_w) continue; |
6021 | leency | 203 | // pixels position, where b - black, w - write |
204 | // bw |
||
205 | // wb |
||
6053 | leency | 206 | if(b24(i)!=background) && (b24(i+3)==background) && (b24(i+line_w)==background) && (b24(i+3+line_w)!=background) |
5997 | leency | 207 | { |
6216 | leency | 208 | dark_background = MixColors(background,b24(i),210); |
6053 | leency | 209 | DSDWORD[i+3] = DSDWORD[i+3] & 0xFF000000 | dark_background; |
210 | DSDWORD[i+line_w] = DSDWORD[i+line_w] & 0xFF000000 | dark_background; |
||
5981 | leency | 211 | } |
6021 | leency | 212 | // wb |
213 | // bw |
||
6053 | leency | 214 | else if(b24(i)==background) && (b24(i+3)!=background) && (b24(i+line_w)!=background) && (b24(i+3+line_w)==background) |
5981 | leency | 215 | { |
6216 | leency | 216 | dark_background = MixColors(background,b24(i+3),210); |
6053 | leency | 217 | DSDWORD[i] = DSDWORD[i] & 0xFF000000 | dark_background; |
218 | DSDWORD[i+3+line_w] = DSDWORD[i+3+line_w] & 0xFF000000 | dark_background; |
||
5981 | leency | 219 | } |
220 | } |
||
221 | } |
||
222 | |||
6803 | leency | 223 | :int LABEL::WriteIntoWindowCenter(dword x,y,w,h; dword _background, _color; byte fontSizePoints; dword txt) |
5742 | pavelyakov | 224 | { |
5987 | leency | 225 | size.pt = fontSizePoints; |
5985 | leency | 226 | getsize(txt); |
6803 | leency | 227 | return WriteIntoWindow(w-size.width/2+x,y, _background, _color, fontSizePoints, txt); |
5985 | leency | 228 | } |
229 | |||
6803 | leency | 230 | :int LABEL::WriteIntoWindow(int x,y; dword _background, _color; byte fontSizePoints; dword text1) |
5985 | leency | 231 | { |
5742 | pavelyakov | 232 | signed len=0; |
6803 | leency | 233 | if(!text1)return false; |
234 | if(size.pt)if(!changeSIZE())return false; |
||
5987 | leency | 235 | size.pt = fontSizePoints; |
5753 | leency | 236 | getsize(text1); |
5997 | leency | 237 | color = _color; |
238 | background = _background; |
||
5987 | leency | 239 | y -= size.offset_y; |
5754 | pavelyakov | 240 | EDX = size.width*size.height*3; |
6803 | leency | 241 | if(!raw_size) |
5745 | leency | 242 | { |
5987 | leency | 243 | raw_size = EDX; |
244 | raw = malloc(raw_size); |
||
5745 | leency | 245 | } |
6803 | leency | 246 | else if(raw_size |
5745 | leency | 247 | { |
5987 | leency | 248 | raw_size = EDX; |
249 | raw = realloc(raw,raw_size); |
||
5745 | leency | 250 | } |
5985 | leency | 251 | // Fill background color { |
5987 | leency | 252 | EBX = background; |
253 | EAX = raw_size+raw; |
||
254 | for (EDI=raw; EDI |
||
5985 | leency | 255 | // } |
5987 | leency | 256 | len = size.offset_x; |
5730 | pavelyakov | 257 | WHILE(DSBYTE[text1]) |
258 | { |
||
5987 | leency | 259 | len+=symbol(len,0,DSBYTE[text1], raw); |
6803 | leency | 260 | if(bold)len+=math.ceil(size.pt/17); |
5730 | pavelyakov | 261 | text1++; |
262 | } |
||
6803 | leency | 263 | IF (smooth) ApplySmooth(); |
5987 | leency | 264 | show_buf(x,y); |
5730 | pavelyakov | 265 | return len; |
266 | } |
||
267 | |||
6803 | leency | 268 | :void LABEL::WriteIntoBuffer(int x,y,w,h; dword _background, _color; byte fontSizePoints; dword text1) |
5782 | leency | 269 | { |
5987 | leency | 270 | dword new_raw_size; |
6803 | leency | 271 | if(!text1)return; |
272 | if(size.pt)if(!changeSIZE())return; |
||
5987 | leency | 273 | |
6021 | leency | 274 | if (size.pt != fontSizePoints) { |
275 | size.pt = fontSizePoints; |
||
276 | getsize(text1); |
||
277 | y -= size.offset_y; |
||
278 | } |
||
5997 | leency | 279 | color = _color; |
280 | background = _background; |
||
5981 | leency | 281 | |
5782 | leency | 282 | size.width = w; |
5783 | leency | 283 | size.height = h; |
5784 | leency | 284 | |
5987 | leency | 285 | new_raw_size = w*h*3; |
6803 | leency | 286 | if(raw_size != new_raw_size) |
5782 | leency | 287 | { |
5987 | leency | 288 | raw_size = new_raw_size; |
289 | free(raw); |
||
290 | raw = malloc(raw_size); |
||
5985 | leency | 291 | // Fill background color |
5987 | leency | 292 | EBX = background; |
293 | EAX = raw_size+raw; |
||
294 | for (EDI=raw; EDI |
||
5782 | leency | 295 | } |
296 | WHILE(DSBYTE[text1]) |
||
297 | { |
||
5987 | leency | 298 | x+=symbol(x,y,DSBYTE[text1], raw); |
6803 | leency | 299 | if(bold)x+=math.ceil(size.pt/17); |
5782 | leency | 300 | text1++; |
301 | } |
||
302 | return; |
||
303 | } |
||
304 | |||
5987 | leency | 305 | :void LABEL::show_buf(dword x, y){ |
306 | _PutImage(x, y, size.width, size.height, raw); |
||
5985 | leency | 307 | } |
308 | |||
309 | |||
310 | |||
5730 | pavelyakov | 311 | #endif |