[PATCH 5/5] gdi32: Explicitly write out the rops for copy_rect_1().
Huw Davies
huw at codeweavers.com
Thu Aug 25 03:43:11 CDT 2016
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
dlls/gdi32/dibdrv/primitives.c | 384 +++++++++++++++++++++--------------------
1 file changed, 201 insertions(+), 183 deletions(-)
diff --git a/dlls/gdi32/dibdrv/primitives.c b/dlls/gdi32/dibdrv/primitives.c
index 090eebe..465005b 100644
--- a/dlls/gdi32/dibdrv/primitives.c
+++ b/dlls/gdi32/dibdrv/primitives.c
@@ -1619,36 +1619,55 @@ static inline void copy_rect_bits_align_1( BYTE *dst_start, int dst_x, const BYT
dst_start += dst_x / 8;
full_bytes = (dst_end - ((dst_x + 7) & ~7)) / 8;
- for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride)
+ switch( rop2 )
{
- dst = dst_start;
- src = src_start;
- if (dst_x & 7)
- {
- mask = edge_masks_1[dst_x & 7];
- do_rop_codes_mask_8( dst, src[0], &codes, mask );
- src++;
- dst++;
- }
-
- if (rop2 == R2_COPYPEN)
+ case R2_COPYPEN:
+ for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride)
{
+ dst = dst_start;
+ src = src_start;
+ if (dst_x & 7)
+ {
+ mask = edge_masks_1[dst_x & 7];
+ do_rop_codes_mask_8( dst, src[0], &codes, mask );
+ src++;
+ dst++;
+ }
memmove( dst, src, full_bytes );
src += full_bytes;
dst += full_bytes;
+ if (dst_end & 7)
+ {
+ mask = ~edge_masks_1[dst_end & 7];
+ do_rop_codes_mask_8( dst, src[0], &codes, mask );
+ }
}
- else
- {
- for (i = 0; i < full_bytes; i++, src++, dst++)
- do_rop_codes_8( dst, src[0], &codes );
- }
+ break;
- if (dst_end & 7)
- {
- mask = ~edge_masks_1[dst_end & 7];
- do_rop_codes_mask_8( dst, src[0], &codes, mask );
+#define LOOP( op ) \
+ for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride) \
+ { \
+ dst = dst_start; \
+ src = src_start; \
+ if (dst_x & 7) \
+ { \
+ mask = edge_masks_1[dst_x & 7]; \
+ do_rop_codes_mask_8( dst, src[0], &codes, mask ); \
+ src++; \
+ dst++; \
+ } \
+ for (i = 0; i < full_bytes; i++, src++, dst++) \
+ op; \
+ if (dst_end & 7) \
+ { \
+ mask = ~edge_masks_1[dst_end & 7]; \
+ do_rop_codes_mask_8( dst, src[0], &codes, mask ); \
+ } \
}
+
+ ROPS_WITHOUT_COPY( dst[0], src[0] );
}
+#undef LOOP
}
static inline void copy_rect_bits_shl_1( BYTE *dst_start, int dst_x, const BYTE *src_start, int src_x,
@@ -1666,39 +1685,36 @@ static inline void copy_rect_bits_shl_1( BYTE *dst_start, int dst_x, const BYTE
dst_start += dst_x / 8;
full_bytes = (dst_end - ((dst_x + 7) & ~7)) / 8;
- for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride)
- {
- dst = dst_start;
- src = src_start;
- if (dst_x & 7)
- {
- src_val = (src[0] << off) | (src[1] >> (8 - off));
- mask = edge_masks_1[dst_x & 7];
- do_rop_codes_mask_8( dst, src_val, &codes, mask );
- src++;
- dst++;
- }
-
- if (rop2 == R2_COPYPEN)
- {
- for (i = 0; i < full_bytes; i++, src++, dst++)
- dst[0] = (src[0] << off) | (src[1] >> (8 - off));
- }
- else
- {
- for (i = 0; i < full_bytes; i++, src++, dst++)
- do_rop_codes_8( dst, (src[0] << off) | (src[1] >> (8 - off)), &codes );
- }
+#define LOOP( op ) \
+ for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride) \
+ { \
+ dst = dst_start; \
+ src = src_start; \
+ if (dst_x & 7) \
+ { \
+ src_val = (src[0] << off) | (src[1] >> (8 - off)); \
+ mask = edge_masks_1[dst_x & 7]; \
+ do_rop_codes_mask_8( dst, src_val, &codes, mask ); \
+ src++; \
+ dst++; \
+ } \
+ for (i = 0; i < full_bytes; i++, src++, dst++) \
+ op; \
+ if (dst_end & 7) \
+ { \
+ src_val = src[0] << off; \
+ if ((dst_end & 7) + off > 8) \
+ src_val |= (src[1] >> (8 - off)); \
+ mask = ~edge_masks_1[dst_end & 7]; \
+ do_rop_codes_mask_8( dst, src_val, &codes, mask ); \
+ } \
+ }
- if (dst_end & 7)
- {
- src_val = src[0] << off;
- if ((dst_end & 7) + off > 8)
- src_val |= (src[1] >> (8 - off));
- mask = ~edge_masks_1[dst_end & 7];
- do_rop_codes_mask_8( dst, src_val, &codes, mask );
- }
+ switch( rop2 )
+ {
+ ROPS_ALL( dst[0], ((src[0] << off) | (src[1] >> (8 - off))) );
}
+#undef LOOP
}
static inline void copy_rect_bits_shr_1( BYTE *dst_start, int dst_x, const BYTE *src_start, int src_x,
@@ -1716,48 +1732,41 @@ static inline void copy_rect_bits_shr_1( BYTE *dst_start, int dst_x, const BYTE
dst_start += dst_x / 8;
full_bytes = (dst_end - ((dst_x + 7) & ~7)) / 8;
- for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride)
- {
- dst = dst_start;
- src = src_start;
- last_src = 0;
- if (dst_x & 7)
- {
- last_src = src[0];
- mask = edge_masks_1[dst_x & 7];
- do_rop_codes_mask_8( dst, src[0] >> -off, &codes, mask );
- src++;
- dst++;
- }
-
- if (rop2 == R2_COPYPEN)
- {
- for (i = 0; i < full_bytes; i++, src++, dst++)
- {
- src_val = (last_src << (8 + off)) | (src[0] >> -off);
- last_src = src[0];
- dst[0] = src_val;
- }
- }
- else
- {
- for (i = 0; i < full_bytes; i++, src++, dst++)
- {
- src_val = (last_src << (8 + off)) | (src[0] >> -off);
- last_src = src[0];
- do_rop_codes_8( dst, src_val, &codes );
- }
- }
+#define LOOP( op ) \
+ for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride) \
+ { \
+ dst = dst_start; \
+ src = src_start; \
+ last_src = 0; \
+ if (dst_x & 7) \
+ { \
+ last_src = src[0]; \
+ mask = edge_masks_1[dst_x & 7]; \
+ do_rop_codes_mask_8( dst, src[0] >> -off, &codes, mask ); \
+ src++; \
+ dst++; \
+ } \
+ for (i = 0; i < full_bytes; i++, src++, dst++) \
+ { \
+ src_val = (last_src << (8 + off)) | (src[0] >> -off); \
+ last_src = src[0]; \
+ op; \
+ } \
+ if (dst_end & 7) \
+ { \
+ src_val = last_src << (8 + off); \
+ if ((dst_end & 7) + off > 0) \
+ src_val |= (src[0] >> -off); \
+ mask = ~edge_masks_1[dst_end & 7]; \
+ do_rop_codes_mask_8( dst, src_val, &codes, mask ); \
+ } \
+ }
- if (dst_end & 7)
- {
- src_val = last_src << (8 + off);
- if ((dst_end & 7) + off > 0)
- src_val |= (src[0] >> -off);
- mask = ~edge_masks_1[dst_end & 7];
- do_rop_codes_mask_8( dst, src_val, &codes, mask );
- }
+ switch( rop2 )
+ {
+ ROPS_ALL( dst[0], src_val )
}
+#undef LOOP
}
static inline void copy_rect_bits_rev_align_1( BYTE *dst_start, int dst_x, const BYTE *src_start, int src_x,
@@ -1774,36 +1783,55 @@ static inline void copy_rect_bits_rev_align_1( BYTE *dst_start, int dst_x, const
dst_start += (dst_end - 1) / 8;
full_bytes = (dst_end - ((dst_x + 7) & ~7)) / 8;
- for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride)
+ switch( rop2 )
{
- dst = dst_start;
- src = src_start;
- if (dst_end & 7)
- {
- mask = ~edge_masks_1[dst_end & 7];
- do_rop_codes_mask_8( dst, src[0], &codes, mask );
- src--;
- dst--;
- }
-
- if (rop2 == R2_COPYPEN)
+ case R2_COPYPEN:
+ for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride)
{
+ dst = dst_start;
+ src = src_start;
+ if (dst_end & 7)
+ {
+ mask = ~edge_masks_1[dst_end & 7];
+ do_rop_codes_mask_8( dst, src[0], &codes, mask );
+ src--;
+ dst--;
+ }
memmove( dst, src, full_bytes );
src -= full_bytes;
dst -= full_bytes;
+ if (dst_x & 7)
+ {
+ mask = edge_masks_1[dst_x & 7];
+ do_rop_codes_mask_8( dst, src[0], &codes, mask );
+ }
}
- else
- {
- for (i = 0; i < full_bytes; i++, src--, dst--)
- do_rop_codes_8( dst, src[0], &codes );
- }
+ break;
- if (dst_x & 7)
- {
- mask = edge_masks_1[dst_x & 7];
- do_rop_codes_mask_8( dst, src[0], &codes, mask );
+#define LOOP( op ) \
+ for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride) \
+ { \
+ dst = dst_start; \
+ src = src_start; \
+ if (dst_end & 7) \
+ { \
+ mask = ~edge_masks_1[dst_end & 7]; \
+ do_rop_codes_mask_8( dst, src[0], &codes, mask ); \
+ src--; \
+ dst--; \
+ } \
+ for (i = 0; i < full_bytes; i++, src--, dst--) \
+ op; \
+ if (dst_x & 7) \
+ { \
+ mask = edge_masks_1[dst_x & 7]; \
+ do_rop_codes_mask_8( dst, src[0], &codes, mask ); \
+ } \
}
+
+ ROPS_WITHOUT_COPY( dst[0], src[0] );
}
+#undef LOOP
}
static inline void copy_rect_bits_rev_shl_1( BYTE *dst_start, int dst_x, const BYTE *src_start, int src_x,
@@ -1821,48 +1849,41 @@ static inline void copy_rect_bits_rev_shl_1( BYTE *dst_start, int dst_x, const B
dst_start += (dst_end - 1) / 8;
full_bytes = (dst_end - ((dst_x + 7) & ~7)) / 8;
- for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride)
- {
- dst = dst_start;
- src = src_start;
- last_src = 0;
- if (dst_end & 7)
- {
- last_src = src[0];
- mask = ~edge_masks_1[dst_end & 7];
- do_rop_codes_mask_8( dst, src[0] << off, &codes, mask );
- src--;
- dst--;
- }
-
- if (rop2 == R2_COPYPEN)
- {
- for (i = 0; i < full_bytes; i++, src--, dst--)
- {
- src_val = (src[0] << off) | (last_src >> (8 - off));
- last_src = src[0];
- dst[0] = src_val;
- }
- }
- else
- {
- for (i = 0; i < full_bytes; i++, src--, dst--)
- {
- src_val = (src[0] << off) | (last_src >> (8 - off));
- last_src = src[0];
- do_rop_codes_8( dst, src_val, &codes );
- }
- }
+#define LOOP( op ) \
+ for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride) \
+ { \
+ dst = dst_start; \
+ src = src_start; \
+ last_src = 0; \
+ if (dst_end & 7) \
+ { \
+ last_src = src[0]; \
+ mask = ~edge_masks_1[dst_end & 7]; \
+ do_rop_codes_mask_8( dst, src[0] << off, &codes, mask ); \
+ src--; \
+ dst--; \
+ } \
+ for (i = 0; i < full_bytes; i++, src--, dst--) \
+ { \
+ src_val = (src[0] << off) | (last_src >> (8 - off)); \
+ last_src = src[0]; \
+ op; \
+ } \
+ if (dst_x & 7) \
+ { \
+ src_val = last_src >> (8 - off); \
+ if ((dst_x & 7) + off < 8) \
+ src_val |= (src[0] << off); \
+ mask = edge_masks_1[dst_x & 7]; \
+ do_rop_codes_mask_8( dst, src_val, &codes, mask ); \
+ } \
+ }
- if (dst_x & 7)
- {
- src_val = last_src >> (8 - off);
- if ((dst_x & 7) + off < 8)
- src_val |= (src[0] << off);
- mask = edge_masks_1[dst_x & 7];
- do_rop_codes_mask_8( dst, src_val, &codes, mask );
- }
+ switch( rop2 )
+ {
+ ROPS_ALL( dst[0], src_val );
}
+#undef LOOP
}
static inline void copy_rect_bits_rev_shr_1( BYTE *dst_start, int dst_x, const BYTE *src_start, int src_x,
@@ -1880,38 +1901,35 @@ static inline void copy_rect_bits_rev_shr_1( BYTE *dst_start, int dst_x, const B
dst_start += (dst_end - 1) / 8;
full_bytes = (dst_end - ((dst_x + 7) & ~7)) / 8;
- for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride)
- {
- dst = dst_start;
- src = src_start;
- if (dst_end & 7)
- {
- mask = edge_masks_1[dst_x & 7];
- do_rop_codes_mask_8( dst, (src[-1] << (8 + off)) | (src[0] >> -off), &codes, mask );
- src--;
- dst--;
- }
-
- if (rop2 == R2_COPYPEN)
- {
- for (i = 0; i < full_bytes; i++, src--, dst--)
- dst[0] = (src[-1] << (8 + off)) | (src[0] >> -off);
- }
- else
- {
- for (i = 0; i < full_bytes; i++, src--, dst--)
- do_rop_codes_8( dst, (src[-1] << (8 + off)) | (src[0] >> -off), &codes );
- }
+#define LOOP( op ) \
+ for (y = 0; y < size->cy; y++, dst_start += dst_stride, src_start += src_stride) \
+ { \
+ dst = dst_start; \
+ src = src_start; \
+ if (dst_end & 7) \
+ { \
+ mask = edge_masks_1[dst_x & 7]; \
+ do_rop_codes_mask_8( dst, (src[-1] << (8 + off)) | (src[0] >> -off), &codes, mask ); \
+ src--; \
+ dst--; \
+ } \
+ for (i = 0; i < full_bytes; i++, src--, dst--) \
+ op; \
+ if (dst_x & 7) \
+ { \
+ src_val = src[0] >> -off; \
+ if ((dst_x & 7) + off < 0) \
+ src_val |= (src[-1] << (8 + off)); \
+ mask = edge_masks_1[dst_x & 7]; \
+ do_rop_codes_mask_8( dst, src_val, &codes, mask ); \
+ } \
+ }
- if (dst_x & 7)
- {
- src_val = src[0] >> -off;
- if ((dst_x & 7) + off < 0)
- src_val |= (src[-1] << (8 + off));
- mask = edge_masks_1[dst_x & 7];
- do_rop_codes_mask_8( dst, src_val, &codes, mask );
- }
+ switch( rop2 )
+ {
+ ROPS_ALL( dst[0], (src[-1] << (8 + off)) | (src[0] >> -off) );
}
+#undef LOOP
}
static void copy_rect_1(const dib_info *dst, const RECT *rc,
--
2.7.4
More information about the wine-patches
mailing list