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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;
  3. ;; grev.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 green channel of an image.
  12. ;;
  13. ;; This source code can be assembled by NASM:
  14. ;;
  15. ;;    nasm -f win32 grev.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:rpGRev.8bf "
  26.  
  27. section    .data
  28. total    dd    0
  29. partial    dd    0
  30. global    filter.name
  31. filter.name    db    "Bit-Reverse Green", 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.     lodsb
  154.     stosb
  155.  
  156.     push    ecx
  157.     lodsb
  158.     mov    ah, al
  159.     mov    ecx, 8
  160.  
  161. .greenloop:
  162.     shl    al, 1
  163.     shr    ah, 1
  164.     adc    al, 0
  165.     loop    .greenloop
  166.  
  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.