Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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