Rev 8821 | Rev 9396 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
3107 | leency | 1 | //Asper |
5598 | pavelyakov | 2 | #ifndef INCLUDE_LIBIMG_H |
3 | #define INCLUDE_LIBIMG_H |
||
3107 | leency | 4 | |
5598 | pavelyakov | 5 | #ifndef INCLUDE_KOLIBRI_H |
6 | #include "../lib/kolibri.h" |
||
7 | #endif |
||
8 | |||
9 | #ifndef INCLUDE_MEM_H |
||
10 | #include "../lib/mem.h" |
||
11 | #endif |
||
12 | |||
13 | #ifndef INCLUDE_DLL_H |
||
14 | #include "../lib/dll.h" |
||
15 | #endif |
||
16 | |||
3107 | leency | 17 | //library |
18 | dword libimg = #alibimg; |
||
7252 | leency | 19 | char alibimg[] = "/sys/lib/libimg.obj"; |
5626 | leency | 20 | |
8381 | leency | 21 | dword libimg_init = #alibimg_init; |
22 | dword img_decode = #aimg_decode; |
||
23 | dword img_destroy = #aimg_destroy; |
||
24 | dword img_draw = #aimg_draw; |
||
25 | dword img_create = #aimg_create; |
||
26 | dword img_encode = #aimg_encode; |
||
27 | dword img_convert = #aimg_convert; |
||
28 | dword img_from_file = #aimg_from_file; |
||
8396 | leency | 29 | dword img_blend = #aimg_blend; |
30 | //dword img_resize = #aimg_resize; |
||
31 | //dword img_is_img = #aimg_is_img; |
||
32 | //dword img_to_rgb2 = #aimg_to_rgb2; |
||
33 | //dword img_scale = #aimg_scale; |
||
34 | //dword img_flip = #aimg_flip; |
||
35 | //dword img_rotate = #aimg_rotate; |
||
7190 | leency | 36 | |
3839 | Asper | 37 | $DD 2 dup 0 |
3107 | leency | 38 | |
8396 | leency | 39 | //import |
8381 | leency | 40 | char alibimg_init[] = "lib_init"; |
41 | char aimg_decode[] = "img_decode"; |
||
42 | char aimg_destroy[] = "img_destroy"; |
||
43 | char aimg_draw[] = "img_draw"; |
||
44 | char aimg_create[] = "img_create"; |
||
45 | char aimg_encode[] = "img_encode"; |
||
46 | char aimg_convert[] = "img_convert"; |
||
47 | char aimg_from_file[] = "img_from_file"; |
||
8396 | leency | 48 | char aimg_blend[] = "img_blend"; |
49 | //char aimg_resize[] = "img_resize"; |
||
50 | //char aimg_is_img[] = "img_is_img"; |
||
51 | //char aimg_to_rgb2[] = "img_to_rgb2"; |
||
52 | //char aimg_scale[] = "img_scale"; |
||
53 | //char aimg_flip[] = "img_flip"; |
||
54 | //char aimg_rotate[] = "img_rotate"; |
||
3107 | leency | 55 | |
7190 | leency | 56 | #define LIBIMG_FORMAT_BMP 1 |
57 | #define LIBIMG_FORMAT_ICO 2 |
||
58 | #define LIBIMG_FORMAT_CUR 3 |
||
59 | #define LIBIMG_FORMAT_GIF 4 |
||
60 | #define LIBIMG_FORMAT_PNG 5 |
||
61 | #define LIBIMG_FORMAT_JPEG 6 |
||
62 | #define LIBIMG_FORMAT_TGA 7 |
||
63 | #define LIBIMG_FORMAT_PCX 8 |
||
64 | #define LIBIMG_FORMAT_XCF 9 |
||
65 | #define LIBIMG_FORMAT_TIFF 10 |
||
66 | #define LIBIMG_FORMAT_PNM 11 |
||
67 | #define LIBIMG_FORMAT_WBMP 12 |
||
68 | #define LIBIMG_FORMAT_XBM 13 |
||
69 | #define LIBIMG_FORMAT_Z80 14 |
||
3107 | leency | 70 | |
7190 | leency | 71 | // values for Image.Type |
72 | // must be consecutive to allow fast switch on Image.Type in support functions |
||
7995 | leency | 73 | #define IMAGE_BPP8i 1 // indexed |
74 | #define IMAGE_BPP24 2 |
||
75 | #define IMAGE_BPP32 3 |
||
76 | #define IMAGE_BPP15 4 |
||
77 | #define IMAGE_BPP16 5 |
||
78 | #define IMAGE_BPP1 6 |
||
79 | #define IMAGE_BPP8g 7 // grayscale |
||
80 | #define IMAGE_BPP2i 8 |
||
81 | #define IMAGE_BPP4i 9 |
||
82 | #define IMAGE_BPP8a 10 // grayscale with alpha channel; application layer only!!! |
||
7254 | leency | 83 | // kernel doesn't handle this image type, |
84 | // libimg can only create and destroy such images |
||
7190 | leency | 85 | |
7995 | leency | 86 | struct libimg_image |
87 | { |
||
88 | dword checksum; // ((Width ROL 16) OR Height) XOR Data[0] ; ignored so far |
||
89 | dword w; |
||
90 | dword h; |
||
91 | dword next; |
||
92 | dword previous; |
||
93 | dword type; // one of Image.bppN |
||
94 | dword imgsrc; |
||
95 | dword palette; // used iff Type eq Image.bpp1, Image.bpp2, Image.bpp4 or Image.bpp8i |
||
96 | dword extended; |
||
97 | dword flags; // bitfield |
||
98 | dword delay; // used iff Image.IsAnimated is set in Flags |
||
99 | dword image; |
||
100 | void load(); |
||
101 | void convert_into(); |
||
102 | void replace_color(); |
||
8780 | leency | 103 | void replace_2colors(); |
7995 | leency | 104 | void set_vars(); |
105 | void draw(); |
||
106 | }; |
||
7190 | leency | 107 | |
7995 | leency | 108 | :void libimg_image::set_vars() |
109 | { |
||
110 | $push edi |
||
111 | EDI = image; |
||
8396 | leency | 112 | //checksum = ESDWORD[EDI]; |
7995 | leency | 113 | w = ESDWORD[EDI+4]; |
114 | h = ESDWORD[EDI+8]; |
||
8396 | leency | 115 | //next = ESDWORD[EDI+12]; |
116 | //previous = ESDWORD[EDI+16]; |
||
7995 | leency | 117 | imgsrc = ESDWORD[EDI+24]; |
8396 | leency | 118 | //palette = ESDWORD[EDI+28]; |
119 | //extended = ESDWORD[EDI+32]; |
||
120 | //flags = ESDWORD[EDI+36]; |
||
121 | //delay = ESDWORD[EDI+40]; |
||
7995 | leency | 122 | $pop edi |
123 | } |
||
124 | |||
125 | :void libimg_image::load(dword file_path) |
||
126 | { |
||
8389 | leency | 127 | if (image) img_destroy stdcall(image); |
128 | img_from_file stdcall(file_path); |
||
7995 | leency | 129 | if (!EAX) { |
130 | notify("'Error: Image not loaded'E"); |
||
131 | } else { |
||
132 | image = EAX; |
||
133 | set_vars(); |
||
134 | } |
||
135 | } |
||
136 | |||
137 | :void libimg_image::replace_color(dword old_color, new_color) |
||
138 | { |
||
139 | EDX = w * h * 4 + imgsrc; |
||
8780 | leency | 140 | ESI = old_color; |
141 | ECX = new_color; |
||
142 | FOR (EDI = imgsrc; EDI < EDX; EDI += 4) IF (DSDWORD[EDI]==ESI) DSDWORD[EDI] = ECX; |
||
7995 | leency | 143 | } |
144 | |||
8780 | leency | 145 | :void libimg_image::replace_2colors(dword old_color1, new_color1, old_color2, new_color2) |
146 | { |
||
147 | EDX = w * h * 4 + imgsrc; |
||
148 | ESI = old_color1; |
||
149 | ECX = new_color1; |
||
150 | EBX = old_color2; |
||
151 | EAX = new_color2; |
||
152 | FOR (EDI = imgsrc; EDI < EDX; EDI += 4) { |
||
153 | IF (DSDWORD[EDI]==ESI) DSDWORD[EDI] = ECX; |
||
154 | ELSE IF (DSDWORD[EDI]==EBX) DSDWORD[EDI] = EAX; |
||
155 | } |
||
156 | } |
||
157 | |||
7995 | leency | 158 | :void libimg_image::draw(dword _x, _y, _w, _h, _xoff, _yoff) |
159 | { |
||
160 | if (image) img_draw stdcall(image, _x, _y, _w, _h, _xoff, _yoff); |
||
161 | } |
||
162 | |||
163 | :void libimg_image::convert_into(dword _to) |
||
164 | { |
||
165 | img_convert stdcall(image, 0, _to, 0, 0); |
||
8407 | leency | 166 | $push eax |
167 | img_destroy stdcall(image); |
||
168 | $pop eax |
||
7995 | leency | 169 | if (!EAX) { |
170 | notify("'LibImg convertation error!'E"); |
||
171 | } else { |
||
172 | image = EAX; |
||
173 | set_vars(); |
||
174 | } |
||
175 | } |
||
176 | |||
7224 | leency | 177 | :dword create_image(dword type, dword width, dword height) { |
178 | img_create stdcall(width, height, type); |
||
179 | return EAX; |
||
180 | } |
||
181 | |||
182 | // size - output parameter, error code / the size of encoded data |
||
183 | :dword encode_image(dword image_ptr, dword options, dword specific_options, dword* size) { |
||
184 | img_encode stdcall(image_ptr, options, specific_options); |
||
185 | ESDWORD[size] = ECX; |
||
186 | |||
187 | return EAX; |
||
188 | } |
||
189 | |||
9016 | leency | 190 | :dword save_image(dword _image_pointer, _w, _h, _path) |
7224 | leency | 191 | { |
192 | dword encoded_data=0; |
||
193 | dword encoded_size=0; |
||
194 | dword image_ptr = 0; |
||
195 | |||
7995 | leency | 196 | image_ptr = create_image(IMAGE_BPP24, _w, _h); |
7190 | leency | 197 | |
9016 | leency | 198 | if (!image_ptr) { |
199 | return "Error creating image!"; |
||
7224 | leency | 200 | } |
201 | else { |
||
202 | EDI = image_ptr; |
||
7995 | leency | 203 | memmov(EDI.libimg_image.imgsrc, _image_pointer, _w * _h * 3); |
7224 | leency | 204 | |
205 | encoded_data = encode_image(image_ptr, LIBIMG_FORMAT_PNG, 0, #encoded_size); |
||
206 | |||
207 | img_destroy stdcall(image_ptr); |
||
208 | |||
9016 | leency | 209 | if(!encoded_data) { |
210 | return "Error encoding image!"; |
||
7224 | leency | 211 | } |
212 | else { |
||
9016 | leency | 213 | if (!CreateFile(encoded_size, encoded_data, _path)) { |
214 | return 0; |
||
7224 | leency | 215 | } |
216 | else { |
||
9016 | leency | 217 | return "'Error saving image file!\nNot enough space? Path wrong?\nFile system is not writable?..' -E"; |
7224 | leency | 218 | } |
219 | } |
||
220 | } |
||
7190 | leency | 221 | } |
222 | |||
7995 | leency | 223 | |
224 | |||
225 | ///////////////////////////// |
||
226 | /* |
||
227 | // DRAW ICON PATTERN / TEMP |
||
228 | */ |
||
229 | ///////////////////////////// |
||
230 | |||
231 | :void DrawIcon32(dword x,y, _bg, icon_n) { |
||
232 | static dword bg; |
||
8381 | leency | 233 | static dword pure_img32; |
234 | if (!pure_img32) || (bg!=_bg) { |
||
7995 | leency | 235 | bg = _bg; |
8382 | leency | 236 | if (pure_img32) img_destroy stdcall(pure_img32); |
8381 | leency | 237 | img_from_file stdcall("/sys/icons32.png"); |
238 | pure_img32 = EAX; |
||
239 | //now fill transparent with another color |
||
240 | EDX = ESDWORD[EAX+4] * ESDWORD[EAX+8] * 4 + ESDWORD[EAX+24]; |
||
241 | for (ESI = ESDWORD[EAX+24]; ESI < EDX; ESI += 4) { |
||
242 | if (DSDWORD[ESI]==0x00000000) DSDWORD[ESI] = bg; |
||
243 | } |
||
7995 | leency | 244 | } |
8381 | leency | 245 | img_draw stdcall(pure_img32, x, y, 32, 32, 0, icon_n*32); |
7977 | leency | 246 | } |
247 | |||
8821 | leency | 248 | :int DrawIcon16(dword x,y, _bg, icon_n) { |
8381 | leency | 249 | static dword bg; |
250 | static dword pure_img16; |
||
251 | dword bgshadow; |
||
8821 | leency | 252 | int size; |
8381 | leency | 253 | if (!pure_img16) || (bg!=_bg) { |
254 | bg = _bg; |
||
255 | bgshadow = MixColors(bg, 0, 220); |
||
8382 | leency | 256 | if (pure_img16) img_destroy stdcall(pure_img16); |
8381 | leency | 257 | img_from_file stdcall("/sys/icons16.png"); |
258 | pure_img16 = EAX; |
||
259 | //now fill transparent with another color |
||
260 | EDX = ESDWORD[EAX+4] * ESDWORD[EAX+8] * 4 + ESDWORD[EAX+24]; |
||
261 | for (ESI = ESDWORD[EAX+24]; ESI < EDX; ESI += 4) { |
||
262 | if (DSDWORD[ESI]==0xffFFFfff) DSDWORD[ESI] = bg; |
||
263 | if (DSDWORD[ESI]==0xffCACBD6) DSDWORD[ESI] = bgshadow; |
||
264 | } |
||
7995 | leency | 265 | } |
8821 | leency | 266 | size = ESDWORD[pure_img16+4]; //get image width |
267 | img_draw stdcall(pure_img16, x, y, size, size, 0, icon_n*size); |
||
268 | return size; |
||
7995 | leency | 269 | } |
7224 | leency | 270 | |
5598 | pavelyakov | 271 | #endif>>>> |