Rev 6327 | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
180 | heavyiron | 1 | ;*************************************************************************** |
2 | ;*******************CODING BMP FILE(1,4,8,24 bits)************************** |
||
3 | ;*************************************************************************** |
||
4 | |||
5 | ;-------------------------autor andrew_programmer--------------------------- |
||
6 | |||
7 | coding_bmp: |
||
8 | |||
9 | mov [PointerToImage],ebx |
||
10 | mov [WhereCodingBMP],ecx |
||
11 | mov [BmpPalette],edx |
||
12 | mov [Bmp_SizeX],esi |
||
13 | mov [Bmp_SizeY],edi |
||
14 | ;********************************************** |
||
15 | ;******************1 bit BMP******************* |
||
16 | ;********************************************** |
||
17 | cmp eax,2 |
||
18 | ja no_monohrom_colors |
||
19 | mov esi,[BmpPalette] |
||
20 | mov edi,[WhereCodingBMP] |
||
21 | add edi,54 |
||
22 | mov eax,[esi] ;first color |
||
23 | mov ebx,[esi+4] ;second color |
||
24 | mov [edi],eax |
||
25 | mov [edi+4],ebx |
||
26 | |||
27 | ;coding image to bmp 1 bit format |
||
28 | mov esi,[PointerToImage] |
||
29 | mov edx,[WhereCodingBMP] |
||
30 | mov ebx,[Bmp_SizeX] |
||
31 | add ebx,31 ;picture_size_x+31 |
||
32 | shr ebx,5 ;((picture_size_x)+31)/32 |
||
33 | mov [Bmp_doublewords],ebx ;double words in string |
||
34 | shl ebx,2 |
||
35 | mov [Bmp_bytes_per_string],ebx ;bytes per string |
||
36 | mov ecx,[Bmp_SizeY] |
||
37 | dec ecx |
||
38 | imul ebx,ecx |
||
39 | add edx,54+8 |
||
40 | add edx,ebx ;in edx pointer to area for coding |
||
41 | |||
42 | mov ebp,[Bmp_bytes_per_string] |
||
43 | |||
44 | mov ebx,[Bmp_SizeY] |
||
45 | mov esi,[PointerToImage] |
||
46 | mov edi,edx |
||
47 | |||
48 | mov edx,[Bmp_SizeX] |
||
49 | lea edx,[edx+edx*2] |
||
50 | |||
51 | mov [Bmp_Counter],7 |
||
52 | and [Bmp_Counter2],0 |
||
53 | copy_lines_1: |
||
54 | |||
55 | push esi |
||
56 | mov ecx,[Bmp_bytes_per_string] |
||
57 | shl ecx,3 ;(Bmp_bytes_per_string)*8 |
||
58 | |||
59 | rep_movsb_1: |
||
60 | |||
61 | mov eax,[esi] |
||
62 | and eax,0xffffff |
||
63 | push esi |
||
64 | push ecx |
||
65 | push ebx |
||
66 | mov esi,[BmpPalette] |
||
67 | xor ecx,ecx |
||
68 | find_color_in_palette_1: |
||
69 | mov ebx,[esi] |
||
70 | and ebx,0xffffff |
||
71 | cmp eax,ebx ;color fined ? |
||
72 | je color_fined_1 |
||
73 | add esi,4 |
||
74 | inc ecx |
||
75 | cmp ecx,256 |
||
76 | jl find_color_in_palette_1 |
||
77 | color_fined_1: |
||
78 | mov [Bmp_Counter3],ecx ;number color in palette |
||
79 | pop ebx |
||
80 | pop ecx |
||
81 | pop esi |
||
82 | mov eax,[Bmp_Counter3] |
||
83 | |||
84 | test eax,eax |
||
85 | jz no_change_bit_in_byte |
||
86 | |||
87 | push ecx |
||
88 | mov ecx,[Bmp_Counter] |
||
89 | bts [Bmp_Counter2],ecx |
||
90 | pop ecx |
||
91 | |||
92 | no_change_bit_in_byte: |
||
93 | |||
94 | dec [Bmp_Counter] |
||
95 | jns no_minus_in_counter |
||
96 | |||
97 | push eax |
||
98 | mov eax,[Bmp_Counter2] |
||
99 | mov [edi],al |
||
100 | inc edi |
||
101 | mov [Bmp_Counter],7 |
||
102 | and [Bmp_Counter2],0 ;obnulyaem byte |
||
103 | pop eax |
||
104 | |||
105 | no_minus_in_counter: |
||
106 | |||
107 | add esi,3 |
||
108 | dec ecx |
||
109 | jnz rep_movsb_1 |
||
110 | pop esi |
||
111 | |||
112 | add esi,edx |
||
113 | sub edi,ebp |
||
114 | sub edi,ebp |
||
115 | |||
116 | dec ebx |
||
117 | jnz copy_lines_1 |
||
118 | |||
119 | mov edi,[WhereCodingBMP] |
||
120 | mov ebx,[Bmp_bytes_per_string] |
||
121 | imul ebx,[Bmp_SizeY] |
||
122 | add ebx,(54+8) |
||
123 | |||
124 | ;crate list of bmp description |
||
125 | mov [edi],word 'BM' |
||
126 | mov [edi+2],ebx |
||
127 | mov [edi+10],dword 54+8 ;where bigin bmp imige |
||
128 | mov [edi+14],dword 40 |
||
129 | mov edx,[Bmp_SizeX] |
||
130 | mov ecx,[Bmp_SizeY] |
||
131 | mov [edi+18],edx ;picture size x |
||
132 | mov [edi+22],ecx ;picture size y |
||
133 | mov [edi+26],word 1 |
||
134 | mov [edi+28],word 1 ;bits per pixel |
||
135 | mov [edi+30],dword 0 |
||
136 | mov edx,[Bmp_bytes_per_string] |
||
137 | imul edx,ecx |
||
138 | mov [edi+34],edx |
||
139 | mov [edi+38],dword 0 |
||
140 | mov [edi+42],dword 0 |
||
141 | mov [edi+46],dword 0 |
||
142 | |||
143 | ret |
||
144 | |||
145 | no_monohrom_colors: |
||
146 | |||
147 | ;********************************************** |
||
148 | ;*****************4 bits BMP******************* |
||
149 | ;********************************************** |
||
150 | cmp eax,16 |
||
151 | ja no_16_colors |
||
152 | ;copy 16 colors palette |
||
153 | mov esi,[BmpPalette] |
||
154 | mov edi,[WhereCodingBMP] |
||
155 | add edi,54 |
||
156 | mov ecx,16 |
||
157 | rep movsd |
||
158 | |||
159 | ;coding image to bmp 4 bits format |
||
160 | mov esi,[PointerToImage] |
||
161 | mov edx,[WhereCodingBMP] |
||
162 | mov ebx,[Bmp_SizeX] |
||
163 | shl ebx,2 ;4*(picture_size_x) |
||
164 | add ebx,31 ;4*(picture_size_x)+31 |
||
165 | shr ebx,5 ;(4*(picture_size_x)+31)/32 |
||
166 | mov [Bmp_doublewords],ebx ;double words in string |
||
167 | shl ebx,2 |
||
168 | mov [Bmp_bytes_per_string],ebx ;bytes per string |
||
169 | mov ecx,[Bmp_SizeY] |
||
170 | dec ecx |
||
171 | imul ebx,ecx |
||
172 | add edx,54+64 |
||
173 | add edx,ebx |
||
174 | |||
175 | mov ebp,[Bmp_bytes_per_string] |
||
176 | |||
177 | mov ebx,[Bmp_SizeY] |
||
178 | mov [Bmp_Counter2],ebx |
||
179 | |||
180 | mov edi,edx |
||
181 | |||
182 | xor ebx,ebx |
||
183 | copy_lines_4: |
||
184 | |||
185 | mov ecx,[Bmp_bytes_per_string] |
||
186 | shl ecx,1 |
||
187 | |||
188 | and [Bmp_Counter3],0 |
||
189 | push esi |
||
190 | |||
191 | rep_movsb_4: |
||
192 | mov eax,[esi] |
||
193 | and eax,0xffffff |
||
194 | |||
195 | mov [Bmp_save1],esi |
||
196 | mov [Bmp_save2],ecx |
||
197 | mov [Bmp_save3],ebx |
||
198 | mov esi,[BmpPalette] |
||
199 | xor ecx,ecx |
||
200 | find_color_in_palette_: |
||
201 | mov ebx,[esi] |
||
202 | and ebx,0xffffff |
||
203 | cmp eax,ebx ;color fined ? |
||
204 | je color_fined_ |
||
205 | add esi,4 |
||
206 | inc ecx |
||
207 | cmp ecx,16 |
||
208 | jl find_color_in_palette_ |
||
209 | color_fined_: |
||
210 | mov [Bmp_Counter],ecx ;number color in palette |
||
211 | mov esi,[Bmp_save1] |
||
212 | mov ecx,[Bmp_save2] |
||
213 | mov ebx,[Bmp_save3] |
||
214 | |||
215 | xor eax,eax |
||
216 | mov eax,[Bmp_Counter] |
||
217 | shl bl,4 |
||
218 | add bl,al |
||
219 | |||
220 | mov eax,[Bmp_Counter3] |
||
221 | and eax,1b |
||
222 | test eax,eax ;next block ready ? |
||
223 | jz no_ready |
||
224 | mov [edi],bl ;4 bit color |
||
225 | inc edi |
||
226 | no_ready: |
||
227 | |||
228 | add esi,3 |
||
229 | inc [Bmp_Counter3] |
||
230 | |||
231 | dec ecx |
||
232 | jnz rep_movsb_4 |
||
233 | |||
234 | pop esi |
||
235 | |||
236 | add esi,[Bmp_SizeX] |
||
237 | add esi,[Bmp_SizeX] |
||
238 | add esi,[Bmp_SizeX] |
||
239 | |||
240 | sub edi,ebp |
||
241 | sub edi,ebp |
||
242 | |||
243 | dec [Bmp_Counter2] |
||
244 | jnz copy_lines_4 |
||
245 | |||
246 | ;total size of bmp file |
||
247 | mov edi,[WhereCodingBMP] |
||
248 | mov ebx,[Bmp_bytes_per_string] |
||
249 | imul ebx,[Bmp_SizeY] |
||
250 | add ebx,(54+64) |
||
251 | |||
252 | ;crate list of bmp description |
||
253 | mov [edi],word 'BM' |
||
254 | mov [edi+2],ebx |
||
255 | mov [edi+10],dword 54+64 |
||
256 | mov [edi+14],dword 40 |
||
257 | mov edx,[Bmp_SizeX] |
||
258 | mov ecx,[Bmp_SizeY] |
||
259 | mov [edi+18],edx |
||
260 | mov [edi+22],ecx |
||
261 | mov [edi+26],word 1 |
||
262 | mov [edi+28],word 4 |
||
263 | mov [edi+30],dword 0 |
||
264 | mov edx,[Bmp_bytes_per_string] |
||
265 | imul edx,ecx |
||
266 | mov [edi+34],edx |
||
267 | mov [edi+38],dword 0 |
||
268 | mov [edi+42],dword 0 |
||
269 | mov [edi+46],dword 0 |
||
270 | |||
271 | ret |
||
272 | no_16_colors: |
||
273 | |||
274 | ;********************************************** |
||
275 | ;******************8 bits BMP****************** |
||
276 | ;********************************************** |
||
277 | |||
278 | cmp eax,256 |
||
279 | ja no_8_bits_per_pixel |
||
280 | ;copy palette |
||
281 | mov esi,[BmpPalette] |
||
282 | mov edi,[WhereCodingBMP] |
||
283 | add edi,54 |
||
284 | mov ecx,256 |
||
285 | rep movsd |
||
286 | |||
287 | ;coding image to bmp 8 bits format |
||
288 | mov esi,[PointerToImage] |
||
289 | mov edx,[WhereCodingBMP] |
||
290 | mov ebx,[Bmp_SizeX] |
||
291 | shl ebx,3 ;8*(picture_size_x) |
||
292 | add ebx,31 ;8*(picture_size_x)+31 |
||
293 | shr ebx,5 ;(8*(picture_size_x)+31)/32 |
||
294 | mov [Bmp_doublewords],ebx ;double words in string |
||
295 | shl ebx,2 |
||
296 | mov [Bmp_bytes_per_string],ebx ;bytes per string |
||
297 | |||
298 | mov ecx,[Bmp_SizeY] |
||
299 | dec ecx |
||
300 | imul ebx,ecx |
||
301 | add edx,(1024+54) |
||
302 | add edx,ebx ;in edx pointer to copy bitmap arrea |
||
303 | |||
304 | mov ebp,[Bmp_bytes_per_string] |
||
305 | shl ebp,1 |
||
306 | |||
307 | mov ebx,[Bmp_SizeY] |
||
308 | mov edi,edx |
||
309 | |||
310 | copy_lines_8: |
||
311 | |||
312 | mov ecx,[Bmp_bytes_per_string] |
||
313 | mov [Bmp_save1],esi |
||
314 | rep_movsb_8: |
||
315 | mov eax,[esi] |
||
316 | and eax,0xffffff |
||
317 | push esi |
||
318 | push ecx |
||
319 | push ebx |
||
320 | mov esi,[BmpPalette] |
||
321 | xor ecx,ecx |
||
322 | find_color_in_palette: |
||
323 | mov ebx,[esi] |
||
324 | and ebx,0xffffff |
||
325 | cmp eax,ebx ;color fined ? |
||
326 | je color_fined |
||
327 | add esi,4 |
||
328 | inc ecx |
||
329 | cmp ecx,256 |
||
330 | jl find_color_in_palette |
||
331 | color_fined: |
||
332 | mov [Bmp_Counter],ecx ;number color in palette |
||
333 | pop ebx |
||
334 | pop ecx |
||
335 | pop esi |
||
336 | mov eax,[Bmp_Counter] |
||
337 | mov [edi],al ;8 bit color |
||
338 | add esi,3 |
||
339 | inc edi |
||
340 | |||
341 | dec ecx |
||
342 | jnz rep_movsb_8 |
||
343 | |||
344 | mov esi,[Bmp_save1] |
||
345 | |||
346 | add esi,[Bmp_SizeX] |
||
347 | add esi,[Bmp_SizeX] |
||
348 | add esi,[Bmp_SizeX] |
||
349 | |||
350 | sub edi,ebp |
||
351 | dec ebx |
||
352 | jnz copy_lines_8 |
||
353 | |||
354 | ;total size of bmp file |
||
355 | mov edi,[WhereCodingBMP] |
||
356 | mov ebx,[Bmp_bytes_per_string] |
||
357 | imul ebx,[Bmp_SizeY] |
||
358 | add ebx,54+1024 |
||
359 | |||
360 | ;crate list of bmp description |
||
361 | mov [edi],word 'BM' |
||
362 | mov [edi+2],ebx |
||
363 | mov [edi+10],dword 54+1024 |
||
364 | mov [edi+14],dword 40 |
||
365 | mov edx,[Bmp_SizeX] |
||
366 | mov ecx,[Bmp_SizeY] |
||
367 | mov [edi+18],edx |
||
368 | mov [edi+22],ecx |
||
369 | mov [edi+26],word 1 |
||
370 | mov [edi+28],word 8 |
||
371 | mov [edi+30],dword 0 |
||
372 | mov edx,[Bmp_bytes_per_string] |
||
373 | imul edx,ecx |
||
374 | mov [edi+34],edx |
||
375 | mov [edi+38],dword 0 |
||
376 | mov [edi+42],dword 0 |
||
377 | mov [edi+46],dword 0 |
||
378 | |||
379 | ret |
||
380 | no_8_bits_per_pixel: |
||
381 | |||
382 | ;********************************************** |
||
383 | ;*******************24 bit BMP***************** |
||
384 | ;********************************************** |
||
385 | |||
386 | cmp eax,256 |
||
387 | jle no_32_bits_per_pixel |
||
388 | ;copy picture |
||
389 | mov esi,[PointerToImage] |
||
390 | mov edx,[WhereCodingBMP] |
||
391 | mov ebx,[Bmp_SizeX] |
||
392 | shl ebx,3 ;8*(picture_size_x) |
||
393 | lea ebx,[ebx+ebx*2] ;3*8*(picture_size_x) |
||
394 | add ebx,31 ;3*8*(picture_size_x)+31 |
||
395 | shr ebx,5 ;(3*8*(picture_size_x)+31)/32 |
||
396 | mov [Bmp_doublewords],ebx ;double words in string |
||
397 | shl ebx,2 |
||
398 | mov [Bmp_bytes_per_string],ebx ;bytes per string |
||
399 | mov ecx,[Bmp_SizeY] |
||
400 | dec ecx |
||
401 | imul ebx,ecx |
||
402 | add edx,54 |
||
403 | add edx,ebx ;in edx pointer to start of copy bit map |
||
404 | |||
405 | mov ebp,[Bmp_bytes_per_string] |
||
406 | shl ebp,1 |
||
407 | |||
408 | mov ebx,[Bmp_SizeY] |
||
409 | |||
410 | mov esi,[PointerToImage] |
||
411 | mov edi,edx |
||
412 | |||
413 | mov edx,[Bmp_SizeX] |
||
414 | lea edx,[edx+edx*2] |
||
415 | |||
416 | copy_lines_24: |
||
417 | |||
418 | push esi |
||
419 | mov ecx,[Bmp_doublewords] |
||
420 | rep_movsb_24: |
||
421 | mov eax,[esi] |
||
422 | mov [edi],eax |
||
423 | add esi,4 |
||
424 | add edi,4 |
||
425 | dec ecx |
||
426 | jnz rep_movsb_24 |
||
427 | pop esi |
||
428 | |||
429 | add esi,edx |
||
430 | sub edi,ebp |
||
431 | dec ebx |
||
432 | jnz copy_lines_24 |
||
433 | |||
434 | ;total size of bmp fille |
||
435 | mov edi,[WhereCodingBMP] |
||
436 | mov ebx,[Bmp_bytes_per_string] |
||
437 | imul ebx,[Bmp_SizeY] |
||
438 | add ebx,54 |
||
439 | |||
440 | ;write info to structure of bmp file |
||
441 | mov [edi],word 'BM' |
||
442 | mov [edi+2],ebx |
||
443 | mov [edi+10],dword 54 ;where begin bmp imige |
||
444 | mov [edi+14],dword 40 ;total size of structure number two |
||
445 | mov edx,[Bmp_SizeX] |
||
446 | mov ecx,[Bmp_SizeY] |
||
447 | mov [edi+18],edx |
||
448 | mov [edi+22],ecx |
||
449 | mov [edi+26],word 1 |
||
450 | mov [edi+28],word 24 ;bytes per pixel |
||
451 | mov [edi+30],dword 0 |
||
452 | mov edx,[Bmp_bytes_per_string] |
||
453 | imul edx,ecx |
||
454 | mov [edi+34],edx ;size of bmp image |
||
455 | mov [edi+38],dword 0 |
||
456 | mov [edi+42],dword 0 |
||
457 | mov [edi+46],dword 0 |
||
458 | ret |
||
459 | no_32_bits_per_pixel: |
||
460 | |||
461 | |||
462 | ret |
||
463 | |||
464 | PointerToImage dd 0 |
||
465 | WhereCodingBMP dd 0 |
||
466 | BmpPalette dd 0 |
||
467 | Bmp_SizeX dd 0 |
||
468 | Bmp_SizeY dd 0 |
||
469 | Bmp_Counter dd 0 |
||
470 | Bmp_Counter2 dd 0 |
||
471 | Bmp_Counter3 dd 0 |
||
472 | Bmp_save1 dd 0 |
||
473 | Bmp_save2 dd 0 |
||
474 | Bmp_save3 dd 0 |
||
475 | Bmp_bytes_per_string dd 0 |
||
476 | Bmp_doublewords dd 0 |