7dfe6ad257
git-svn-id: svn://kolibrios.org@3122 a494cfbc-eb01-0410-851d-a64ba20cac60
1182 lines
26 KiB
NASM
1182 lines
26 KiB
NASM
;405 412 586
|
||
;
|
||
;
|
||
bufer_size=1024*16+2
|
||
fichero=4
|
||
mcu_ptr=8
|
||
color_ptr=12
|
||
estado=16
|
||
color_c=17
|
||
nbits=color_c
|
||
idct=20
|
||
tmp_bits=24
|
||
actable=28
|
||
matriz_limit=32
|
||
sourcebits=36
|
||
sourcebits_index=40
|
||
sourcebits_limit=44
|
||
qt_ptrs=48
|
||
ht_dc_ptrs=64
|
||
ht_ac_ptrs=80
|
||
matrices=96
|
||
tmp_bufer=100
|
||
x_org=104
|
||
y_org=108
|
||
x_mcu=112
|
||
y_mcu=116
|
||
x_size=120
|
||
y_size=124
|
||
x_org2=128
|
||
y_org2=132
|
||
x_mcu2=136
|
||
y_mcu2=140
|
||
x_size2=144
|
||
y_size2=148
|
||
q_ptr=152
|
||
dc=164
|
||
position=204
|
||
draw_ptr=208
|
||
struct_size=212
|
||
|
||
jpeg_info: ;fichero en eax
|
||
;retorna ebp
|
||
xor ebp,ebp
|
||
pushad
|
||
mov ebp,esp
|
||
mov ecx,6
|
||
sub esp,ecx
|
||
mov edi,esp
|
||
call read
|
||
pop dx
|
||
cmp dx,0d8ffh
|
||
je .l1
|
||
mov esp,ebp
|
||
popad
|
||
ret
|
||
.l1: push eax
|
||
mov ecx,struct_size
|
||
call mallocz
|
||
mov [edi],ebp
|
||
mov ebp,edi
|
||
pop dword [ebp+fichero]
|
||
pop ax
|
||
pop cx
|
||
jmp .l3
|
||
.l2: mov ebx,[ebp+tmp_bufer]
|
||
add ebx,[ebx-4]
|
||
mov cx,[ebx-2]
|
||
mov ax,[ebx-4]
|
||
.l3: push .l2
|
||
xchg cl,ch
|
||
add cx,2
|
||
cmp ch,3
|
||
jnc .l4
|
||
cmp al,0ffh
|
||
jne eoi
|
||
cmp ah,0dbh
|
||
je dqt
|
||
cmp ah,0c4h
|
||
je dht
|
||
cmp ah,0c0h
|
||
je sof0
|
||
cmp ah,0dah
|
||
je sos
|
||
cmp ah,0c2h
|
||
je eoi
|
||
cmp ah,0c9h
|
||
je eoi
|
||
cmp ah,0d9h
|
||
je eoi
|
||
.l4: lea edx,[ecx-4]
|
||
xor ecx,ecx
|
||
mov eax,[ebp+fichero]
|
||
call skip
|
||
mov ecx,4
|
||
call READ
|
||
cmp ecx,[edi-4]
|
||
jne eoi
|
||
ret
|
||
|
||
eoi:
|
||
mov esp,[ebp]
|
||
; do not close file - this will be done by caller
|
||
and dword [ebp+fichero], 0
|
||
call jpeg_close
|
||
popad
|
||
xor ebp,ebp
|
||
ret
|
||
|
||
jpeg_close:
|
||
test ebp,ebp
|
||
jz .l2
|
||
pushad
|
||
mov eax,[ebp+fichero]
|
||
call close
|
||
mov edi,[ebp+sourcebits]
|
||
call free
|
||
lea esi,[ebp+qt_ptrs]
|
||
mov ecx,14
|
||
.l1: mov edi,[esi]
|
||
add esi,4
|
||
call free
|
||
loop .l1
|
||
mov edi,ebp
|
||
call free
|
||
popad
|
||
.l2: ret
|
||
|
||
dqt: call READ
|
||
mov esi,edi
|
||
lea eax,[edi+ecx]
|
||
push eax
|
||
.l1: xor eax,eax
|
||
lodsb
|
||
cmp al,4
|
||
jnc eoi
|
||
lea ebx,[ebp+qt_ptrs+eax*4]
|
||
test dword [ebx],-1
|
||
jnz eoi
|
||
mov ecx,64
|
||
xor eax,eax
|
||
sub esp,128
|
||
mov edi,esp
|
||
.l2: lodsb
|
||
stosw
|
||
loop .l2
|
||
mov ecx,256
|
||
call malloc
|
||
mov [ebx],edi
|
||
mov eax,esi
|
||
mov esi,esp
|
||
pushad
|
||
mov ebp,zigzag
|
||
fninit
|
||
mov cl,64
|
||
xor eax,eax
|
||
.l3: fild word[esi]
|
||
mov al,[ebp]
|
||
and al,-2
|
||
add ebp,2
|
||
add esi,2
|
||
mov ebx,eax
|
||
and ebx,28
|
||
fmul dword [ebx+k2]
|
||
mov ebx,eax
|
||
shr ebx,3
|
||
and ebx,4+8+16
|
||
fmul dword [ebx+k2]
|
||
fstp dword [edi+eax]
|
||
dec cl
|
||
jnz .l3
|
||
popad
|
||
mov esi,eax
|
||
add esp,128
|
||
mov eax,[esp]
|
||
sub eax,esi
|
||
jc eoi
|
||
cmp eax,4
|
||
ja .l1
|
||
jne eoi
|
||
pop eax
|
||
ret
|
||
|
||
sof0: call READ
|
||
cmp byte [edi],8
|
||
jne eoi ;precision
|
||
mov ax,[edi+1]
|
||
xchg al,ah
|
||
mov [ebp+y_size],ax
|
||
mov ax,[edi+3]
|
||
xchg al,ah
|
||
mov [ebp+x_size],ax
|
||
mov al,[edi+5] ;ncomponentes
|
||
mov cl,al
|
||
mov [ebp+color_c],al
|
||
mov edx,modes
|
||
dec al
|
||
jz .l1
|
||
dec al
|
||
dec al
|
||
jnz eoi
|
||
mov al,[edi+10]
|
||
mov ah,[edi+13]
|
||
cmp ax,1111h
|
||
jne eoi
|
||
mov al,[edi+7]
|
||
add edx,16
|
||
cmp al,11h
|
||
je .l1
|
||
add edx,16
|
||
cmp al,21h
|
||
je .l1
|
||
add edx,16
|
||
cmp al,22h
|
||
jne eoi
|
||
.l1: lea ebx,[ebp+q_ptr]
|
||
lea esi,[ebp+qt_ptrs]
|
||
mov [ebp+mcu_ptr],edx
|
||
.l2: movzx eax,byte [edi+8]
|
||
add edi,3
|
||
cmp al,4
|
||
jnc eoi
|
||
lea eax,[eax*4+esi]
|
||
mov [ebx],eax
|
||
add ebx,16
|
||
dec cl
|
||
jnz .l2
|
||
ret
|
||
|
||
READ: mov eax,[ebp+fichero]
|
||
mov edi,[ebp+tmp_bufer]
|
||
movzx ecx,cx
|
||
call mresize
|
||
mov [ebp+tmp_bufer],edi
|
||
jmp read
|
||
|
||
dht: call READ
|
||
mov esi,edi
|
||
lea eax,[edi+ecx]
|
||
push eax
|
||
.l1: lodsb
|
||
mov edi,esi
|
||
mov ebx,3+16
|
||
and bl,al
|
||
cmp bl,al
|
||
jne eoi
|
||
shr bl,2
|
||
and al,3
|
||
or bl,al
|
||
lea ebx,[ebp+ht_dc_ptrs+ebx*4]
|
||
test dword [ebx],-1
|
||
jnz eoi
|
||
mov cl,15
|
||
mov al,[edi]
|
||
.l2: inc edi ;calcular numero de codigos
|
||
add al,[edi]
|
||
jc eoi
|
||
dec cl
|
||
jnz .l2
|
||
movzx ecx,al
|
||
lea ecx,[ecx*4+2]
|
||
call malloc
|
||
mov [ebx],edi
|
||
call arbol_hf
|
||
mov eax,[esp]
|
||
sub eax,ebx
|
||
jc eoi
|
||
mov esi,ebx
|
||
cmp eax,4
|
||
ja .l1
|
||
jne eoi
|
||
pop eax
|
||
ret
|
||
|
||
arbol_hf: ;esi=ht edi=memoria para el arbol
|
||
;retorna en ebx el final de ht
|
||
;codigos: bits 0-3=nbits del siguiente numero
|
||
; bits 4-7=numero de zeros
|
||
; bits 8-14=longitud de este codigo o error si =127
|
||
; bit 15=codigo/puntero
|
||
push ebp
|
||
lea ebx,[edi-2]
|
||
add ebx,[ebx-2]
|
||
mov word [ebx],-1 ;codigo de error si encontrado
|
||
push ebx
|
||
push esi
|
||
lea ebx,[esi+16]
|
||
mov ebp,esp
|
||
xor ecx,ecx
|
||
push edi
|
||
push ecx
|
||
add edi,2
|
||
mov dx,1
|
||
add dh,[esi]
|
||
jz .l3
|
||
jmp .l2
|
||
.l1: push edi
|
||
push ecx
|
||
add edi,2
|
||
.l2: inc cl
|
||
cmp cl,dl
|
||
jc .l1
|
||
mov al,[ebx]
|
||
inc ebx
|
||
mov ah,128 ;marca de codigo
|
||
or ah,dl
|
||
cmp edi,[ebp+4]
|
||
jnc .l5
|
||
stosw
|
||
cmp esp,ebp
|
||
jnc .l5
|
||
pop ecx
|
||
pop esi
|
||
lea eax,[edi-2]
|
||
sub eax,esi
|
||
mov [esi],ax
|
||
dec dh
|
||
jnz .l2 ;ncodigos
|
||
mov esi,[ebp]
|
||
.l3: inc esi
|
||
inc dl
|
||
cmp dl,17
|
||
jnc .l4
|
||
add dh,[esi]
|
||
jz .l3
|
||
mov [ebp],esi
|
||
jmp .l2
|
||
.l4: lea esp,[ebp+8]
|
||
pop ebp
|
||
ret
|
||
.l5: mov ebp,[ebp+8]
|
||
jmp eoi
|
||
|
||
sos: sub ecx,4 ;a continuacion vienen los datos de la imagen
|
||
call READ
|
||
mov eax,[ebp+fichero]
|
||
call ftell
|
||
mov [ebp+position],edx
|
||
mov esi,edi
|
||
lea edi,[ebp+q_ptr]
|
||
lodsb ;numero de componentes
|
||
sub [ebp+color_c],al
|
||
jnz eoi
|
||
mov dh,al
|
||
.l1: mov ebx,[edi]
|
||
mov eax,[ebx]
|
||
stosd
|
||
lodsw
|
||
mov cl,ah
|
||
and eax,0f00h
|
||
and ecx,0f0h
|
||
shr eax,6
|
||
shr ecx,2
|
||
lea ebx,[ebp+ht_ac_ptrs+eax]
|
||
mov eax,[ebx]
|
||
lea ebx,[ebp+ht_dc_ptrs+ecx]
|
||
mov ecx,[ebx]
|
||
test eax,eax
|
||
jz eoi
|
||
test ecx,ecx
|
||
jz eoi
|
||
stosd
|
||
mov eax,ecx
|
||
stosd
|
||
add edi,4
|
||
dec dh
|
||
jnz .l1
|
||
mov edx,[ebp+mcu_ptr]
|
||
cmp edx,modes
|
||
jne .l2
|
||
lea esi,[ebp+q_ptr]
|
||
lea edi,[ebp+q_ptr+32]
|
||
movsd
|
||
movsd
|
||
movsd
|
||
.l2:
|
||
mov esi,edx
|
||
push dword [esi]
|
||
pop dword [ebp+mcu_ptr]
|
||
push dword [esi+4]
|
||
pop dword[ebp+color_ptr]
|
||
push dword [esi+12]
|
||
pop dword [ebp+y_mcu]
|
||
push dword [esi+8]
|
||
pop dword [ebp+x_mcu]
|
||
mov ecx,64*18
|
||
call malloc
|
||
mov [ebp+matrices],edi
|
||
mov ecx,bufer_size
|
||
call malloc
|
||
mov [ebp+sourcebits],edi
|
||
mov esp,[ebp]
|
||
mov [esp+8],ebp
|
||
popad
|
||
ret
|
||
|
||
jpeg_display:
|
||
test ebp,ebp
|
||
jnz .inicio
|
||
ret
|
||
.inicio:
|
||
pushad
|
||
mov [ebp],esp
|
||
mov eax,[ebp+fichero]
|
||
mov edx,[ebp+position]
|
||
call lseek
|
||
mov edi,[ebp+sourcebits]
|
||
add edi,bufer_size
|
||
mov [ebp+sourcebits_index],edi
|
||
sub edi,2
|
||
mov [ebp+sourcebits_limit],edi
|
||
mov edi,[ebp+matrices]
|
||
mov [ebp+matriz_limit],edi
|
||
xor eax,eax
|
||
mov [esp+8],eax
|
||
mov [ebp+estado],eax
|
||
mov [ebp+tmp_bits],eax
|
||
mov [ebp+dc],eax
|
||
mov [ebp+dc+16],eax
|
||
mov [ebp+dc+32],eax
|
||
|
||
mov eax,[ebp+y_mcu]
|
||
mov ecx,[ebp+y_org]
|
||
sub ecx,eax
|
||
mov [ebp+y_org2],ecx
|
||
mov [ebp+y_mcu2],eax
|
||
push dword [ebp+y_size]
|
||
pop dword [ebp+y_size2]
|
||
.l3: push dword [ebp+x_org]
|
||
pop dword [ebp+x_org2]
|
||
push dword [ebp+x_mcu]
|
||
pop dword [ebp+x_mcu2]
|
||
push dword [ebp+x_size]
|
||
pop dword [ebp+x_size2]
|
||
mov eax,[ebp+y_mcu2]
|
||
add [ebp+y_org2],eax
|
||
sub [ebp+y_size2],eax
|
||
jnc .l4
|
||
add eax,[ebp+y_size2]
|
||
jnz .cont
|
||
mov [esp+8],ebp
|
||
popad
|
||
ret
|
||
.cont:
|
||
mov dword [ebp+y_size2],0
|
||
mov [ebp+y_mcu2],eax
|
||
.l4:
|
||
mov eax,[ebp+x_mcu2]
|
||
sub [ebp+x_size2],eax
|
||
jnc .l5
|
||
add eax,[ebp+x_size2]
|
||
jz .l3
|
||
mov dword [ebp+x_size2],0
|
||
mov [ebp+x_mcu2],eax
|
||
call dword [ebp+mcu_ptr]
|
||
mov eax,[ebp+x_mcu]
|
||
mov ecx,[ebp+x_mcu2]
|
||
mov edx,[ebp+y_mcu2]
|
||
call recortar
|
||
jmp .l6
|
||
.l5:
|
||
call dword [ebp+mcu_ptr]
|
||
mov ecx,[ebp+x_mcu2]
|
||
mov edx,[ebp+y_mcu2]
|
||
.l6:
|
||
mov eax,[ebp+x_org2]
|
||
mov ebx,[ebp+y_org2]
|
||
call dword [ebp+draw_ptr]
|
||
add [ebp+x_org2],ecx
|
||
mov ax,[ebp+estado]
|
||
test al,15
|
||
jz .l4
|
||
cmp ah,8
|
||
jnc .l4
|
||
xor edx,edx
|
||
mov [ebp+tmp_bits],edx
|
||
mov [ebp+dc],edx
|
||
mov [ebp+dc+16],edx
|
||
mov [ebp+dc+32],edx
|
||
add dword [ebp+sourcebits_index],2
|
||
and word [ebp+estado],0c0h
|
||
test al,32
|
||
jz .l4
|
||
jmp .l3
|
||
|
||
color100:
|
||
push edi
|
||
.l1: lodsw
|
||
mov dl,ah
|
||
mov ah,al
|
||
stosw
|
||
mov ah,dl
|
||
stosb
|
||
mov al,dl
|
||
stosb
|
||
stosw
|
||
dec cl
|
||
jnz .l1
|
||
pop edi
|
||
ret
|
||
|
||
color111:
|
||
push edi
|
||
.l1: lodsw
|
||
mov bx,[esi+62]
|
||
mov dx,[esi+126]
|
||
xchg ah,bh
|
||
xchg ah,dl
|
||
xchg ah,bl
|
||
stosw
|
||
mov ax,bx
|
||
stosw
|
||
mov ax,dx
|
||
stosw
|
||
dec cl
|
||
jnz .l1
|
||
pop edi
|
||
mov ecx,64*3
|
||
jmp ybr_bgr
|
||
|
||
color411:
|
||
push ebp
|
||
push edi
|
||
lea ebp,[esi+ecx*8]
|
||
.l1: push ecx
|
||
mov ax,[esi]
|
||
mov cx,[ebp]
|
||
mov dx,[ebp+64]
|
||
add ebp,2
|
||
xchg ch,dl
|
||
mov bx,ax
|
||
mov ah,cl
|
||
mov bl,ch
|
||
mov [edi],ax
|
||
mov [edi+2],bx
|
||
mov [edi+4],cx
|
||
mov ax,[esi+8]
|
||
mov bh,ah
|
||
mov ah,cl
|
||
mov [edi+48],ax
|
||
mov [edi+48+2],bx
|
||
mov [edi+48+4],cx
|
||
mov ax,[esi+2]
|
||
mov bx,ax
|
||
mov ah,dl
|
||
mov bl,dh
|
||
mov [edi+6],ax
|
||
mov [edi+2+6],bx
|
||
mov [edi+4+6],dx
|
||
mov ax,[esi+8+2]
|
||
mov bh,ah
|
||
mov ah,dl
|
||
mov [edi+48+6],ax
|
||
mov [edi+48+2+6],bx
|
||
mov [edi+48+4+6],dx
|
||
pop ecx
|
||
add edi,12
|
||
dec ecx
|
||
add esi,4
|
||
test cl,1
|
||
jnz .l1
|
||
add esi,64-8
|
||
test cl,2
|
||
jnz .l1
|
||
sub esi,128-16
|
||
add edi,48
|
||
test cl,15
|
||
jnz .l1
|
||
add esi,64
|
||
test cl,cl
|
||
jnz .l1
|
||
pop edi
|
||
pop ebp
|
||
mov ecx,64*4*3
|
||
jmp ybr_bgr
|
||
|
||
color211:
|
||
push ebp
|
||
push edi
|
||
lea ebp,[esi+ecx*4]
|
||
.l1: push ecx
|
||
mov ax,[esi]
|
||
mov cx,[ebp]
|
||
mov dx,[ebp+64]
|
||
add ebp,2
|
||
xchg ch,dl
|
||
mov bx,ax
|
||
mov ah,cl
|
||
mov bl,ch
|
||
mov [edi],ax
|
||
mov [edi+2],bx
|
||
mov [edi+4],cx
|
||
mov ax,[esi+2]
|
||
mov bx,ax
|
||
mov ah,dl
|
||
mov bl,dh
|
||
mov [edi+6],ax
|
||
mov [edi+2+6],bx
|
||
mov [edi+4+6],dx
|
||
pop ecx
|
||
add edi,12
|
||
dec cl
|
||
add esi,4
|
||
test cl,1
|
||
jnz .l1
|
||
add esi,64-8
|
||
test cl,2
|
||
jnz .l1
|
||
sub esi,128-8
|
||
test cl,cl
|
||
jnz .l1
|
||
pop edi
|
||
pop ebp
|
||
mov ecx,64*3*2
|
||
jmp ybr_bgr
|
||
|
||
|
||
mcu411: lea ebx,[ebp+q_ptr]
|
||
call hufdecode
|
||
lea ebx,[ebp+q_ptr]
|
||
call hufdecode
|
||
mcu211: lea ebx,[ebp+q_ptr]
|
||
call hufdecode
|
||
mcu111: lea ebx,[ebp+q_ptr]
|
||
call hufdecode
|
||
lea ebx,[ebp+q_ptr+16]
|
||
call hufdecode
|
||
mcu100: lea ebx,[ebp+q_ptr+32]
|
||
call hufdecode
|
||
mov esi,[ebp+matrices]
|
||
mov dword [ebp+matriz_limit],esi
|
||
mov ecx,32
|
||
lea edi,[esi+64*6]
|
||
jmp dword [ebp+color_ptr]
|
||
|
||
cargar_bits: ;edx=bits,cl=nbits,
|
||
;bp=data struct
|
||
;cr: cl,edx,eax,si
|
||
;ncr bx,bp,di,ch
|
||
|
||
mov esi,[ebp+sourcebits_index]
|
||
cmp esi,[ebp+sourcebits_limit]
|
||
jnc .l6
|
||
movzx eax,byte [esi]
|
||
inc esi
|
||
add cl,8
|
||
cmp al,-1
|
||
je .l2
|
||
mov ah,al
|
||
lodsb
|
||
add cl,8
|
||
cmp al,-1
|
||
je .l2
|
||
.l1: ror eax,cl
|
||
or edx,eax
|
||
mov [ebp+sourcebits_index],esi
|
||
ret
|
||
.l2: lodsb
|
||
test al,al
|
||
jnz .l3
|
||
mov al,-1
|
||
call .l1
|
||
cmp cl,16
|
||
jc cargar_bits
|
||
ret
|
||
.l3: sub esi,2
|
||
sub cl,8
|
||
sub al,0d0h
|
||
cmp al,8
|
||
jc .l4
|
||
sub al,9
|
||
mov al,63
|
||
jz .l4
|
||
mov al,127
|
||
.l4: inc al
|
||
or [ebp+estado],al
|
||
movzx eax,ah
|
||
jmp .l1
|
||
.l5: mov [ebp+sourcebits_limit],edi
|
||
mov word [edi],0d9ffh
|
||
popad
|
||
jmp cargar_bits
|
||
.l6: ;read file
|
||
pushad
|
||
mov ecx,bufer_size-2
|
||
mov edx,[ebp+sourcebits_limit]
|
||
mov edi,[ebp+sourcebits]
|
||
mov ax,[edx]
|
||
sub edx,edi
|
||
stosw
|
||
sub esi,edx
|
||
mov [ebp+sourcebits_index],esi
|
||
cmp edx,ecx
|
||
jne .l5
|
||
mov eax,[ebp+fichero]
|
||
call read
|
||
lea ecx,[edi+ecx-2]
|
||
mov [ebp+sourcebits_limit],ecx
|
||
popad
|
||
jmp cargar_bits
|
||
|
||
|
||
hufdecode: ;si->dctable [bp+20]->actable di->outbufer edx->bits cl->bits en edx
|
||
|
||
|
||
;[bp+24]->sourcebits
|
||
;[bp+22]=outbufer+128
|
||
;[bx] q ptr para aa&n
|
||
;[bx+2] a ptr
|
||
;[bx+4] d ptr
|
||
;[bx+8] dc componente
|
||
fninit
|
||
push dword [ebx]
|
||
mov cl,[ebp+nbits]
|
||
mov edx,[ebp+tmp_bits]
|
||
cmp cl,16
|
||
jnc .l1
|
||
call cargar_bits
|
||
.l1: mov eax,[ebx+4]
|
||
mov esi,[ebx+8]
|
||
mov [ebp+actable],eax
|
||
movzx eax,word [esi]
|
||
add esi,2
|
||
.l2: add edx,edx
|
||
jnc .l3
|
||
add esi,eax
|
||
.l3: lodsw
|
||
test ax,ax
|
||
jns .l2
|
||
;codigo encontrado
|
||
and ax,7f0fh
|
||
mov edi,[ebp+matriz_limit] ;arrays
|
||
sub cl,ah
|
||
jns .l4
|
||
fldz
|
||
.error:
|
||
xor ecx,ecx
|
||
or byte [ebp+estado],32
|
||
jmp .l12
|
||
.l4: cmp cl,al
|
||
jnc .l5
|
||
push eax
|
||
call cargar_bits
|
||
pop eax
|
||
.l5: sub cl,al
|
||
mov ch,cl
|
||
mov cl,al
|
||
mov eax,edx
|
||
shl edx,cl
|
||
sar eax,17
|
||
xor ax,8000h
|
||
xor cl,15
|
||
sar ax,cl
|
||
mov cl,ch
|
||
mov ch,2
|
||
add ax,8000h ;incrementar si negativo
|
||
adc ax,8000h
|
||
add [ebx+12],ax
|
||
fild word [ebx+12]
|
||
push ecx
|
||
mov ecx,64
|
||
xor eax,eax
|
||
add [ebp+matriz_limit],ecx
|
||
rep stosd
|
||
pop ecx
|
||
sub edi,64*4
|
||
mov ebx,[esp]
|
||
fmul dword [ebx]
|
||
.l6: cmp cl,16
|
||
jnc .l7
|
||
call cargar_bits
|
||
.l7: mov esi,[ebp+actable]
|
||
movzx eax,word[esi]
|
||
add esi,2
|
||
.l8: add edx,edx
|
||
jnc .l9
|
||
add esi,eax
|
||
.l9: lodsw
|
||
test ax,ax
|
||
jns .l8
|
||
;codigo encontrado
|
||
and ah,127
|
||
xor ebx,ebx
|
||
sub cl,ah
|
||
js .error
|
||
or bl,al
|
||
jz .l12
|
||
and al,0f0h
|
||
shr al,3
|
||
add ch,al
|
||
js .error
|
||
and bl,0fh
|
||
jz .l11
|
||
cmp cl,bl
|
||
jnc .l10
|
||
call cargar_bits
|
||
.l10: sub cl,bl
|
||
xchg bl,cl
|
||
mov eax,edx
|
||
shl edx,cl
|
||
sar eax,17
|
||
xor cl,15
|
||
xor ax,8000h
|
||
sar ax,cl
|
||
add ax,8000h ;incrementar si negativo
|
||
adc ax,8000h
|
||
mov cl,bl
|
||
mov bl,ch
|
||
mov [ebp+tmp_bits],ax
|
||
mov ax,[ebx+zigzag]
|
||
mov ebx,[esp]
|
||
fild word [ebp+tmp_bits]
|
||
or [ebp+idct],ax
|
||
and eax,11111100b
|
||
fmul dword [ebx+eax]
|
||
fstp dword [edi+eax]
|
||
.l11: add ch,2
|
||
jns .l6
|
||
.l12: mov [ebp+nbits],cl
|
||
mov [ebp+tmp_bits],edx
|
||
xor ebx,ebx
|
||
add esp,4
|
||
xchg ebx,[ebp+idct]
|
||
cmp ch,2
|
||
je idctf1
|
||
fstp dword [edi]
|
||
test bh,0feh
|
||
jnz idctf3
|
||
idctf2a: test bh,1
|
||
mov esi,edi
|
||
jz .l1
|
||
test bl,1
|
||
jnz idctf3
|
||
push idctf2b
|
||
jmp idctf3b
|
||
.l1: call idctf3a
|
||
mov cl,4
|
||
call limit
|
||
mov eax,[edi-8]
|
||
mov edx,[edi-4]
|
||
mov cl,7
|
||
.l2: mov [edi],eax
|
||
mov [edi+4],edx
|
||
add edi,8
|
||
dec cl
|
||
jnz .l2
|
||
ret
|
||
|
||
idctf1: fistp word[edi+64]
|
||
mov ax,128
|
||
add ax,[edi+64]
|
||
jz .l2
|
||
test ah,ah
|
||
jz .l1
|
||
mov al,-1
|
||
js .l2
|
||
.l1: mov ah,al
|
||
stosw
|
||
stosw
|
||
mov eax,[edi-4]
|
||
mov ecx,15
|
||
rep stosd
|
||
.l2: ret
|
||
|
||
idctf3: mov bl,8
|
||
mov esi,edi
|
||
.l1: rcr bh,1
|
||
jc .l3
|
||
mov eax,[esi]
|
||
test eax,eax
|
||
jz .l4
|
||
mov cl,7
|
||
.l2: add esi,32
|
||
mov [esi],eax
|
||
dec cl
|
||
jnz .l2
|
||
sub esi,32*7-4
|
||
dec bl
|
||
jnz .l1
|
||
jmp .l5
|
||
.l3: call idctf3b
|
||
.l4: add esi,4
|
||
dec bl
|
||
jnz .l1
|
||
.l5: mov esi,edi
|
||
mov cl,8
|
||
.l6: call idctf3a
|
||
add esi,32
|
||
add edi,16
|
||
dec cl
|
||
jnz .l6
|
||
sub edi,128
|
||
mov esi,edi
|
||
mov cl,32
|
||
limit: mov dx,[esi]
|
||
mov bx,[esi+2]
|
||
add esi,4
|
||
add dx,128
|
||
add bx,128
|
||
test dh,dh
|
||
mov ax,dx
|
||
jz .l1
|
||
mov al,0
|
||
js .l1
|
||
mov al,-1
|
||
.l1: test bh,bh
|
||
mov ah,bl
|
||
jz .l2
|
||
mov ah,0
|
||
js .l2
|
||
mov ah,-1
|
||
.l2: stosw
|
||
dec cl
|
||
jnz limit
|
||
ret
|
||
|
||
idctf2b:
|
||
mov dl,8
|
||
.l1: fld dword[esi]
|
||
add esi,32
|
||
mov ax,128
|
||
fistp word [edi]
|
||
add ax,[edi]
|
||
test ah,ah
|
||
jz .l2
|
||
mov al,0
|
||
js .l2
|
||
mov al,-1
|
||
.l2: mov ah,al
|
||
stosw
|
||
stosw
|
||
stosw
|
||
stosw
|
||
dec dl
|
||
jnz .l1
|
||
ret
|
||
|
||
idctf3a: ;si(d float),di(w int) ncr
|
||
fld dword[esi+1*4] ;f1 ;t21=f1+f7
|
||
fld st0
|
||
fld dword[esi+7*4] ;f7
|
||
fadd st2,st0
|
||
fsubp st1,st0 ;t22=f1-f7
|
||
fld dword[esi+5*4]
|
||
fld st0 ;f5 ;t23=f5+f3
|
||
fld dword[esi+3*4] ;f3
|
||
fadd st2,st0
|
||
fsubp st1,st0 ;t20=f5-f3
|
||
fld st0
|
||
fadd st0,st3 ;t25=(t20+t22)*k2
|
||
fmul dword[k+4] ;k2 ;t25,t20,t23,t22,t21
|
||
fld st4 ;t7=t21+t23
|
||
fadd st0,st3 ;t7,t25,t20,t23,t22,t21
|
||
fld dword[k+12] ;k4 ;t6=k4*t20+t25-t7
|
||
fmulp st3,st0
|
||
fsub st2,st0
|
||
fld st1
|
||
faddp st3,st0 ;t7,t25,t6,t23,t22,t21
|
||
fld st5 ;t5=(t21-t23)*k1-t6
|
||
fsub st0,st4
|
||
fmul dword[k] ;k1
|
||
fsub st0,st3
|
||
fstp st6 ;t7,t25,t6,t23,t22,t5
|
||
fstp st3 ;t25,t6,t7,t22,t5
|
||
fxch st3
|
||
fmul dword[k+8] ;k3 ;t4=k3*t22-t25+t5
|
||
fadd st0,st4 ;t22*k3+t5,t6,t7,t25,t5
|
||
fsubrp st3,st0 ;t6,t7,t4,t5
|
||
fld dword[esi] ;f0 ;t10=f0+f4
|
||
fst st5 ;f0,t4,t5,t6,t7,f0
|
||
fld dword[esi+4*4] ;f4
|
||
fsub st6,st0 ;t11=f0-f4
|
||
faddp st1,st0
|
||
fld st0 ;t10,t10,t6,t7,t4,t5,t11
|
||
fld dword[esi+2*4] ;f2 ;t13=f2+f6
|
||
fadd dword[esi+6*4] ;f6 ;t13,t10,t10,t6,t7,t4,t5,t11
|
||
fadd st2,st0 ;t13,t10,t0,t6,t7,t4,t5,t11 ;t0=t10+t13
|
||
fsubp st1,st0 ;t3,t0,t6,t7,t4,t5,t11 ;t3=t10-t13
|
||
fld st0 ;p3=t3-t4
|
||
fsub st0,st5
|
||
fistp word [edi+3*2] ;p3
|
||
fadd st0,st4 ;p4=t3+t4
|
||
fld dword[esi+2*4] ;f2
|
||
fstp st5
|
||
fistp word [edi+4*2] ;p4 ;t0,t6,t7,f2,t5,t11
|
||
fld st0 ;p0=t0+t7
|
||
fsub st0,st3
|
||
fistp word [edi+7*2] ;p7
|
||
fadd st0,st2 ;p7=t0-t7
|
||
fistp word [edi] ;p0 ;t6,t7,f2,t5,t11
|
||
fld st2 ;f2 ;f2,t6,t7,f2,t5,t11 ;t12=(f2-f6)*k1-t13
|
||
fld dword[esi+6*4] ;f6
|
||
fadd st4,st0 ;f6,f2,t6,t7,t13,t5,t11
|
||
fsubp st1,st0
|
||
fmul dword[k] ;k1
|
||
fsub st0,st3
|
||
fst st3 ;t12,t6,t7,t12,t5,t11
|
||
fadd st0,st5 ;t1=t11+t12
|
||
fst st2 ;t1,t6,t1,t12,t5,t11
|
||
fadd st0,st1 ;p1=t1+t6
|
||
fistp word [edi+2] ;p1 ;t6,t1,t12,t5,t11
|
||
fsubp st1,st0 ;p6=t1-t6
|
||
fistp word [edi+6*2] ;p6 ;t12,t5,t11
|
||
fsubp st2,st0 ;t2=t11-t12 ;t5,t2
|
||
fld st0
|
||
fadd st0,st2 ;p2=t2+t5
|
||
fistp word [edi+2*2] ;p2
|
||
fsubp st1,st0 ;p5=t2-t5 ;t5,t2
|
||
fistp word [edi+5*2]
|
||
ret ;p5
|
||
|
||
|
||
|
||
|
||
idctf3b: ;si ncr
|
||
fld dword[esi+1*32]
|
||
fld st0 ;f1 ;t21=f1+f7
|
||
fld dword[esi+7*32]
|
||
fadd st2,st0 ;f7
|
||
fsubp st1,st0 ;t22=f1-f7
|
||
fld dword[esi+5*32]
|
||
fld st0 ;f5 ;t23=f5+f3
|
||
fld dword[esi+3*32] ;f3
|
||
fadd st2,st0
|
||
fsubp st1,st0
|
||
fld st0 ;t20=f5-f3
|
||
fadd st0,st3 ;t25=(t20+t22)*k2
|
||
fmul dword[k+4] ;k2 ;t25,t20,t23,t22,t21
|
||
fld st4 ;t7=t21+t23
|
||
fadd st0,st3 ;t7,t25,t20,t23,t22,t21
|
||
fld dword[k+12] ;k4 ;t6=k4*t20+t25-t7
|
||
fmulp st3,st0
|
||
fsub st2,st0
|
||
fld st1
|
||
faddp st3,st0 ;t7,t25,t6,t23,t22,t21
|
||
fld st5 ;t5=(t21-t23)*k1-t6
|
||
fsub st0,st4
|
||
fmul dword[k] ;k1
|
||
fsub st0,st3
|
||
fstp st6 ;t7,t25,t6,t23,t22,t5
|
||
fstp st3
|
||
fxch st3 ;t25,t6,t7,t22,t5
|
||
fmul dword[k+8] ;k3 ;t4=k3*t22-t25+t5
|
||
fadd st0,st4 ;t22*k3+t5,t6,t7,t25,t5
|
||
fsubrp st3,st0 ;t6,t7,t4,t5
|
||
fld dword[esi] ;f0 ;t10=f0+f4
|
||
fst st5 ;f0,t4,t5,t6,t7,f0
|
||
fld dword[esi+4*32] ;f4
|
||
fsub st6,st0 ;t11=f0-f4
|
||
faddp st1,st0
|
||
fld st0 ;t10,t10,t6,t7,t4,t5,t11
|
||
fld dword[esi+2*32] ;f2 ;t13=f2+f6
|
||
fadd dword[esi+6*32] ;f6 ;t13,t10,t10,t6,t7,t4,t5,t11
|
||
fadd st2,st0 ;t13,t10,t0,t6,t7,t4,t5,t11 ;t0=t10+t13
|
||
fsubp st1,st0 ;t3,t0,t6,t7,t4,t5,t11 ;t3=t10-t13
|
||
fld st0 ;p3=t3-t4
|
||
fsub st0,st5
|
||
fstp dword[esi+3*32] ;p3
|
||
fadd st0,st4 ;p4=t3+t4
|
||
fld dword[esi+2*32] ;f2
|
||
fstp st5
|
||
fstp dword[esi+4*32] ;p4 ;t0,t6,t7,f2,t5,t11
|
||
fld st0
|
||
fsub st0,st3 ;p0=t0+t7
|
||
fstp dword[esi+7*32] ;p7
|
||
fadd st0,st2 ;p7=t0-t7
|
||
fstp dword[esi] ;p0 ;t6,t7,f2,t5,t11
|
||
fld st2 ;f2 ;f2,t6,t7,f2,t5,t11 ;t12=(f2-f6)*k1-t13
|
||
fld dword[esi+6*32] ;f6
|
||
fadd st4,st0 ;f6,f2,t6,t7,t13,t5,t11
|
||
fsubp st1,st0
|
||
fmul dword[k] ;k1
|
||
fsub st0,st3
|
||
fst st3 ;t12,t6,t7,t12,t5,t11
|
||
fadd st0,st5 ;t1=t11+t12
|
||
fst st2 ;t1,t6,t1,t12,t5,t11
|
||
fadd st0,st1 ;p1=t1+t6
|
||
fstp dword[esi+1*32] ;p1 ;t6,t1,t12,t5,t11
|
||
fsubp st1,st0 ;p6=t1-t6
|
||
fstp dword[esi+6*32] ;p6 ;t12,t5,t11
|
||
fsubp st2,st0
|
||
fld st0 ;t2=t11-t12 ;t5,t2
|
||
fadd st0,st2 ;p2=t2+t5
|
||
fstp dword[esi+2*32] ;p2
|
||
fsubp st1,st0 ;p5=t2-t5 ;t5,t2
|
||
fstp dword[esi+5*32]
|
||
ret ;p5
|
||
|
||
ybr_bgr: ;edi=bmp ecx=n_BYTES
|
||
;retorna edi+=ecx
|
||
pushad
|
||
mov esi,edi
|
||
add edi,ecx
|
||
push edi
|
||
mov edi,[colortabla]
|
||
.l1: lodsw
|
||
movzx ebx,ah
|
||
movzx ebp,al
|
||
movzx eax,al
|
||
movzx ecx,byte[esi]
|
||
lea ebx,[ebx*4+edi+1024]
|
||
lea ecx,[ecx*4+edi]
|
||
add eax,[ebx] ;cb ;solo se usan 16 bits
|
||
mov edx,[ebx+2] ;pero el codigo de 32 bits es mas rapido
|
||
mov ebx,[ecx] ;cr
|
||
add eax,[ecx+2]
|
||
add ebx,ebp ;b
|
||
add edx,ebp ;r
|
||
test ah,ah
|
||
jz .l2
|
||
mov al,0
|
||
js .l2
|
||
mov al,-1
|
||
.l2: test dh,dh
|
||
jz .l3
|
||
mov dl,0
|
||
js .l3
|
||
mov dl,-1
|
||
.l3: test bh,bh
|
||
mov dh,al
|
||
jz .l4
|
||
mov bl,0
|
||
js .l4
|
||
mov bl,-1
|
||
.l4: mov [esi-2],dx
|
||
mov [esi],bl
|
||
inc esi
|
||
cmp esi,[esp]
|
||
jc .l1
|
||
pop edi
|
||
popad
|
||
ret
|
||
|
||
recortar: ;edi=bufer eax=ancho en pixels (ecx,edx)tama<6D>o deseado
|
||
pushad
|
||
dec edx
|
||
jz .l2
|
||
lea ebx,[ecx*3]
|
||
lea eax,[eax*3]
|
||
lea esi,[edi+eax]
|
||
add edi,ebx
|
||
sub eax,ebx
|
||
.l1: mov ecx,ebx
|
||
call movedata
|
||
add esi,eax
|
||
dec edx
|
||
jnz .l1
|
||
.l2: popad
|
||
ret
|
||
|
||
;R = Y + 1.402 *(Cr-128)
|
||
;G = Y - 0.34414*(Cb-128) - 0.71414*(Cr-128)
|
||
;B = Y + 1.772 *(Cb-128)
|
||
|
||
colortabla: dd 0
|
||
|
||
colorprecalc: ;prepara la tabla para convertir ycb a rgb
|
||
mov ecx,1024*2
|
||
call malloc
|
||
mov [colortabla],edi
|
||
fninit
|
||
fld dword [.k+4]
|
||
fld dword [.k]
|
||
mov dl,0
|
||
call .l1
|
||
fld dword [.k+12]
|
||
fld dword[.k+8]
|
||
.l1: mov cx,-128
|
||
.l2: mov [edi],ecx
|
||
inc ecx
|
||
fild word[edi]
|
||
fld st0
|
||
fmul st0,st2
|
||
fistp word[edi]
|
||
fmul st0,st2
|
||
fistp word[edi+2]
|
||
add edi,4
|
||
inc dl
|
||
jnz .l2
|
||
ret
|
||
|
||
.k: dd 1.402,-0.71414,-0.34414,+1.772
|