[PATCH 3/5] gdi32: Explicitly write out the rops for mask_rect_32().
Huw Davies
huw at codeweavers.com
Thu Aug 25 03:43:09 CDT 2016
Signed-off-by: Huw Davies <huw at codeweavers.com>
---
dlls/gdi32/dibdrv/primitives.c | 172 +++++++++++++++++------------------------
1 file changed, 71 insertions(+), 101 deletions(-)
diff --git a/dlls/gdi32/dibdrv/primitives.c b/dlls/gdi32/dibdrv/primitives.c
index 91cce3f..abfb1b5 100644
--- a/dlls/gdi32/dibdrv/primitives.c
+++ b/dlls/gdi32/dibdrv/primitives.c
@@ -125,6 +125,10 @@ case R2_MERGEPENNOT: LOOP( (_d) = (~(_d) | (_s)) ) break; \
case R2_MERGEPEN: LOOP( (_d) |= (_s) ) break; \
case R2_WHITE: LOOP( (_d) = ~0 ) break;
+#define ROPS_ALL( _d, _s ) \
+case R2_COPYPEN: LOOP( (_d) = (_s) ) break; \
+ROPS_WITHOUT_COPY( (_d), (_s) )
+
static inline void do_rop_32(DWORD *ptr, DWORD and, DWORD xor)
{
*ptr = (*ptr & and) ^ xor;
@@ -5312,13 +5316,10 @@ static void mask_rect_32( const dib_info *dst, const RECT *rc,
{
DWORD *dst_start = get_pixel_ptr_32(dst, rc->left, rc->top), dst_colors[256];
DWORD src_val, bit_val, i, full, pos;
- struct rop_codes codes;
int x, y, origin_end = origin->x + rc->right - rc->left;
const RGBQUAD *color_table = get_dib_color_table( src );
BYTE *src_start = get_pixel_ptr_1(src, origin->x, origin->y);
- get_rop_codes( rop2, &codes );
-
if (dst->funcs == &funcs_8888)
for (i = 0; i < 2; i++)
dst_colors[i] = color_table[i].rgbRed << 16 | color_table[i].rgbGreen << 8 |
@@ -5336,6 +5337,10 @@ static void mask_rect_32( const dib_info *dst, const RECT *rc,
/* Special case starting and finishing in same byte, neither on byte boundary */
if ((origin->x & 7) && (origin_end & 7) && (origin->x & ~7) == (origin_end & ~7))
{
+ struct rop_codes codes;
+
+ get_rop_codes( rop2, &codes );
+
for (y = rc->top; y < rc->bottom; y++)
{
pos = origin->x & 7;
@@ -5352,106 +5357,71 @@ static void mask_rect_32( const dib_info *dst, const RECT *rc,
full = ((rc->right - rc->left) - ((8 - (origin->x & 7)) & 7)) / 8;
- for (y = rc->top; y < rc->bottom; y++)
- {
- pos = origin->x & 7;
- src_val = src_start[pos / 8];
- x = 0;
-
- switch (pos & 7)
- {
- case 1:
- bit_val = src_val >> 6;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- /* fall through */
- case 2:
- bit_val = src_val >> 5;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- /* fall through */
- case 3:
- bit_val = src_val >> 4;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- /* fall through */
- case 4:
- bit_val = src_val >> 3;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- /* fall through */
- case 5:
- bit_val = src_val >> 2;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- /* fall through */
- case 6:
- bit_val = src_val >> 1;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- /* fall through */
- case 7:
- bit_val = src_val;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- pos = (pos + 7) & ~7;
- }
-
- for (i = 0; i < full; i++, pos += 8)
- {
- src_val = src_start[pos / 8];
-
- bit_val = src_val >> 7;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- bit_val = src_val >> 6;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- bit_val = src_val >> 5;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- bit_val = src_val >> 4;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- bit_val = src_val >> 3;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- bit_val = src_val >> 2;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- bit_val = src_val >> 1;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- bit_val = src_val;
- do_rop_codes_32( dst_start + x++, dst_colors[bit_val], &codes );
- }
-
- if (origin_end & 7)
- {
- src_val = src_start[pos / 8];
- x += (origin_end & 7) - 1;
-
- switch (origin_end & 7)
- {
- case 7:
- bit_val = src_val >> 1;
- do_rop_codes_32( dst_start + x--, dst_colors[bit_val], &codes );
- /* fall through */
- case 6:
- bit_val = src_val >> 2;
- do_rop_codes_32( dst_start + x--, dst_colors[bit_val], &codes );
- /* fall through */
- case 5:
- bit_val = src_val >> 3;
- do_rop_codes_32( dst_start + x--, dst_colors[bit_val], &codes );
- /* fall through */
- case 4:
- bit_val = src_val >> 4;
- do_rop_codes_32( dst_start + x--, dst_colors[bit_val], &codes );
- /* fall through */
- case 3:
- bit_val = src_val >> 5;
- do_rop_codes_32( dst_start + x--, dst_colors[bit_val], &codes );
- /* fall through */
- case 2:
- bit_val = src_val >> 6;
- do_rop_codes_32( dst_start + x--, dst_colors[bit_val], &codes );
- /* fall through */
- case 1:
- bit_val = src_val >> 7;
- do_rop_codes_32( dst_start + x, dst_colors[bit_val], &codes );
- }
- }
+#define LOOP( op ) \
+ for (y = rc->top; y < rc->bottom; y++) \
+ { \
+ pos = origin->x & 7; \
+ src_val = src_start[pos / 8]; \
+ x = 0; \
+ switch (pos & 7) \
+ { \
+ case 1: bit_val = src_val >> 6; op; x++; \
+ /* fall through */ \
+ case 2: bit_val = src_val >> 5; op; x++; \
+ /* fall through */ \
+ case 3: bit_val = src_val >> 4; op; x++; \
+ /* fall through */ \
+ case 4: bit_val = src_val >> 3; op; x++; \
+ /* fall through */ \
+ case 5: bit_val = src_val >> 2; op; x++; \
+ /* fall through */ \
+ case 6: bit_val = src_val >> 1; op; x++; \
+ /* fall through */ \
+ case 7: bit_val = src_val; op; x++; \
+ pos = (pos + 7) & ~7; \
+ } \
+ for (i = 0; i < full; i++, pos += 8) \
+ { \
+ src_val = src_start[pos / 8]; \
+ bit_val = src_val >> 7; op; x++; \
+ bit_val = src_val >> 6; op; x++; \
+ bit_val = src_val >> 5; op; x++; \
+ bit_val = src_val >> 4; op; x++; \
+ bit_val = src_val >> 3; op; x++; \
+ bit_val = src_val >> 2; op; x++; \
+ bit_val = src_val >> 1; op; x++; \
+ bit_val = src_val; op; x++; \
+ } \
+ if (origin_end & 7) \
+ { \
+ src_val = src_start[pos / 8]; \
+ x += (origin_end & 7) - 1; \
+ switch (origin_end & 7) \
+ { \
+ case 7: bit_val = src_val >> 1; op; x--; \
+ /* fall through */ \
+ case 6: bit_val = src_val >> 2; op; x--; \
+ /* fall through */ \
+ case 5: bit_val = src_val >> 3; op; x--; \
+ /* fall through */ \
+ case 4: bit_val = src_val >> 4; op; x--; \
+ /* fall through */ \
+ case 3: bit_val = src_val >> 5; op; x--; \
+ /* fall through */ \
+ case 2: bit_val = src_val >> 6; op; x--; \
+ /* fall through */ \
+ case 1: bit_val = src_val >> 7; op; \
+ } \
+ } \
+ dst_start += dst->stride / 4; \
+ src_start += src->stride; \
+ }
- dst_start += dst->stride / 4;
- src_start += src->stride;
+ switch (rop2)
+ {
+ ROPS_ALL( dst_start[x], dst_colors[bit_val] )
}
+#undef LOOP
}
static void mask_rect_24( const dib_info *dst, const RECT *rc,
--
2.7.4
More information about the wine-patches
mailing list