Alexandre Julliard : gdi32: Add helper functions for copying a DIB line.

Alexandre Julliard julliard at winehq.org
Thu Sep 22 13:39:47 CDT 2011


Module: wine
Branch: master
Commit: 5fd305c31f98d581c165ed4d314fc79d60d8c835
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=5fd305c31f98d581c165ed4d314fc79d60d8c835

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Sep 22 10:18:14 2011 +0200

gdi32: Add helper functions for copying a DIB line.

---

 dlls/gdi32/dibdrv/primitives.c |   96 +++++++++++++++++++++++----------------
 1 files changed, 57 insertions(+), 39 deletions(-)

diff --git a/dlls/gdi32/dibdrv/primitives.c b/dlls/gdi32/dibdrv/primitives.c
index c102f9c..de0993b 100644
--- a/dlls/gdi32/dibdrv/primitives.c
+++ b/dlls/gdi32/dibdrv/primitives.c
@@ -104,6 +104,57 @@ static inline void do_rop_codes_mask_8(BYTE *dst, BYTE src, struct rop_codes *co
     do_rop_mask_8( dst, (src & codes->a1) ^ codes->a2, (src & codes->x1) ^ codes->x2, mask );
 }
 
+static inline void do_rop_codes_line_32(DWORD *dst, const DWORD *src, struct rop_codes *codes, int len)
+{
+    for (; len > 0; len--, src++, dst++) do_rop_codes_32( dst, *src, codes );
+}
+
+static inline void do_rop_codes_line_16(WORD *dst, const WORD *src, struct rop_codes *codes, int len)
+{
+    for (; len > 0; len--, src++, dst++) do_rop_codes_16( dst, *src, codes );
+}
+
+static inline void do_rop_codes_line_8(BYTE *dst, const BYTE *src, struct rop_codes *codes, int len)
+{
+    for (; len > 0; len--, src++, dst++) do_rop_codes_8( dst, *src, codes );
+}
+
+static inline void do_rop_codes_line_4(BYTE *dst, int dst_x, const BYTE *src, int src_x,
+                                      struct rop_codes *codes, int len)
+{
+    BYTE src_val;
+
+    for (src += src_x / 2, dst += dst_x / 2; len > 0; len--, dst_x++, src_x++)
+    {
+        if (dst_x & 1)
+        {
+            if (src_x & 1) src_val = *src++;
+            else           src_val = *src >> 4;
+            do_rop_codes_mask_8( dst++, src_val, codes, 0x0f );
+        }
+        else
+        {
+            if (src_x & 1) src_val = *src++ << 4;
+            else           src_val = *src;
+            do_rop_codes_mask_8( dst, src_val, codes, 0xf0 );
+        }
+    }
+}
+
+static inline void do_rop_codes_line_1(BYTE *dst, int dst_x, const BYTE *src, int src_x,
+                                      struct rop_codes *codes, int len)
+{
+    BYTE src_val;
+
+    for (src += src_x / 8, dst += dst_x / 8; len > 0; len--, dst_x++, src_x++)
+    {
+        src_val = *src & pixel_masks_1[src_x & 7] ? 0xff : 0;
+        do_rop_codes_mask_8( dst, src_val, codes, pixel_masks_1[dst_x & 7] );
+        if ((src_x & 7) == 7) src++;
+        if ((dst_x & 7) == 7) dst++;
+    }
+}
+
 static void solid_rects_32(const dib_info *dib, int num, const RECT *rc, DWORD and, DWORD xor)
 {
     DWORD *ptr, *start;
@@ -706,9 +757,7 @@ static void copy_rect_32(const dib_info *dst, const RECT *rc,
         get_rop_codes( rop2, &codes );
         for (y = rc->top; y < rc->bottom; y++)
         {
-            for (x = rc->left, dst_ptr = dst_start, src_ptr = src_start; x < rc->right; x++)
-                do_rop_codes_32( dst_ptr++, *src_ptr++, &codes );
-
+            do_rop_codes_line_32( dst_start, src_start, &codes, rc->right - rc->left );
             dst_start += dst->stride / 4;
             src_start += src->stride / 4;
         }
@@ -750,12 +799,7 @@ static void copy_rect_24(const dib_info *dst, const RECT *rc,
         get_rop_codes( rop2, &codes );
         for (y = rc->top; y < rc->bottom; y++)
         {
-            for (x = rc->left, dst_ptr = dst_start, src_ptr = src_start; x < rc->right; x++)
-            {
-                do_rop_codes_8( dst_ptr++, *src_ptr++, &codes );
-                do_rop_codes_8( dst_ptr++, *src_ptr++, &codes );
-                do_rop_codes_8( dst_ptr++, *src_ptr++, &codes );
-            }
+            do_rop_codes_line_8( dst_start, src_start, &codes, (rc->right - rc->left) * 3 );
             dst_start += dst->stride;
             src_start += src->stride;
         }
@@ -797,9 +841,7 @@ static void copy_rect_16(const dib_info *dst, const RECT *rc,
         get_rop_codes( rop2, &codes );
         for (y = rc->top; y < rc->bottom; y++)
         {
-            for (x = rc->left, dst_ptr = dst_start, src_ptr = src_start; x < rc->right; x++)
-                do_rop_codes_16( dst_ptr++, *src_ptr++, &codes );
-
+            do_rop_codes_line_16( dst_start, src_start, &codes, rc->right - rc->left );
             dst_start += dst->stride / 2;
             src_start += src->stride / 2;
         }
@@ -841,9 +883,7 @@ static void copy_rect_8(const dib_info *dst, const RECT *rc,
         get_rop_codes( rop2, &codes );
         for (y = rc->top; y < rc->bottom; y++)
         {
-            for (x = rc->left, dst_ptr = dst_start, src_ptr = src_start; x < rc->right; x++)
-                do_rop_codes_8( dst_ptr++, *src_ptr++, &codes );
-
+            do_rop_codes_line_8( dst_start, src_start, &codes, rc->right - rc->left );
             dst_start += dst->stride;
             src_start += src->stride;
         }
@@ -888,21 +928,7 @@ static void copy_rect_4(const dib_info *dst, const RECT *rc,
         get_rop_codes( rop2, &codes );
         for (y = rc->top; y < rc->bottom; y++)
         {
-            for (x = rc->left, src_x = origin->x, dst_ptr = dst_start, src_ptr = src_start; x < rc->right; x++, src_x++)
-            {
-                if (x & 1)
-                {
-                    if (src_x & 1) src_val =  *src_ptr++;
-                    else           src_val =  *src_ptr >> 4;
-                    do_rop_codes_mask_8( dst_ptr++, src_val, &codes, 0x0f );
-                }
-                else
-                {
-                    if (src_x & 1) src_val = *src_ptr++ << 4;
-                    else           src_val = *src_ptr;
-                    do_rop_codes_mask_8( dst_ptr, src_val, &codes, 0xf0 );
-                }
-            }
+            do_rop_codes_line_4( dst_start, rc->left, src_start, origin->x, &codes, rc->right - rc->left );
             dst_start += dst->stride;
             src_start += src->stride;
         }
@@ -947,15 +973,7 @@ static void copy_rect_1(const dib_info *dst, const RECT *rc,
         get_rop_codes( rop2, &codes );
         for (y = rc->top; y < rc->bottom; y++)
         {
-            dst_bitpos = rc->left & 7;
-            src_bitpos = origin->x & 7;
-            for (x = rc->left, dst_ptr = dst_start, src_ptr = src_start; x < rc->right; x++)
-            {
-                src_val = *src_ptr & pixel_masks_1[src_bitpos] ? 0xff : 0;
-                do_rop_codes_mask_8( dst_ptr, src_val, &codes, pixel_masks_1[dst_bitpos] );
-                if (dst_bitpos++ == 7) { dst_ptr++, dst_bitpos = 0; }
-                if (src_bitpos++ == 7) { src_ptr++, src_bitpos = 0; }
-            }
+            do_rop_codes_line_1( dst_start, rc->left, src_start, origin->x, &codes, rc->right - rc->left );
             dst_start += dst->stride;
             src_start += src->stride;
         }




More information about the wine-cvs mailing list