Subversion Repositories Kolibri OS

Rev

Rev 2733 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. ;;================================================================================================;;
  2. ;;//// blend_mmx.asm //// (c) dunkaist, 2011-2012 ////////////////////////////////////////////////;;
  3. ;;================================================================================================;;
  4. ;;                                                                                                ;;
  5. ;; This file is part of Common development libraries (Libs-Dev).                                  ;;
  6. ;;                                                                                                ;;
  7. ;; Libs-Dev is free software: you can redistribute it and/or modify it under the terms of the GNU ;;
  8. ;; Lesser General Public License as published by the Free Software Foundation, either version 2.1 ;;
  9. ;; of the License, or (at your option) any later version.                                         ;;
  10. ;;                                                                                                ;;
  11. ;; Libs-Dev is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without  ;;
  12. ;; even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU  ;;
  13. ;; Lesser General Public License for more details.                                                ;;
  14. ;;                                                                                                ;;
  15. ;; You should have received a copy of the GNU Lesser General Public License along with Libs-Dev.  ;;
  16. ;; If not, see <http://www.gnu.org/licenses/>.                                                    ;;
  17. ;;                                                                                                ;;
  18. ;;================================================================================================;;
  19.  
  20. proc    xcf._.blend_rgb
  21.  
  22.         xchg            al, bh
  23.         mov             ah, bh
  24.         neg             ax
  25.         add             ax, 0xffff
  26.         mul             ah
  27.         neg             ah
  28.         add             ah, 0xff
  29.         xchg            ah, bh
  30.  
  31.         mov             al, 0xff
  32.         cmp             ah, bh
  33.         je              @f
  34.         not             al
  35.         div             bh
  36.     @@:
  37.  
  38.         mov             ah, al
  39.  
  40.         movd            mm1, eax
  41.         punpcklbw       mm1, mm1
  42.         punpcklbw       mm1, mm0
  43.  
  44.         movq            mm7, mm1
  45.         psrlw           mm7, 7
  46.         paddw           mm1, mm7
  47.  
  48.         psubw           mm3, mm2
  49.         pmullw          mm3, mm1
  50.         psllw           mm2, 8
  51.         paddw           mm3, mm2
  52.         pinsrw          mm3, ebx, 3
  53.         psrlw           mm3, 8
  54.         packuswb        mm3, mm0
  55.         movd            eax, mm3
  56.  
  57.         ret
  58. endp
  59.  
  60.  
  61. proc    xcf._.blend_gray
  62.  
  63.         xchg            al, bh
  64.         mov             ah, bh
  65.         neg             ax
  66.         add             ax, 0xffff
  67.         mul             ah
  68.         neg             ah
  69.         add             ah, 0xff
  70.         xchg            ah, bh
  71.  
  72.         mov             al, 0xff
  73.         cmp             ah, bh
  74.         je              @f
  75.         not             al
  76.         div             bh
  77.     @@:
  78.  
  79.         mov             ah, al
  80.  
  81.         movd            mm1, eax
  82.         punpcklbw       mm1, mm1
  83.         punpcklbw       mm1, mm0
  84.  
  85.         movq            mm7, mm1
  86.         psrlw           mm7, 7
  87.         paddw           mm1, mm7
  88.  
  89.         psubw           mm3, mm2
  90.         pmullw          mm3, mm1
  91.         psllw           mm2, 8
  92.         paddw           mm3, mm2
  93.         pinsrw          mm3, ebx, 1
  94.         psrlw           mm3, 8
  95.         packuswb        mm3, mm0
  96.         movd            eax, mm3
  97.  
  98.         ret
  99. endp
  100.  
  101.  
  102. proc    xcf._.merge_32 _copy_width, _copy_height, _img_total_bpl, _bottom_total_bpl
  103.   .rgb_line:
  104.         mov             ecx, [_copy_width]
  105.   .rgb_pixel:
  106.         mov             ebx, [edi]
  107.         lodsd
  108.  
  109.         movd            mm2, ebx
  110.         movd            mm3, eax
  111.         shr             eax, 24
  112.         shr             ebx, 16
  113.         cmp             al, bh
  114.         jna             @f
  115.         mov             al, bh
  116.     @@:
  117.         pxor            mm0, mm0
  118.         call            edx
  119.         call            xcf._.blend_rgb
  120.         stosd
  121.         dec             ecx
  122.         jnz             .rgb_pixel
  123.         add             esi, [_img_total_bpl]
  124.         add             edi, [_bottom_total_bpl]
  125.         dec             [_copy_height]
  126.         jnz             .rgb_line
  127.         emms
  128.         ret
  129. endp
  130.  
  131.  
  132. proc    xcf._.merge_8a _copy_width, _copy_height, _img_total_bpl, _bottom_total_bpl
  133.   .gray_line:
  134.         mov             ecx, [_copy_width]
  135.   .gray_pixel:
  136.         mov             bx,  word[edi]
  137.         lodsw
  138.         movd            mm2, ebx
  139.         movd            mm3, eax
  140.         shr             eax, 8
  141.         cmp             al, bh
  142.         jna             @f
  143.         mov             al, bh
  144.     @@:
  145.         pxor            mm0, mm0
  146.         call            edx
  147.         call            xcf._.blend_gray
  148.         stosw
  149.         dec             ecx
  150.         jnz             .gray_pixel
  151.         add             esi, [_img_total_bpl]
  152.         add             edi, [_bottom_total_bpl]
  153.         dec             [_copy_height]
  154.         jnz             .gray_line
  155.         emms
  156.         ret
  157. endp
  158.  
  159.  
  160. proc    xcf._.composite_rgb_00 _copy_width, _copy_height, _bottom_total_bpl, _img_total_bpl
  161.  
  162.   .line:
  163.         mov             ecx, [_copy_width]
  164.   .pixel:
  165.         mov             ebx, [edi]
  166.         lodsd
  167.         movd            mm2, ebx
  168.         movd            mm3, eax
  169.  
  170.         shr             eax, 24
  171.         shr             ebx, 16
  172.  
  173.         xchg            al, bh
  174.         mov             ah, bh
  175.         neg             ax
  176.         add             ax, 0xffff
  177.         mul             ah
  178.         neg             ah
  179.         add             ah, 0xff
  180.         xchg            ah, bh
  181.  
  182.         mov             al, 0xff
  183.         cmp             ah, bh
  184.         je              @f
  185.         not             al
  186.         div             bh
  187.     @@:
  188.  
  189.         mov             ah, al
  190.  
  191.         movd            mm1, eax
  192.         pxor            mm0, mm0
  193.         punpcklbw       mm1, mm1
  194.         punpcklbw       mm1, mm0
  195.         punpcklbw       mm2, mm0
  196.         punpcklbw       mm3, mm0
  197.  
  198.         psubsw          mm3, mm2
  199.         pmullw          mm3, mm1
  200.         psllw           mm2, 8
  201.         paddw           mm3, mm2
  202.         pinsrw          mm3, ebx, 3
  203.         psrlw           mm3, 8
  204.         packuswb        mm3, mm0
  205.         movd            eax, mm3
  206.         stosd
  207.  
  208.         dec             ecx
  209.         jnz             .pixel
  210.         add             esi, [_img_total_bpl]
  211.         add             edi, [_bottom_total_bpl]
  212.         dec             [_copy_height]
  213.         jnz             .line
  214.  
  215.         ret
  216. endp
  217.  
  218.  
  219. proc    xcf._.composite_gray_00 _copy_width, _copy_height, _bottom_total_bpl, _img_total_bpl
  220.  
  221.   .line:
  222.         mov             ecx, [_copy_width]
  223.   .pixel:
  224.         mov             bx, [edi]
  225.         lodsw
  226.         movd            mm2, ebx
  227.         movd            mm3, eax
  228.  
  229.         shr             eax, 8
  230.  
  231.         xchg            al, bh
  232.         mov             ah, bh
  233.         neg             ax
  234.         add             ax, 0xffff
  235.         mul             ah
  236.         neg             ah
  237.         add             ah, 0xff
  238.         xchg            ah, bh
  239.  
  240.         mov             al, 0xff
  241.         cmp             ah, bh
  242.         je              @f
  243.         not             al
  244.         div             bh
  245.     @@:
  246.  
  247.         mov             ah, al
  248.  
  249.         movd            mm1, eax
  250.         pxor            mm0, mm0
  251.         punpcklbw       mm1, mm1
  252.         punpcklbw       mm1, mm0
  253.         punpcklbw       mm2, mm0
  254.         punpcklbw       mm3, mm0
  255.  
  256.         psubw           mm3, mm2
  257.         pmullw          mm3, mm1
  258.         psllw           mm2, 8
  259.         paddw           mm3, mm2
  260.         pinsrw          mm3, ebx, 1
  261.         psrlw           mm3, 8
  262.         packuswb        mm3, mm0
  263.         movd            eax, mm3
  264.         stosw
  265.  
  266.         dec             ecx
  267.         jnz             .pixel
  268.         add             esi, [_img_total_bpl]
  269.         add             edi, [_bottom_total_bpl]
  270.         dec             [_copy_height]
  271.         jnz             .line
  272.  
  273.         ret
  274. endp
  275.  
  276.  
  277. proc    xcf._.composite_indexed_00 _copy_width, _copy_height, _bottom_total_bpl, _img_total_bpl
  278.  
  279.   .line:
  280.         mov             ecx, [_copy_width]
  281.   .pixel:
  282.         mov             bx, [edi]
  283.         lodsw
  284.  
  285.         or              ah, 0x7f
  286.         test            ah, 0x80
  287.         jnz             @f
  288.         mov             ax, bx
  289.     @@:
  290.         stosw
  291.  
  292.         dec             ecx
  293.         jnz             .pixel
  294.         add             esi, [_img_total_bpl]
  295.         add             edi, [_bottom_total_bpl]
  296.         dec             [_copy_height]
  297.         jnz             .line
  298.         ret
  299. endp
  300.  
  301.  
  302. proc    xcf._.composite_rgb_01 _copy_width, _copy_height, _bottom_total_bpl, _img_total_bpl
  303.         pushad
  304.  
  305.         pxor            mm4, mm4
  306.         movd            mm4, [xcf._.random_b]
  307.         movd            mm1, [xcf._.random_a]
  308.         movd            mm2, [xcf._.random_c]
  309.  
  310.   .line:
  311.         mov             ecx, [_copy_width]
  312.   .pixel:
  313.         mov             ebx, [edi]
  314.         lodsd
  315.  
  316.         movq            mm0, mm4
  317.         pmuludq         mm0, mm1
  318.         paddq           mm0, mm2
  319.         movd            edx, mm0
  320.         movd            mm4, edx
  321.         pxor            mm0, mm0
  322.  
  323.         rol             eax, 8
  324.         test            al, al
  325.         jz              @f
  326.         shr             edx, 17
  327.         cmp             dl, al
  328.         ja              @f
  329.         ror             eax, 8
  330.         or              eax, 0xff000000
  331.         jmp             .done
  332.     @@:
  333.         mov             eax, ebx
  334.   .done:
  335.         stosd
  336.         dec             ecx
  337.         jnz             .pixel
  338.         add             esi, [_img_total_bpl]
  339.         add             edi, [_bottom_total_bpl]
  340.         dec             [_copy_height]
  341.         jnz             .line
  342.  
  343.   .quit:
  344.         popad
  345.         ret
  346. endp
  347.  
  348.  
  349. proc    xcf._.composite_gray_01 _copy_width, _copy_height, _bottom_total_bpl, _img_total_bpl
  350.         pushad
  351.  
  352.         pxor            mm4, mm4
  353.         movd            mm4, [xcf._.random_b]
  354.         movd            mm1, [xcf._.random_a]
  355.         movd            mm2, [xcf._.random_c]
  356.  
  357.   .line:
  358.         mov             ecx, [_copy_width]
  359.   .pixel:
  360.         mov             ebx, [edi]
  361.         lodsw
  362.  
  363.         movq            mm0, mm4
  364.         pmuludq         mm0, mm1
  365.         paddq           mm0, mm2
  366.         movd            edx, mm0
  367.         movd            mm4, edx
  368.         pxor            mm0, mm0
  369.  
  370.         test            ah, ah
  371.         jz              @f
  372.         shr             edx, 17
  373.         cmp             dl, ah
  374.         ja              @f
  375.         or              ax, 0xff00
  376.         jmp             .done
  377.     @@:
  378.         mov             eax, ebx
  379.   .done:
  380.         stosw
  381.         dec             ecx
  382.         jnz             .pixel
  383.         add             esi, [_img_total_bpl]
  384.         add             edi, [_bottom_total_bpl]
  385.         dec             [_copy_height]
  386.         jnz             .line
  387.  
  388.   .quit:
  389.         popad
  390.         ret
  391. endp
  392.  
  393.  
  394. proc    xcf._.composite_rgb_03                  ; Multiply
  395.  
  396.         punpcklbw       mm2, mm0
  397.         punpcklbw       mm3, mm0
  398.         pmullw          mm3, mm2
  399.         psrlw           mm3, 8
  400.  
  401.         ret
  402. endp
  403.  
  404.  
  405. proc    xcf._.composite_rgb_04                  ; Screen
  406.  
  407.         punpcklbw       mm2, mm0
  408.         punpcklbw       mm3, mm0
  409.         movq            mm4, [xcf._.mmx_00ff]
  410.         movq            mm5, mm4
  411.         psubw           mm5, mm3
  412.         movq            mm3, mm4
  413.         psubw           mm4, mm2
  414.         pmullw          mm4, mm5
  415.         psrlw           mm4, 8
  416.         psubw           mm3, mm4
  417.  
  418.         ret
  419. endp
  420.  
  421.  
  422. proc    xcf._.composite_rgb_05                  ; Overlay
  423.  
  424.         punpcklbw       mm2, mm0
  425.         punpcklbw       mm3, mm0
  426.         movq            mm4, [xcf._.mmx_00ff]
  427.         psubw           mm4, mm2
  428.         pmullw          mm3, mm4
  429.         psrlw           mm3, 7
  430.         paddw           mm3, mm2
  431.         pmullw          mm3, mm2
  432.         psrlw           mm3, 8
  433.  
  434.         ret
  435. endp
  436.  
  437.  
  438. proc    xcf._.composite_rgb_06                  ; Difference
  439.  
  440.         movq            mm4, mm3
  441.         pminub          mm4, mm2
  442.         pmaxub          mm3, mm2
  443.         psubusb         mm3, mm4
  444.         punpcklbw       mm2, mm0
  445.         punpcklbw       mm3, mm0
  446.  
  447.         ret
  448. endp
  449.  
  450.  
  451. proc    xcf._.composite_rgb_07                  ; Addition
  452.  
  453.         paddusb         mm3, mm2
  454.         punpcklbw       mm2, mm0
  455.         punpcklbw       mm3, mm0
  456.  
  457.         ret
  458. endp
  459.  
  460.  
  461. proc    xcf._.composite_rgb_08                  ; Subtract
  462.  
  463.         movq            mm4, mm2
  464.         psubusb         mm4, mm3
  465.         movq            mm3, mm4
  466.         punpcklbw       mm2, mm0
  467.         punpcklbw       mm3, mm0
  468.  
  469.         ret
  470. endp
  471.  
  472.  
  473. proc    xcf._.composite_rgb_09                  ; Darken Only
  474.  
  475.         pminub          mm3, mm2
  476.         punpcklbw       mm2, mm0
  477.         punpcklbw       mm3, mm0
  478.  
  479.         ret
  480. endp
  481.  
  482.  
  483. proc    xcf._.composite_rgb_10                  ; Lighten Only
  484.  
  485.         pmaxub          mm3, mm2
  486.         punpcklbw       mm2, mm0
  487.         punpcklbw       mm3, mm0
  488.  
  489.         ret
  490. endp
  491.  
  492.  
  493. proc    xcf._.composite_rgb_11                  ; Hue (H of HSV)
  494.         push            eax ebx ecx edx
  495.  
  496.         movd            eax, mm3
  497.         movd            ebx, mm2
  498.  
  499.         call            xcf._.rgb2hsv
  500.         xchg            eax, ebx
  501.         call            xcf._.rgb2hsv
  502.         xchg            eax, ebx
  503.  
  504.         test            ah, ah
  505.         jnz             @f
  506.         ror             eax, 8
  507.         ror             ebx, 8
  508.         mov             ah, bh
  509.         rol             eax, 8
  510.         rol             ebx, 8
  511.     @@:
  512.         mov             ax, bx
  513.  
  514.         call            xcf._.hsv2rgb
  515.  
  516.         movd            mm3, eax
  517.  
  518.         punpcklbw       mm2, mm0
  519.         punpcklbw       mm3, mm0
  520.  
  521.   .quit:
  522.         pop             edx ecx ebx eax
  523.         ret
  524. endp
  525.  
  526.  
  527. proc    xcf._.composite_rgb_12                  ; Saturation (S of HSV)
  528.         push            eax ebx ecx edx
  529.  
  530.         movd            eax, mm3
  531.         movd            ebx, mm2
  532.  
  533.         call            xcf._.rgb2hsv
  534.         xchg            eax, ebx
  535.         call            xcf._.rgb2hsv
  536.         xchg            eax, ebx
  537.  
  538.         ror             eax, 8
  539.         ror             ebx, 8
  540.         mov             ah, bh
  541.         rol             eax, 8
  542.         rol             ebx, 8
  543.         mov             al, bl
  544.  
  545.         call            xcf._.hsv2rgb
  546.  
  547.  
  548.         movd            mm3, eax
  549.  
  550.         punpcklbw       mm2, mm0
  551.         punpcklbw       mm3, mm0
  552.  
  553.   .quit:
  554.         pop             edx ecx ebx eax
  555.         ret
  556. endp
  557.  
  558.  
  559. proc    xcf._.composite_rgb_13                  ; Color (H and S of HSL)
  560.         push            eax ebx ecx edx
  561.  
  562.         movd            eax, mm3
  563.         movd            ebx, mm2
  564.  
  565.         call            xcf._.rgb2hsl
  566.         xchg            eax,    ebx
  567.         call            xcf._.rgb2hsl
  568.         xchg            eax,    ebx
  569.  
  570.         mov             al, bl
  571.  
  572.         call            xcf._.hsl2rgb
  573.  
  574.  
  575.         movd            mm3, eax
  576.  
  577.         punpcklbw       mm2, mm0
  578.         punpcklbw       mm3, mm0
  579.  
  580.   .quit:
  581.         pop             edx ecx ebx eax
  582.         ret
  583. endp
  584.  
  585.  
  586. proc    xcf._.composite_rgb_14                  ; Value (V of HSV)
  587.         push            eax ebx ecx edx
  588.  
  589.         movd            eax, mm3
  590.         movd            ebx, mm2
  591.  
  592.         call            xcf._.rgb2hsv
  593.         xchg            eax, ebx
  594.         call            xcf._.rgb2hsv
  595.         xchg            eax, ebx
  596.  
  597.         ror             eax, 8
  598.         ror             ebx, 8
  599.         mov             ax, bx
  600.         rol             eax, 8
  601.         rol             ebx, 8
  602.  
  603.         call            xcf._.hsv2rgb
  604.  
  605.  
  606.         movd            mm3, eax
  607.  
  608.         punpcklbw       mm2, mm0
  609.         punpcklbw       mm3, mm0
  610.  
  611.   .quit:
  612.         pop             edx ecx ebx eax
  613.         ret
  614. endp
  615.  
  616.  
  617. proc    xcf._.composite_rgb_15                  ; Divide
  618.         push            eax ebx ecx
  619.  
  620.         movd            eax, mm3
  621.         movd            ebx, mm2
  622.  
  623.         rol             eax, 8
  624.         rol             ebx, 8
  625.  
  626.         xchg            eax, ebx
  627.  
  628.         mov             ecx, 3
  629.  
  630.   .color:
  631.         rol             eax, 8
  632.         rol             ebx, 8
  633.         shl             ax, 8
  634.         test            bl, bl
  635.         jz              .clamp1
  636.         cmp             ah, bl
  637.         jae             .clamp2
  638.         div             bl
  639.         jmp             .done
  640.   .clamp1:
  641.         mov             al, 0xff
  642.         test            ah, ah
  643.         jnz             @f
  644.         not             al
  645.     @@:
  646.         jmp             .done
  647.   .clamp2:
  648.         mov             al, 0xff
  649.         jmp             .done
  650.   .done:
  651.         mov             ah, al
  652.         loop            .color
  653.  
  654.         ror             eax, 8
  655.         movd            mm3, eax
  656.  
  657.         punpcklbw       mm2, mm0
  658.         punpcklbw       mm3, mm0
  659.  
  660.         pop             ecx ebx eax
  661.         ret
  662. endp
  663.  
  664.  
  665. proc    xcf._.composite_rgb_16                  ; Dodge
  666.         push            eax ebx ecx
  667.  
  668.         movd            eax, mm3
  669.         movd            ebx, mm2
  670.  
  671.         rol             eax, 8
  672.         rol             ebx, 8
  673.  
  674.         xchg            eax, ebx
  675.  
  676.         mov             ecx, 3
  677.  
  678.   .color:
  679.         rol             eax, 8
  680.         rol             ebx, 8
  681.         shl             ax, 8
  682.         neg             bl
  683.         add             bl, 0xff
  684.         test            bl, bl
  685.         jz              .clamp1
  686.         cmp             ah,  bl
  687.         jae             .clamp2
  688.         div             bl
  689.         jmp             .done
  690.   .clamp1:
  691.         mov             al, 0xff
  692.         test            ah, ah
  693.         jnz             @f
  694.         not             al
  695.     @@:
  696.         jmp             .done
  697.   .clamp2:
  698.         mov             al, 0xff
  699.         jmp             .done
  700.   .done:
  701.         mov             ah, al
  702.         loop            .color
  703.  
  704.         ror             eax, 8
  705.         movd            mm3, eax
  706.  
  707.         punpcklbw       mm2, mm0
  708.         punpcklbw       mm3, mm0
  709.  
  710.         pop             ecx ebx eax
  711.         ret
  712. endp
  713.  
  714.  
  715. proc    xcf._.composite_rgb_17                  ; Burn
  716.         push            eax ebx ecx
  717.  
  718.         movd            eax, mm3
  719.         movd            ebx, mm2
  720.  
  721.         rol             eax, 8
  722.         rol             ebx, 8
  723.  
  724.         xchg            eax, ebx
  725.  
  726.         mov             ecx, 3
  727.  
  728.   .color:
  729.         rol             eax, 8
  730.         rol             ebx, 8
  731.         shl             ax, 8
  732.         neg             ah
  733.         add             ah, 0xff
  734.         test            bl, bl
  735.         jz              .clamp1
  736.         cmp             ah, bl
  737.         jae             .clamp2
  738.         div             bl
  739.         jmp             .done
  740.   .clamp1:
  741.         mov             al, 0xff
  742.         test            ah, ah
  743.         jnz             @f
  744.         not             al
  745.     @@:
  746.         jmp             .done
  747.   .clamp2:
  748.         mov             al, 0xff
  749.         jmp             .done
  750.   .done:
  751.         mov             ah, al
  752.         neg             ah
  753.         add             ah, 0xff
  754.         loop            .color
  755.  
  756.         ror             eax, 8
  757.         movd            mm3, eax
  758.  
  759.         punpcklbw       mm2, mm0
  760.         punpcklbw       mm3, mm0
  761.  
  762.         pop             ecx ebx eax
  763.         ret
  764. endp
  765.  
  766.  
  767. proc    xcf._.composite_rgb_18                  ; Hard Light
  768.         push            eax ebx ecx
  769.  
  770.         movd            eax, mm3
  771.         movd            ebx, mm2
  772.  
  773.         rol             eax, 8
  774.         rol             ebx, 8
  775.  
  776.         mov             ecx, 3
  777.  
  778.   .color:
  779.         rol             eax, 8
  780.         rol             ebx, 8
  781.         cmp             al, 127
  782.         jna             .part1
  783.         mov             ah, 0xff
  784.         sub             ah, bl
  785.         neg             al
  786.         add             al, 0xff
  787.         mul             ah
  788.         shl             ax, 1
  789.         neg             ah
  790.         add             ah, 0xff
  791.         jmp             .done
  792.   .part1:
  793.         mul             bl
  794.         shl             ax, 1
  795.   .done:
  796.         loop            .color
  797.  
  798.         ror             eax, 8
  799.         movd            mm3, eax
  800.  
  801.         punpcklbw       mm2, mm0
  802.         punpcklbw       mm3, mm0
  803.  
  804.         pop             ecx ebx eax
  805.         ret
  806. endp
  807.  
  808.  
  809. proc    xcf._.composite_rgb_20                  ; Grain Extract
  810.  
  811.         punpcklbw       mm2, mm0
  812.         punpcklbw       mm3, mm0
  813.         movq            mm4, mm2
  814.         psubw           mm3, [xcf._.mmx_0080]
  815.         psubw           mm4, mm3
  816.         movq            mm3, mm4
  817.         packuswb        mm3, mm0
  818.         punpcklbw       mm3, mm0
  819.         ret
  820. endp
  821.  
  822.  
  823. proc    xcf._.composite_rgb_21                  ; Grain Merge
  824.  
  825.         punpcklbw       mm2, mm0
  826.         punpcklbw       mm3, mm0
  827.         paddw           mm3, mm2
  828.         psubusw         mm3, [xcf._.mmx_0080]
  829.         packuswb        mm3, mm0
  830.         punpcklbw       mm3, mm0
  831.         ret
  832. endp
  833.  
  834.  
  835. ; starting numbers for pseudo-random number generator
  836. xcf._.random_a          dd      1103515245
  837. xcf._.random_b          dd      777
  838. xcf._.random_c          dd      12345
  839.  
  840. xcf._.mmx_0080          dq      0x0080008000800080
  841. xcf._.mmx_00ff          dq      0x00ff00ff00ff00ff
  842. xcf._.mmx_0100          dq      0x0100010001000100
  843.