Rev 31 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
31 | halyavin | 1 | ;405 412 586 |
2 | ; |
||
3 | ; |
||
4 | bufer_size=1024*16+2 |
||
5 | fichero=4 |
||
6 | mcu_ptr=8 |
||
7 | color_ptr=12 |
||
8 | estado=16 |
||
9 | color_c=17 |
||
10 | nbits=color_c |
||
11 | idct=20 |
||
12 | tmp_bits=24 |
||
13 | actable=28 |
||
14 | matriz_limit=32 |
||
15 | sourcebits=36 |
||
16 | sourcebits_index=40 |
||
17 | sourcebits_limit=44 |
||
18 | qt_ptrs=48 |
||
19 | ht_dc_ptrs=64 |
||
20 | ht_ac_ptrs=80 |
||
21 | matrices=96 |
||
22 | tmp_bufer=100 |
||
23 | x_org=104 |
||
24 | y_org=108 |
||
25 | x_mcu=112 |
||
26 | y_mcu=116 |
||
27 | x_size=120 |
||
28 | y_size=124 |
||
29 | x_org2=128 |
||
30 | y_org2=132 |
||
31 | x_mcu2=136 |
||
32 | y_mcu2=140 |
||
33 | x_size2=144 |
||
34 | y_size2=148 |
||
35 | q_ptr=152 |
||
36 | dc=164 |
||
37 | position=204 |
||
38 | draw_ptr=208 |
||
39 | struct_size=212 |
||
40 | |||
41 | jpeg_info: ;fichero en eax |
||
42 | ;retorna ebp |
||
43 | xor ebp,ebp |
||
44 | pushad |
||
45 | mov ebp,esp |
||
46 | mov ecx,6 |
||
47 | sub esp,ecx |
||
48 | mov edi,esp |
||
49 | call read |
||
50 | pop dx |
||
51 | cmp dx,0d8ffh |
||
52 | je .l1 |
||
53 | mov esp,ebp |
||
54 | popad |
||
55 | ret |
||
56 | .l1: push eax |
||
57 | mov ecx,struct_size |
||
58 | call mallocz |
||
59 | mov [edi],ebp |
||
60 | mov ebp,edi |
||
61 | pop dword [ebp+fichero] |
||
62 | pop ax |
||
63 | pop cx |
||
64 | jmp .l3 |
||
65 | .l2: mov ebx,[ebp+tmp_bufer] |
||
66 | add ebx,[ebx-4] |
||
67 | mov cx,[ebx-2] |
||
68 | mov ax,[ebx-4] |
||
69 | .l3: push .l2 |
||
70 | xchg cl,ch |
||
71 | add cx,2 |
||
72 | cmp ch,3 |
||
73 | jnc .l4 |
||
74 | cmp al,0ffh |
||
75 | jne eoi |
||
76 | cmp ah,0dbh |
||
77 | je dqt |
||
78 | cmp ah,0c4h |
||
79 | je dht |
||
80 | cmp ah,0c0h |
||
81 | je sof0 |
||
82 | cmp ah,0dah |
||
83 | je sos |
||
84 | cmp ah,0c2h |
||
85 | je eoi |
||
86 | cmp ah,0c9h |
||
87 | je eoi |
||
88 | cmp ah,0d9h |
||
89 | je eoi |
||
90 | .l4: lea edx,[ecx-4] |
||
91 | xor ecx,ecx |
||
92 | mov eax,[ebp+fichero] |
||
93 | call skip |
||
94 | mov ecx,4 |
||
95 | call READ |
||
96 | cmp ecx,[edi-4] |
||
97 | jne eoi |
||
98 | ret |
||
99 | |||
100 | eoi: |
||
101 | mov esp,[ebp] |
||
102 | call jpeg_close |
||
103 | popad |
||
104 | xor ebp,ebp |
||
105 | ret |
||
106 | |||
107 | jpeg_close: |
||
108 | test ebp,ebp |
||
109 | jz .l2 |
||
110 | pushad |
||
111 | mov eax,[ebp+fichero] |
||
112 | call close |
||
113 | mov edi,[ebp+sourcebits] |
||
114 | call free |
||
115 | lea esi,[ebp+qt_ptrs] |
||
116 | mov ecx,14 |
||
117 | .l1: mov edi,[esi] |
||
118 | add esi,4 |
||
119 | call free |
||
120 | loop .l1 |
||
121 | mov edi,ebp |
||
122 | call free |
||
123 | popad |
||
124 | .l2: ret |
||
125 | |||
126 | dqt: call READ |
||
127 | mov esi,edi |
||
128 | lea eax,[edi+ecx] |
||
129 | push eax |
||
130 | .l1: xor eax,eax |
||
131 | lodsb |
||
132 | cmp al,4 |
||
133 | jnc eoi |
||
134 | lea ebx,[ebp+qt_ptrs+eax*4] |
||
135 | test dword [ebx],-1 |
||
136 | jnz eoi |
||
137 | mov ecx,64 |
||
138 | xor eax,eax |
||
139 | sub esp,128 |
||
140 | mov edi,esp |
||
141 | .l2: lodsb |
||
142 | stosw |
||
143 | loop .l2 |
||
144 | mov ecx,256 |
||
145 | call malloc |
||
146 | mov [ebx],edi |
||
147 | mov eax,esi |
||
148 | mov esi,esp |
||
149 | pushad |
||
150 | mov ebp,zigzag |
||
151 | fninit |
||
152 | mov cl,64 |
||
153 | xor eax,eax |
||
154 | .l3: fild word[esi] |
||
155 | mov al,[ebp] |
||
156 | and al,-2 |
||
157 | add ebp,2 |
||
158 | add esi,2 |
||
159 | mov ebx,eax |
||
160 | and ebx,28 |
||
161 | fmul dword [ebx+k2] |
||
162 | mov ebx,eax |
||
163 | shr ebx,3 |
||
164 | and ebx,4+8+16 |
||
165 | fmul dword [ebx+k2] |
||
166 | fstp dword [edi+eax] |
||
167 | dec cl |
||
168 | jnz .l3 |
||
169 | popad |
||
170 | mov esi,eax |
||
171 | add esp,128 |
||
172 | mov eax,[esp] |
||
173 | sub eax,esi |
||
174 | jc eoi |
||
175 | cmp eax,4 |
||
176 | ja .l1 |
||
177 | jne eoi |
||
178 | pop eax |
||
179 | ret |
||
180 | |||
181 | sof0: call READ |
||
182 | cmp byte [edi],8 |
||
183 | jne eoi ;precision |
||
184 | mov ax,[edi+1] |
||
185 | xchg al,ah |
||
186 | mov [ebp+y_size],ax |
||
187 | mov ax,[edi+3] |
||
188 | xchg al,ah |
||
189 | mov [ebp+x_size],ax |
||
190 | mov al,[edi+5] ;ncomponentes |
||
191 | mov cl,al |
||
192 | mov [ebp+color_c],al |
||
193 | mov edx,modes |
||
194 | dec al |
||
195 | jz .l1 |
||
196 | dec al |
||
197 | dec al |
||
198 | jnz eoi |
||
199 | mov al,[edi+10] |
||
200 | mov ah,[edi+13] |
||
201 | cmp ax,1111h |
||
202 | jne eoi |
||
203 | mov al,[edi+7] |
||
204 | add edx,16 |
||
205 | cmp al,11h |
||
206 | je .l1 |
||
207 | add edx,16 |
||
208 | cmp al,21h |
||
209 | je .l1 |
||
210 | add edx,16 |
||
211 | cmp al,22h |
||
212 | jne eoi |
||
213 | .l1: lea ebx,[ebp+q_ptr] |
||
214 | lea esi,[ebp+qt_ptrs] |
||
215 | mov [ebp+mcu_ptr],edx |
||
216 | .l2: movzx eax,byte [edi+8] |
||
217 | add edi,3 |
||
218 | cmp al,4 |
||
219 | jnc eoi |
||
220 | lea eax,[eax*4+esi] |
||
221 | mov [ebx],eax |
||
222 | add ebx,16 |
||
223 | dec cl |
||
224 | jnz .l2 |
||
225 | ret |
||
226 | |||
227 | READ: mov eax,[ebp+fichero] |
||
228 | mov edi,[ebp+tmp_bufer] |
||
229 | movzx ecx,cx |
||
230 | call mresize |
||
231 | mov [ebp+tmp_bufer],edi |
||
232 | jmp read |
||
233 | |||
234 | dht: call READ |
||
235 | mov esi,edi |
||
236 | lea eax,[edi+ecx] |
||
237 | push eax |
||
238 | .l1: lodsb |
||
239 | mov edi,esi |
||
240 | mov ebx,3+16 |
||
241 | and bl,al |
||
242 | cmp bl,al |
||
243 | jne eoi |
||
244 | shr bl,2 |
||
245 | and al,3 |
||
246 | or bl,al |
||
247 | lea ebx,[ebp+ht_dc_ptrs+ebx*4] |
||
248 | test dword [ebx],-1 |
||
249 | jnz eoi |
||
250 | mov cl,15 |
||
251 | mov al,[edi] |
||
252 | .l2: inc edi ;calcular numero de codigos |
||
253 | add al,[edi] |
||
254 | jc eoi |
||
255 | dec cl |
||
256 | jnz .l2 |
||
257 | movzx ecx,al |
||
258 | lea ecx,[ecx*4+2] |
||
259 | call malloc |
||
260 | mov [ebx],edi |
||
261 | call arbol_hf |
||
262 | mov eax,[esp] |
||
263 | sub eax,ebx |
||
264 | jc eoi |
||
265 | mov esi,ebx |
||
266 | cmp eax,4 |
||
267 | ja .l1 |
||
268 | jne eoi |
||
269 | pop eax |
||
270 | ret |
||
271 | |||
272 | arbol_hf: ;esi=ht edi=memoria para el arbol |
||
273 | ;retorna en ebx el final de ht |
||
274 | ;codigos: bits 0-3=nbits del siguiente numero |
||
275 | ; bits 4-7=numero de zeros |
||
276 | ; bits 8-14=longitud de este codigo o error si =127 |
||
277 | ; bit 15=codigo/puntero |
||
278 | push ebp |
||
279 | lea ebx,[edi-2] |
||
280 | add ebx,[ebx-2] |
||
281 | mov word [ebx],-1 ;codigo de error si encontrado |
||
282 | push ebx |
||
283 | push esi |
||
284 | lea ebx,[esi+16] |
||
285 | mov ebp,esp |
||
286 | xor ecx,ecx |
||
287 | push edi |
||
288 | push ecx |
||
289 | add edi,2 |
||
290 | mov dx,1 |
||
291 | add dh,[esi] |
||
292 | jz .l3 |
||
293 | jmp .l2 |
||
294 | .l1: push edi |
||
295 | push ecx |
||
296 | add edi,2 |
||
297 | .l2: inc cl |
||
298 | cmp cl,dl |
||
299 | jc .l1 |
||
300 | mov al,[ebx] |
||
301 | inc ebx |
||
302 | mov ah,128 ;marca de codigo |
||
303 | or ah,dl |
||
304 | cmp edi,[ebp+4] |
||
305 | jnc .l5 |
||
306 | stosw |
||
307 | cmp esp,ebp |
||
308 | jnc .l5 |
||
309 | pop ecx |
||
310 | pop esi |
||
311 | lea eax,[edi-2] |
||
312 | sub eax,esi |
||
313 | mov [esi],ax |
||
314 | dec dh |
||
315 | jnz .l2 ;ncodigos |
||
316 | mov esi,[ebp] |
||
317 | .l3: inc esi |
||
318 | inc dl |
||
319 | cmp dl,17 |
||
320 | jnc .l4 |
||
321 | add dh,[esi] |
||
322 | jz .l3 |
||
323 | mov [ebp],esi |
||
324 | jmp .l2 |
||
325 | .l4: lea esp,[ebp+8] |
||
326 | pop ebp |
||
327 | ret |
||
328 | .l5: mov ebp,[ebp+8] |
||
329 | jmp eoi |
||
330 | |||
331 | sos: sub ecx,4 ;a continuacion vienen los datos de la imagen |
||
332 | call READ |
||
333 | mov eax,[ebp+fichero] |
||
334 | call ftell |
||
335 | mov [ebp+position],edx |
||
336 | mov esi,edi |
||
337 | lea edi,[ebp+q_ptr] |
||
338 | lodsb ;numero de componentes |
||
339 | sub [ebp+color_c],al |
||
340 | jnz eoi |
||
341 | mov dh,al |
||
342 | .l1: mov ebx,[edi] |
||
343 | mov eax,[ebx] |
||
344 | stosd |
||
345 | lodsw |
||
346 | mov cl,ah |
||
347 | and eax,0f00h |
||
348 | and ecx,0f0h |
||
349 | shr eax,6 |
||
350 | shr ecx,2 |
||
351 | lea ebx,[ebp+ht_ac_ptrs+eax] |
||
352 | mov eax,[ebx] |
||
353 | lea ebx,[ebp+ht_dc_ptrs+ecx] |
||
354 | mov ecx,[ebx] |
||
355 | test eax,eax |
||
356 | jz eoi |
||
357 | test ecx,ecx |
||
358 | jz eoi |
||
359 | stosd |
||
360 | mov eax,ecx |
||
361 | stosd |
||
362 | add edi,4 |
||
363 | dec dh |
||
364 | jnz .l1 |
||
365 | mov edx,[ebp+mcu_ptr] |
||
366 | cmp edx,modes |
||
367 | jne .l2 |
||
368 | lea esi,[ebp+q_ptr] |
||
369 | lea edi,[ebp+q_ptr+32] |
||
370 | movsd |
||
371 | movsd |
||
372 | movsd |
||
373 | .l2: |
||
374 | mov esi,edx |
||
375 | push dword [esi] |
||
376 | pop dword [ebp+mcu_ptr] |
||
377 | push dword [esi+4] |
||
378 | pop dword[ebp+color_ptr] |
||
379 | push dword [esi+12] |
||
380 | pop dword [ebp+y_mcu] |
||
381 | push dword [esi+8] |
||
382 | pop dword [ebp+x_mcu] |
||
383 | mov ecx,64*18 |
||
384 | call malloc |
||
385 | mov [ebp+matrices],edi |
||
386 | mov ecx,bufer_size |
||
387 | call malloc |
||
388 | mov [ebp+sourcebits],edi |
||
389 | mov esp,[ebp] |
||
390 | mov [esp+8],ebp |
||
391 | popad |
||
392 | ret |
||
393 | |||
394 | jpeg_display: |
||
395 | test ebp,ebp |
||
396 | jnz .inicio |
||
397 | ret |
||
398 | .inicio: |
||
399 | pushad |
||
400 | mov [ebp],esp |
||
401 | mov eax,[ebp+fichero] |
||
402 | mov edx,[ebp+position] |
||
403 | call lseek |
||
404 | mov edi,[ebp+sourcebits] |
||
405 | add edi,bufer_size |
||
406 | mov [ebp+sourcebits_index],edi |
||
407 | sub edi,2 |
||
408 | mov [ebp+sourcebits_limit],edi |
||
409 | mov edi,[ebp+matrices] |
||
410 | mov [ebp+matriz_limit],edi |
||
411 | xor eax,eax |
||
412 | mov [esp+8],eax |
||
413 | mov [ebp+estado],eax |
||
414 | mov [ebp+tmp_bits],eax |
||
415 | mov [ebp+dc],eax |
||
416 | mov [ebp+dc+16],eax |
||
417 | mov [ebp+dc+32],eax |
||
418 | |||
419 | mov eax,[ebp+y_mcu] |
||
420 | mov ecx,[ebp+y_org] |
||
421 | sub ecx,eax |
||
422 | mov [ebp+y_org2],ecx |
||
423 | mov [ebp+y_mcu2],eax |
||
424 | push dword [ebp+y_size] |
||
425 | pop dword [ebp+y_size2] |
||
426 | .l3: push dword [ebp+x_org] |
||
427 | pop dword [ebp+x_org2] |
||
428 | push dword [ebp+x_mcu] |
||
429 | pop dword [ebp+x_mcu2] |
||
430 | push dword [ebp+x_size] |
||
431 | pop dword [ebp+x_size2] |
||
432 | mov eax,[ebp+y_mcu2] |
||
433 | add [ebp+y_org2],eax |
||
434 | sub [ebp+y_size2],eax |
||
435 | jnc .l4 |
||
436 | add eax,[ebp+y_size2] |
||
437 | jnz .cont |
||
438 | mov [esp+8],ebp |
||
439 | popad |
||
440 | ret |
||
441 | .cont: |
||
442 | mov dword [ebp+y_size2],0 |
||
443 | mov [ebp+y_mcu2],eax |
||
444 | .l4: |
||
445 | mov eax,[ebp+x_mcu2] |
||
446 | sub [ebp+x_size2],eax |
||
447 | jnc .l5 |
||
448 | add eax,[ebp+x_size2] |
||
449 | jz .l3 |
||
450 | mov dword [ebp+x_size2],0 |
||
451 | mov [ebp+x_mcu2],eax |
||
452 | call dword [ebp+mcu_ptr] |
||
453 | mov eax,[ebp+x_mcu] |
||
454 | mov ecx,[ebp+x_mcu2] |
||
455 | mov edx,[ebp+y_mcu2] |
||
456 | call recortar |
||
457 | jmp .l6 |
||
458 | .l5: |
||
459 | call dword [ebp+mcu_ptr] |
||
460 | mov ecx,[ebp+x_mcu2] |
||
461 | mov edx,[ebp+y_mcu2] |
||
462 | .l6: |
||
463 | mov eax,[ebp+x_org2] |
||
464 | mov ebx,[ebp+y_org2] |
||
465 | call dword [ebp+draw_ptr] |
||
466 | add [ebp+x_org2],ecx |
||
467 | mov ax,[ebp+estado] |
||
468 | test al,15 |
||
469 | jz .l4 |
||
470 | cmp ah,8 |
||
471 | jnc .l4 |
||
472 | xor edx,edx |
||
473 | mov [ebp+tmp_bits],edx |
||
474 | mov [ebp+dc],edx |
||
475 | mov [ebp+dc+16],edx |
||
476 | mov [ebp+dc+32],edx |
||
477 | add dword [ebp+sourcebits_index],2 |
||
478 | and word [ebp+estado],0c0h |
||
479 | test al,32 |
||
480 | jz .l4 |
||
481 | jmp .l3 |
||
482 | |||
483 | color100: |
||
484 | push edi |
||
485 | .l1: lodsw |
||
486 | mov dl,ah |
||
487 | mov ah,al |
||
488 | stosw |
||
489 | mov ah,dl |
||
490 | stosb |
||
491 | mov al,dl |
||
492 | stosb |
||
493 | stosw |
||
494 | dec cl |
||
495 | jnz .l1 |
||
496 | pop edi |
||
497 | ret |
||
498 | |||
499 | color111: |
||
500 | push edi |
||
501 | .l1: lodsw |
||
502 | mov bx,[esi+62] |
||
503 | mov dx,[esi+126] |
||
504 | xchg ah,bh |
||
505 | xchg ah,dl |
||
506 | xchg ah,bl |
||
507 | stosw |
||
508 | mov ax,bx |
||
509 | stosw |
||
510 | mov ax,dx |
||
511 | stosw |
||
512 | dec cl |
||
513 | jnz .l1 |
||
514 | pop edi |
||
515 | mov ecx,64*3 |
||
516 | jmp ybr_bgr |
||
517 | |||
518 | color411: |
||
519 | push ebp |
||
520 | push edi |
||
521 | lea ebp,[esi+ecx*8] |
||
522 | .l1: push ecx |
||
523 | mov ax,[esi] |
||
524 | mov cx,[ebp] |
||
525 | mov dx,[ebp+64] |
||
526 | add ebp,2 |
||
527 | xchg ch,dl |
||
528 | mov bx,ax |
||
529 | mov ah,cl |
||
530 | mov bl,ch |
||
531 | mov [edi],ax |
||
532 | mov [edi+2],bx |
||
533 | mov [edi+4],cx |
||
534 | mov ax,[esi+8] |
||
535 | mov bh,ah |
||
536 | mov ah,cl |
||
537 | mov [edi+48],ax |
||
538 | mov [edi+48+2],bx |
||
539 | mov [edi+48+4],cx |
||
540 | mov ax,[esi+2] |
||
541 | mov bx,ax |
||
542 | mov ah,dl |
||
543 | mov bl,dh |
||
544 | mov [edi+6],ax |
||
545 | mov [edi+2+6],bx |
||
546 | mov [edi+4+6],dx |
||
547 | mov ax,[esi+8+2] |
||
548 | mov bh,ah |
||
549 | mov ah,dl |
||
550 | mov [edi+48+6],ax |
||
551 | mov [edi+48+2+6],bx |
||
552 | mov [edi+48+4+6],dx |
||
553 | pop ecx |
||
554 | add edi,12 |
||
555 | dec ecx |
||
556 | add esi,4 |
||
557 | test cl,1 |
||
558 | jnz .l1 |
||
559 | add esi,64-8 |
||
560 | test cl,2 |
||
561 | jnz .l1 |
||
562 | sub esi,128-16 |
||
563 | add edi,48 |
||
564 | test cl,15 |
||
565 | jnz .l1 |
||
566 | add esi,64 |
||
567 | test cl,cl |
||
568 | jnz .l1 |
||
569 | pop edi |
||
570 | pop ebp |
||
571 | mov ecx,64*4*3 |
||
572 | jmp ybr_bgr |
||
573 | |||
574 | color211: |
||
575 | push ebp |
||
576 | push edi |
||
577 | lea ebp,[esi+ecx*4] |
||
578 | .l1: push ecx |
||
579 | mov ax,[esi] |
||
580 | mov cx,[ebp] |
||
581 | mov dx,[ebp+64] |
||
582 | add ebp,2 |
||
583 | xchg ch,dl |
||
584 | mov bx,ax |
||
585 | mov ah,cl |
||
586 | mov bl,ch |
||
587 | mov [edi],ax |
||
588 | mov [edi+2],bx |
||
589 | mov [edi+4],cx |
||
590 | mov ax,[esi+2] |
||
591 | mov bx,ax |
||
592 | mov ah,dl |
||
593 | mov bl,dh |
||
594 | mov [edi+6],ax |
||
595 | mov [edi+2+6],bx |
||
596 | mov [edi+4+6],dx |
||
597 | pop ecx |
||
598 | add edi,12 |
||
599 | dec cl |
||
600 | add esi,4 |
||
601 | test cl,1 |
||
602 | jnz .l1 |
||
603 | add esi,64-8 |
||
604 | test cl,2 |
||
605 | jnz .l1 |
||
606 | sub esi,128-8 |
||
607 | test cl,cl |
||
608 | jnz .l1 |
||
609 | pop edi |
||
610 | pop ebp |
||
611 | mov ecx,64*3*2 |
||
612 | jmp ybr_bgr |
||
613 | |||
614 | |||
615 | mcu411: lea ebx,[ebp+q_ptr] |
||
616 | call hufdecode |
||
617 | lea ebx,[ebp+q_ptr] |
||
618 | call hufdecode |
||
619 | mcu211: lea ebx,[ebp+q_ptr] |
||
620 | call hufdecode |
||
621 | mcu111: lea ebx,[ebp+q_ptr] |
||
622 | call hufdecode |
||
623 | lea ebx,[ebp+q_ptr+16] |
||
624 | call hufdecode |
||
625 | mcu100: lea ebx,[ebp+q_ptr+32] |
||
626 | call hufdecode |
||
627 | mov esi,[ebp+matrices] |
||
628 | mov dword [ebp+matriz_limit],esi |
||
629 | mov ecx,32 |
||
630 | lea edi,[esi+64*6] |
||
631 | jmp dword [ebp+color_ptr] |
||
632 | |||
633 | cargar_bits: ;edx=bits,cl=nbits, |
||
634 | ;bp=data struct |
||
635 | ;cr: cl,edx,eax,si |
||
636 | ;ncr bx,bp,di,ch |
||
637 | |||
638 | mov esi,[ebp+sourcebits_index] |
||
639 | cmp esi,[ebp+sourcebits_limit] |
||
640 | jnc .l6 |
||
641 | movzx eax,byte [esi] |
||
642 | inc esi |
||
643 | add cl,8 |
||
644 | cmp al,-1 |
||
645 | je .l2 |
||
646 | mov ah,al |
||
647 | lodsb |
||
648 | add cl,8 |
||
649 | cmp al,-1 |
||
650 | je .l2 |
||
651 | .l1: ror eax,cl |
||
652 | or edx,eax |
||
653 | mov [ebp+sourcebits_index],esi |
||
654 | ret |
||
655 | .l2: lodsb |
||
656 | test al,al |
||
657 | jnz .l3 |
||
658 | mov al,-1 |
||
659 | call .l1 |
||
660 | cmp cl,16 |
||
661 | jc cargar_bits |
||
662 | ret |
||
663 | .l3: sub esi,2 |
||
664 | sub cl,8 |
||
665 | sub al,0d0h |
||
666 | cmp al,8 |
||
667 | jc .l4 |
||
668 | sub al,9 |
||
669 | mov al,63 |
||
670 | jz .l4 |
||
671 | mov al,127 |
||
672 | .l4: inc al |
||
673 | or [ebp+estado],al |
||
674 | movzx eax,ah |
||
675 | jmp .l1 |
||
676 | .l5: mov [ebp+sourcebits_limit],edi |
||
677 | mov word [edi],0d9ffh |
||
678 | popad |
||
679 | jmp cargar_bits |
||
680 | .l6: ;read file |
||
681 | pushad |
||
682 | mov ecx,bufer_size-2 |
||
683 | mov edx,[ebp+sourcebits_limit] |
||
684 | mov edi,[ebp+sourcebits] |
||
685 | mov ax,[edx] |
||
686 | sub edx,edi |
||
687 | stosw |
||
688 | sub esi,edx |
||
689 | mov [ebp+sourcebits_index],esi |
||
690 | cmp edx,ecx |
||
691 | jne .l5 |
||
692 | mov eax,[ebp+fichero] |
||
693 | call read |
||
694 | lea ecx,[edi+ecx-2] |
||
695 | mov [ebp+sourcebits_limit],ecx |
||
696 | popad |
||
697 | jmp cargar_bits |
||
698 | |||
699 | |||
700 | hufdecode: ;si->dctable [bp+20]->actable di->outbufer edx->bits cl->bits en edx |
||
701 | |||
702 | |||
703 | ;[bp+24]->sourcebits |
||
704 | ;[bp+22]=outbufer+128 |
||
705 | ;[bx] q ptr para aa&n |
||
706 | ;[bx+2] a ptr |
||
707 | ;[bx+4] d ptr |
||
708 | ;[bx+8] dc componente |
||
709 | fninit |
||
710 | push dword [ebx] |
||
711 | mov cl,[ebp+nbits] |
||
712 | mov edx,[ebp+tmp_bits] |
||
713 | cmp cl,16 |
||
714 | jnc .l1 |
||
715 | call cargar_bits |
||
716 | .l1: mov eax,[ebx+4] |
||
717 | mov esi,[ebx+8] |
||
718 | mov [ebp+actable],eax |
||
719 | movzx eax,word [esi] |
||
720 | add esi,2 |
||
721 | .l2: add edx,edx |
||
722 | jnc .l3 |
||
723 | add esi,eax |
||
724 | .l3: lodsw |
||
725 | test ax,ax |
||
726 | jns .l2 |
||
727 | ;codigo encontrado |
||
728 | and ax,7f0fh |
||
729 | mov edi,[ebp+matriz_limit] ;arrays |
||
730 | sub cl,ah |
||
731 | jns .l4 |
||
732 | fldz |
||
733 | .error: |
||
734 | xor ecx,ecx |
||
735 | or byte [ebp+estado],32 |
||
736 | jmp .l12 |
||
737 | .l4: cmp cl,al |
||
738 | jnc .l5 |
||
739 | push eax |
||
740 | call cargar_bits |
||
741 | pop eax |
||
742 | .l5: sub cl,al |
||
743 | mov ch,cl |
||
744 | mov cl,al |
||
745 | mov eax,edx |
||
746 | shl edx,cl |
||
747 | sar eax,17 |
||
748 | xor ax,8000h |
||
749 | xor cl,15 |
||
750 | sar ax,cl |
||
751 | mov cl,ch |
||
752 | mov ch,2 |
||
753 | add ax,8000h ;incrementar si negativo |
||
754 | adc ax,8000h |
||
755 | add [ebx+12],ax |
||
756 | fild word [ebx+12] |
||
757 | push ecx |
||
758 | mov ecx,64 |
||
759 | xor eax,eax |
||
760 | add [ebp+matriz_limit],ecx |
||
761 | rep stosd |
||
762 | pop ecx |
||
763 | sub edi,64*4 |
||
764 | mov ebx,[esp] |
||
765 | fmul dword [ebx] |
||
766 | .l6: cmp cl,16 |
||
767 | jnc .l7 |
||
768 | call cargar_bits |
||
769 | .l7: mov esi,[ebp+actable] |
||
770 | movzx eax,word[esi] |
||
771 | add esi,2 |
||
772 | .l8: add edx,edx |
||
773 | jnc .l9 |
||
774 | add esi,eax |
||
775 | .l9: lodsw |
||
776 | test ax,ax |
||
777 | jns .l8 |
||
778 | ;codigo encontrado |
||
779 | and ah,127 |
||
780 | xor ebx,ebx |
||
781 | sub cl,ah |
||
782 | js .error |
||
783 | or bl,al |
||
784 | jz .l12 |
||
785 | and al,0f0h |
||
786 | shr al,3 |
||
787 | add ch,al |
||
788 | js .error |
||
789 | and bl,0fh |
||
790 | jz .l11 |
||
791 | cmp cl,bl |
||
792 | jnc .l10 |
||
793 | call cargar_bits |
||
794 | .l10: sub cl,bl |
||
795 | xchg bl,cl |
||
796 | mov eax,edx |
||
797 | shl edx,cl |
||
798 | sar eax,17 |
||
799 | xor cl,15 |
||
800 | xor ax,8000h |
||
801 | sar ax,cl |
||
802 | add ax,8000h ;incrementar si negativo |
||
803 | adc ax,8000h |
||
804 | mov cl,bl |
||
805 | mov bl,ch |
||
806 | mov [ebp+tmp_bits],ax |
||
807 | mov ax,[ebx+zigzag] |
||
808 | mov ebx,[esp] |
||
809 | fild word [ebp+tmp_bits] |
||
810 | or [ebp+idct],ax |
||
811 | and eax,11111100b |
||
812 | fmul dword [ebx+eax] |
||
813 | fstp dword [edi+eax] |
||
814 | .l11: add ch,2 |
||
815 | jns .l6 |
||
816 | .l12: mov [ebp+nbits],cl |
||
817 | mov [ebp+tmp_bits],edx |
||
818 | xor ebx,ebx |
||
819 | add esp,4 |
||
820 | xchg ebx,[ebp+idct] |
||
821 | cmp ch,2 |
||
822 | je idctf1 |
||
823 | fstp dword [edi] |
||
824 | test bh,0feh |
||
825 | jnz idctf3 |
||
826 | idctf2a: test bh,1 |
||
827 | mov esi,edi |
||
828 | jz .l1 |
||
829 | test bl,1 |
||
830 | jnz idctf3 |
||
831 | push idctf2b |
||
832 | jmp idctf3b |
||
833 | .l1: call idctf3a |
||
834 | mov cl,4 |
||
835 | call limit |
||
836 | mov eax,[edi-8] |
||
837 | mov edx,[edi-4] |
||
838 | mov cl,7 |
||
839 | .l2: mov [edi],eax |
||
840 | mov [edi+4],edx |
||
841 | add edi,8 |
||
842 | dec cl |
||
843 | jnz .l2 |
||
844 | ret |
||
845 | |||
846 | idctf1: fistp word[edi+64] |
||
847 | mov ax,128 |
||
848 | add ax,[edi+64] |
||
849 | jz .l2 |
||
850 | test ah,ah |
||
851 | jz .l1 |
||
852 | mov al,-1 |
||
853 | js .l2 |
||
854 | .l1: mov ah,al |
||
855 | stosw |
||
856 | stosw |
||
857 | mov eax,[edi-4] |
||
858 | mov ecx,15 |
||
859 | rep stosd |
||
860 | .l2: ret |
||
861 | |||
862 | idctf3: mov bl,8 |
||
863 | mov esi,edi |
||
864 | .l1: rcr bh,1 |
||
865 | jc .l3 |
||
866 | mov eax,[esi] |
||
867 | test eax,eax |
||
868 | jz .l4 |
||
869 | mov cl,7 |
||
870 | .l2: add esi,32 |
||
871 | mov [esi],eax |
||
872 | dec cl |
||
873 | jnz .l2 |
||
874 | sub esi,32*7-4 |
||
875 | dec bl |
||
876 | jnz .l1 |
||
877 | jmp .l5 |
||
878 | .l3: call idctf3b |
||
879 | .l4: add esi,4 |
||
880 | dec bl |
||
881 | jnz .l1 |
||
882 | .l5: mov esi,edi |
||
883 | mov cl,8 |
||
884 | .l6: call idctf3a |
||
885 | add esi,32 |
||
886 | add edi,16 |
||
887 | dec cl |
||
888 | jnz .l6 |
||
889 | sub edi,128 |
||
890 | mov esi,edi |
||
891 | mov cl,32 |
||
892 | limit: mov dx,[esi] |
||
893 | mov bx,[esi+2] |
||
894 | add esi,4 |
||
895 | add dx,128 |
||
896 | add bx,128 |
||
897 | test dh,dh |
||
898 | mov ax,dx |
||
899 | jz .l1 |
||
900 | mov al,0 |
||
901 | js .l1 |
||
902 | mov al,-1 |
||
903 | .l1: test bh,bh |
||
904 | mov ah,bl |
||
905 | jz .l2 |
||
906 | mov ah,0 |
||
907 | js .l2 |
||
908 | mov ah,-1 |
||
909 | .l2: stosw |
||
910 | dec cl |
||
911 | jnz limit |
||
912 | ret |
||
913 | |||
914 | idctf2b: |
||
915 | mov dl,8 |
||
916 | .l1: fld dword[esi] |
||
917 | add esi,32 |
||
918 | mov ax,128 |
||
919 | fistp word [edi] |
||
920 | add ax,[edi] |
||
921 | test ah,ah |
||
922 | jz .l2 |
||
923 | mov al,0 |
||
924 | js .l2 |
||
925 | mov al,-1 |
||
926 | .l2: mov ah,al |
||
927 | stosw |
||
928 | stosw |
||
929 | stosw |
||
930 | stosw |
||
931 | dec dl |
||
932 | jnz .l1 |
||
933 | ret |
||
934 | |||
935 | idctf3a: ;si(d float),di(w int) ncr |
||
936 | fld dword[esi+1*4] ;f1 ;t21=f1+f7 |
||
937 | fld st0 |
||
938 | fld dword[esi+7*4] ;f7 |
||
939 | fadd st2,st0 |
||
940 | fsubp st1,st0 ;t22=f1-f7 |
||
941 | fld dword[esi+5*4] |
||
942 | fld st0 ;f5 ;t23=f5+f3 |
||
943 | fld dword[esi+3*4] ;f3 |
||
944 | fadd st2,st0 |
||
945 | fsubp st1,st0 ;t20=f5-f3 |
||
946 | fld st0 |
||
947 | fadd st0,st3 ;t25=(t20+t22)*k2 |
||
948 | fmul dword[k+4] ;k2 ;t25,t20,t23,t22,t21 |
||
949 | fld st4 ;t7=t21+t23 |
||
950 | fadd st0,st3 ;t7,t25,t20,t23,t22,t21 |
||
951 | fld dword[k+12] ;k4 ;t6=k4*t20+t25-t7 |
||
952 | fmulp st3,st0 |
||
953 | fsub st2,st0 |
||
954 | fld st1 |
||
955 | faddp st3,st0 ;t7,t25,t6,t23,t22,t21 |
||
956 | fld st5 ;t5=(t21-t23)*k1-t6 |
||
957 | fsub st0,st4 |
||
958 | fmul dword[k] ;k1 |
||
959 | fsub st0,st3 |
||
960 | fstp st6 ;t7,t25,t6,t23,t22,t5 |
||
961 | fstp st3 ;t25,t6,t7,t22,t5 |
||
962 | fxch st3 |
||
963 | fmul dword[k+8] ;k3 ;t4=k3*t22-t25+t5 |
||
964 | fadd st0,st4 ;t22*k3+t5,t6,t7,t25,t5 |
||
965 | fsubrp st3,st0 ;t6,t7,t4,t5 |
||
966 | fld dword[esi] ;f0 ;t10=f0+f4 |
||
967 | fst st5 ;f0,t4,t5,t6,t7,f0 |
||
968 | fld dword[esi+4*4] ;f4 |
||
969 | fsub st6,st0 ;t11=f0-f4 |
||
970 | faddp st1,st0 |
||
971 | fld st0 ;t10,t10,t6,t7,t4,t5,t11 |
||
972 | fld dword[esi+2*4] ;f2 ;t13=f2+f6 |
||
973 | fadd dword[esi+6*4] ;f6 ;t13,t10,t10,t6,t7,t4,t5,t11 |
||
974 | fadd st2,st0 ;t13,t10,t0,t6,t7,t4,t5,t11 ;t0=t10+t13 |
||
975 | fsubp st1,st0 ;t3,t0,t6,t7,t4,t5,t11 ;t3=t10-t13 |
||
976 | fld st0 ;p3=t3-t4 |
||
977 | fsub st0,st5 |
||
978 | fistp word [edi+3*2] ;p3 |
||
979 | fadd st0,st4 ;p4=t3+t4 |
||
980 | fld dword[esi+2*4] ;f2 |
||
981 | fstp st5 |
||
982 | fistp word [edi+4*2] ;p4 ;t0,t6,t7,f2,t5,t11 |
||
983 | fld st0 ;p0=t0+t7 |
||
984 | fsub st0,st3 |
||
985 | fistp word [edi+7*2] ;p7 |
||
986 | fadd st0,st2 ;p7=t0-t7 |
||
987 | fistp word [edi] ;p0 ;t6,t7,f2,t5,t11 |
||
988 | fld st2 ;f2 ;f2,t6,t7,f2,t5,t11 ;t12=(f2-f6)*k1-t13 |
||
989 | fld dword[esi+6*4] ;f6 |
||
990 | fadd st4,st0 ;f6,f2,t6,t7,t13,t5,t11 |
||
991 | fsubp st1,st0 |
||
992 | fmul dword[k] ;k1 |
||
993 | fsub st0,st3 |
||
994 | fst st3 ;t12,t6,t7,t12,t5,t11 |
||
995 | fadd st0,st5 ;t1=t11+t12 |
||
996 | fst st2 ;t1,t6,t1,t12,t5,t11 |
||
997 | fadd st0,st1 ;p1=t1+t6 |
||
998 | fistp word [edi+2] ;p1 ;t6,t1,t12,t5,t11 |
||
999 | fsubp st1,st0 ;p6=t1-t6 |
||
1000 | fistp word [edi+6*2] ;p6 ;t12,t5,t11 |
||
1001 | fsubp st2,st0 ;t2=t11-t12 ;t5,t2 |
||
1002 | fld st0 |
||
1003 | fadd st0,st2 ;p2=t2+t5 |
||
1004 | fistp word [edi+2*2] ;p2 |
||
1005 | fsubp st1,st0 ;p5=t2-t5 ;t5,t2 |
||
1006 | fistp word [edi+5*2] |
||
1007 | ret ;p5 |
||
1008 | |||
1009 | |||
1010 | |||
1011 | |||
1012 | idctf3b: ;si ncr |
||
1013 | fld dword[esi+1*32] |
||
1014 | fld st0 ;f1 ;t21=f1+f7 |
||
1015 | fld dword[esi+7*32] |
||
1016 | fadd st2,st0 ;f7 |
||
1017 | fsubp st1,st0 ;t22=f1-f7 |
||
1018 | fld dword[esi+5*32] |
||
1019 | fld st0 ;f5 ;t23=f5+f3 |
||
1020 | fld dword[esi+3*32] ;f3 |
||
1021 | fadd st2,st0 |
||
1022 | fsubp st1,st0 |
||
1023 | fld st0 ;t20=f5-f3 |
||
1024 | fadd st0,st3 ;t25=(t20+t22)*k2 |
||
1025 | fmul dword[k+4] ;k2 ;t25,t20,t23,t22,t21 |
||
1026 | fld st4 ;t7=t21+t23 |
||
1027 | fadd st0,st3 ;t7,t25,t20,t23,t22,t21 |
||
1028 | fld dword[k+12] ;k4 ;t6=k4*t20+t25-t7 |
||
1029 | fmulp st3,st0 |
||
1030 | fsub st2,st0 |
||
1031 | fld st1 |
||
1032 | faddp st3,st0 ;t7,t25,t6,t23,t22,t21 |
||
1033 | fld st5 ;t5=(t21-t23)*k1-t6 |
||
1034 | fsub st0,st4 |
||
1035 | fmul dword[k] ;k1 |
||
1036 | fsub st0,st3 |
||
1037 | fstp st6 ;t7,t25,t6,t23,t22,t5 |
||
1038 | fstp st3 |
||
1039 | fxch st3 ;t25,t6,t7,t22,t5 |
||
1040 | fmul dword[k+8] ;k3 ;t4=k3*t22-t25+t5 |
||
1041 | fadd st0,st4 ;t22*k3+t5,t6,t7,t25,t5 |
||
1042 | fsubrp st3,st0 ;t6,t7,t4,t5 |
||
1043 | fld dword[esi] ;f0 ;t10=f0+f4 |
||
1044 | fst st5 ;f0,t4,t5,t6,t7,f0 |
||
1045 | fld dword[esi+4*32] ;f4 |
||
1046 | fsub st6,st0 ;t11=f0-f4 |
||
1047 | faddp st1,st0 |
||
1048 | fld st0 ;t10,t10,t6,t7,t4,t5,t11 |
||
1049 | fld dword[esi+2*32] ;f2 ;t13=f2+f6 |
||
1050 | fadd dword[esi+6*32] ;f6 ;t13,t10,t10,t6,t7,t4,t5,t11 |
||
1051 | fadd st2,st0 ;t13,t10,t0,t6,t7,t4,t5,t11 ;t0=t10+t13 |
||
1052 | fsubp st1,st0 ;t3,t0,t6,t7,t4,t5,t11 ;t3=t10-t13 |
||
1053 | fld st0 ;p3=t3-t4 |
||
1054 | fsub st0,st5 |
||
1055 | fstp dword[esi+3*32] ;p3 |
||
1056 | fadd st0,st4 ;p4=t3+t4 |
||
1057 | fld dword[esi+2*32] ;f2 |
||
1058 | fstp st5 |
||
1059 | fstp dword[esi+4*32] ;p4 ;t0,t6,t7,f2,t5,t11 |
||
1060 | fld st0 |
||
1061 | fsub st0,st3 ;p0=t0+t7 |
||
1062 | fstp dword[esi+7*32] ;p7 |
||
1063 | fadd st0,st2 ;p7=t0-t7 |
||
1064 | fstp dword[esi] ;p0 ;t6,t7,f2,t5,t11 |
||
1065 | fld st2 ;f2 ;f2,t6,t7,f2,t5,t11 ;t12=(f2-f6)*k1-t13 |
||
1066 | fld dword[esi+6*32] ;f6 |
||
1067 | fadd st4,st0 ;f6,f2,t6,t7,t13,t5,t11 |
||
1068 | fsubp st1,st0 |
||
1069 | fmul dword[k] ;k1 |
||
1070 | fsub st0,st3 |
||
1071 | fst st3 ;t12,t6,t7,t12,t5,t11 |
||
1072 | fadd st0,st5 ;t1=t11+t12 |
||
1073 | fst st2 ;t1,t6,t1,t12,t5,t11 |
||
1074 | fadd st0,st1 ;p1=t1+t6 |
||
1075 | fstp dword[esi+1*32] ;p1 ;t6,t1,t12,t5,t11 |
||
1076 | fsubp st1,st0 ;p6=t1-t6 |
||
1077 | fstp dword[esi+6*32] ;p6 ;t12,t5,t11 |
||
1078 | fsubp st2,st0 |
||
1079 | fld st0 ;t2=t11-t12 ;t5,t2 |
||
1080 | fadd st0,st2 ;p2=t2+t5 |
||
1081 | fstp dword[esi+2*32] ;p2 |
||
1082 | fsubp st1,st0 ;p5=t2-t5 ;t5,t2 |
||
1083 | fstp dword[esi+5*32] |
||
1084 | ret ;p5 |
||
1085 | |||
1086 | ybr_bgr: ;edi=bmp ecx=n_BYTES |
||
1087 | ;retorna edi+=ecx |
||
1088 | pushad |
||
1089 | mov esi,edi |
||
1090 | add edi,ecx |
||
1091 | push edi |
||
1092 | mov edi,[colortabla] |
||
1093 | .l1: lodsw |
||
1094 | movzx ebx,ah |
||
1095 | movzx ebp,al |
||
1096 | movzx eax,al |
||
1097 | movzx ecx,byte[esi] |
||
1098 | lea ebx,[ebx*4+edi+1024] |
||
1099 | lea ecx,[ecx*4+edi] |
||
1100 | add eax,[ebx] ;cb ;solo se usan 16 bits |
||
1101 | mov edx,[ebx+2] ;pero el codigo de 32 bits es mas rapido |
||
1102 | mov ebx,[ecx] ;cr |
||
1103 | add eax,[ecx+2] |
||
1104 | add ebx,ebp ;b |
||
1105 | add edx,ebp ;r |
||
1106 | test ah,ah |
||
1107 | jz .l2 |
||
1108 | mov al,0 |
||
1109 | js .l2 |
||
1110 | mov al,-1 |
||
1111 | .l2: test dh,dh |
||
1112 | jz .l3 |
||
1113 | mov dl,0 |
||
1114 | js .l3 |
||
1115 | mov dl,-1 |
||
1116 | .l3: test bh,bh |
||
1117 | mov dh,al |
||
1118 | jz .l4 |
||
1119 | mov bl,0 |
||
1120 | js .l4 |
||
1121 | mov bl,-1 |
||
1122 | .l4: mov [esi-2],dx |
||
1123 | mov [esi],bl |
||
1124 | inc esi |
||
1125 | cmp esi,[esp] |
||
1126 | jc .l1 |
||
1127 | pop edi |
||
1128 | popad |
||
1129 | ret |
||
1130 | |||
1131 | recortar: ;edi=bufer eax=ancho en pixels (ecx,edx)tama¤o deseado |
||
1132 | pushad |
||
1133 | dec edx |
||
1134 | jz .l2 |
||
1135 | lea ebx,[ecx*3] |
||
1136 | lea eax,[eax*3] |
||
1137 | lea esi,[edi+eax] |
||
1138 | add edi,ebx |
||
1139 | sub eax,ebx |
||
1140 | .l1: mov ecx,ebx |
||
1141 | call movedata |
||
1142 | add esi,eax |
||
1143 | dec edx |
||
1144 | jnz .l1 |
||
1145 | .l2: popad |
||
1146 | ret |
||
1147 | |||
1148 | ;R = Y + 1.402 *(Cr-128) |
||
1149 | ;G = Y - 0.34414*(Cb-128) - 0.71414*(Cr-128) |
||
1150 | ;B = Y + 1.772 *(Cb-128) |
||
1151 | |||
1152 | colortabla: dd 0 |
||
1153 | |||
1154 | colorprecalc: ;prepara la tabla para convertir ycb a rgb |
||
1155 | mov ecx,1024*2 |
||
1156 | call malloc |
||
1157 | mov [colortabla],edi |
||
1158 | fninit |
||
1159 | fld dword [.k+4] |
||
1160 | fld dword [.k] |
||
1161 | mov dl,0 |
||
1162 | call .l1 |
||
1163 | fld dword [.k+12] |
||
1164 | fld dword[.k+8] |
||
1165 | .l1: mov cx,-128 |
||
1166 | .l2: mov [edi],ecx |
||
1167 | inc ecx |
||
1168 | fild word[edi] |
||
1169 | fld st0 |
||
1170 | fmul st0,st2 |
||
1171 | fistp word[edi] |
||
1172 | fmul st0,st2 |
||
1173 | fistp word[edi+2] |
||
1174 | add edi,4 |
||
1175 | inc dl |
||
1176 | jnz .l2 |
||
1177 | ret |
||
1178 | |||
1179 | .k: dd 1.402,-0.71414,-0.34414,+1.772 |