⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdi.c

📁 车载电子影音系统dvd播放系统原程序代码
💻 C
📖 第 1 页 / 共 5 页
字号:
    _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 + -