📄 vram2b.c
字号:
DWORD *pixelPos = (DWORD *)desLinePos, ad;
DWORD unitValue = srcValue;
SHORT i, k;
DWORD mask;
WORD totalOffset, num, r;
ad = ( (DWORD)pixelPos ) & 0x3;
if( ad != 0 ) // 奇地址
{
//// pixelPos = (DWORD *)(( (DWORD)pixelPos ) - ( 4 - ad ));
//// desBitOffset += (CHAR)( ( 4 - ad )<< 3 );
pixelPos = (DWORD *)(( (DWORD)pixelPos ) - ( ad ));
desBitOffset += (CHAR)( ( ad )<< 3 );
}
totalOffset = ( len << LOG_PIXEL_BITS ) + desBitOffset;
num = totalOffset >> 5; // 4 bytes
r = totalOffset & 0x1f;
for( i = -2, k = BITS_PER_PIXEL; i < LOG_PIXEL_NUM; i ++ ) // 循环次数为log2( PIXEL_NUM * 4 )
{
unitValue |= ( unitValue << k );
k = k << 1;
}
if( desBitOffset != 0 )
{
if( num == 0 ) // 不到一个整单位
{
#ifdef BIG_ENDIAN_ORDER
mask = MAKEMASK( totalOffset - desBitOffset ) << ( 32 - totalOffset );
mask = exbyte(mask);
#else
mask = MAKEMASK( totalOffset - desBitOffset ) << desBitOffset;
mask = test(mask);
#endif
// PixelMaskOp( pixelPos, unitValue, mask, op );
PIXELMASKOP( pixelPos, unitValue, mask, op )
}
else // 超过一个整单位
{
#ifdef BIG_ENDIAN_ORDER
mask = MAKEMASK( 32 - desBitOffset );
mask = exbyte(mask);
#else
mask = ~MAKEMASK( desBitOffset );
mask = test(mask);
#endif
// PixelMaskOp( pixelPos, unitValue, mask, op ); // 头部
PIXELMASKOP( pixelPos, unitValue, mask, op ) // 头部
pixelPos++;
switch( op )
{
case GPC_REPLACE_STYLE:
case GPC_COPY_STYLE:
for( i = 1; i < num; i++, pixelPos++ )
(*pixelPos) = unitValue;
break;
case GPC_XOR_STYLE:
for( i = 1; i < num; i++, pixelPos++ )
(*pixelPos) ^= unitValue;
break;
case GPC_AND_STYLE:
for( i = 1; i < num; i++, pixelPos++ )
(*pixelPos) &= unitValue;
break;
case GPC_OR_STYLE:
for( i = 1; i < num; i++, pixelPos++ )
(*pixelPos) |= unitValue;
break;
default:
break;
}
if( r != 0 ) // 尾部
{
#ifdef BIG_ENDIAN_ORDER
mask = ~MAKEMASK( 32 - r );
mask = exbyte(mask);
#else
mask = MAKEMASK( r );
mask = test(mask);
#endif
// PixelMaskOp( pixelPos, unitValue, mask, op );
PIXELMASKOP( pixelPos, unitValue, mask, op )
}
}
}
else // 起始边界对齐
{
switch( op )
{
case GPC_REPLACE_STYLE:
case GPC_COPY_STYLE:
for( i = 0; i < num; i++, pixelPos++ )
(*pixelPos) = unitValue;
break;
case GPC_XOR_STYLE:
for( i = 0; i < num; i++, pixelPos++ )
(*pixelPos) ^= unitValue;
break;
case GPC_AND_STYLE:
for( i = 0; i < num; i++, pixelPos++ )
(*pixelPos) &= unitValue;
break;
case GPC_OR_STYLE:
for( i = 0; i < num; i++, pixelPos++ )
(*pixelPos) |= unitValue;
break;
default:
break;
}
if( r != 0 ) // 尾部
{
#ifdef BIG_ENDIAN_ORDER
mask = ~MAKEMASK( 32 - r );
mask = exbyte(mask);
#else
mask = MAKEMASK( r );
mask = test(mask);
#endif
// PixelMaskOp( pixelPos, unitValue, mask, op );
PIXELMASKOP( pixelPos, unitValue, mask, op )
}
}
}
//InvertLine 对指定行进行反色逻辑操作
//以32比特为一个操作单位
void InvertLine( PIXEL *desLinePos, CHAR desBitOffset, WORD len )
{
DWORD *pixelPos = (DWORD *)desLinePos, ad;
DWORD unitMask = -1;
SHORT i;
DWORD mask;
WORD totalOffset, num, r;
ad = ( (DWORD)pixelPos ) & 0x3;
if( ad != 0 ) // 奇地址
{
//// pixelPos = (DWORD *)(( (DWORD)pixelPos ) - ( 4 - ad ));
//// desBitOffset += (CHAR)( ( 4 - ad )<< 3 );
pixelPos = (DWORD *)(( (DWORD)pixelPos ) - ( ad ));
desBitOffset += (CHAR)( ( ad )<< 3 );
}
totalOffset = ( len << LOG_PIXEL_BITS ) + desBitOffset;
num = totalOffset >> 5; // 4 bytes
r = totalOffset & 0x1f;
if( desBitOffset != 0 )
{
if( num == 0 ) // 不到一个整单位
{
#ifdef BIG_ENDIAN_ORDER
mask = MAKEMASK( totalOffset - desBitOffset ) << ( 32 - totalOffset );
mask = exbyte(mask);
#else
mask = MAKEMASK( totalOffset - desBitOffset ) << desBitOffset;
#endif
(*pixelPos) ^= mask;
}
else // 超过一个整单位
{
#ifdef BIG_ENDIAN_ORDER
mask = MAKEMASK( 32 - desBitOffset );
mask = exbyte(mask);
#else
mask = ~MAKEMASK( desBitOffset );
#endif
(*pixelPos) ^= mask;
pixelPos++;
for( i = 1; i < num; i++, pixelPos++ )
(*pixelPos) ^= unitMask;
if( r != 0 ) // 尾部
{
#ifdef BIG_ENDIAN_ORDER
mask = ~MAKEMASK( 32 - r );
mask = exbyte(mask);
#else
mask = MAKEMASK( r );
#endif
(*pixelPos) ^= mask;
}
}
}
else // 起始边界对齐
{
for( i = 0; i < num; i++, pixelPos++ )
(*pixelPos) ^= unitMask;
if( r != 0 ) // 尾部
{
#ifdef BIG_ENDIAN_ORDER
mask = ~MAKEMASK( 32 - r );
mask = exbyte(mask);
#else
mask = MAKEMASK( r );
#endif
(*pixelPos) ^= mask;
}
}
}
void LineUnicolorMaskOp( PIXEL *desLinePos, CHAR desBitOffset, WORD len, PIXEL srcValue, WORD mask, WORD op )
{
PIXEL *pixelPos;
PIXEL unitValue = srcValue;
WORD i, enBit = 0;
CHAR bitOffset;
pixelPos = desLinePos;
bitOffset = desBitOffset;
for( i = 0; i < len; i++ )
{
if( enBit == 0 )
enBit = 0x8000;
if( enBit & mask )
PixelOp( pixelPos, bitOffset, srcValue, op );
GetNextPixelPosition( &pixelPos, &bitOffset, pixelPos, bitOffset );
enBit = enBit >> 1;
}
}
//LineOp 对指定的两行进行逻辑操作(包括按位与、或、异或、复制等)
//以16比特为一组
void LineOp( PIXEL *desLinePos, CHAR desBitOffset, PIXEL *srcLinePos, CHAR srcBitOffset, WORD len, WORD op )
{
WORD i;
WORD *srcPos = (WORD *)srcLinePos, *desPos = (WORD *)desLinePos;
WORD mask;
DWORD totalOffset, num, r;
if( ( (DWORD)srcPos ) & 0x1 ) // 奇地址
{
srcPos = (WORD *)( ((DWORD)srcPos) -1 );
srcBitOffset += 8;
}
if( ( (DWORD)desPos ) & 0x1 ) // 奇地址
{
desPos = (WORD *)( ((DWORD)desPos) -1 );
desBitOffset += 8;
}
totalOffset = ( len << LOG_PIXEL_BITS ) + desBitOffset; // 要求一行的像素个数小于1023
num = totalOffset >> 4;
r = totalOffset & 0xf; // 尾比特数
if( num == 0 ) // 像素尺寸小于剩余单位
{
WORD tempValue;
#ifdef BIG_ENDIAN_ORDER
mask = MAKEMASK( totalOffset - desBitOffset ) << ( 16 - totalOffset );
mask = ex2byte(mask);
#else
mask = MAKEMASK( totalOffset - desBitOffset ) << desBitOffset;
mask = test(mask);
#endif
if( srcBitOffset <= desBitOffset )
{
#ifdef BIG_ENDIAN_ORDER
tempValue = (*srcPos) >> ( desBitOffset - srcBitOffset );
#else
tempValue = (*srcPos) << ( desBitOffset - srcBitOffset );
#endif
UnitMaskOp( desPos, tempValue, mask, op );
}
else
{
#ifdef BIG_ENDIAN_ORDER
tempValue = (WORD)( ( (*((DWORD *)srcPos)) << ( srcBitOffset - desBitOffset ) ) >> 16 );
#else
tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> ( srcBitOffset - desBitOffset ) ) & 0xffff );
#endif
UnitMaskOp( desPos, tempValue, mask, op );
}
}
else // 其他
{
if( desBitOffset == srcBitOffset ) // 边界对齐
{
#ifdef BIG_ENDIAN_ORDER
mask = MAKEMASK( 16 - srcBitOffset );
mask = ex2byte(mask);
#else
mask = ~MAKEMASK( srcBitOffset );
mask = test(mask);
#endif
UnitMaskOp( desPos, *srcPos, mask, op );
desPos++;
srcPos++;
switch( op )
{
case GPC_REPLACE_STYLE:
case GPC_COPY_STYLE:
for( i = 1; i < num; i++, desPos++, srcPos++ )
(*desPos) = (*srcPos);
break;
case GPC_XOR_STYLE:
for( i = 1; i < num; i++, desPos++, srcPos++ )
(*desPos) ^= (*srcPos);
break;
case GPC_AND_STYLE:
for( i = 1; i < num; i++, desPos++, srcPos++ )
(*desPos) &= (*srcPos);
break;
case GPC_OR_STYLE:
for( i = 1; i < num; i++, desPos++, srcPos++ )
(*desPos) |= (*srcPos);
break;
default:
break;
}
#ifdef BIG_ENDIAN_ORDER
mask = ~MAKEMASK( 16 - r );
mask = ex2byte(mask);
#else
mask = MAKEMASK( r );
mask = test(mask);
#endif
UnitMaskOp( desPos, *srcPos, mask, op );
}
else // 边界不对齐
{
WORD tempValue, t;
if( desBitOffset < srcBitOffset )
{
t = srcBitOffset - desBitOffset;
#ifdef BIG_ENDIAN_ORDER
tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> ( 16 - t ) ) );
#else
tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
#endif
}
else
{
t = desBitOffset - srcBitOffset;
#ifdef BIG_ENDIAN_ORDER
tempValue = (*srcPos) >> t;
#else
tempValue = (*srcPos) << t;
#endif
}
#ifdef BIG_ENDIAN_ORDER
mask = MAKEMASK( 16 - desBitOffset );
mask = ex2byte(mask);
#else
mask = ~MAKEMASK( desBitOffset );
mask = test(mask);
#endif
UnitMaskOp( desPos, tempValue, mask, op );
desPos++;
if( desBitOffset < srcBitOffset )
{
srcPos++;
#ifdef BIG_ENDIAN_ORDER
t = 16 - t;
#endif
}
else
{
#ifdef BIG_ENDIAN_ORDER
#else
t = 16 - t;
#endif
}
switch( op )
{
case GPC_REPLACE_STYLE:
case GPC_COPY_STYLE:
for( i = 1; i < num; i++, desPos++, srcPos++ )
{
#ifdef BIG_ENDIAN_ORDER
tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
#else
tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
#endif
(*desPos) = tempValue;
}
break;
case GPC_XOR_STYLE:
for( i = 1; i < num; i++, desPos++, srcPos++ )
{
#ifdef BIG_ENDIAN_ORDER
tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
#else
tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
#endif
(*desPos) ^= tempValue;
}
break;
case GPC_AND_STYLE:
for( i = 1; i < num; i++, desPos++, srcPos++ )
{
#ifdef BIG_ENDIAN_ORDER
tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
#else
tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
#endif
(*desPos) &= tempValue;
}
break;
case GPC_OR_STYLE:
for( i = 1; i < num; i++, desPos++, srcPos++ )
{
#ifdef BIG_ENDIAN_ORDER
tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
#else
tempValue = (WORD)( ( (*((DWORD *)srcPos)) >> t ) );
#endif
(*desPos) |= tempValue;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -