home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 June / Chip_2002-06_cd1.bin / tema / grafika_plugin / install / FlipsRolls / fliproll.exe / Main / rrev.asm < prev    next >
Encoding:
Assembly Source File  |  2002-05-06  |  4.6 KB  |  266 lines

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;
  3. ;; rrev.asm
  4. ;;
  5. ;; Copyright 1999 G. Adam Stanislav
  6. ;; All rights reserved
  7. ;;
  8. ;; Started: 19-Nov-1999
  9. ;; Updated: 19-Nov-1999
  10. ;;
  11. ;; This is a Photoshop plugin which reverses the bits of the red channel of an image.
  12. ;;
  13. ;; This source code can be assembled by NASM:
  14. ;;
  15. ;;    nasm -f win32 rrev.asm
  16. ;;
  17. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  18.  
  19. %include    'filter.inc'
  20.  
  21. global    filter.parameters, filter.prepare, filter.start
  22. global    filter.continue, filter.finish
  23.  
  24. section    .drectve    info
  25. db    "-out:rpRRev.8bf "
  26.  
  27. section    .data
  28. total    dd    0
  29. partial    dd    0
  30. global    filter.name
  31. filter.name    db    "Bit-Reverse Red", 0
  32.  
  33. section    .text align=4
  34.  
  35.     ; These procedures receive four parameters:
  36.     ;
  37.     ;    [esp+ 4] = selector (word) = EAX
  38.     ;    [esp+ 8] = address of filterParamBlock
  39.     ;    [esp+12] = address of data
  40.     ;    [esp+16] = address of result word, contains 0 (success)
  41.  
  42. align 4
  43. error.return:
  44.     mov    ecx, [esp+16]
  45.     mov    word [ecx], filterBadParameters
  46.     ret
  47.  
  48. align 4
  49. filter.start:
  50.     ; Get the pointer to the parameter block
  51.     mov    ecx, [esp+8]
  52.  
  53.     ; Quit if NULL.
  54.     jecxz    error.return
  55.  
  56.     ; Tell the host to give us r,g,b planes
  57.     mov    eax, 2 << 16
  58.     mov    [ecx+inLoPlane], eax
  59.     mov    [ecx+outLoPlane], eax
  60.  
  61.     ; Calculate the total number of pixels
  62.     movzx    eax, word [ecx+filterRect+right]
  63.     sub    ax, [ecx+filterRect+left]
  64.     movzx    edx, word [ecx+filterRect+bottom]
  65.     sub    dx, [ecx+filterRect+top]
  66.     mul    edx
  67.     mov    [total], eax
  68.     sub    edx, edx
  69.     mov    [partial], edx
  70.  
  71.     ; Ask the host for a NUMCOLSxNUMROWS input and output data. Less if the
  72.     ; image is small.
  73.     movzx    eax, word [ecx+filterRect+right]
  74.     movzx    edx, word [ecx+filterRect+left]
  75.     sub    ax, dx
  76.  
  77.     cmp    ax, NUMCOLS
  78.     jb    .X
  79.     mov    ax, NUMCOLS-1
  80.  
  81. .X:
  82.     mov    [ecx+inRect+left], dx
  83.     mov    [ecx+outRect+left], dx
  84.     add    ax, dx
  85.     mov    [ecx+inRect+right], ax
  86.     mov    [ecx+outRect+right], ax
  87.  
  88.     mov    ax, [ecx+filterRect+bottom]
  89.     mov    dx, [ecx+filterRect+top]
  90.     sub    ax, dx
  91.  
  92.     cmp    ax, NUMROWS
  93.     jb    .Y
  94.     mov    ax, NUMROWS-1
  95.  
  96. .Y:
  97.     mov    [ecx+inRect+top], dx
  98.     mov    [ecx+outRect+top], dx
  99.     add    ax, dx
  100.     mov    [ecx+inRect+bottom], ax
  101.     mov    [ecx+outRect+bottom], ax
  102.  
  103.     ret
  104.  
  105. align 4
  106. filter.continue:
  107.  
  108.     mov    ecx, [esp+8]
  109.     or    ecx, ecx
  110.     je    near error.return
  111.  
  112.     ; Calculate how far we are
  113.     movzx    eax, word [ecx+inRect+right]
  114.     sub    ax, [ecx+inRect+left]
  115.     movzx    edx, word [ecx+inRect+bottom]
  116.     sub    dx, [ecx+inRect+top]
  117.     mul    edx
  118.     add    [partial], eax
  119.  
  120.     push    ecx
  121.     push    dword [total]
  122.     push    dword [partial]
  123.     call    [ecx+progressProc]
  124.     add    esp, 8
  125.     pop    edx
  126.  
  127.     push    esi
  128.     push    edi
  129.  
  130.     mov    esi, [edx+inData]
  131.     mov    edi, [edx+outData]
  132.  
  133.     movzx    ecx, word [edx+inRect+bottom]
  134.     sub    cx, [edx+inRect+top]
  135.  
  136.     sub    eax, eax
  137.     cld
  138.  
  139.     ; ECX = number of rows
  140.  
  141. .bigloop:
  142.     push    ecx
  143.  
  144.     mov    cx, word [edx+inRect+right]
  145.     sub    cx, [edx+inRect+left]
  146.  
  147.     ; ECX = number of columns
  148.  
  149.     push    esi
  150.     push    edi
  151.  
  152. .filterloop:
  153.     push    ecx
  154.     lodsb
  155.     mov    ah, al
  156.     mov    ecx, 8
  157.  
  158. .redloop:
  159.     shl    al, 1
  160.     shr    ah, 1
  161.     adc    al, 0
  162.     loop    .redloop
  163.  
  164.     stosb
  165.  
  166.     lodsb
  167.     stosb
  168.  
  169.     lodsb
  170.     stosb
  171.  
  172.     pop    ecx
  173.     loop    .filterloop
  174.  
  175.     pop    edi
  176.     pop    esi
  177.  
  178.     add    esi, [edx+inRowBytes]
  179.     add    edi, [edx+outRowBytes]
  180.     pop    ecx
  181.     loop    .bigloop
  182.  
  183.     pop    edi
  184.     pop    esi
  185.  
  186.     mov    ecx, edx
  187.  
  188.     ; See if there are more columns to process within these rows.
  189.     movzx    eax, word [ecx+inRect+right]
  190.     cmp    ax, [ecx+filterRect+right]
  191.     jae    .rows
  192.  
  193. .left:
  194.     mov    [ecx+inRect+left], ax
  195.     mov    [ecx+outRect+left], ax
  196.     add    ax, NUMCOLS-1
  197.     cmp    ax, [ecx+filterRect+right]
  198.     jbe    .right
  199.     mov    ax, [ecx+filterRect+right]
  200.  
  201. .right:
  202.     mov    [ecx+inRect+right], ax
  203.     mov    [ecx+outRect+right], ax
  204.  
  205.     ret
  206.  
  207. .rows:
  208.     ; See if there are any unprocessed rows
  209.     movzx    eax, word [ecx+inRect+bottom]
  210.     cmp    ax, [ecx+filterRect+bottom]
  211.     jae    filter.cleanup    ; all done
  212.     mov    [ecx+inRect+top], ax
  213.     mov    [ecx+outRect+top], ax
  214.     add    ax, NUMROWS-1
  215.     cmp    ax, [ecx+filterRect+bottom]
  216.     jbe    .bottom
  217.     mov    ax, [ecx+filterRect+bottom]
  218.  
  219. .bottom:
  220.     mov    [ecx+inRect+bottom], ax
  221.     mov    [ecx+outRect+bottom], ax
  222.  
  223.     movzx    eax, word [ecx+filterRect+left]
  224.     jmp    .left
  225.  
  226.  
  227. align 4
  228. filter.cleanup:
  229.     sub    eax, eax
  230.     mov    [ecx+inRect], eax
  231.     mov    [ecx+inRect+4], eax
  232.     mov    [ecx+outRect], eax
  233.     mov    [ecx+outRect+4], eax
  234.     mov    [ecx+inLoPlane], eax
  235.     mov    [ecx+outLoPlane], eax
  236.  
  237. .done:
  238.     ret
  239.  
  240. align 4
  241. filter.prepare:
  242.     mov    ecx, [esp+8]
  243.     or    ecx, ecx
  244.     jz    near error.return
  245.  
  246.     mov    eax, NUMROWS*NUMCOLS*4
  247.     cmp    eax, [ecx+maxSpace]
  248.     ja    near error.return
  249.     mov    [ecx+maxSpace], eax
  250.     sub    eax, eax
  251.     mov    [ecx+bufferSpace], eax
  252.  
  253.     ; FALL THROUGH
  254.  
  255. filter.finish:
  256.     ; Nothing to finish. Just return.
  257.  
  258.     ; FALL THROUGH
  259.  
  260. filter.parameters:
  261.     ; No parameters required. Just return.
  262.  
  263.     ret
  264.  
  265. align 4
  266.