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

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