Rev 7229 | Rev 7252 | 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 | |||
17 | #ifndef INCLUDE_LIBIO_H |
||
7049 | leency | 18 | #include "../lib/obj/libio.h" |
5598 | pavelyakov | 19 | #endif |
20 | |||
3107 | leency | 21 | //library |
22 | dword libimg = #alibimg; |
||
23 | char alibimg[21] = "/sys/lib/libimg.obj\0"; |
||
5626 | leency | 24 | |
3107 | leency | 25 | dword libimg_init = #alibimg_init; |
26 | dword img_is_img = #aimg_is_img; |
||
27 | dword img_to_rgb2 = #aimg_to_rgb2; |
||
28 | dword img_decode = #aimg_decode; |
||
29 | dword img_destroy = #aimg_destroy; |
||
30 | dword img_draw = #aimg_draw; |
||
7229 | leency | 31 | dword img_create = #aimg_create; |
32 | dword img_encode = #aimg_encode; |
||
7190 | leency | 33 | |
3107 | leency | 34 | //dword img_flip = #aimg_flip; |
35 | //dword img_rotate = #aimg_rotate; |
||
3839 | Asper | 36 | $DD 2 dup 0 |
3107 | leency | 37 | |
38 | //import libimg , \ |
||
39 | char alibimg_init[9] = "lib_init\0"; |
||
40 | char aimg_is_img[11] = "img_is_img\0"; |
||
41 | char aimg_to_rgb2[12] = "img_to_rgb2\0"; |
||
42 | char aimg_decode[11] = "img_decode\0"; |
||
43 | char aimg_destroy[12] = "img_destroy\0"; |
||
44 | char aimg_draw[9] = "img_draw\0"; |
||
7190 | leency | 45 | char aimg_create[11] = "img_create\0"; |
46 | char aimg_encode[11] = "img_encode\0"; |
||
3107 | leency | 47 | //char aimg_flip[9] = "img_flip\0"; |
48 | //char aimg_rotate[11] = "img_rotate\0 "; |
||
49 | |||
7190 | leency | 50 | #define LIBIMG_FORMAT_BMP 1 |
51 | #define LIBIMG_FORMAT_ICO 2 |
||
52 | #define LIBIMG_FORMAT_CUR 3 |
||
53 | #define LIBIMG_FORMAT_GIF 4 |
||
54 | #define LIBIMG_FORMAT_PNG 5 |
||
55 | #define LIBIMG_FORMAT_JPEG 6 |
||
56 | #define LIBIMG_FORMAT_TGA 7 |
||
57 | #define LIBIMG_FORMAT_PCX 8 |
||
58 | #define LIBIMG_FORMAT_XCF 9 |
||
59 | #define LIBIMG_FORMAT_TIFF 10 |
||
60 | #define LIBIMG_FORMAT_PNM 11 |
||
61 | #define LIBIMG_FORMAT_WBMP 12 |
||
62 | #define LIBIMG_FORMAT_XBM 13 |
||
63 | #define LIBIMG_FORMAT_Z80 14 |
||
3107 | leency | 64 | |
7190 | leency | 65 | struct _Image |
66 | { |
||
67 | dword Checksum; // ((Width ROL 16) OR Height) XOR Data[0] ; ignored so far |
||
68 | dword Width; |
||
69 | dword Height; |
||
70 | dword Next; |
||
71 | dword Previous; |
||
72 | dword Type; // one of Image.bppN |
||
73 | dword Data; |
||
74 | dword Palette; // used iff Type eq Image.bpp1, Image.bpp2, Image.bpp4 or Image.bpp8i |
||
75 | dword Extended; |
||
76 | dword Flags; // bitfield |
||
77 | dword Delay; // used iff Image.IsAnimated is set in Flags |
||
78 | }; |
||
3107 | leency | 79 | |
7190 | leency | 80 | // values for Image.Type |
81 | // must be consecutive to allow fast switch on Image.Type in support functions |
||
82 | #define Image_bpp8i 1 // indexed |
||
83 | #define Image_bpp24 2 |
||
84 | #define Image_bpp32 3 |
||
85 | #define Image_bpp15 4 |
||
86 | #define Image_bpp16 5 |
||
87 | #define Image_bpp1 6 |
||
88 | #define Image_bpp8g 7 // grayscale |
||
89 | #define Image_bpp2i 8 |
||
90 | #define Image_bpp4i 9 |
||
91 | #define Image_bpp8a 10 // grayscale with alpha channel; application layer only!!! kernel doesn't handle this image type, libimg can only create and destroy such images |
||
92 | |||
93 | |||
7224 | leency | 94 | :dword load_image(dword filename) |
3107 | leency | 95 | { |
96 | //align 4 |
||
97 | dword img_data=0; |
||
98 | dword img_data_len=0; |
||
99 | dword fh=0; |
||
100 | dword image=0; |
||
101 | |||
102 | byte tmp_buf[40]; |
||
103 | $and img_data, 0 |
||
104 | //$mov eax, filename |
||
105 | //$push eax |
||
106 | //invoke file.open, eax, O_READ |
||
107 | file_open stdcall (filename, O_READ); |
||
108 | $or eax, eax |
||
109 | $jnz loc05 |
||
110 | $stc |
||
111 | return 0; |
||
112 | @loc05: |
||
113 | $mov fh, eax |
||
114 | //invoke file.size |
||
115 | file_size stdcall (filename); |
||
116 | $mov img_data_len, ebx |
||
117 | //stdcall mem.Alloc, ebx |
||
118 | mem_Alloc(EBX); |
||
119 | |||
120 | $test eax, eax |
||
121 | $jz error_close |
||
122 | $mov img_data, eax |
||
123 | //invoke file.read, [fh], eax, [img_data_len] |
||
124 | file_read stdcall (fh, EAX, img_data_len); |
||
125 | $cmp eax, -1 |
||
126 | $jz error_close |
||
127 | $cmp eax, img_data_len |
||
128 | $jnz error_close |
||
129 | //invoke file.close, [fh] |
||
130 | file_close stdcall (fh); |
||
131 | $inc eax |
||
132 | $jz error_ |
||
133 | //; img.decode checks for img.is_img |
||
134 | //; //invoke img.is_img, [img_data], [img_data_len] |
||
135 | //; $or eax, eax |
||
136 | //; $jz exit |
||
137 | //invoke img.decode, [img_data], [img_data_len], 0 |
||
138 | EAX=img_data; |
||
139 | img_decode stdcall (EAX, img_data_len,0); |
||
140 | $or eax, eax |
||
141 | $jz error_ |
||
142 | $cmp image, 0 |
||
143 | $pushf |
||
144 | $mov image, eax |
||
145 | //call init_frame |
||
146 | $popf |
||
147 | //call update_image_sizes |
||
148 | mem_Free(img_data);//free_img_data(img_data); |
||
149 | $clc |
||
150 | return image; |
||
151 | |||
152 | @error_free: |
||
153 | //invoke img.destroy, [image] |
||
154 | img_destroy stdcall (image); |
||
155 | $jmp error_ |
||
156 | |||
157 | @error_pop: |
||
158 | $pop eax |
||
159 | $jmp error_ |
||
160 | @error_close: |
||
161 | //invoke file.close, [fh] |
||
162 | file_close stdcall (fh); |
||
163 | @error_: |
||
164 | mem_Free(img_data); |
||
165 | $stc |
||
166 | return 0; |
||
167 | } |
||
5598 | pavelyakov | 168 | |
7224 | leency | 169 | :dword create_image(dword type, dword width, dword height) { |
170 | img_create stdcall(width, height, type); |
||
171 | return EAX; |
||
172 | } |
||
173 | |||
174 | // size - output parameter, error code / the size of encoded data |
||
175 | :dword encode_image(dword image_ptr, dword options, dword specific_options, dword* size) { |
||
176 | img_encode stdcall(image_ptr, options, specific_options); |
||
177 | ESDWORD[size] = ECX; |
||
178 | |||
179 | return EAX; |
||
180 | } |
||
181 | |||
182 | :void DrawLibImage(dword image_pointer,x,y,w,h,offx,offy) { |
||
6978 | leency | 183 | img_draw stdcall ( |
184 | image_pointer, |
||
185 | x, |
||
186 | y, |
||
187 | w, |
||
188 | h, |
||
189 | offx, |
||
190 | offy |
||
191 | ); |
||
192 | } |
||
193 | |||
7224 | leency | 194 | //NOTICE: DO NOT FORGOT TO INIT libio AND libimg!!! |
195 | :void save_image(dword _image, _w, _h, _path) |
||
196 | { |
||
197 | char save_success_message[4096+200]; |
||
198 | dword encoded_data=0; |
||
199 | dword encoded_size=0; |
||
200 | dword image_ptr = 0; |
||
201 | |||
202 | image_ptr = create_image(Image_bpp24, _w, _h); |
||
7190 | leency | 203 | |
7224 | leency | 204 | if (image_ptr == 0) { |
205 | notify("'Error saving file, probably not enought memory!' -E"); |
||
206 | } |
||
207 | else { |
||
208 | EDI = image_ptr; |
||
209 | memmov(EDI._Image.Data, _image, _w * _h * 3); |
||
210 | |||
211 | encoded_data = encode_image(image_ptr, LIBIMG_FORMAT_PNG, 0, #encoded_size); |
||
212 | |||
213 | img_destroy stdcall(image_ptr); |
||
214 | |||
215 | if(encoded_data == 0) { |
||
216 | notify("'Error saving file, incorrect data!' -E"); |
||
217 | } |
||
218 | else { |
||
7227 | leency | 219 | if (CreateFile(encoded_size, encoded_data, _path) == 0) { |
7224 | leency | 220 | sprintf(#save_success_message, "'File saved as %s' -O", _path); |
221 | notify(#save_success_message); |
||
222 | } |
||
223 | else { |
||
7245 | leency | 224 | notify("'Error saving image file!\nProbably not enought space or file system is not writable!\nPlease, check saving path.' -E"); |
7224 | leency | 225 | } |
226 | } |
||
227 | } |
||
7190 | leency | 228 | } |
229 | |||
7229 | leency | 230 | #ifndef INCLUDE_LIBIMG_LOAD_SKIN_H |
231 | #include "../lib/patterns/libimg_load_skin.h" |
||
232 | #endif |
||
7224 | leency | 233 | |
7229 | leency | 234 | |
5598 | pavelyakov | 235 | #endif |