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

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