📄 gdi.c
字号:
_dwGDIHeaders[1] = _dwGDIHeaders[1] | (_dwGDITemp<<9) | _wGDITemp;
W99AV_WriteDRAMBurst(__dwRegionTAddr-2 ,_dwGDIHeaders, 2);
#else
W99AV_WriteDRAMBurst(__RegionList[bRegionId].dwTAddr+2, _dwGDIHeaders, 2);
W99AV_WriteDRAMBurst(__RegionList[bRegionId].dwBAddr+2, _dwGDIHeaders, 2);
#endif
//W99AV_WriteDRAMBurst(BMP_GRP_TADDR+2, _dwSWOSDHeaders, 2);
//W99AV_WriteDRAMBurst(BMP_GRP_BADDR+2, _dwSWOSDHeaders, 2);
// May need to clear the regiont to transparent color
// but don't do it here, because I use GDI_FillRect to clear the region,
// not write DRAM directly.
//GDI_ClearRegion(bRegionId);
#endif //#ifndef NO_GDI
//W99AV_ReadDRAMData(0x834c, &_dwGDITemp);
// Brian2.39
OSD_AdjustOSDPos();
return TRUE;
}
void GDI_ClearRegion_By_RISC(BYTE bRegionId)
{
#ifndef NO_GDI
__dwW99AVCmdArg[0] = 3;
__dwW99AVCmdArg[1] = CMDARG_FILL_DRAM; // Command Argument
#ifdef USE_ONE_OSD_REGION
_dwGDITemp = __RegionList[bRegionId].wWidth/(1L << (2-__bColorMode));
#else
_dwGDITemp = __RegionList[bRegionId].wWidth/(1L << (2-__RegionList[bRegionId].bColorMode));
#endif
#ifdef MINI_OSD_REGION // CT908S
__dwW99AVCmdArg[2] = __dwRegionTAddr+4;
__dwW99AVCmdArg[3] = _dwGDITemp*(__dwRegionHeight/2) >> 2; // [31:16] rect left, [15:0] rect top
#else
__dwW99AVCmdArg[2] = __RegionList[bRegionId].dwTAddr+4;
__dwW99AVCmdArg[3] = _dwGDITemp*(__RegionList[bRegionId].wHeight/2) >> 2; // [31:16] rect left, [15:0] rect top
#endif
W99AV_CommandN(COMMAND_GDI);
__dwW99AVCmdArg[0] = 3;
__dwW99AVCmdArg[1] = CMDARG_FILL_DRAM; // Command Argument
#ifdef USE_ONE_OSD_REGION
_dwGDITemp = __RegionList[bRegionId].wWidth/(1L << (2-__bColorMode));
#else
_dwGDITemp = __RegionList[bRegionId].wWidth/(1L << (2-__RegionList[bRegionId].bColorMode));
#endif
#ifdef MINI_OSD_REGION // CT908S
__dwW99AVCmdArg[2] = __dwRegionBAddr+4;
__dwW99AVCmdArg[3] = _dwGDITemp*(__dwRegionHeight/2) >> 2; // [31:16] rect left, [15:0] rect top
#else
__dwW99AVCmdArg[2] = __RegionList[bRegionId].dwBAddr+4;
__dwW99AVCmdArg[3] = _dwGDITemp*(__RegionList[bRegionId].wHeight/2) >> 2; // [31:16] rect left, [15:0] rect top
#endif
W99AV_CommandN(COMMAND_GDI);
#endif // #ifndef NO_GDI
}
// *********************************************************************
// Function : GDI_ClearRegion
// Description : This function clears the entire region to transparent color
// Arguments : bRegionId: the ID of the region to initialize,
// The ID is an index to the __RegionList
// Return : NOne
// Side Effect :
// *********************************************************************
void GDI_ClearRegion(BYTE bRegionId)
{
#ifndef NO_GDI
#ifndef GDI_CLEAR_REGION_BY_WRITE_DRAM
BYTE bTmp;
bTmp = __bCurrentRegionId;
__bCurrentRegionId = bRegionId;
#ifdef MINI_OSD_REGION // CT908S
GDI_FILL_RECT(0, 0, __RegionList[bRegionId].wWidth-1, __dwRegionHeight-1, PAL_ENTRY_COLOR_TRANSPARENT);
#else
GDI_FILL_RECT(0, 0, __RegionList[bRegionId].wWidth-1, __RegionList[bRegionId].wHeight-1, PAL_ENTRY_COLOR_TRANSPARENT);
#endif
__bCurrentRegionId = bTmp;
/*
__dwW99AVCmdArg[0] = 3;
__dwW99AVCmdArg[1] = CMDARG_FILL_DRAM; // Command Argument
__dwW99AVCmdArg[2] = __RegionList[bRegionId].dwTAddr+4;
_dwGDITemp = __RegionList[bRegionId].wWidth/(1L << (2-__RegionList[bRegionId].bColorMode));
__dwW99AVCmdArg[3] = _dwGDITemp*(__RegionList[bRegionId].wHeight/2) >> 2; // [31:16] rect left, [15:0] rect top
W99AV_CommandN(COMMAND_GDI);
__dwW99AVCmdArg[0] = 3;
__dwW99AVCmdArg[1] = CMDARG_FILL_DRAM; // Command Argument
__dwW99AVCmdArg[2] = __RegionList[bRegionId].dwBAddr+4;
_dwGDITemp = __RegionList[bRegionId].wWidth/(1L << (2-__RegionList[bRegionId].bColorMode));
__dwW99AVCmdArg[3] = _dwGDITemp*(__RegionList[bRegionId].wHeight/2) >> 2; // [31:16] rect left, [15:0] rect top
W99AV_CommandN(COMMAND_GDI);
*/
#else
if (bRegionId >= NUMBER_OF_REGION)
return ;
// CK, may need to clear the regiont to transparent color
#ifdef USE_ONE_OSD_REGION
_dwGDIHeaders[0] = __RegionList[bRegionId].wWidth/(1L << (2-__bColorMode));
#else
_dwGDIHeaders[0] = __RegionList[bRegionId].wWidth/(1L << (2-__RegionList[bRegionId].bColorMode));
#endif
for (_wGDITemp=0; _wGDITemp<_dwGDIHeaders[0]; _wGDITemp++)
__bPixelBuffer[_wGDITemp] = PAL_ENTRY_COLOR_TRANSPARENT;
_dwGDIHeaders[0] = _dwGDIHeaders[0] >> 2;
_wGDITemp = 0;
#ifdef MINI_OSD_REGION // CT908S
for (_dwGDITemp=0; _dwGDITemp<__dwRegionHeight/2; _dwGDITemp++)
#else
for (_dwGDITemp=0; _dwGDITemp<__RegionList[bRegionId].wHeight/2; _dwGDITemp++)
#endif
{
#ifdef MINI_OSD_REGION // CT908S
W99AV_WriteDRAMBurst( __dwRegionTAddr+4+_wGDITemp, (DWORD*)__bPixelBuffer, (WORD)_dwGDIHeaders[0]);
W99AV_WriteDRAMBurst( __dwRegionBAddr+4+_wGDITemp, (DWORD*)__bPixelBuffer, (WORD)_dwGDIHeaders[0]);
#else
W99AV_WriteDRAMBurst( __RegionList[bRegionId].dwTAddr+4+_wGDITemp, (DWORD*)__bPixelBuffer, (WORD)_dwGDIHeaders[0]);
W99AV_WriteDRAMBurst( __RegionList[bRegionId].dwBAddr+4+_wGDITemp, (DWORD*)__bPixelBuffer, (WORD)_dwGDIHeaders[0]);
#endif
_wGDITemp += (WORD)_dwGDIHeaders[0];
}
#endif //#ifndef GDI_CLEAR_REGION_BY_WRITE_DRAM
#endif //#ifndef NO_GDI
}
// *********************************************************************
// Function : GDI_SetCurrentRegion
// Description : This function set the current region
// Arguments : bRegionId: the ID of region
// The ID is an index to the __RegionList
// Return : None
// Side Effect :
// *********************************************************************
void GDI_SetCurrentRegion(BYTE bRegionId)
{
#ifndef NO_GDI
__bCurrentRegionId = bRegionId;
#endif //#ifndef NO_GDI
}
// *********************************************************************
// Function : GDI_ActivateRegion
// Description : This function prepares the region by setting the header of BMP OSD
// Arguments : bPlaneId: the ID of the plane to be mapped with current region,
// The ID is an index to the __PlaneList
// Return : TRUE: function succeeded
// FALSE: function failed
// Side Effect :
// *********************************************************************
BOOL GDI_ActivateRegion(void)
{
#ifndef NO_GDI
// *** must set the following variables to the correct value,
// *** W99AV_Reset will use them
if (__bCurrentRegionId >= NUMBER_OF_REGION)
return FALSE;
#ifdef USE_ONE_OSD_REGION
switch (__bColorMode)
#else
switch (__RegionList[__bCurrentRegionId].bColorMode)
#endif
{
case 0: // 4 color, one BYTE contains 4 pixels
#ifdef MINI_OSD_REGION // CT908S
_dwGDITemp = (__RegionList[__bCurrentRegionId].wWidth*__dwRegionHeight) >> 5;
#else
_dwGDITemp = (__RegionList[__bCurrentRegionId].wWidth*__RegionList[__bCurrentRegionId].wHeight) >> 5;
#endif
break;
case 1: // 16 color, one BYTE contains 2 pixels
#ifdef MINI_OSD_REGION // CT908S
_dwGDITemp = (__RegionList[__bCurrentRegionId].wWidth*__dwRegionHeight) >> 4;
#else
_dwGDITemp = (__RegionList[__bCurrentRegionId].wWidth*__RegionList[__bCurrentRegionId].wHeight) >> 4;
#endif
break;
case 2: // 256 color, one BYTE contains 1 pixels
#ifdef MINI_OSD_REGION // CT908S
_dwGDITemp = (__RegionList[__bCurrentRegionId].wWidth*__dwRegionHeight) >> 3;
#else
_dwGDITemp = (__RegionList[__bCurrentRegionId].wWidth*__RegionList[__bCurrentRegionId].wHeight) >> 3;
#endif
break;
default:
return FALSE;
}
_dwGDITemp = _dwGDITemp+4; // plus header 4 DWORD
//W99AV_WriteDRAMData( _Plane.dwTSize_var, _dwGDITemp+4); //in DWORD, one field
//W99AV_WriteDRAMData( _Plane.dwBSize_var, _dwGDITemp+4); //in DWORD, one field
// Alan2.36 update the font table address for unicode support
#ifndef SUPPORT_UNICODE
// Brian2.37
if (_bNormalFontableAddress)
{
_dwTopSize = (_dwGDITemp|( (OSD_DRAM_FONT_TABLE_START_0 >>4 ) << 16)); //(_dwGDITemp|(0x4080 << 16));
_dwBottomSize = (_dwGDITemp|( (OSD_DRAM_FONT_TABLE_START_1 >> 4) << 16)); //(_dwGDITemp|(0x4480 << 16));
}
else
{
// Brian2.37, just for 64M compile issue
#ifdef FONT_TABLE_AT_ODD_ADDRESS
_dwTopSize = (_dwGDITemp|( (OSD_DRAM_FONT_TABLE_START_0_JPEG >>4 ) << 16)); //(_dwGDITemp|(0x4080 << 16));
_dwBottomSize = (_dwGDITemp|( (OSD_DRAM_FONT_TABLE_START_1_JPEG >> 4) << 16)); //(_dwGDITemp|(0x4480 << 16));
#endif
}
#else
_dwTopSize = _dwGDITemp;
_dwBottomSize = _dwGDITemp;
#endif
W99AV_WriteDRAMData( _Plane.dwTSize_var, _dwBottomSize); //put Font table address in bit 16~31
W99AV_WriteDRAMData( _Plane.dwBSize_var, _dwTopSize); //put Font table address in bit 16~31
// Alan2.36 adds these lines
#ifdef SUPPORT_UNICODE
W99AV_WriteDRAMData( 0x161, OSD_DRAM_FONT_TABLE_START_0);
W99AV_WriteDRAMData( 0x160, OSD_DRAM_FONT_TABLE_START_1);
#endif
//W99AV_WriteDRAMData( W99AV_DRAM_OSDT_SIZE, _dwGDITemp+4); //in DWORD, one field
//W99AV_WriteDRAMData( W99AV_DRAM_OSDB_SIZE, _dwGDITemp+4); //in DWORD, one field
#ifdef USE_ONE_OSD_REGION
_dwGDIHeaders[0]=( HEADER0_BMP | (((DWORD) __bColorMode )<<27 )); // need set header 0 again
#ifdef MINI_OSD_REGION // CT908S
// Brian2.30, use region address to judge if we are going to use the mini-osd region
if (__dwRegionTAddr == (REGION_T_ADDR0+(GDI_REGION_WIDTH>>3)-4))
{
// to speed up the GXA command, use a pesudo region
// set NEXT_OSD_ADD , Top/Down could use the same pseudo headea
// set NEXT_OSD_ADD: [0]~[19]
_dwGDIHeaders[0] &= 0xFFF00000;
// don't forget we have a whole line of space (80 DW) used as "Header" area, now use the 4 DW before the TOP header as the pseudo OSD address
_dwGDIHeaders[0] |= (__dwRegionTAddr -4);
}
W99AV_WriteDRAMBurst(__dwRegionTAddr ,_dwGDIHeaders, 1);
W99AV_WriteDRAMBurst(__dwRegionBAddr ,_dwGDIHeaders, 1);
_dwGDIHeaders[0]=( __dwRegionTAddr | ((DWORD)__bColorMode <<27) );
_dwGDIHeaders[1]=( __dwRegionBAddr | ((DWORD)__bColorMode <<27) );
#else
W99AV_WriteDRAMBurst(__RegionList[__bCurrentRegionId].dwTAddr ,_dwGDIHeaders, 1);
W99AV_WriteDRAMBurst(__RegionList[__bCurrentRegionId].dwBAddr ,_dwGDIHeaders, 1);
_dwGDIHeaders[0]=( __RegionList[__bCurrentRegionId].dwTAddr | ((DWORD)__bColorMode <<27) );
_dwGDIHeaders[1]=( __RegionList[__bCurrentRegionId].dwBAddr | ((DWORD)__bColorMode <<27) );
#endif
#else
_dwGDIHeaders[0]=( __RegionList[__bCurrentRegionId].dwTAddr | ((DWORD)__RegionList[__bCurrentRegionId].bColorMode <<27) );
_dwGDIHeaders[1]=( __RegionList[__bCurrentRegionId].dwBAddr | ((DWORD)__RegionList[__bCurrentRegionId].bColorMode <<27) );
#endif
_dwTopAddr = _dwGDIHeaders[1];
_dwBottomAddr = _dwGDIHeaders[0];
W99AV_WriteDRAMData( _Plane.dwTAddr_var, _dwBottomAddr );
W99AV_WriteDRAMData( _Plane.dwBAddr_var, _dwTopAddr );
#endif //#ifndef NO_GDI
return TRUE;
}
// *********************************************************************
// Function : GDI_DeactivateRegion
// Description : This function deactivate the region mapped with plane
// Arguments : none
// Return : none
// Side Effect :
// *********************************************************************
void GDI_DeactivateRegion(void)
{
#ifndef NO_GDI
W99AV_WriteDRAMData( _Plane.dwTAddr_var, 0 );
W99AV_WriteDRAMData( _Plane.dwBAddr_var, 0 );
W99AV_WriteDRAMData( _Plane.dwTSize_var, 0 );
W99AV_WriteDRAMData( _Plane.dwBSize_var, 0 );
#endif //#ifndef NO_GDI
}
// *********************************************************************
// Function : GDI_MoveRegion
// Description : This function moves the entire region
// Arguments : None
// Global Var : __wGDIx, __wGDIy: the new start point of the region
// Return : none
// Side Effect :
// *********************************************************************
#pragma NOAREGS // may be called in ISR
void GDI_MoveRegion(void) //WORD wX, WORD wY)
{
#ifndef NO_GDI
DWORD dwTmp;
if (__bCurrentRegionId >= NUMBER_OF_REGION)
return;
#ifdef MINI_OSD_REGION // CT908S
W99AV_ReadDRAMData( __dwRegionTAddr+2, &_dwGDIHeaders[2] );
W99AV_ReadDRAMData( __dwRegionTAddr+3, &_dwGDIHeaders[3] );
#else
W99AV_ReadDRAMData( __RegionList[__bCurrentRegionId].dwTAddr+2, &_dwGDIHeaders[2] );
W99AV_ReadDRAMData( __RegionList[__bCurrentRegionId].dwTAddr+3, &_dwGDIHeaders[3] );
#endif
#ifdef H2D
dwTmp=__wGDIStartX+__RegionList[__bCurrentRegionId].wWidth*2; // 2 means: 2 clock/pixel
#else
dwTmp=__wGDIStartX+__RegionList[__bCurrentRegionId].wWidth*2*2; // 2 means: 2 clock/pixel
#endif
_dwGDIHeaders[2] = _dwGDIHeaders[2] & 0xFF800000;
_dwGDIHeaders[2]=( _dwGDIHeaders[2] | (((DWORD)__wGDIStartX) << 12) | (((DWORD)dwTmp) << 1) );
_dwGDIHeaders[3] = _dwGDIHeaders[3] & 0xFFFC0000;
#ifdef MINI_OSD_REGION // CT908S
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -