超大数字显示
2 E币
成为会员,免费下载资料
文件大小:19.62 KB
上传者:ngswfx
时间:2016-07-22 09:54:38
下载量:10
本帖最后由 ngswfx 于 2016-7-22 17:37 编辑
这几天弄数字矩阵,希望能把某个单元的序号显示出来,但是普通的文字太小,实际使用中根本看不见。现场安装调试带来不便。
//开始想着弄true type矢量字体,看了看相关的支持库,最后一想,这东西太大,太费劲。
自己做了0-9的bmp格式的图片,每张图片原始大小145K,分辨率176*288。10个图片共计1.45M。进过gzip压缩,实际只有20k flash占用,非常满意。这是肯定的,都是黑屏,有效信息非常少,而且单色,压缩成这样应该的。之所以不用jpg,是因为在bmp转jpg过程中,反而会带来边缘的躁动,带来额外信息,对后期压缩成zip,对空间占用反而有影响。
//////操作流程如下。
1、将所有图片在pc上压缩为标准zip格式,例如0.bmp---------0.zip
2、将所有zip文件全部放入roofs指定目录。例如/root/Num/目录下。
3、程序运行中,如果需要某个数字图片,执行命令gzip -cd /root/Num/n.zip>/dev/n.bmp /////由于dev目录是内存目录,肯定是可写的。如果需要多个数字,就都解压出来然后读取。由于对于一个单元来说最多用2个数字,额外内存占用,也就145K*2=300K左右。而且是用完就删除了,能够接受。
4、通过读取/dev/n.bmp文件,通过fb OSD方式叠加屏幕上显示(看demo有实例,自己堆积代码,调试一下流程即可),
5、使用结束后,删除/dev/n.bmp文件。
//////////当然你通过获取几个数字,然后位置组合,就可以实现几位数字的显示了,例如:998,我的代码中仅仅显示99以内,如果一位数字就显一位,2位就显示2位,没有显示01这种。
//////////超级大,呵呵,这下,满足需求了,而flash占用仅仅20K左右。
///简单制作后,其实可以再做26个英文字母,以及常见的标点符号,这样,就可以超大英文显示了。而且最后整体空间占用也不会太大,弄50个左右的字符,估计压缩后也就是100K以内。就是显示的时候控制好那些字符解压出来即可。
/////////////////////////////代码中有一个缓冲其实没有使用。直接拷贝代码肯定不能运行,好多变量参数没给出,仅供参考流程。
[code]
int Check_InitOSD_ENV()
{
if(fdOSD!=0)
return fdOSD;
///////////////////////////////////////////////
HI_S32 s32Ret = HI_SUCCESS;
HIFB_LAYER_INFO_S stLayerInfo;
HI_BOOL Show;
HI_BOOL bCompress = HI_TRUE;
HIFB_POINT_S stPoint = {0};
struct fb_var_screeninfo stVarInfo;
char file[12] = "/dev/fb0";
HIFB_COLORKEY_S stColorKey;
HI_U32 maxW,maxH,u32Frm;//指的是屏幕宽度高度
//////////////////////////////////////////
strcpy(file, "/dev/fb0");
fdOSD = open(file, O_RDWR, 0);
if(fdOSD < 0)
return 0;
s32Ret = ioctl(fdOSD, FBIOGET_VSCREENINFO, &stVarInfo);
if(s32Ret < 0){
close(fdOSD);fdOSD=0;
return 0;
}
SAMPLE_COMM_VO_GetWH(_VIDOE_OUT_RESOLUTION,(HI_U32*)&_nWndWidth,(HI_U32*)&_nWndHeight,&u32Frm);
maxW=704;
maxH=576;
stVarInfo.xres =maxW;
stVarInfo.yres =maxH;
//虚拟分辨率
stVarInfo.xres_virtual = maxW;
stVarInfo.yres_virtual = maxH;
stVarInfo.red = g_r32;
stVarInfo.green = g_g32;
stVarInfo.blue = g_b32;
stVarInfo.transp = g_a32;
stVarInfo.bits_per_pixel = 32;
stVarInfo.activate=FB_ACTIVATE_NOW;
stVarInfo.xoffset=0;
stVarInfo.yoffset=0;
s32Ret = ioctl(fdOSD, FBIOPUT_VSCREENINFO, &stVarInfo);
if(s32Ret < 0){
close(fdOSD);fdOSD=0;
return 0;
}
stColorKey.bKeyEnable = HI_TRUE;
stColorKey.u32Key = BK_SCR_TRANS_COLOR_KEY;
if (ioctl(fdOSD, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)
{
close(fdOSD);fdOSD=0;
return 0;
}
if (ioctl(fdOSD, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0){
close(fdOSD);fdOSD=0;
return 0;
}
stLayerInfo.BufMode = HIFB_LAYER_BUF_ONE;
stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE; // HIFB_LAYERMASK_BUFMODE HIFB_LAYERMASK_ANTIFLICKER_MODE
stLayerInfo.u32DisplayWidth = _nWndWidth;
stLayerInfo.u32DisplayHeight = _nWndHeight;
stLayerInfo. s32XPos = 0;
stLayerInfo. s32YPos = 0;
stLayerInfo.u32Mask |= HIFB_LAYERMASK_DISPSIZE; //HIFB_LAYERMASK_POS
s32Ret = ioctl(fdOSD, FBIOPUT_LAYER_INFO, &stLayerInfo);
if(s32Ret < 0){
close(fdOSD);fdOSD=0;
return 0;
}
//printf("Check_InitOSD_ENV: pos6.1 \n");
if (ioctl(fdOSD, FBIOPUT_COMPRESSION_HIFB, &bCompress) < 0)
{
close(fdOSD);fdOSD=0;
return 0;
}
Show = HI_TRUE;
if (ioctl(fdOSD, FBIOPUT_SHOW_HIFB, &Show) < 0){
close(fdOSD);fdOSD=0;
return 0;
}
if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&(stOsdCanvasBuf.stCanvas.u32PhyAddr), ((void**)&pOSDBuf),NULL, NULL, maxW*maxH*2)){
close(fdOSD);fdOSD=0;
return 0;
}
stOsdCanvasBuf.stCanvas.u32Height = maxH;
stOsdCanvasBuf.stCanvas.u32Width = maxW;
stOsdCanvasBuf.stCanvas.u32Pitch = maxW*2;
stOsdCanvasBuf.stCanvas.enFmt = HIFB_FMT_ARGB1555;//HIFB_FMT_RGB565 HIFB_FMT_ARGB1555 HIFB_FMT_RGB888
memset(pOSDBuf, BK_SCR_TRANS_COLOR_KEY, stOsdCanvasBuf.stCanvas.u32Pitch*stOsdCanvasBuf.stCanvas.u32Height);
return fdOSD;
}
//清空显示的OSD信息,使避免窗体分割切换时,OSD残影
bool ClearShowOsd()
{
#ifdef SUPPORT_OSD
if(!bCanUseOSD)
return false;
fdOSD=Check_InitOSD_ENV();
if(!fdOSD)
return false;
if(!pOSDBuf)
return false;
HI_S32 s32Ret = HI_SUCCESS;
HI_U32 maxW=704,maxH=576;
///////////////////////////////////////////////////////////////////////////////
memset(pOSDBuf,BK_SCR_TRANS_COLOR_KEY,maxW*maxH*2);
////////////////////////////////////////////////////////////////////
stOsdCanvasBuf.UpdateRect.x = 0;
stOsdCanvasBuf.UpdateRect.y = 0;
stOsdCanvasBuf.UpdateRect.w = maxW;
stOsdCanvasBuf.UpdateRect.h = maxH;
if(fdOSD)
s32Ret = ioctl(fdOSD, FBIO_REFRESH, &stOsdCanvasBuf);
if(s32Ret < 0)
{
DebugInfEx(DBG_LEVEL1,"REFRESH failed!\n");
HI_MPI_SYS_MmzFree(stOsdCanvasBuf.stCanvas.u32PhyAddr, pOSDBuf);
close(fdOSD);
fdOSD=0;
return false;
}
#endif
return true;
}
void CheckInitOsdRGB(char **pOSDRGB)
{
if(!*pOSDRGB){
HI_U32 maxW=704,maxH=576;
*pOSDRGB=new char[maxW*maxH*2];
memset(*pOSDRGB,BK_SCR_TRANS_COLOR_KEY,maxW*maxH*2);
}
}
HI_S32 IVHI_LoadBmp(const HI_CHAR *filename, BITMAP_S *pstBitmap)
{
OSD_SURFACE_S Surface;
OSD_BITMAPFILEHEADER bmpFileHeader;
OSD_BITMAPINFO bmpInfo;
if(GetBmpInfo(filename,&bmpFileHeader,&bmpInfo) < 0)
{
printf("GetBmpInfo err!\n");
return HI_FAILURE;
}
Surface.enColorFmt = OSD_COLOR_FMT_RGB1555;
pstBitmap->pData = malloc(2*(bmpInfo.bmiHeader.biWidth)*(bmpInfo.bmiHeader.biHeight));
if(NULL == pstBitmap->pData)
{
printf("malloc osd memroy err!\n");
return HI_FAILURE;
}
CreateSurfaceByBitMap(filename,&Surface,(HI_U8*)(pstBitmap->pData));
pstBitmap->u32Width = Surface.u16Width;
pstBitmap->u32Height = Surface.u16Height;
pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_1555;
return HI_SUCCESS;
}
void SolveNumBitMap(int nNum,bool bCtreatOkDel)
{
int nNum1=nNum/10;
int nNum2=nNum%10;
bool bOneNum=false;
if(nNum1==0)
bOneNum=true;
char strCmd[128];
memset(strCmd,0,sizeof strCmd);
if(bOneNum){
if(bCtreatOkDel)
sprintf(strCmd,"gzip -cd /root/Num/%d.zip>/dev/%d.bmp",nNum2,nNum2);
else
sprintf(strCmd,"rm /dev/%d.bmp",nNum2);
system(strCmd);
}else{
if(bCtreatOkDel)
sprintf(strCmd,"gzip -cd /root/Num/%d.zip>/dev/%d.bmp",nNum1,nNum1);
else
sprintf(strCmd,"rm /dev/%d.bmp",nNum1);
system(strCmd);
memset(strCmd,0,sizeof strCmd);
if(bCtreatOkDel)
sprintf(strCmd,"gzip -cd /root/Num/%d.zip>/dev/%d.bmp",nNum2,nNum2);
else
sprintf(strCmd,"rm /dev/%d.bmp",nNum2);
system(strCmd);
}
}
////////////////显示当前显示器全局序号
int IVHI_HDEC_ShowDisplayerNum(int nNum)
{
printf("IVHI_HDEC_ShowDisplayerNum :%d bCanUseOSD:%d fdOSD:%d\n",nNum,bCanUseOSD,fdOSD);
if(nNum<0||nNum>99)
return false;
if(bBigGlobolNumShowed){
ClearShowOsd();
bBigGlobolNumShowed=false;
SolveNumBitMap(nNum,false);
return true;
}
if(!bCanUseOSD)
return false;
SolveNumBitMap(nNum,true);
//直接读取相应的bmp图片,然后在fb上显示出来
BITMAP_S stBitmap1;
BITMAP_S stBitmap2;
memset(&stBitmap1,0,sizeof(BITMAP_S));
memset(&stBitmap2,0,sizeof(BITMAP_S));
char strFile[32];
int nNum1=nNum/10;
int nNum2=nNum%10;
bool bOneNum=false;
if(nNum1==0)
bOneNum=true;
memset(strFile,0,sizeof strFile);
int s32Ret=0;
if(bOneNum==false){
sprintf(strFile,"/dev/%d.bmp",nNum1);
if(!IsFileExist(strFile)){
SolveNumBitMap(nNum,false);
return false;
}
s32Ret = IVHI_LoadBmp(strFile, &stBitmap1);
}
memset(strFile,0,sizeof strFile);
sprintf(strFile,"/dev/%d.bmp",nNum2);
if(!IsFileExist(strFile)){
printf("IVHI_HDEC_ShowDisplayerNum :%s not exist\n",strFile);
if (NULL != stBitmap1.pData)
{
free(stBitmap1.pData);
stBitmap1.pData = NULL;
}
SolveNumBitMap(nNum,false);
return false;
}
s32Ret = IVHI_LoadBmp(strFile, &stBitmap2);
///////////////////////////////////////////////
if(bOneNum==false){
printf("bmp 1 w:%d h:%d\n",stBitmap1.u32Width,stBitmap1.u32Height);
}
printf("bmp 2 w:%d h:%d\n",stBitmap2.u32Width,stBitmap2.u32Height);
char *pOSDRGB=NULL;
CheckInitOsdRGB(&pOSDRGB);
fdOSD=Check_InitOSD_ENV();
if(fdOSD<1)
DebugInfEx(DBG_LEVEL4,"fdosd :%d !\n",fdOSD);
if(!fdOSD){
if (NULL != stBitmap1.pData)
{
free(stBitmap1.pData);
stBitmap1.pData = NULL;
}
if (NULL != stBitmap2.pData)
{
free(stBitmap2.pData);
stBitmap2.pData = NULL;
}
SolveNumBitMap(nNum,false);
return false;
}
HIFB_COLORKEY_S stColorKey;
stColorKey.bKeyEnable = HI_TRUE;
stColorKey.u32Key = 0x0;
if (ioctl(fdOSD, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)
{
printf("IVHI_HDEC_ShowDisplayerNum FBIOPUT_COLORKEY_HIFB :%d\n",fdOSD);
close(fdOSD);fdOSD=0;
if (NULL != stBitmap1.pData)
{
free(stBitmap1.pData);
stBitmap1.pData = NULL;
}
if (NULL != stBitmap2.pData)
{
free(stBitmap2.pData);
stBitmap2.pData = NULL;
}
SolveNumBitMap(nNum,false);
return false;
}
/////////////////////////////////////////
bBigGlobolNumShowed=true;
ClearShowOsd();
//////////////////////////////////
HI_U32 maxW=704,maxH=576; //176*288
memset(pOSDBuf,0x0,maxW*maxH*2);
HI_U32 nLeftTopX=176;
HI_U32 nLeftTopY=144;
if(bOneNum==false){
for(HI_U32 y=nLeftTopY;y
if((y-nLeftTopY)>stBitmap1.u32Height)
break;
//少拷贝最后一个像素
memcpy(pOSDBuf+y*maxW+nLeftTopX,stBitmap1.pData+(y-nLeftTopY)*stBitmap1.u32Width*2,stBitmap1.u32Width*2);
}
}
if(bOneNum==false){
nLeftTopX=352;
nLeftTopY=144;
}else{
nLeftTopX=352-88;
nLeftTopY=144;
}
for(HI_U32 y=nLeftTopY;y
if((y-nLeftTopY)>stBitmap2.u32Height)
break;
//少拷贝最后一个像素
memcpy(pOSDBuf+y*maxW+nLeftTopX,stBitmap2.pData+(y-nLeftTopY)*stBitmap2.u32Width*2,stBitmap2.u32Width*2);
}
if(pOSDRGB){
delete pOSDRGB;
pOSDRGB=NULL;
}
///////////////
stOsdCanvasBuf.UpdateRect.x = 0;
stOsdCanvasBuf.UpdateRect.y = 0;
stOsdCanvasBuf.UpdateRect.w = maxW;
stOsdCanvasBuf.UpdateRect.h = maxH;
if(fdOSD)
s32Ret = ioctl(fdOSD, FBIO_REFRESH, &stOsdCanvasBuf);
/////////////////////////////////////////////
if (NULL != stBitmap1.pData)
{
free(stBitmap1.pData);
stBitmap1.pData = NULL;
}
if (NULL != stBitmap2.pData)
{
free(stBitmap2.pData);
stBitmap2.pData = NULL;
}
SolveNumBitMap(nNum,false);
///////////////////////////////////////////////////////
return true;
}[/code]
这几天弄数字矩阵,希望能把某个单元的序号显示出来,但是普通的文字太小,实际使用中根本看不见。现场安装调试带来不便。
//开始想着弄true type矢量字体,看了看相关的支持库,最后一想,这东西太大,太费劲。
自己做了0-9的bmp格式的图片,每张图片原始大小145K,分辨率176*288。10个图片共计1.45M。进过gzip压缩,实际只有20k flash占用,非常满意。这是肯定的,都是黑屏,有效信息非常少,而且单色,压缩成这样应该的。之所以不用jpg,是因为在bmp转jpg过程中,反而会带来边缘的躁动,带来额外信息,对后期压缩成zip,对空间占用反而有影响。
//////操作流程如下。
1、将所有图片在pc上压缩为标准zip格式,例如0.bmp---------0.zip
2、将所有zip文件全部放入roofs指定目录。例如/root/Num/目录下。
3、程序运行中,如果需要某个数字图片,执行命令gzip -cd /root/Num/n.zip>/dev/n.bmp /////由于dev目录是内存目录,肯定是可写的。如果需要多个数字,就都解压出来然后读取。由于对于一个单元来说最多用2个数字,额外内存占用,也就145K*2=300K左右。而且是用完就删除了,能够接受。
4、通过读取/dev/n.bmp文件,通过fb OSD方式叠加屏幕上显示(看demo有实例,自己堆积代码,调试一下流程即可),
5、使用结束后,删除/dev/n.bmp文件。
//////////当然你通过获取几个数字,然后位置组合,就可以实现几位数字的显示了,例如:998,我的代码中仅仅显示99以内,如果一位数字就显一位,2位就显示2位,没有显示01这种。
//////////超级大,呵呵,这下,满足需求了,而flash占用仅仅20K左右。
///简单制作后,其实可以再做26个英文字母,以及常见的标点符号,这样,就可以超大英文显示了。而且最后整体空间占用也不会太大,弄50个左右的字符,估计压缩后也就是100K以内。就是显示的时候控制好那些字符解压出来即可。
/////////////////////////////代码中有一个缓冲其实没有使用。直接拷贝代码肯定不能运行,好多变量参数没给出,仅供参考流程。
[code]
int Check_InitOSD_ENV()
{
if(fdOSD!=0)
return fdOSD;
///////////////////////////////////////////////
HI_S32 s32Ret = HI_SUCCESS;
HIFB_LAYER_INFO_S stLayerInfo;
HI_BOOL Show;
HI_BOOL bCompress = HI_TRUE;
HIFB_POINT_S stPoint = {0};
struct fb_var_screeninfo stVarInfo;
char file[12] = "/dev/fb0";
HIFB_COLORKEY_S stColorKey;
HI_U32 maxW,maxH,u32Frm;//指的是屏幕宽度高度
//////////////////////////////////////////
strcpy(file, "/dev/fb0");
fdOSD = open(file, O_RDWR, 0);
if(fdOSD < 0)
return 0;
s32Ret = ioctl(fdOSD, FBIOGET_VSCREENINFO, &stVarInfo);
if(s32Ret < 0){
close(fdOSD);fdOSD=0;
return 0;
}
SAMPLE_COMM_VO_GetWH(_VIDOE_OUT_RESOLUTION,(HI_U32*)&_nWndWidth,(HI_U32*)&_nWndHeight,&u32Frm);
maxW=704;
maxH=576;
stVarInfo.xres =maxW;
stVarInfo.yres =maxH;
//虚拟分辨率
stVarInfo.xres_virtual = maxW;
stVarInfo.yres_virtual = maxH;
stVarInfo.red = g_r32;
stVarInfo.green = g_g32;
stVarInfo.blue = g_b32;
stVarInfo.transp = g_a32;
stVarInfo.bits_per_pixel = 32;
stVarInfo.activate=FB_ACTIVATE_NOW;
stVarInfo.xoffset=0;
stVarInfo.yoffset=0;
s32Ret = ioctl(fdOSD, FBIOPUT_VSCREENINFO, &stVarInfo);
if(s32Ret < 0){
close(fdOSD);fdOSD=0;
return 0;
}
stColorKey.bKeyEnable = HI_TRUE;
stColorKey.u32Key = BK_SCR_TRANS_COLOR_KEY;
if (ioctl(fdOSD, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)
{
close(fdOSD);fdOSD=0;
return 0;
}
if (ioctl(fdOSD, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0){
close(fdOSD);fdOSD=0;
return 0;
}
stLayerInfo.BufMode = HIFB_LAYER_BUF_ONE;
stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE; // HIFB_LAYERMASK_BUFMODE HIFB_LAYERMASK_ANTIFLICKER_MODE
stLayerInfo.u32DisplayWidth = _nWndWidth;
stLayerInfo.u32DisplayHeight = _nWndHeight;
stLayerInfo. s32XPos = 0;
stLayerInfo. s32YPos = 0;
stLayerInfo.u32Mask |= HIFB_LAYERMASK_DISPSIZE; //HIFB_LAYERMASK_POS
s32Ret = ioctl(fdOSD, FBIOPUT_LAYER_INFO, &stLayerInfo);
if(s32Ret < 0){
close(fdOSD);fdOSD=0;
return 0;
}
//printf("Check_InitOSD_ENV: pos6.1 \n");
if (ioctl(fdOSD, FBIOPUT_COMPRESSION_HIFB, &bCompress) < 0)
{
close(fdOSD);fdOSD=0;
return 0;
}
Show = HI_TRUE;
if (ioctl(fdOSD, FBIOPUT_SHOW_HIFB, &Show) < 0){
close(fdOSD);fdOSD=0;
return 0;
}
if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&(stOsdCanvasBuf.stCanvas.u32PhyAddr), ((void**)&pOSDBuf),NULL, NULL, maxW*maxH*2)){
close(fdOSD);fdOSD=0;
return 0;
}
stOsdCanvasBuf.stCanvas.u32Height = maxH;
stOsdCanvasBuf.stCanvas.u32Width = maxW;
stOsdCanvasBuf.stCanvas.u32Pitch = maxW*2;
stOsdCanvasBuf.stCanvas.enFmt = HIFB_FMT_ARGB1555;//HIFB_FMT_RGB565 HIFB_FMT_ARGB1555 HIFB_FMT_RGB888
memset(pOSDBuf, BK_SCR_TRANS_COLOR_KEY, stOsdCanvasBuf.stCanvas.u32Pitch*stOsdCanvasBuf.stCanvas.u32Height);
return fdOSD;
}
//清空显示的OSD信息,使避免窗体分割切换时,OSD残影
bool ClearShowOsd()
{
#ifdef SUPPORT_OSD
if(!bCanUseOSD)
return false;
fdOSD=Check_InitOSD_ENV();
if(!fdOSD)
return false;
if(!pOSDBuf)
return false;
HI_S32 s32Ret = HI_SUCCESS;
HI_U32 maxW=704,maxH=576;
///////////////////////////////////////////////////////////////////////////////
memset(pOSDBuf,BK_SCR_TRANS_COLOR_KEY,maxW*maxH*2);
////////////////////////////////////////////////////////////////////
stOsdCanvasBuf.UpdateRect.x = 0;
stOsdCanvasBuf.UpdateRect.y = 0;
stOsdCanvasBuf.UpdateRect.w = maxW;
stOsdCanvasBuf.UpdateRect.h = maxH;
if(fdOSD)
s32Ret = ioctl(fdOSD, FBIO_REFRESH, &stOsdCanvasBuf);
if(s32Ret < 0)
{
DebugInfEx(DBG_LEVEL1,"REFRESH failed!\n");
HI_MPI_SYS_MmzFree(stOsdCanvasBuf.stCanvas.u32PhyAddr, pOSDBuf);
close(fdOSD);
fdOSD=0;
return false;
}
#endif
return true;
}
void CheckInitOsdRGB(char **pOSDRGB)
{
if(!*pOSDRGB){
HI_U32 maxW=704,maxH=576;
*pOSDRGB=new char[maxW*maxH*2];
memset(*pOSDRGB,BK_SCR_TRANS_COLOR_KEY,maxW*maxH*2);
}
}
HI_S32 IVHI_LoadBmp(const HI_CHAR *filename, BITMAP_S *pstBitmap)
{
OSD_SURFACE_S Surface;
OSD_BITMAPFILEHEADER bmpFileHeader;
OSD_BITMAPINFO bmpInfo;
if(GetBmpInfo(filename,&bmpFileHeader,&bmpInfo) < 0)
{
printf("GetBmpInfo err!\n");
return HI_FAILURE;
}
Surface.enColorFmt = OSD_COLOR_FMT_RGB1555;
pstBitmap->pData = malloc(2*(bmpInfo.bmiHeader.biWidth)*(bmpInfo.bmiHeader.biHeight));
if(NULL == pstBitmap->pData)
{
printf("malloc osd memroy err!\n");
return HI_FAILURE;
}
CreateSurfaceByBitMap(filename,&Surface,(HI_U8*)(pstBitmap->pData));
pstBitmap->u32Width = Surface.u16Width;
pstBitmap->u32Height = Surface.u16Height;
pstBitmap->enPixelFormat = PIXEL_FORMAT_RGB_1555;
return HI_SUCCESS;
}
void SolveNumBitMap(int nNum,bool bCtreatOkDel)
{
int nNum1=nNum/10;
int nNum2=nNum%10;
bool bOneNum=false;
if(nNum1==0)
bOneNum=true;
char strCmd[128];
memset(strCmd,0,sizeof strCmd);
if(bOneNum){
if(bCtreatOkDel)
sprintf(strCmd,"gzip -cd /root/Num/%d.zip>/dev/%d.bmp",nNum2,nNum2);
else
sprintf(strCmd,"rm /dev/%d.bmp",nNum2);
system(strCmd);
}else{
if(bCtreatOkDel)
sprintf(strCmd,"gzip -cd /root/Num/%d.zip>/dev/%d.bmp",nNum1,nNum1);
else
sprintf(strCmd,"rm /dev/%d.bmp",nNum1);
system(strCmd);
memset(strCmd,0,sizeof strCmd);
if(bCtreatOkDel)
sprintf(strCmd,"gzip -cd /root/Num/%d.zip>/dev/%d.bmp",nNum2,nNum2);
else
sprintf(strCmd,"rm /dev/%d.bmp",nNum2);
system(strCmd);
}
}
////////////////显示当前显示器全局序号
int IVHI_HDEC_ShowDisplayerNum(int nNum)
{
printf("IVHI_HDEC_ShowDisplayerNum :%d bCanUseOSD:%d fdOSD:%d\n",nNum,bCanUseOSD,fdOSD);
if(nNum<0||nNum>99)
return false;
if(bBigGlobolNumShowed){
ClearShowOsd();
bBigGlobolNumShowed=false;
SolveNumBitMap(nNum,false);
return true;
}
if(!bCanUseOSD)
return false;
SolveNumBitMap(nNum,true);
//直接读取相应的bmp图片,然后在fb上显示出来
BITMAP_S stBitmap1;
BITMAP_S stBitmap2;
memset(&stBitmap1,0,sizeof(BITMAP_S));
memset(&stBitmap2,0,sizeof(BITMAP_S));
char strFile[32];
int nNum1=nNum/10;
int nNum2=nNum%10;
bool bOneNum=false;
if(nNum1==0)
bOneNum=true;
memset(strFile,0,sizeof strFile);
int s32Ret=0;
if(bOneNum==false){
sprintf(strFile,"/dev/%d.bmp",nNum1);
if(!IsFileExist(strFile)){
SolveNumBitMap(nNum,false);
return false;
}
s32Ret = IVHI_LoadBmp(strFile, &stBitmap1);
}
memset(strFile,0,sizeof strFile);
sprintf(strFile,"/dev/%d.bmp",nNum2);
if(!IsFileExist(strFile)){
printf("IVHI_HDEC_ShowDisplayerNum :%s not exist\n",strFile);
if (NULL != stBitmap1.pData)
{
free(stBitmap1.pData);
stBitmap1.pData = NULL;
}
SolveNumBitMap(nNum,false);
return false;
}
s32Ret = IVHI_LoadBmp(strFile, &stBitmap2);
///////////////////////////////////////////////
if(bOneNum==false){
printf("bmp 1 w:%d h:%d\n",stBitmap1.u32Width,stBitmap1.u32Height);
}
printf("bmp 2 w:%d h:%d\n",stBitmap2.u32Width,stBitmap2.u32Height);
char *pOSDRGB=NULL;
CheckInitOsdRGB(&pOSDRGB);
fdOSD=Check_InitOSD_ENV();
if(fdOSD<1)
DebugInfEx(DBG_LEVEL4,"fdosd :%d !\n",fdOSD);
if(!fdOSD){
if (NULL != stBitmap1.pData)
{
free(stBitmap1.pData);
stBitmap1.pData = NULL;
}
if (NULL != stBitmap2.pData)
{
free(stBitmap2.pData);
stBitmap2.pData = NULL;
}
SolveNumBitMap(nNum,false);
return false;
}
HIFB_COLORKEY_S stColorKey;
stColorKey.bKeyEnable = HI_TRUE;
stColorKey.u32Key = 0x0;
if (ioctl(fdOSD, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)
{
printf("IVHI_HDEC_ShowDisplayerNum FBIOPUT_COLORKEY_HIFB :%d\n",fdOSD);
close(fdOSD);fdOSD=0;
if (NULL != stBitmap1.pData)
{
free(stBitmap1.pData);
stBitmap1.pData = NULL;
}
if (NULL != stBitmap2.pData)
{
free(stBitmap2.pData);
stBitmap2.pData = NULL;
}
SolveNumBitMap(nNum,false);
return false;
}
/////////////////////////////////////////
bBigGlobolNumShowed=true;
ClearShowOsd();
//////////////////////////////////
HI_U32 maxW=704,maxH=576; //176*288
memset(pOSDBuf,0x0,maxW*maxH*2);
HI_U32 nLeftTopX=176;
HI_U32 nLeftTopY=144;
if(bOneNum==false){
for(HI_U32 y=nLeftTopY;y
break;
//少拷贝最后一个像素
memcpy(pOSDBuf+y*maxW+nLeftTopX,stBitmap1.pData+(y-nLeftTopY)*stBitmap1.u32Width*2,stBitmap1.u32Width*2);
}
}
if(bOneNum==false){
nLeftTopX=352;
nLeftTopY=144;
}else{
nLeftTopX=352-88;
nLeftTopY=144;
}
for(HI_U32 y=nLeftTopY;y
break;
//少拷贝最后一个像素
memcpy(pOSDBuf+y*maxW+nLeftTopX,stBitmap2.pData+(y-nLeftTopY)*stBitmap2.u32Width*2,stBitmap2.u32Width*2);
}
if(pOSDRGB){
delete pOSDRGB;
pOSDRGB=NULL;
}
///////////////
stOsdCanvasBuf.UpdateRect.x = 0;
stOsdCanvasBuf.UpdateRect.y = 0;
stOsdCanvasBuf.UpdateRect.w = maxW;
stOsdCanvasBuf.UpdateRect.h = maxH;
if(fdOSD)
s32Ret = ioctl(fdOSD, FBIO_REFRESH, &stOsdCanvasBuf);
/////////////////////////////////////////////
if (NULL != stBitmap1.pData)
{
free(stBitmap1.pData);
stBitmap1.pData = NULL;
}
if (NULL != stBitmap2.pData)
{
free(stBitmap2.pData);
stBitmap2.pData = NULL;
}
SolveNumBitMap(nNum,false);
///////////////////////////////////////////////////////
return true;
}[/code]
展开》
折叠》