Subversion Repositories Kolibri OS

Rev

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