2017-11-05 02:43:38 +03:00
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
// $Id$
|
|
|
|
/////////////////////////////////////////////////////////////////////////
|
|
|
|
//
|
2018-01-05 20:43:51 +03:00
|
|
|
// Copyright (C) 2017-2018 The Bochs Project
|
2017-11-05 02:43:38 +03:00
|
|
|
//
|
|
|
|
// This library is free software; you can redistribute it and/or
|
|
|
|
// modify it under the terms of the GNU Lesser General Public
|
|
|
|
// License as published by the Free Software Foundation; either
|
|
|
|
// version 2 of the License, or (at your option) any later version.
|
|
|
|
//
|
|
|
|
// This library is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
// Lesser General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU Lesser General Public
|
|
|
|
// License along with this library; if not, write to the Free Software
|
|
|
|
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
|
|
|
|
#ifndef BX_BITBLT_H
|
|
|
|
#define BX_BITBLT_H
|
|
|
|
|
|
|
|
typedef void (*bx_bitblt_rop_t)(
|
|
|
|
Bit8u *dst,const Bit8u *src,
|
|
|
|
int dstpitch,int srcpitch,
|
|
|
|
int bltwidth,int bltheight);
|
|
|
|
|
|
|
|
#define IMPLEMENT_FORWARD_BITBLT(name,opline) \
|
|
|
|
static void bitblt_rop_fwd_##name( \
|
|
|
|
Bit8u *dst,const Bit8u *src, \
|
|
|
|
int dstpitch,int srcpitch, \
|
|
|
|
int bltwidth,int bltheight) \
|
|
|
|
{ \
|
|
|
|
int x,y; \
|
|
|
|
dstpitch -= bltwidth; \
|
|
|
|
srcpitch -= bltwidth; \
|
|
|
|
for (y = 0; y < bltheight; y++) { \
|
|
|
|
for (x = 0; x < bltwidth; x++) { \
|
|
|
|
opline; \
|
|
|
|
dst++; \
|
|
|
|
src++; \
|
|
|
|
} \
|
|
|
|
dst += dstpitch; \
|
|
|
|
src += srcpitch; \
|
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define IMPLEMENT_BACKWARD_BITBLT(name,opline) \
|
|
|
|
static void bitblt_rop_bkwd_##name( \
|
|
|
|
Bit8u *dst,const Bit8u *src, \
|
|
|
|
int dstpitch,int srcpitch, \
|
|
|
|
int bltwidth,int bltheight) \
|
|
|
|
{ \
|
|
|
|
int x,y; \
|
|
|
|
dstpitch += bltwidth; \
|
|
|
|
srcpitch += bltwidth; \
|
|
|
|
for (y = 0; y < bltheight; y++) { \
|
|
|
|
for (x = 0; x < bltwidth; x++) { \
|
|
|
|
opline; \
|
|
|
|
dst--; \
|
|
|
|
src--; \
|
|
|
|
} \
|
|
|
|
dst += dstpitch; \
|
|
|
|
src += srcpitch; \
|
|
|
|
} \
|
|
|
|
}
|
|
|
|
|
2018-01-05 20:43:51 +03:00
|
|
|
#ifdef BX_USE_BINARY_ROP
|
2017-11-05 02:43:38 +03:00
|
|
|
IMPLEMENT_FORWARD_BITBLT(0, *dst = 0)
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(src_and_dst, *dst = (*src) & (*dst))
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(nop, (void)0)
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(src_and_notdst, *dst = (*src) & (~(*dst)))
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(notdst, *dst = ~(*dst))
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(src, *dst = *src)
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(1, *dst = 0xff)
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(notsrc_and_dst, *dst = (~(*src)) & (*dst))
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(src_xor_dst, *dst = (*src) ^ (*dst))
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(src_or_dst, *dst = (*src) | (*dst))
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(notsrc_or_notdst, *dst = (~(*src)) | (~(*dst)))
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(src_notxor_dst, *dst = ~((*src) ^ (*dst)))
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(src_or_notdst, *dst = (*src) | (~(*dst)))
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(notsrc, *dst = (~(*src)))
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(notsrc_or_dst, *dst = (~(*src)) | (*dst))
|
|
|
|
IMPLEMENT_FORWARD_BITBLT(notsrc_and_notdst, *dst = (~(*src)) & (~(*dst)))
|
|
|
|
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(0, *dst = 0)
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(src_and_dst, *dst = (*src) & (*dst))
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(nop, (void)0)
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(src_and_notdst, *dst = (*src) & (~(*dst)))
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(notdst, *dst = ~(*dst))
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(src, *dst = *src)
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(1, *dst = 0xff)
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(notsrc_and_dst, *dst = (~(*src)) & (*dst))
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(src_xor_dst, *dst = (*src) ^ (*dst))
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(src_or_dst, *dst = (*src) | (*dst))
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(notsrc_or_notdst, *dst = (~(*src)) | (~(*dst)))
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(src_notxor_dst, *dst = ~((*src) ^ (*dst)))
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(src_or_notdst, *dst = (*src) | (~(*dst)))
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(notsrc, *dst = (~(*src)))
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(notsrc_or_dst, *dst = (~(*src)) | (*dst))
|
|
|
|
IMPLEMENT_BACKWARD_BITBLT(notsrc_and_notdst, *dst = (~(*src)) & (~(*dst)))
|
2018-01-05 20:43:51 +03:00
|
|
|
#endif
|
2017-11-05 02:43:38 +03:00
|
|
|
|
2018-01-05 20:43:51 +03:00
|
|
|
#ifdef BX_USE_TERNARY_ROP
|
2017-11-19 12:06:37 +03:00
|
|
|
static void bx_ternary_rop(Bit8u rop0, Bit8u *dst_ptr, Bit8u *src_ptr, Bit8u *pat_ptr,
|
2017-11-16 01:13:37 +03:00
|
|
|
int dpxsize)
|
|
|
|
{
|
|
|
|
Bit8u mask, inbits, outbits;
|
|
|
|
|
|
|
|
for (int i = 0; i < dpxsize; i++) {
|
|
|
|
mask = 0x80;
|
|
|
|
outbits = 0;
|
|
|
|
for (int b = 7; b >= 0; b--) {
|
|
|
|
inbits = (*dst_ptr & mask) > 0;
|
|
|
|
inbits |= ((*src_ptr & mask) > 0) << 1;
|
|
|
|
inbits |= ((*pat_ptr & mask) > 0) << 2;
|
|
|
|
outbits |= ((rop0 & (1 << inbits)) > 0) << b;
|
|
|
|
mask >>= 1;
|
|
|
|
}
|
|
|
|
*dst_ptr++ = outbits;
|
|
|
|
src_ptr++;
|
|
|
|
pat_ptr++;
|
|
|
|
}
|
|
|
|
}
|
2018-01-05 20:43:51 +03:00
|
|
|
#endif
|
2017-11-16 01:13:37 +03:00
|
|
|
|
2017-11-05 02:43:38 +03:00
|
|
|
#endif
|