Subversion Repositories Kolibri OS

Rev

Rev 109 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

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