📄 blt.cpp
字号:
if (pBltParms->pLookup)
{
color0 = (unsigned short) pBltParms->pLookup[0];
color1 = (unsigned short) pBltParms->pLookup[1];
}
else if (pBltParms->pConvert)
{
color0 = (unsigned short)(pBltParms->pColorConverter->*(pBltParms->pConvert))(0);
;
color1 = (unsigned short)(pBltParms->pColorConverter->*(pBltParms->pConvert))(1);
;
}
else
{
color0 = 0x0000;
color1 = 0xFFFF;
}
if (pBltParms->pSrc->Format() == gpe1Bpp)
{
RETAILMSG( 0, ( TEXT(" start color expansion CTS - hrhr\n") ) );
gfx_set_solid_pattern(0);
gfx_set_mono_source(color0,color1,0);
gfx_set_raster_operation((unsigned char) pBltParms->rop4);
gfx_mono_bitmap_to_screen_blt(srcX,srcY,x1,y1,x2 - x1,y2 - y1,lineptr,stride);
RETAILMSG( 0, ( TEXT(" End color expansion CTS - hrhr\n") ) );
}
else // if (Display_BPP >= 8)
{
RETAILMSG( 0, ( TEXT(" Solid CTS - hrhr\n") ) );
if (pBltParms->bltFlags & BLT_TRANSPARENT) {
RETAILMSG(1,(TEXT("Durango BmpToScrxBlt\r\n")));
gfx_set_solid_pattern(0);
gfx_set_raster_operation((unsigned char) pBltParms->rop4);//0xcc);
gfx_color_bitmap_to_screen_xblt(srcX, srcY, x1, y1, x2 - x1, y2 - y1,
lineptr, stride, color0);
} else {
gfx_set_solid_pattern(0);
gfx_set_mono_source(color0,color1,0);
gfx_set_raster_operation((unsigned char) pBltParms->rop4);
gfx_color_bitmap_to_screen_blt(srcX,srcY,x1,y1,x2 - x1,y2 - y1,
lineptr,stride);
}
}
#else
//Get a valid data pointer
//ASSERT(lineptr != 0);
// SET PARAMETERS FOR ALL SCANLINES
WAIT_PENDING(GXregisters);
WRITE_REG32(GXregisters, GP_DST_XCOOR, (y1 << 16) | x1);
WRITE_REG32(GXregisters, GP_WIDTH, 0x10000 | width);
WRITE_REG16(GXregisters, GP_RASTER_MODE, pBltParms->rop4 & 0x00FF);
// DETERMINE BLT MODE
blit_mode = BM_READ_SRC_BB0;
if ((pBltParms->rop4 & 0x00FF) != 0x00CC)
blit_mode |= BM_READ_DST_FB1;
// CHECK SOURCE COLOR DEPTH
if (pBltParms->pSrc->Format() == gpe1Bpp)
{
unsigned short color0, color1;
// MONOCHROME SOURCE
DEBUGMSG(0,(TEXT("MONOCHROME SOURCE %X %X\n"), pBltParms->pLookup, pBltParms->pConvert));
//SET THE START X POSITION
WRITE_REG16(GXregisters, GP_SRC_XCOOR, srcX & 7);
width_bytes = (width + (srcX & 0x7) + 7) >> 3;
lineptr += (srcY * stride) + (srcX >> 3);
blit_mode |= BM_SOURCE_EXPAND;
// GET SOURCE EXPANSION COLORS
// If no lookup pointer then default to 0x0000 and 0xFFFF.
if (pBltParms->pLookup)
{
color0 = (unsigned short) pBltParms->pLookup[0];
color1 = (unsigned short) pBltParms->pLookup[1];
}
else if (pBltParms->pConvert)
{
color0 = (unsigned short)(pBltParms->pColorConverter->*(pBltParms->pConvert))(0);
;
color1 = (unsigned short)(pBltParms->pColorConverter->*(pBltParms->pConvert))(1);
;
}
else
{
color0 = 0x0000;
color1 = 0xFFFF;
}
// DUPLICATE COLORS IF 8 BPP
if (Display_BPP == 8)
{
color0 &= 0x00FF;
color0 |= (color0 << 8);
color1 &= 0x00FF;
color1 |= (color1 << 8);
}
// LOAD COLORS INTO HARDWARE
WRITE_REG32(GXregisters, GP_SRC_COLOR_0, (color1 << 16) | color0);
}
else if (Display_BPP == 8)
{
// 8 BPP COLOR SOURCE
width_bytes = width;
lineptr += (srcY * stride) + srcX;
}
else
{
// 16 BPP COLOR SOURCE
width_bytes = width << 1;
lineptr += (srcY * stride) + (srcX << 1);
}
// REPEAT FOR EACH SCANLINE
unsigned long widthWBytes = width_bytes >> 2;
width_bytes &= 0x3;
memInit();
for (i = 0; i < height; i++)
{
// COPY CURRENT POINTER TO A DWORD POINTER
dataptr = lineptr;
spadAddr = BB0_Base_Address;
// COPY ALL THE DATA FOR THE CURRENT LINE INTO THE SCRATCHPAD
// Must wait for the pipeline to be idle before loading the
// new data into the BLT buffer.
memCopy(dataptr, spadAddr, widthWBytes, width_bytes);
WRITE_REG16(GXregisters, GP_BLIT_MODE, blit_mode);
// ADJUST SOURCE OFFSET FOR NEXT SCANLINE
lineptr += stride;
}
#endif
return S_OK;
}
//BPP=1
static unsigned char bit_mask[8] = {0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01};
static unsigned char bit_shift[8] = {7,6,5,4,3,2,1,0};
//BPP=2
static unsigned char bit2_mask[4] = {0xC0, 0x30, 0x0C, 0x03};
static unsigned char bit2_shift[4] = {6,4,2,0};
//BPP=4
static unsigned char nibble_mask[2] = {0xF0, 0x0F};
static unsigned char nibble_shift[2] = {4, 0};
#define GETBIT(Data, bit) \
(unsigned char)(((Data) & bit_mask[(bit)]) >> bit_shift[(bit)])
#define GET2BIT(Data, bit) \
(unsigned char)(((Data) & bit2_mask[(bit)]) >> bit2_shift[(bit)])
#define GETNIBBLE(Data, bit) \
(unsigned char)(((Data) & nibble_mask[(bit)]) >> nibble_shift[(bit)])
#define DataConversion1_2_8(_srcDataPtr, _sXOffset, _dataLen, _LUT, _SAddr) \
{ \
/* Loop thru the scan data and do color conversion */ \
for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) { \
_tmpData = GETBIT(_srcDataPtr[xInit>>3], (xInit&0x7)); \
_tmpData = _LUT[_tmpData]; \
WRITE_REG8(GXregisters, _SAddr, _tmpData); \
_SAddr ++; \
} \
}
#define DataConversion2_2_8(_srcDataPtr,_sXOffset, _dataLen, _LUT, _SAddr) \
{ \
/* Loop thru the scan data and do color conversion */ \
for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) { \
_tmpData = GET2BIT(_srcDataPtr[xInit>>2], (xInit&0x3)); \
_tmpData = _LUT[_tmpData]; \
WRITE_REG8(GXregisters, _SAddr, _tmpData); \
_SAddr ++; \
} \
}
#define DataConversion4_2_8(_srcDataPtr, _sXOffset, _dataLen, _LUT, _SAddr) \
{ \
/* Loop thru the scan data and do color conversion */ \
for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) { \
_tmpData = GETNIBBLE(_srcDataPtr[xInit>>1], (xInit&0x1)); \
_tmpData = _LUT[_tmpData]; \
WRITE_REG8(GXregisters, _SAddr, _tmpData); \
_SAddr ++; \
} \
}
#define DataConversion8_2_8(_srcDataPtr, _dataLen, _LUT, _SAddr) \
{ \
/* Loop thru the scan data and do color conversion */ \
for (cntr = 0; cntr < _dataLen; cntr++) { \
_tmpData = _LUT[_srcDataPtr[cntr]]; \
WRITE_REG8(GXregisters, _SAddr, _tmpData); \
_SAddr ++; \
} \
}
#define DataConversion24_2_8(_srcDataPtr, _dataLen, _pFunc, _pConv, _SAddr) \
{ \
/* Loop thru the scan data and do color conversion */ \
for (cntr = 0; cntr < _dataLen; cntr ++) { \
_tmpData = cntr * 3; \
_tmpData = (_srcDataPtr[_tmpData] << 16) | \
(_srcDataPtr[_tmpData + 1] << 8) | \
(_srcDataPtr[_tmpData + 2] ); \
WRITE_REG8(GXregisters, _SAddr, ((_pConv)->*((_pFunc)))(_tmpData)); \
_SAddr ++; \
} \
}
#define DataConversion1_2_16(_srcDataPtr, _sXOffset, _dataLen, _LUT, _SAddr) \
{ \
/* Loop thru the scan data and do color conversion */ \
for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) { \
_tmpData = GETBIT(_srcDataPtr[xInit>>3], (xInit&0x7)); \
_tmpData = _LUT[_tmpData]; \
WRITE_REG16(GXregisters, _SAddr, _tmpData); \
_SAddr += 2; \
} \
}
#define DataConversion2_2_16(_srcDataPtr, _sXOffset, _dataLen, _LUT, _SAddr) \
{ \
/* Loop thru the scan data and do color conversion */ \
for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) { \
_tmpData = GET2BIT(_srcDataPtr[xInit>>2], (xInit&0x3)); \
_tmpData = _LUT[_tmpData]; \
WRITE_REG16(GXregisters, _SAddr, _tmpData); \
_SAddr += 2; \
} \
}
#define DataConversion4_2_16(_srcDataPtr, _sXOffset, _dataLen, _LUT, _SAddr) \
{ \
/* Loop thru the scan data and do color conversion */ \
for (xInit=_sXOffset, cntr = 0; cntr < _dataLen; cntr++, xInit++) { \
_tmpData = GETNIBBLE(_srcDataPtr[xInit>>1], (xInit&0x1)); \
_tmpData = _LUT[_tmpData]; \
WRITE_REG16(GXregisters, _SAddr, _tmpData); \
_SAddr += 2; \
} \
}
#define DataConversion8_2_16(_srcDataPtr, _dataLen, _LUT, _SAddr) \
{ \
/* Loop thru the scan data and do color conversion */ \
for (cntr = 0; cntr < _dataLen; cntr++) { \
_tmpData = _LUT[_srcDataPtr[cntr]]; \
WRITE_REG16(GXregisters, _SAddr, _tmpData); \
_SAddr += 2; \
} \
}
#define DataConversion24_2_16(_srcDataPtr, _dataLen, _pFunc, _pConv, _SAddr) \
{ \
/* Loop thru the scan data and do color conversion */ \
for (cntr = 0; cntr < _dataLen; cntr++) { \
_tmpData = cntr * 3; \
_tmpData = (_srcDataPtr[_tmpData] << 16) | \
(_srcDataPtr[_tmpData + 1] << 8) | \
(_srcDataPtr[_tmpData + 2] ); \
WRITE_REG16(GXregisters, _SAddr, ((_pConv)->*((_pFunc)))(_tmpData)); \
_SAddr += 2; \
} \
}
//----------------------------------------------------------------------------
// AcceleratedBitmapScreenLookupBlt
//
// This routine is called to perform a bitmap to screen BLT with color conversion.
//
// For GX, the source data is loaded into BB0 and the graphics pipeline
// reads the destination data, if required, into BB1.
//
// POSSIBLE OPTIMIZATIONS:
// - Check to see if the bitmap is small enough to fit entirely in the
// BLT buffer.
// - Change the data load routine to use DWORDS.
//----------------------------------------------------------------------------
SCODE GxVideo::AcceleratedBitmapScreenLookupBlt( GPEBltParms *pBltParms )
{
DEBUGMSG(0,(TEXT("AcceleratedBitmapScreenLookupBlt\n")));
GxVideoSurf *dst = (GxVideoSurf *)(pBltParms->pDst);
int left = dst->Left();
int top = dst->Top();
int x1 = pBltParms->prclDst->left + left;
int y1 = pBltParms->prclDst->top + top;
int x2 = pBltParms->prclDst->right + left;
int y2 = pBltParms->prclDst->bottom + top;
int srcX, srcY, srcDepth, sXOffset;
unsigned long spadAddr, i, width, height, width_bytes, remainingBytes, *lookup;
int stride;
unsigned char *dataptr, *lineptr;
unsigned short blit_mode=0;
ColorConverter *clrConverter;
// GET BLT PARAMETERS
width = x2 - x1;
height = y2 - y1;
// Caller assures a well-ordered, non-empty rect
//ASSERT(width > 0 && height > 0);
stride = pBltParms->pSrc->Stride();
srcX = pBltParms->prclSrc->left;
srcY = pBltParms->prclSrc->top;
lineptr = (unsigned char *) pBltParms->pSrc->Buffer();
srcDepth = EGPEFormatToBpp[pBltParms->pSrc->Format()];
DEBUGMSG(0,(TEXT("AcceleratedBitmapScreenLookupBlt=%d %d %d %d %d %d %d 0x%X 0x%X 0x%X %d %d\n"),
x1, y1, x2, y2, width, height, stride, srcX, srcY,
Display_BPP,pBltParms->pSrc->Format(), srcDepth));
//Get a valid data pointer
//ASSERT(lineptr != 0);
// SET PARAMETERS FOR ALL SCANLINES
WAIT_PENDING(GXregisters);
WRITE_REG32(GXregisters, GP_DST_XCOOR, (y1 << 16) | x1);
WRITE_REG32(GXregisters, GP_WIDTH, 0x10000 | width);
WRITE_REG16(GXregisters, GP_RASTER_MODE, pBltParms->rop4 & 0x00FF);
// DETERMINE BLT MODE
blit_mode = BM_READ_SRC_BB0;
if ((pBltParms->rop4 & 0x00FF) != 0x00CC)
blit_mode |= BM_READ_DST_FB1;
//Make a copy of the color lookup table
lookup = pBltParms->pLookup;
clrConverter = pBltParms->pColorConverter;
sXOffset = 0; //Init the start x offset
// CHECK SOURCE COLOR DEPTH
switch(srcDepth)
{
case 1:
lineptr += (srcY * stride) + (srcX >> 3);
sXOffset = (srcX & 0x7);
break;
case 2:
lineptr += (srcY * stride) + (srcX >> 2);
sXOffset = srcX & 0x3;
break;
case 4:
lineptr += (srcY * stride) + (srcX >> 1);
sXOffset = srcX & 0x1;
break;
case 8:
lineptr += (srcY * stride) + srcX;
break;
case 16:
lineptr += (srcY * stride) + (srcX << 1);
break;
case 24:
DEBUGMSG(0,(TEXT("24\n")));
lineptr += (srcY * stride) + (srcX << 2);
break;
default: //* 8 bit depth
lineptr += (srcY * stride) + srcX;
break;
}
width_bytes = (Display_BPP == 8) ? width : (width << 1);
// REPEAT FOR EACH SCANLINE
unsigned long widthWBytes = width_bytes >> 2;
remainingBytes = width_bytes & 0x3;
unsigned long cntr, xInit, _tmpData=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -