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

📄 grframe.c

📁 DVB软件,基于CT216软件的开发源程序.
💻 C
字号:
#include <stdio.h>
#include <string.h>
#include "ct_type.h"
#include "dvb_osd.h"
#include "dvb_sys.h"
#include "ct_osd.h"

#ifdef ANTIFLICKER_OPEN
#include "aflicker.h"
#endif


/*******************************************************************************************/
#if 1
#define GR_MSG(p)
#else
#define GR_MSG(p)			printf p
#endif

#if 1
#define GR_DBG(p)
#else
#define GR_DBG(p) 		printf p
#endif

#ifdef CT216T_ELGIST_MM
extern u32 gen_point;
#endif
/*******************************************************************************************/ 
#define	LINE_SEGMENT_SIZE	64

#define MPEG_DRAM_DISABLE_CACHE 0x80000000

#define	OSD_DISP_REGION		(EN_CT_OSD_FRAME_REGION_DISPLAY)
#define	OSD_WORK_REGION		(EN_CT_OSD_FRAME_REGION_WORKING)
#ifndef NO_BMP_REGION
#define	OSD_BMP_REGION		(EN_CT_OSD_FRAME_REGION_BITMAP)
#endif // end #ifndef NO_BMP_REGION


u8 _u8grFrameDebug =  0;
typedef struct
{
	u32 u32GrFrameTopFieldStartAddr ;
	u32 u32GrFrameBtmFieldStartAddr ;
	u32 u32GrFrameWidth ;
	u32 u32GrFrameHieght ;

	u32 u32TopFieldDispRgnStartAddr ;
	u32 u32BtmFieldDispRgnStartAddr ;
	u32 u32DispRgnHieght ;

	u32 u32TopFieldWorkRgnStartAddr ;
	u32 u32BtmFieldWorkRgnStartAddr ;
	u32 u32WorkRgnHieght ;

	u32 u32TopFieldBmpRgnStartAddr ;
	u32 u32BtmFieldBmpRgnStartAddr ;
	u32 u32BmpRgnHieght ;

	u32 u32ColorDepth ;
	u32 u32ColoPalletStartAddr ;

	u32 u32GrFrameTopFieldHeaderAddr ;
	u32 u32GrFrameBtmFieldHeaderAddr ;
} tFRAME_DEV_HANDLE ;



u16	**pu16SysFontSet;
u32	**pu32SysFontsSetFontOffset;
u8	**pu8SysFontsSetFontWidth;
u8	**pu8SysFontsSetFontHeight;
u8	**pu8SysFontsSetFontStartPos;
u8 	**pu8SysFontsInfo;

u16 au16LetterMatrix[396];
u8 au8LetterMatrix[256];

bool8 GrFrame_GetDevHandle(tFRAME_DEV_HANDLE  *pstFrameDevHandle) ;
void GRFrame_SetFontInfo(DVB_OSD_UNICODE_FONT_PARAMETER stUsrFontsAddr);
void MemCpyExcludeColorKey(u8 *pu8Dst, u8 *pu8Src, u32 u32Length, u8 u8ColorKey);
void MemCpy(u8 *pu8Dst, u8 *pu8Src, u32 u32Length);

int  GrFrame_DrawChar(tFRAME_DEV_HANDLE *pstFrameDevHandle, u16 u16RegionId, u16 u16X, u16 u16Y, u16 u16CharIndex, u8 u8BackColor, u8 u8ForeColor,u8 u8IsColorkey) ;
void GrFrame_DrawString(u16 u16RegionId, u16 u16X, u16 u16Y, u16 u16CharSpace, u16 *pu16CharIndex, u16 u16StrLength, u8 u8BackColor, u8 u8ForeColor,u8 u8IsColorkey) ;

void GRFrame_SetFontInfo(DVB_OSD_UNICODE_FONT_PARAMETER stUsrFontsAddr)
{
	pu16SysFontSet = (u16**)stUsrFontsAddr.u16SysFontSetAddr;
	pu32SysFontsSetFontOffset = (u32**)stUsrFontsAddr.u32SysFontsSetFontOffsetAddr;
	pu8SysFontsSetFontWidth = (u8**)stUsrFontsAddr.u8SysFontsSetFontWidthAddr;
	pu8SysFontsSetFontHeight = (u8**)stUsrFontsAddr.u8SysFontsSetFontHeightAddr;
	pu8SysFontsSetFontStartPos = (u8**)stUsrFontsAddr.u8SysFontsSetFontStartPosAddr;
	pu8SysFontsInfo = (u8**)stUsrFontsAddr.u8SysFontsInfoAddr;	
	
//	GR_DBG(("Get Font Set %x, Font Offset %x, Font width %d, Font Info %x\n", pu16SysFontSet, pu32SysFontsSetFontOffset, pu8SysFontsSetFontWidth, pu8SysFontsInfo));	
}
void GRFrame_SetFontInfo_SChinese(DVB_OSD_UNICODE_FONT_PARAMETER stUsrFontsAddr)
{
	pu16SysFontSet = (u16**)stUsrFontsAddr.u16SysFontSetAddr;
	pu8SysFontsInfo = (u8**)stUsrFontsAddr.u8SysFontsInfoAddr;	
	
//	GR_DBG(("Get Font Set %x, Font Offset %x, Font width %d, Font Info %x\n", pu16SysFontSet, pu32SysFontsSetFontOffset, pu8SysFontsSetFontWidth, pu8SysFontsInfo));	
}
tFRAME_DEV_HANDLE stGrFrameDevHandle ;
bool8 GrFrame_GetDevHandle(tFRAME_DEV_HANDLE  *pstFrameDevHandle)
{
	CT_OSD_FrameHandleParams*            pstOSdFrameHandle   = NULL;
	CT_OSD_ColorPatelleParams* pstColorPalette     = NULL;
	pstColorPalette     = CT_OSD_GetcolorPatelleParameter();
	pstOSdFrameHandle   = CT_OSD_GetOperationFrameHandle();
    if ((pstOSdFrameHandle==NULL)||
        (pstColorPalette==NULL))
    {
        return FALSE;
    }
    
	pstFrameDevHandle->u32GrFrameTopFieldStartAddr  = pstOSdFrameHandle->u32FrameTopFieldStartAddr;
	pstFrameDevHandle->u32GrFrameBtmFieldStartAddr  = pstOSdFrameHandle->u32FrameBtmFieldStartAddr;
	pstFrameDevHandle->u32GrFrameWidth              = pstOSdFrameHandle->stInitParams.u16RegionWidth;
	pstFrameDevHandle->u32GrFrameHieght             = pstOSdFrameHandle->stInitParams.u16DisplayRegionHeight;
	pstFrameDevHandle->u32GrFrameHieght             += pstOSdFrameHandle->stInitParams.u16WorkingRegionHeight;
	pstFrameDevHandle->u32GrFrameHieght             += pstOSdFrameHandle->stInitParams.u16BitmapRegionHeight;


	pstFrameDevHandle->u32TopFieldDispRgnStartAddr  = pstOSdFrameHandle->u32DisplayRegionTopFieldStartAddr;
	pstFrameDevHandle->u32BtmFieldDispRgnStartAddr  = pstOSdFrameHandle->u32DisplayRegionBtmFieldStartAddr;
	pstFrameDevHandle->u32DispRgnHieght             = pstOSdFrameHandle->stInitParams.u16DisplayRegionHeight ;
	
	pstFrameDevHandle->u32TopFieldWorkRgnStartAddr  = pstOSdFrameHandle->u32WorkingRegionTopFieldStartAddr;
	pstFrameDevHandle->u32BtmFieldWorkRgnStartAddr  = pstOSdFrameHandle->u32WorkingRegionBtmFieldStartAddr;
	pstFrameDevHandle->u32WorkRgnHieght             = pstOSdFrameHandle->stInitParams.u16WorkingRegionHeight;
	
	pstFrameDevHandle->u32TopFieldBmpRgnStartAddr   = pstOSdFrameHandle->u32BitmapRegionTopFieldStartAddr;
	pstFrameDevHandle->u32BtmFieldBmpRgnStartAddr   = pstOSdFrameHandle->u32BitmapRegionBtmFieldStartAddr;
	pstFrameDevHandle->u32BmpRgnHieght              = pstOSdFrameHandle->stInitParams.u16BitmapRegionHeight;
	
	pstFrameDevHandle->u32ColorDepth                = (u32)pstOSdFrameHandle->stInitParams.enColorDepth;
	pstFrameDevHandle->u32ColoPalletStartAddr       = pstColorPalette->stInitParams.u32Addr;
	
	pstFrameDevHandle->u32GrFrameTopFieldHeaderAddr = pstOSdFrameHandle->u32FrameTopFieldHeaderAddr;
	pstFrameDevHandle->u32GrFrameBtmFieldHeaderAddr = pstOSdFrameHandle->u32FrameBtmFieldHeaderAddr;

#if 0
    // Mpeg Dram Disable Cache
	#if 1
    pstFrameDevHandle->u32GrFrameTopFieldStartAddr  |= MPEG_DRAM_DISABLE_CACHE;
	pstFrameDevHandle->u32GrFrameBtmFieldStartAddr  |= MPEG_DRAM_DISABLE_CACHE;
	pstFrameDevHandle->u32TopFieldDispRgnStartAddr  |= MPEG_DRAM_DISABLE_CACHE;
	pstFrameDevHandle->u32BtmFieldDispRgnStartAddr  |= MPEG_DRAM_DISABLE_CACHE;
	pstFrameDevHandle->u32TopFieldWorkRgnStartAddr  |= MPEG_DRAM_DISABLE_CACHE;
	pstFrameDevHandle->u32BtmFieldWorkRgnStartAddr  |= MPEG_DRAM_DISABLE_CACHE;
	pstFrameDevHandle->u32TopFieldBmpRgnStartAddr   |= MPEG_DRAM_DISABLE_CACHE;
	pstFrameDevHandle->u32BtmFieldBmpRgnStartAddr   |= MPEG_DRAM_DISABLE_CACHE;
	pstFrameDevHandle->u32GrFrameTopFieldHeaderAddr |= MPEG_DRAM_DISABLE_CACHE;
	pstFrameDevHandle->u32GrFrameBtmFieldHeaderAddr |= MPEG_DRAM_DISABLE_CACHE;
	pstFrameDevHandle->u32ColoPalletStartAddr       |= MPEG_DRAM_DISABLE_CACHE;
	#else
	{
		extern disable_dcahce() ;
		extern enable_dcahce() ;
		disable_dcahce() ;
		enable_dcahce() ;
	}
	#endif
#endif
	return TRUE;
}

u32 GrFrame_GetRegionTopFieldAddr(tFRAME_DEV_HANDLE *pstFrameDevHandle, u16 u16RegionId)
{
	u32 u32RegionAddr = 0;

	switch(u16RegionId)
	{
		case OSD_DISP_REGION :
			u32RegionAddr = pstFrameDevHandle->u32TopFieldDispRgnStartAddr ;
			break ;
		case OSD_WORK_REGION:
			u32RegionAddr = pstFrameDevHandle->u32TopFieldWorkRgnStartAddr;
			break ;
#ifndef NO_BMP_REGION			
		case OSD_BMP_REGION:
			u32RegionAddr = pstFrameDevHandle->u32TopFieldBmpRgnStartAddr;
			break ;
#endif // end #ifndef NO_BMP_REGION			
	}
	return(u32RegionAddr) ;
}

u32 GrFrame_GetRegionBtmFieldAddr(tFRAME_DEV_HANDLE *pstFrameDevHandle, u16 u16RegionId)
{
	u32 u32RegionAddr = 0;

	switch(u16RegionId)
	{
		case OSD_DISP_REGION :
			u32RegionAddr = pstFrameDevHandle->u32BtmFieldDispRgnStartAddr ;
			break ;
		case OSD_WORK_REGION:
			u32RegionAddr = pstFrameDevHandle->u32BtmFieldWorkRgnStartAddr;
			break ;
#ifndef NO_BMP_REGION		
		case OSD_BMP_REGION:
			u32RegionAddr = pstFrameDevHandle->u32BtmFieldBmpRgnStartAddr;
			break ;
#endif // end #ifndef NO_BMP_REGION			
	}
	return(u32RegionAddr) ;
}

u16 GrFrame_GetRegionWidth(tFRAME_DEV_HANDLE *pstFrameDevHandle, u16 u16RegionId)
{
	// same width for all region
	return (u16)(pstFrameDevHandle->u32GrFrameWidth) ;
}

u16 GrFrame_GetRegionHeight(tFRAME_DEV_HANDLE *pstFrameDevHandle, u16 u16RegionId)
{
	u16 u16Height = 0;

	switch(u16RegionId)
	{
		case OSD_DISP_REGION :
			u16Height = (u16)pstFrameDevHandle->u32DispRgnHieght;
			break ;
		case OSD_WORK_REGION:
			u16Height = (u16)pstFrameDevHandle->u32WorkRgnHieght;
			break ;
#ifndef NO_BMP_REGION			
		case OSD_BMP_REGION:
			u16Height = (u16)pstFrameDevHandle->u32BmpRgnHieght ;
			break ;
#endif // end #ifndef NO_BMP_REGION			
	}
	return(u16Height) ;

}

void GrFrame_ShowDevInfo(void)
{
	if (GrFrame_GetDevHandle(&stGrFrameDevHandle)!=TRUE)
	{
	    return;
	}
	// show start address
	// show header 0/1/2/3 info
	GR_DBG(("top field start address : 0x%08lx\n",stGrFrameDevHandle.u32GrFrameTopFieldHeaderAddr));
	GR_DBG(("btm field start address : 0x%08lx\n",stGrFrameDevHandle.u32GrFrameBtmFieldHeaderAddr));
	GR_DBG(("header 0 : 0x%08lx\n",*((u32 *)(stGrFrameDevHandle.u32GrFrameTopFieldHeaderAddr))));
	GR_DBG(("header 1 : 0x%08lx\n",*((u32 *)(stGrFrameDevHandle.u32GrFrameTopFieldHeaderAddr+1))));
	GR_DBG(("header 2 : 0x%08lx\n",*((u32 *)(stGrFrameDevHandle.u32GrFrameTopFieldHeaderAddr+2))));
	GR_DBG(("header 3 : 0x%08lx\n",*((u32 *)(stGrFrameDevHandle.u32GrFrameTopFieldHeaderAddr+3))));
}

void GrFrame_EnableDisplay(int iFlag)
{
}

//#define SHOW_FONT_IN_DEBUG	1
#define	FONT_MATRIX_MAX_W	56
#define	FONT_MATRIX_MAX_H	56
u8	au8FnColoredBmp[FONT_MATRIX_MAX_W*FONT_MATRIX_MAX_W * 2] ;

void FnBitMarixTo8BitColorBitmap (
	u16	*pu16FnBitMatrixData,
	int iFnMatrixW,
	int iFnMatrixH,
	int iFnDataWidth,
	u8  u8BgColor,
	u8  u8FgColor,
	u8 	*pu8FnColoredBitmap)
{
	int	i,j;
	int	iNumOfWordInMatrixW ;
	u16	*pu16FnLineBitsInWord ;
	u8	*pu8FnColoredBitmapLine ;
	int	iBitAnchorInLineBits ;

	if ((iFnMatrixW%16) > 0)
	{
		iNumOfWordInMatrixW = (iFnMatrixW/16) + 1;
	}
	else
	{
		iNumOfWordInMatrixW = (iFnMatrixW/16);
	}
	
	
	#if defined(SHOW_FONT_IN_DEBUG)	
	GR_DBG(("\n"));
	#endif
	for(i=0;i<iFnMatrixH;i++)
	{
		pu16FnLineBitsInWord   = &pu16FnBitMatrixData[i*iNumOfWordInMatrixW] ;
		pu8FnColoredBitmapLine = &pu8FnColoredBitmap[i*iFnMatrixW] ;
		iBitAnchorInLineBits = 0 ;
		
		for(j=0;j<iFnDataWidth;j++)
		{
			// パオ娩衡筁ㄓ材

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -