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