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

  1. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;
  3. ;; rbflop.asm
  4. ;;
  5. ;; Copyright 1999 G. Adam Stanislav
  6. ;; All rights reserved
  7. ;;
  8. ;; Started: 18-Nov-1999
  9. ;; Updated: 18-Nov-1999
  10. ;;
  11. ;; This is a Photoshop plugin which flops the red and blue channels of an image.
  12. ;;
  13. ;; This source code can be assembled by NASM:
  14. ;;
  15. ;;    nasm -f win32 rbflop.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:rpRBFlop.8bf "
  26.  
  27. section    .data
  28. total    dd    0
  29. partial    dd    0
  30. global    filter.name
  31. filter.name    db    "Flop Red and Blue", 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.     ; To produce a negative, we do not negate the channel.
  153.     ; We invert it.
  154. .filterloop:
  155.     lodsb
  156.     not    al
  157.     stosb
  158.  
  159.     lodsb
  160.     stosb
  161.     
  162.     lodsb
  163.     not    al
  164.     stosb
  165.  
  166.     loop    .filterloop
  167.  
  168.     pop    edi
  169.     pop    esi
  170.  
  171.     add    esi, [edx+inRowBytes]
  172.     add    edi, [edx+outRowBytes]
  173.     pop    ecx
  174.     loop    .bigloop
  175.  
  176.     pop    edi
  177.     pop    esi
  178.  
  179.     mov    ecx, edx
  180.  
  181.     ; See if there are more columns to process within these rows.
  182.     movzx    eax, word [ecx+inRect+right]
  183.     cmp    ax, [ecx+filterRect+right]
  184.     jae    .rows
  185.  
  186. .left:
  187.     mov    [ecx+inRect+left], ax
  188.     mov    [ecx+outRect+left], ax
  189.     add    ax, NUMCOLS-1
  190.     cmp    ax, [ecx+filterRect+right]
  191.     jbe    .right
  192.     mov    ax, [ecx+filterRect+right]
  193.  
  194. .right:
  195.     mov    [ecx+inRect+right], ax
  196.     mov    [ecx+outRect+right], ax
  197.  
  198.     ret
  199.  
  200. .rows:
  201.     ; See if there are any unprocessed rows
  202.     movzx    eax, word [ecx+inRect+bottom]
  203.     cmp    ax, [ecx+filterRect+bottom]
  204.     jae    filter.cleanup    ; all done
  205.     mov    [ecx+inRect+top], ax
  206.     mov    [ecx+outRect+top], ax
  207.     add    ax, NUMROWS-1
  208.     cmp    ax, [ecx+filterRect+bottom]
  209.     jbe    .bottom
  210.     mov    ax, [ecx+filterRect+bottom]
  211.  
  212. .bottom:
  213.     mov    [ecx+inRect+bottom], ax
  214.     mov    [ecx+outRect+bottom], ax
  215.  
  216.     movzx    eax, word [ecx+filterRect+left]
  217.     jmp    .left
  218.  
  219.  
  220. align 4
  221. filter.cleanup:
  222.     sub    eax, eax
  223.     mov    [ecx+inRect], eax
  224.     mov    [ecx+inRect+4], eax
  225.     mov    [ecx+outRect], eax
  226.     mov    [ecx+outRect+4], eax
  227.     mov    [ecx+inLoPlane], eax
  228.     mov    [ecx+outLoPlane], eax
  229.  
  230. .done:
  231.     ret
  232.  
  233. align 4
  234. filter.prepare:
  235.     mov    ecx, [esp+8]
  236.     or    ecx, ecx
  237.     jz    near error.return
  238.  
  239.     mov    eax, NUMROWS*NUMCOLS*4
  240.     cmp    eax, [ecx+maxSpace]
  241.     ja    near error.return
  242.     mov    [ecx+maxSpace], eax
  243.     sub    eax, eax
  244.     mov    [ecx+bufferSpace], eax
  245.  
  246.     ; FALL THROUGH
  247.  
  248. filter.finish:
  249.     ; Nothing to finish. Just return.
  250.  
  251.     ; FALL THROUGH
  252.  
  253. filter.parameters:
  254.     ; No parameters required. Just return.
  255.  
  256.     ret
  257.  
  258. align 4
  259.