ngswfx

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx  发布于  2016-06-16 15:03:07
采纳率 0%
55个问答
17959

FBI 叠加自定义中文字库 做OSD用,或者叠加其他信息

 
本帖最后由 ngswfx 于 2016-6-22 19:08 编辑

基本思路是:先把字库中的文字叠加到图片buffer上,叠加的时候如果能先得到背景的现在图片,最好了,就可以取反,这样任何光线环境都可以看清文字。
              然后再把这个图片以图形层的方式叠加到输出的主高清通道HD0上即可。
      中间生成文字图片的过程一次完成,可以在线程内执行,通常每秒处理一次即可。这样就可以实现OSD时间,各种文字信息的叠加。

我这边实现的是整个Debug调试信息的叠加,有20行。
   
由于代码在我的整个项目内,还没有搞清爽,所以摘主要关键的传上来大家参考。

其他的部分,参考SDK里面的那个叠加llogo图片的例子,注意把背景色都弄成黑色0x0即可,透出输出的视频了。

附件中,有汉字的字库,本文仅仅使用HZ16Lib.c即可,直接添加到自己的工程里就可以了。如果嫌弃自体小,还可以找24或者32的字库,基础图片可以小一倍,然后叠加时,对缓冲进行放大,要用到那个TDE处理一下缩放,这样效率高些。

我这边输出现在是1024*768,图片用的也是1024*768,所以没用TDE缩放,效率没问题,3520速度很快,我叠加了20行debug信息,都没事,每秒才处理1次。



[code]
    #define                                 USE_CHINESE_WORD_LIB_OSD
    #define                                        HZLIB_ZISE                16
    #define                                        UInt32        unsigned int
    #define                                        UInt16        unsigned short
    #define                                        UInt8        unsigned char
    #define                                        Int8        char
    #define                                        CLIP(a,b,c)    (((a)<(b))?(b):(((a)>(c))?(c):(a)))
    #define                                        UCLIPI(a,b)    CLIP(a,0,b)
    #define                                        HZLIB_ZISE                16
    #define                                        MUX(a,b,c)     ((a)?(b):(c))
    #define                                        INONZERO(a,b)     MUX(a,0,b)
    #define                                        UBYTESEL(a, n)        ( (a>>(8*n)) && 0xff)
    extern int                         g_real_HZ16_count;
    extern unsigned short HZ16_Space[];
    extern unsigned char         HZ16Lib[];

    #define MAX_SUPPORT_OSD_LINES                           4
    #define MAX_SUPPORT_OSD_CHAR_NUM_ONE_LINE  32   //一行最大支持的字符数目
    typedef struct IVHI_OSDEX
    {
            bool bUse;//用于高速判断用
            int  nDisplay;//哪个显示器,第几个输出通道,对于3520等,只有一个,所以为0
            int  nChl;//这个指的是某个显示通道,例如某个屏幕上的某个画面
            int  nSupportLines;//支持的行数
            int  nPosX[MAX_SUPPORT_OSD_LINES];//坐标
            int  nPosY[MAX_SUPPORT_OSD_LINES];
            int  nColor[MAX_SUPPORT_OSD_LINES];//字符颜色
            char strInf[MAX_SUPPORT_OSD_LINES][MAX_SUPPORT_OSD_CHAR_NUM_ONE_LINE];
    }IVHI_OSD;
    IVHI_OSD                                                                                        videoChlOsd[MAX_SUPPORT_DEC_VIDEO_CHL];
    int                                 fdOSD                                                        =0;
    char *                                pOSDYuv                                                        =NULL;
    HIFB_BUFFER_S                 stOsdCanvasBuf;
    HI_U16 *                        pOSDBuf=NULL;
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    #define BK_SCR_TRANS_COLOR_KEY                                                 0x01   //背景透明色

    void YtoRGB1555ToChar(unsigned char Y,unsigned char *rgb1555_0,unsigned char *rgb1555_1,int nColor)
    {
            if(Y>0x01){
                    Y=0xF0;
                    switch(nColor){
                    case 0://白色
                            *rgb1555_0=0xFF;
                            *rgb1555_1=0xFF;
                    break;
                    case 1://
                            *rgb1555_0=0x80;
                            *rgb1555_1=0x80;
                            break;
                    case 2:
                            *rgb1555_0=0xFF;
                            *rgb1555_1=0x80;
                            break;
                    case 3:
                            *rgb1555_0=0x14;
                            *rgb1555_1=0x14;
                            break;
                    }
                    return;
            }
    }

    void DrawOSD(unsigned char *buf, unsigned short *hzLib,int stride,int nColor)
    {
            int i, font;
            int        lumi;
            bool lum=true;
            int *p1 = (int *)(buf+(stride<<4));
            float mult_f = (float)(lum?0.20:1);
            mult_f=0.5;
            float mult_b = 1 - mult_f;
            int avglum = (buf[0] + buf[1] + buf[2] + buf[3] + buf[4] +buf[5] + buf[6] + buf[7] + buf[8] + buf[9] + buf[10] +buf[11] + buf[12] + buf[13] + buf[14] + buf[15])/16;
            if(!lum&&(avglum>145))
                    lumi = 0x1;
            else
                    lumi = 0xff;
            //1字节个亮度信息转为2字节1555
            int nD=2;//翻倍
            unsigned short Y;
            int nPos=0;
            for (i=0; i<16; i++) {
                    font = *hzLib ++;
                    ///////////////  这里修改一下,如果开始的buf里面是背景数据的话,通过调整上面的几个参数可以实现取反,主要是avglum的作用,它先计算开始的数据情况,然后如果背景亮度大于145就变黑,我没搞到视频数据,所以暂时没实现,这里有点乱
            //        for (int j=0; j<32; j++) {
            //                buf[j]=BK_SCR_TRANS_COLOR_KEY;
            //        }
                    nPos=0;//buf[0*nD]和buf[0*nD+1] 2个字节就是1555
                    Y   = (unsigned char)MUX(font&0x0080, lumi*mult_f+buf[0*nD]*mult_b, buf[0*nD]); //这个就是一个Y 变成1555 2个字节
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=1;
                    Y   = (unsigned char)MUX(font&0x0040, lumi*mult_f+buf[1*nD]*mult_b, buf[1*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=2;
                    Y   = (unsigned char)MUX(font&0x0020, lumi*mult_f+buf[2*nD]*mult_b, buf[2*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=3;
                    Y   = (unsigned char)MUX(font&0x0010, lumi*mult_f+buf[3*nD]*mult_b, buf[3*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=4;
                    Y   = (unsigned char)MUX(font&0x0008, lumi*mult_f+buf[4*nD]*mult_b, buf[4*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=5;
                    Y   = (unsigned char)MUX(font&0x0004, lumi*mult_f+buf[5*nD]*mult_b,buf[5*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=6;
                    Y   = (unsigned char)MUX(font&0x0002, lumi*mult_f+buf[6*nD]*mult_b,buf[6*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=7;
                    Y   = (unsigned char)MUX(font&0x0001, lumi*mult_f+buf[7*nD]*mult_b,buf[7*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=8;
                    Y   = (unsigned char)MUX(font&0x8000, lumi*mult_f+buf[8*nD]*mult_b,buf[8*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=9;
                    Y   = (unsigned char)MUX(font&0x4000, lumi*mult_f+buf[9*nD]*mult_b,buf[9*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=10;
                    Y = (unsigned char)MUX(font&0x2000, lumi*mult_f+buf[10*nD]*mult_b,  buf[10*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=11;
                    Y = (unsigned char)MUX(font&0x1000, lumi*mult_f+buf[11*nD]*mult_b,  buf[11*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=12;
                    Y = (unsigned char)MUX(font&0x0800, lumi*mult_f+buf[12*nD]*mult_b,  buf[12*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=13;
                    Y = (unsigned char)MUX(font&0x0400, lumi*mult_f+buf[13*nD]*mult_b,  buf[13*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=14;
                    Y = (unsigned char)MUX(font&0x0200, lumi*mult_f+buf[14*nD]*mult_b,  buf[14*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    nPos=15;
                    Y = (unsigned char)MUX(font&0x0100, lumi*mult_f+buf[15*nD]*mult_b,  buf[15*nD]);
                    YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
                    /////////////////////////////////////////
                    buf += stride*2;
            }

    }
    int        ShowOSD_MX(unsigned char *pBase, char *pStr, unsigned short x, unsigned short y,int width, int height,int nColor)
    {
            if(!pBase||!pStr||width<1||height<1||x>width||y>=height)
                    return 0;
            UInt32 nChar=0,wd=0,nOffset=0,nSize, l, r;
    #if defined USE_CHINESE_WORD_LIB_OSD
            Int8 q=3;
            Int8 w;
            Int8 *p=(char *)pStr;
            UInt8 *pHZLib=0;
            UInt8        *pp = (unsigned char *)p;
            pBase += width*2*y+x*2;
            while (*p) {
                    pp = (unsigned char *)p;
                    q = *p&0x80?(*p++)-161:2; // Get qu code
                    w=((*p++)&0x7f)-33; // Get wei code
                    if ((int)(nOffset = q*94+w) >= g_real_HZ16_count)
                            continue;
                    pHZLib = (HZ16Lib+(nOffset<<5));
                    if (q<10) {
                            l = UBYTESEL(HZ16_Space[nOffset],1);
                            r = UBYTESEL(HZ16_Space[nOffset],0);
                            nSize = HZLIB_ZISE-(l+r);
                    }
                    else {
                            nSize = HZLIB_ZISE;
                            l = r = 0;
                    }
                    if ((int)(x+wd+nSize)>width)
                            break;
                    DrawOSD(pBase+(wd+nChar)*2,(unsigned short *)pHZLib,width,nColor);
                    nChar++;
                    wd += 14;//12 自体间距
            }
    #endif
            return nChar;
    }

    void ShowSysWorkInfOSD()
    {
            if(!pOSDYuv)
                    return;
            //DebugInfEx(DBG_LEVEL1,"ShowSysWorkInfOSD in %d\n",GetTickCount());
            //CPU
            int nLineDisY=16;
            int nLineDisX=16;
            int nPosYAdd=20;
            SYSTEMTIME sysTime;
            GetLocalTime(&sysTime);
            char strINF[MAX_SUPPORT_OSD_DEBUG_INF_CHAR_NUM];
            memset(strINF,0,sizeof strINF);
            sprintf(strINF,"CPU:%d%",IVComInf_GetCpuPercent());
            ShowOSD_MX((unsigned char *)pOSDYuv,strINF,nLineDisX,nLineDisY,nWndWidth,nWndHeight,0);
            //内存
            nLineDisY+=nPosYAdd;
            memset(strINF,0,sizeof strINF);
            sprintf(strINF,"MEM:%d%",IVComInf_GetMemPercent());
            ShowOSD_MX((unsigned char *)pOSDYuv,strINF,nLineDisX,nLineDisY,nWndWidth,nWndHeight,0);
            //网络
            nLineDisY+=nPosYAdd;
            memset(strINF,0,sizeof strINF);
            char strNetCardName[32];
            char strIP[32];
            char strMask[32];
            char strGate[32];
            IVComInf_GetLocalNetPara(0,strNetCardName,strIP,strMask,strGate,NULL);
            sprintf(strINF,"NET:%d%",IVComInf_GetNetPercent(),strNetCardName,strIP,strMask,strGate);
            ShowOSD_MX((unsigned char *)pOSDYuv,strINF,nLineDisX,nLineDisY,nWndWidth,nWndHeight,0);
            //硬盘 FLASH
            nLineDisY+=nPosYAdd;
            memset(strINF,0,sizeof strINF);
            sprintf(strINF,"DISK:16M (32M)");
            ShowOSD_MX((unsigned char *)pOSDYuv,strINF,nLineDisX,nLineDisY,nWndWidth,nWndHeight,0);
            //通道总数
            nLineDisY+=nPosYAdd;
            memset(strINF,0,sizeof strINF);
            sprintf(strINF,"通道总数:4");
            ShowOSD_MX((unsigned char *)pOSDYuv,strINF,nLineDisX,nLineDisY,nWndWidth,nWndHeight,0);
            //分割数
            nLineDisY+=nPosYAdd;
            memset(strINF,0,sizeof strINF);
            sprintf(strINF,"分割数:4");
            ShowOSD_MX((unsigned char *)pOSDYuv,strINF,nLineDisX,nLineDisY,nWndWidth,nWndHeight,0);
            //时间
            nLineDisY+=nPosYAdd;
            memset(strINF,0,sizeof strINF);
            sprintf(strINF,"TIME:%04d-%02d-%02d/%02d:%02d:%02d-%d\n",sysTime.wYear,sysTime.wMonth,sysTime.wDay,sysTime.wHour,sysTime.wMinute,sysTime.wSecond,GetTickCount());
            ShowOSD_MX((unsigned char *)pOSDYuv,strINF,nLineDisX,nLineDisY,nWndWidth,nWndHeight,0);
            //return ;
            //DEBUG 信息
            nLineDisY=nWndHeight-32;
            for(int i=0;i                     if(strlen(lastDebugString)>0){
                            memset(strINF,0,sizeof strINF);
                            sprintf(strINF,"%s",lastDebugString);
                            ShowOSD_MX((unsigned char *)pOSDYuv,strINF,nLineDisX,nLineDisY,nWndWidth,nWndHeight,0);
                            nLineDisY-=nPosYAdd;
                    }
            }
    }

    /////////////////////////////////
    void Check_DeInitOSD()
    {
            if(!bCanUseOSD)
                    return;
            bCanUseOSD=false;
            if(fdOSD){
                    close(fdOSD);
                    fdOSD=0;
            }
            if(stOsdCanvasBuf.stCanvas.u32PhyAddr){
                    HI_MPI_SYS_MmzFree(stOsdCanvasBuf.stCanvas.u32PhyAddr, pOSDBuf);
                    stOsdCanvasBuf.stCanvas.u32PhyAddr=NULL;
                    pOSDBuf=NULL;
                    memset(&stOsdCanvasBuf,0,sizeof stOsdCanvasBuf);
            }
            if(pOSDYuv){
                    delete pOSDYuv;
                    pOSDYuv=NULL;
            }
    }
    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;
            if (ioctl(fdOSD, FBIOPUT_COMPRESSION_HIFB, &bCompress) < 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;
            }
            s32Ret = ioctl(fdOSD, FBIOGET_VSCREENINFO, &stVarInfo);
            if(s32Ret < 0){
                    close(fdOSD);fdOSD=0;
                    return 0;
            }
            if (ioctl(fdOSD, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0){
                    close(fdOSD);fdOSD=0;
                    return 0;
            }
            SAMPLE_COMM_VO_GetWH(VIDOE_OUT_RESOLUTION, &maxW,&maxH,&u32Frm);
            stVarInfo.xres = stVarInfo.xres_virtual = maxW;
            stVarInfo.yres = stVarInfo.yres_virtual = maxH;
            s32Ret = ioctl(fdOSD, FBIOPUT_VSCREENINFO, &stVarInfo);
            if(s32Ret < 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
            s32Ret = ioctl(fdOSD, FBIOPUT_LAYER_INFO, &stLayerInfo);
            if(s32Ret < 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);
            if(!pOSDYuv)
                    pOSDYuv=new char[maxW*maxH*2];
        return fdOSD;
    }[/code]


//////先调用Check_InitOSD_ENV()准备好OSD 的FBI环境,然后调用ShowSysWorkInfOSD()就看到中文字了。
易百纳技术社区文件: HZ16Lib.c.tar.gz
下载
易百纳技术社区文件: HIFB_HZ.tar.gz
下载
易百纳技术社区文件: hifb.tar.gz
下载
我来回答
回答69个
时间排序
认可量排序

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-17 16:43:33
认可0
3520D HIFB 叠加中文效果图

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-17 19:12:32
认可0
:lol,多谢版主,还是加精挣钱快。

goodman

2个粉丝

30

问答

18

专栏

17

资料

goodman 2016-06-18 18:38:06
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=31902&ptid=11624]ngswfx 发表于 2016-6-17 19:12[/url]
,多谢版主,还是加精挣钱快。[/quote]

应该的,发的贴很棒,当然要加精!:lol

lejianz

0个粉丝

1

问答

0

专栏

1

资料

lejianz 2016-06-19 16:13:11
认可0
真的很好,多谢

love_lin

1个粉丝

22

问答

0

专栏

1

资料

love_lin 2016-06-20 11:21:59
认可0
本帖最后由 love_lin 于 2016-6-20 11:29 编辑

至于上周六我提出来的背景半透明,以后我会慢慢研究。然而我就是连续调用你的几个函数接口,还是没办法显示中文,代码如下:
//请帮忙看下是什么原因,调用您的接口都没有变化的,查了半天还是不知道为何,只是把您的字库换成头文件来调用,应该也是可以的!!
[code]/*
* =====================================================
*
*       Filename:  osd_menu.c
*
*    Description:  osd menu
*
*        Version:  
*        Created:  2016年06月03日 10时03分32秒
*       Revision:  none
*       Compiler:  arm-hisiv300-linux-gcc
*
*         Author:  CharLee
*   Organization:  Xiamen CloudTop Technology Co.,LTD
*
* =====================================================
*/

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

#include "sample_comm.h"

#include
#include "hifb.h"
#include "loadbmp.h"
#include "hi_tde_api.h"
#include "hi_tde_type.h"
#include "hi_tde_errcode.h"
#include "HZ16Lib.h"

#define WIDTH_1920             1920
#define HEIGHT_1080            1080
#define WIDTH_720              720
#define HEIGHT_576             576

#define SAMPLE_IMAGE_WIDTH     720
#define SAMPLE_IMAGE_HEIGHT    576
#define SAMPLE_IMAGE_SIZE      (720*576*2)
#define SAMPLE_IMAGE_NUM       20
#define HIFB_RED_1555   0xFC00

#define GRAPHICS_LAYER_G0  0

#define                                        HZLIB_ZISE                16
#define                                        UInt32        unsigned int
#define                                        UInt16        unsigned short
#define                                        UInt8        unsigned char
#define                                        Int8        char
#define                                        CLIP(a,b,c)    (((a)<(b))?(b):(((a)>(c))?(c):(a)))
#define                                        UCLIPI(a,b)    CLIP(a,0,b)
//#define                                        HZLIB_ZISE                16
#define                                        MUX(a,b,c)     ((a)?(b):(c))
#define                                        INONZERO(a,b)     MUX(a,0,b)
#define                                        UBYTESEL(a, n)        ( (a>>(8*n)) && 0xff)

static struct fb_bitfield s_r16 = {10, 5, 0};
static struct fb_bitfield s_g16 = {5, 5, 0};
static struct fb_bitfield s_b16 = {0, 5, 0};
static struct fb_bitfield s_a16 = {15, 1, 0};


//#define MAX_SUPPORT_DEC_VIDEO_CHL 1
//#define MAX_SUPPORT_OSD_LINES                           4
//#define MAX_SUPPORT_OSD_CHAR_NUM_ONE_LINE  32   //一行最大支持的字符数目

char * pOSDRGB = NULL;

void YtoRGB1555ToChar(unsigned char Y,unsigned char *rgb1555_0,unsigned char *rgb1555_1,int nColor)
{
    if(Y>0x01){
            Y=0xF0;
            switch(nColor){
            case 0://白色
                    *rgb1555_0=0xFF;
                    *rgb1555_1=0xFF;
            break;
            case 1://
                    *rgb1555_0=0x80;
                    *rgb1555_1=0x80;
                    break;
            case 2:
                    *rgb1555_0=0xFF;
                    *rgb1555_1=0x80;
                    break;
            case 3:
                    *rgb1555_0=0x14;
                    *rgb1555_1=0x14;
                    break;
            }
            return;
    }
}

void DrawOSD(unsigned char *buf, unsigned short *hzLib,int stride,int nColor)
{
    int i, font;
    int        lumi;
    bool lum=true;
    int *p1 = (int *)(buf+(stride<<4));
    float mult_f = (float)(lum?0.20:1);
    mult_f=0.5;
    float mult_b = 1 - mult_f;
    int avglum = (buf[0] + buf[1] + buf[2] + buf[3] + buf[4] +buf[5] + buf[6] + buf[7] + buf[8] + buf[9] + buf[10] +buf[11] + buf[12] + buf[13] + buf[14] + buf[15])/16;
    if(!lum&&(avglum>145))
            lumi = 0x1;
    else
            lumi = 0xff;
    //1字节个亮度信息转为2字节1555
    int nD=2;//翻倍
    unsigned short Y;
    int nPos=0;
    for (i=0; i<16; i++) {
            font = *hzLib ++;
            nPos=0;//buf[0*nD]和buf[0*nD+1] 2个字节就是1555
            Y   = (unsigned char)MUX(font&0x0080, lumi*mult_f+buf[0*nD]*mult_b, buf[0*nD]); //这个就是一个Y 变成1555 2个字节
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=1;
            Y   = (unsigned char)MUX(font&0x0040, lumi*mult_f+buf[1*nD]*mult_b, buf[1*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=2;
            Y   = (unsigned char)MUX(font&0x0020, lumi*mult_f+buf[2*nD]*mult_b, buf[2*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=3;
            Y   = (unsigned char)MUX(font&0x0010, lumi*mult_f+buf[3*nD]*mult_b, buf[3*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=4;
            Y   = (unsigned char)MUX(font&0x0008, lumi*mult_f+buf[4*nD]*mult_b, buf[4*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=5;
            Y   = (unsigned char)MUX(font&0x0004, lumi*mult_f+buf[5*nD]*mult_b,buf[5*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=6;
            Y   = (unsigned char)MUX(font&0x0002, lumi*mult_f+buf[6*nD]*mult_b,buf[6*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=7;
            Y   = (unsigned char)MUX(font&0x0001, lumi*mult_f+buf[7*nD]*mult_b,buf[7*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=8;
            Y   = (unsigned char)MUX(font&0x8000, lumi*mult_f+buf[8*nD]*mult_b,buf[8*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=9;
            Y   = (unsigned char)MUX(font&0x4000, lumi*mult_f+buf[9*nD]*mult_b,buf[9*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=10;
            Y = (unsigned char)MUX(font&0x2000, lumi*mult_f+buf[10*nD]*mult_b,  buf[10*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=11;
            Y = (unsigned char)MUX(font&0x1000, lumi*mult_f+buf[11*nD]*mult_b,  buf[11*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=12;
            Y = (unsigned char)MUX(font&0x0800, lumi*mult_f+buf[12*nD]*mult_b,  buf[12*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=13;
            Y = (unsigned char)MUX(font&0x0400, lumi*mult_f+buf[13*nD]*mult_b,  buf[13*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=14;
            Y = (unsigned char)MUX(font&0x0200, lumi*mult_f+buf[14*nD]*mult_b,  buf[14*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            nPos=15;
            Y = (unsigned char)MUX(font&0x0100, lumi*mult_f+buf[15*nD]*mult_b,  buf[15*nD]);
            YtoRGB1555ToChar(Y,buf+nPos*nD,buf+nPos*nD+1,nColor);
            
                        buf += stride*2;
    }

}
int  ShowOSD_DEC_BOX_MX(unsigned char *pBase, char *pStr, unsigned short x, unsigned short y,int width, int height,int nColor)
{
    if(!pBase||!pStr||width<1||height<1||x>width||y>=height)
            return 0;
    UInt32 nChar=0,wd=0,nOffset=0,nSize, l, r;

    Int8 q=3;
    Int8 w;
    Int8 *p=(char *)pStr;
    UInt8 *pHZLib=0;
    UInt8        *pp = (unsigned char *)p;
    pBase += width*2*y+x*2;
    while (*p) {
            pp = (unsigned char *)p;
            q = *p&0x80?(*p++)-161:2; // Get qu code
            w=((*p++)&0x7f)-33; // Get wei code
            if ((int)(nOffset = q*94+w) >= g_real_HZ16_count)
                    continue;
            pHZLib = (HZ16Lib+(nOffset<<5));
            if (q<10) {
                    l = UBYTESEL(HZ16_Space[nOffset],1);
                    r = UBYTESEL(HZ16_Space[nOffset],0);
                    nSize = HZLIB_ZISE-(l+r);
            }
            else {
                    nSize = HZLIB_ZISE;
                    l = r = 0;
            }
            if ((int)(x+wd+nSize)>width)
                    break;
            DrawOSD(pBase+(wd+nChar)*2,(unsigned short *)pHZLib,width,nColor);
            nChar++;
            wd += 14;//12 自体间距
    }

    return nChar;
}

static int OSD_MENU_Init()
{
        int nWndWidth = WIDTH_720;
        int nWndHeight = HEIGHT_576;
        ShowOSD_DEC_BOX_MX((unsigned char *)pOSDRGB,"IP:192.168.0.27",128,64,nWndWidth,nWndHeight,0);
        ShowOSD_DEC_BOX_MX((unsigned char *)pOSDRGB,"OSD 菜单",128,128,nWndWidth,nWndHeight,0);
        ShowOSD_DEC_BOX_MX((unsigned char *)pOSDRGB,"CloudTop@CharLee",128,192,nWndWidth,nWndHeight,0);
        ShowOSD_DEC_BOX_MX((unsigned char *)pOSDRGB,"通道号(chl): 0",128,256,nWndWidth,nWndHeight,0);
        ShowOSD_DEC_BOX_MX((unsigned char *)pOSDRGB,"中文测试,能否正常显示",128,320,nWndWidth,nWndHeight,2);
        return 0;
}

HI_S32 OSD_MENU_HIFB_Refresh()
{
    HI_S32 s32Ret = HI_SUCCESS;
    HIFB_LAYER_INFO_S stLayerInfo = {0};
    HIFB_BUFFER_S stCanvasBuf;
    HI_U16* pBuf;
    HI_U8* pDst = NULL;
    //HI_U32 x;
    //HI_U32 y;
    //HI_U32 i;
    HI_CHAR image_name[128];
    HI_BOOL bShow;
    HIFB_POINT_S stPoint = {0};
    struct fb_var_screeninfo stVarInfo;
    HI_CHAR file[12] = "/dev/fb0";
    HI_U32 maxW;
    HI_U32 maxH;
        int fd;
    HIFB_COLORKEY_S stColorKey;
    TDE2_RECT_S stSrcRect, stDstRect;
    TDE2_SURFACE_S stSrc, stDst;
    HI_U32 Phyaddr;
    TDE_HANDLE s32Handle;

    fd = open("/dev/fb0", O_RDWR, 0);
    if (fd < 0)
    {
        SAMPLE_PRT("open %s failed!\n", file);
        return HI_NULL;
    }
    /*all layer surport colorkey*/
    stColorKey.bKeyEnable = HI_TRUE;
    stColorKey.u32Key = 0x0;
    if (ioctl(fd, FBIOPUT_COLORKEY_HIFB, &stColorKey) < 0)
    {
        SAMPLE_PRT("FBIOPUT_COLORKEY_HIFB!\n");
        close(fd);
        return HI_NULL;
    }
    s32Ret = ioctl(fd, FBIOGET_VSCREENINFO, &stVarInfo);
    if (s32Ret < 0)
    {
        SAMPLE_PRT("GET_VSCREENINFO failed!\n");
        close(fd);
        return HI_NULL;
    }

    if (ioctl(fd, FBIOPUT_SCREEN_ORIGIN_HIFB, &stPoint) < 0)
    {
        SAMPLE_PRT("set screen original show position failed!\n");
        close(fd);
        return HI_NULL;
    }

        maxW = WIDTH_720;
    maxH = HEIGHT_576;

    stVarInfo.transp = s_a16;
    stVarInfo.red = s_r16;
    stVarInfo.green = s_g16;
    stVarInfo.blue = s_b16;
    stVarInfo.bits_per_pixel = 16;
    stVarInfo.activate = FB_ACTIVATE_NOW;
    stVarInfo.xres = stVarInfo.xres_virtual = maxW;
    stVarInfo.yres = stVarInfo.yres_virtual = maxH;
    s32Ret = ioctl(fd, FBIOPUT_VSCREENINFO, &stVarInfo);
    if (s32Ret < 0)
    {
        SAMPLE_PRT("PUT_VSCREENINFO failed!\n");
        close(fd);
        return HI_NULL;
    }
    stLayerInfo.BufMode = HIFB_LAYER_BUF_NONE;
    stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE;

    s32Ret = ioctl(fd, FBIOPUT_LAYER_INFO, &stLayerInfo);
    if (s32Ret < 0)
    {
        SAMPLE_PRT("PUT_LAYER_INFO failed!\n");
        close(fd);
        return HI_NULL;
    }
    bShow = HI_TRUE;
    if (ioctl(fd, FBIOPUT_SHOW_HIFB, &bShow) < 0)
    {
        SAMPLE_PRT("FBIOPUT_SHOW_HIFB failed!\n");
        close(fd);
        return HI_NULL;
    }

    if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&(stCanvasBuf.stCanvas.u32PhyAddr), ((void**)&pBuf),
                                          NULL, NULL, maxW * maxH * 2))
    {
        SAMPLE_PRT("allocate memory (maxW*maxH*2 bytes) failed\n");
        close(fd);
        return HI_NULL;
    }
    stCanvasBuf.stCanvas.u32Height = maxH;
    stCanvasBuf.stCanvas.u32Width = maxW;
    stCanvasBuf.stCanvas.u32Pitch = maxW * 2;
    stCanvasBuf.stCanvas.enFmt = HIFB_FMT_ARGB1555;
    memset(pBuf, 0x00, stCanvasBuf.stCanvas.u32Pitch * stCanvasBuf.stCanvas.u32Height);

    /*change bmp*/
    if (HI_FAILURE == HI_MPI_SYS_MmzAlloc(&Phyaddr, ((void**)&pOSDRGB),
                                          NULL, NULL, SAMPLE_IMAGE_WIDTH * SAMPLE_IMAGE_HEIGHT * 2))
    {
        SAMPLE_PRT("allocate memory  failed\n");
        HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
        close(fd);
        return HI_NULL;
    }
        if(NULL != pOSDRGB){
                memset(pOSDRGB,0x0,SAMPLE_IMAGE_WIDTH * SAMPLE_IMAGE_HEIGHT * 2);
        }
    /*init osd menu*/
    OSD_MENU_Init();

        /*copy memeroy*/
        memcpy(pBuf,pOSDRGB,maxW*maxH*2);

        //stCanvasBuf.UpdateRect.x = 180;
        //stCanvasBuf.UpdateRect.y = 180;
        stCanvasBuf.UpdateRect.x = 0;
        stCanvasBuf.UpdateRect.y = 0;
        stCanvasBuf.UpdateRect.w = maxW;
        stCanvasBuf.UpdateRect.h = maxH;
        s32Ret = ioctl(fd, FBIO_REFRESH, &stCanvasBuf);
        if (s32Ret < 0)
        {
            SAMPLE_PRT("REFRESH failed!\n");
            HI_MPI_SYS_MmzFree(Phyaddr, pOSDRGB);
            HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
            close(fd);
            return HI_NULL;
        }
       
        printf("Enter any key to exit\n");
        getchar();

    HI_MPI_SYS_MmzFree(Phyaddr, pOSDRGB);
    HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
    close(fd);

    return 0;;
}

/**********************************************
*
*  Name:        OSD_MENU_HandleSig
*  Description:  ctrl + c / z
*  Param:       
*  Return:
*
*********************************************/
HI_VOID OSD_MENU_HandleSig(HI_S32 signo)
{
    if (SIGINT == signo || SIGTERM == signo)
    {
                //HI_MPI_SYS_MmzFree(Phyaddr, pOSDRGB);
                //HI_MPI_SYS_MmzFree(stCanvasBuf.stCanvas.u32PhyAddr, pBuf);
                //close(fd);
        printf("\033[0;31mprogram exit abnormally!\033[0;39m\n");
    }

    exit(0);
}
/**********************************************
*
*  Name:        main
*  Description:  Program execution entry
*  Param:        int argc, char *argv[]
*  Return: 0
*
*********************************************/
int main ( int argc, char *argv[] )
{
        char ch;
        HI_S32 s32Ret = HI_SUCCESS;

        signal(SIGINT,OSD_MENU_HandleSig);
        signal(SIGTERM,OSD_MENU_HandleSig);
/*       
        s32Ret = OSD_MENU_StartVoDev();
        if(HI_SUCCESS != s32Ret){
                printf("start vo device failed\n");
                return -1;
        }
*/
        OSD_MENU_HIFB_Refresh();
start:
        printf("Enter 'q' exit!\n");
        ch = (char)getchar();
        getchar();
        if(ch != 'q')
                goto start;

        return 0;
}/*End of Main*/
[/code]

//还有几个疑问:
1.在 函数DrawOSD(unsigned char *buf, unsigned short *hzLib,int stride,int nColor) 内,为何要用for循环16次?
2.这种内存拷贝的方式,能不能直接利用freetype生成位图后拷贝呢?

//////目前的效果图如下:

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-20 16:58:28
认可0
本帖最后由 ngswfx 于 2016-6-20 19:12 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=31966&ptid=11624]love_lin 发表于 2016-6-20 11:21[/url]
至于上周六我提出来的背景半透明,以后我会慢慢研究。然而我就是连续调用你的几个函数接口,还是没办法显示 ...[/quote]

1、字体的寬高,16*16的,要一个点一个点的处理 。
2、只要大小匹配当然可以。

/////////////////你现在的问题主要是编译环境的问题。

我这边用的eclipse 交叉编译的,配置的C++环境  配置的GBK环境,这个估计是关键点。也就是说.c文件里面的中文字,本身被保存成什么格式了?

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-20 20:23:11
认可0
本帖最后由 ngswfx 于 2016-6-20 20:43 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=31966&ptid=11624]love_lin 发表于 2016-6-20 11:21[/url]
至于上周六我提出来的背景半透明,以后我会慢慢研究。然而我就是连续调用你的几个函数接口,还是没办法显示 ...[/quote]

解决方法如下:

//如果想让HZ16Lib.c被编译,直接放到sample 目录下的common目录就可以了。
//也可以弄成.h,直接被sample_hifb.c 里面include,这个不是问题的关键。

//你现在那个乱码,是由于sample_hifb.c是UTF-8格式,而GCC默认也是UTF-8格式。这个字库,估计不能在这种环境下用,具体原因我也搞不懂,中文字体显示问题牵扯东西很多,我也搞不明白。
/////////////////解决方法:
1、使用geidt打开sample_hifb.c文件,删除所有中文注释,先屏蔽掉ShowOSD_DEC_BOX_MX这几行代码,然后将文件通过另存为,将文件保存为GBK格式,注意,可能需要手动添加GBK支持。
2、成功保存为GBK格式后,再次打开这个文件,确认一下是不是GBK格式,(再次选择另存为,可以看出来),如果已经是GBK格式的源文件了,尝试开启ShowOSD_DEC_BOX_MX这几行代码,确认里面不是乱码。保存文件sample_hifb.c。
3、修改makefile ,编译选项加入-finput-charset=GBK                //指定源文件的格式是GBK
4、make


附件中,是已经调整过的源码,不过我把2个缓冲,直接弄成一个了,刷新时,可能会看到绘制过程,这个不是问题的关键。

//3520D上运行通过

love_lin

1个粉丝

22

问答

0

专栏

1

资料

love_lin 2016-06-21 08:24:39
认可0
本帖最后由 love_lin 于 2016-6-21 08:26 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32001&ptid=11624]ngswfx 发表于 2016-6-20 20:23[/url]
解决方法如下:

//如果想让HZ16Lib.c被编译,直接放到sample 目录下的common目录就可以了。
[/quote]

真是厉害,谢谢指导,我刚试了一下,目前能正常显示了,效果图如下(空格不行)。
目前只能修改字体的颜色和字间距,那能修改字体和字体的大小吗?它们是由什么决定的?

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-21 16:31:14
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32006&ptid=11624]love_lin 发表于 2016-6-21 08:24[/url]
真是厉害,谢谢指导,我刚试了一下,目前能正常显示了,效果图如下(空格不行)。
目前只能修改字体的 ...[/quote]

字体的大小没法改,只能通过数据拷贝的方式,进行倍数放大,但由于字库本事是16的,所以放大效果并不好
放大2倍基本还能接受,多了就不行了。你就把16*16,水平和垂直都按照点重复一遍就是放大2倍了。
//////////如果项目有需求,可以用32大小的字库,网上应该有,效果会好一些。

/////////空格等的处理手段,应该也不难,再对某个字符查寻的时候,如果发现是空格等不支持的字符。这个字符所在位置,全部都赋值为背景色,这样就相当于空格了。

///////咱们现在搞的是比较基础的、比较底层的叠加,很多都需要靠自己根据原理去思考解决问题的方法。

love_lin

1个粉丝

22

问答

0

专栏

1

资料

love_lin 2016-06-22 18:47:12
认可0
谢谢您的帮助,目前实现的OSD菜单还算比较满意,唯一不足的是还没做背景,这个估计还得研究一阵子。
至于字体确实太小了,在网上也没找到 ,不知道您有没有32*32的,或24*24的。
效果图如下:

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-22 18:59:29
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32199&ptid=11624]love_lin 发表于 2016-6-22 18:47[/url]
谢谢您的帮助,目前实现的OSD菜单还算比较满意,唯一不足的是还没做背景,这个估计还得研究一阵子。
至于 ...[/quote]

不错,有点意思了

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-22 19:00:38
认可0
本帖最后由 ngswfx 于 2016-6-22 19:07 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=32200&ptid=11624]ngswfx 发表于 2016-6-22 18:59[/url]
不错,有点意思了[/quote]

///////////关键部分代码  附件中有字库,不过字库就大一些了,不知道打包到文件会压缩成怎样。

//下面的代码我没试过,可能需要自己根据字库修改。下面的代码肯定不是1555的,应该是YUV 中针对Y这部分
//32*32 hzk
unsigned long __stdcall        ShowOSD32Ex(unsigned char *pBase, char *pStr, unsigned short x, unsigned short y, unsigned short space, unsigned char Lum, int width, int height, int stride)
{
        Int8 q=3, w, asc=0,*p=(Int8 *)pStr;
        UInt8 *pHZLib=0;
        UInt32 nChar=0,wd=0,nOffset=0,nSize, l, r;
        float fsize = 0,fwd = 0;       
        Int8        *pp = p, num=0;       
        x = UCLIPI(x, width-48);
        y = UCLIPI(y, height-24);
        pBase += stride*y*2+x*2;
        while (*p) {               
                pp = p;
                q = *p&0x80?(*p++)-161:2; // Get qu code
                w=((*p++)&0x7f)-33; // Get wei code               
                if ((nOffset = q*94+w) >= g_real_HZ16_count)
                        continue;
                //32*32
                pHZLib = (HZ32Lib+(nOffset<<7));               
                if (q<10) {
                        l = UBYTESEL(HZ16_Space[nOffset],1)*2;
                        r = UBYTESEL(HZ16_Space[nOffset],0)*2;
                        nSize = HZ32LIB_ZISE-(l+r);//+space;
                        fsize = 20.2;
                }
                else {
                        nSize = HZ32LIB_ZISE+space;
                        l = r = 0;
                        fsize = 40.4;
                }               
                if (x+(int)fwd+(int)fsize+2>width)
                        break;               
                // Draw here
                DrawOSD32(pBase+wd+nChar*(16-r-l), (unsigned int *)pHZLib,Lum,64,stride);
                nChar++;
                wd += nSize;
                fwd += fsize;
        }       
        return nChar;
}
void DrawOSD32(unsigned char *buf, unsigned int *hzLib, char lum, char bklum, int stride)
{
        static unsigned char fontlum[] = {64,192};
        int i, font;
        int        lumi,chroma_u,chroma_v;
        int *p1 = (int *) buf+(stride<<4);
        float mult_f = lum?0.20:1;
        float mult_b = 1 - mult_f;

        int avglum = (buf[0] + buf[2] + buf[4] + buf[6] + buf[8] +
                buf[10] + buf[12] + buf[14] + buf[16] + buf[18] + buf[20] +
                buf[22] + buf[24] + buf[26] + buf[28] + buf[30] +buf[32] +
                buf[34] + buf[36] + buf[38] + buf[40] + buf[42] +buf[44] +
                buf[46] + buf[48] + buf[50] +buf[52] +buf[54] +buf[56] +
                buf[58] + buf[60] +buf[62])/32;

        if(avglum>135)
                lumi = 0x1;
        else
                lumi = 0xff;

        //lumi = 0xff;
        chroma_u = 0x80;
        chroma_v = 0x80;

        for (i=0; i<32; i++) {
                font = *hzLib ++;
/*
                buf[0]   = MUX(font&0x0080, lumi, buf[0] );
                buf[2]   = MUX(font&0x0040, lumi, buf[2] );
                buf[4]   = MUX(font&0x0020, lumi, buf[4] );
                buf[6]   = MUX(font&0x0010, lumi, buf[6] );
                buf[8]   = MUX(font&0x0008, lumi, buf[8] );
                buf[10]   = MUX(font&0x0004, lumi,buf[10]);
                buf[12]   = MUX(font&0x0002, lumi,buf[12]);
                buf[14]   = MUX(font&0x0001, lumi,buf[14]);
                buf[16]   = MUX(font&0x8000, lumi,buf[16]);
                buf[18]   = MUX(font&0x4000, lumi,buf[18]);
                buf[20] = MUX(font&0x2000, lumi,  buf[20]);
                buf[22] = MUX(font&0x1000, lumi,  buf[22]);
                buf[24] = MUX(font&0x0800, lumi,  buf[24]);
                buf[26] = MUX(font&0x0400, lumi,  buf[26]);
                buf[28] = MUX(font&0x0200, lumi,  buf[28]);
                buf[30] = MUX(font&0x0100, lumi,  buf[30]);
*/
                buf[0]   = (unsigned char)(MUX(font&0x0080, lumi*mult_f+buf[0]*mult_b, buf[0] ));
                buf[2]   = (unsigned char)(MUX(font&0x0040, lumi*mult_f+buf[2]*mult_b, buf[2] ));
                buf[4]   = (unsigned char)(MUX(font&0x0020, lumi*mult_f+buf[4]*mult_b, buf[4] ));
                buf[6]   = (unsigned char)(MUX(font&0x0010, lumi*mult_f+buf[6]*mult_b, buf[6] ));
                buf[8]   = (unsigned char)(MUX(font&0x0008, lumi*mult_f+buf[8]*mult_b, buf[8] ));
                buf[10]   = (unsigned char)(MUX(font&0x0004, lumi*mult_f+buf[10]*mult_b,buf[10]));
                buf[12]   = (unsigned char)(MUX(font&0x0002, lumi*mult_f+buf[12]*mult_b,buf[12]));
                buf[14]   = (unsigned char)(MUX(font&0x0001, lumi*mult_f+buf[14]*mult_b,buf[14]));
                buf[16]   = (unsigned char)(MUX(font&0x8000, lumi*mult_f+buf[16]*mult_b,buf[16]));
                buf[18]   = (unsigned char)(MUX(font&0x4000, lumi*mult_f+buf[18]*mult_b,buf[18]));
                buf[20] = (unsigned char)(MUX(font&0x2000, lumi*mult_f+buf[20]*mult_b,  buf[20]));
                buf[22] = (unsigned char)(MUX(font&0x1000, lumi*mult_f+buf[22]*mult_b,  buf[22]));
                buf[24] = (unsigned char)(MUX(font&0x0800, lumi*mult_f+buf[24]*mult_b,  buf[24]));
                buf[26] = (unsigned char)(MUX(font&0x0400, lumi*mult_f+buf[26]*mult_b,  buf[26]));
                buf[28] = (unsigned char)(MUX(font&0x0200, lumi*mult_f+buf[28]*mult_b,  buf[28]));
                buf[30] = (unsigned char)(MUX(font&0x0100, lumi*mult_f+buf[30]*mult_b,  buf[30]));
               
                buf[32] = (unsigned char)(MUX(font&0x800000,lumi*mult_f+buf[32]*mult_b,buf[32]));
                buf[34] = (unsigned char)(MUX(font&0x400000,lumi*mult_f+buf[34]*mult_b, buf[34]));
                buf[36] = (unsigned char)(MUX(font&0x200000, lumi*mult_f+buf[36]*mult_b, buf[36] ));
                buf[38] = (unsigned char)(MUX(font&0x100000, lumi*mult_f+buf[38]*mult_b, buf[38] ));
                buf[40] = (unsigned char)(MUX(font&0x080000, lumi*mult_f+buf[40]*mult_b, buf[40] ));
                buf[42] = (unsigned char)(MUX(font&0x040000, lumi*mult_f+buf[42]*mult_b,buf[42]));
                buf[44] = (unsigned char)(MUX(font&0x020000, lumi*mult_f+buf[44]*mult_b,buf[44]));
                buf[46] = (unsigned char)(MUX(font&0x010000, lumi*mult_f+buf[46]*mult_b,buf[46]));
                buf[48] = (unsigned char)(MUX(font&0x80000000, lumi*mult_f+buf[48]*mult_b,buf[48]));
                buf[50] = (unsigned char)(MUX(font&0x40000000, lumi*mult_f+buf[50]*mult_b,buf[50]));
                buf[52] = (unsigned char)(MUX(font&0x20000000, lumi*mult_f+buf[52]*mult_b,buf[52]));
                buf[54] = (unsigned char)(MUX(font&0x10000000, lumi*mult_f+buf[54]*mult_b,buf[54]));
                buf[56] = (unsigned char)(MUX(font&0x08000000, lumi*mult_f+buf[56]*mult_b,buf[56]));
                buf[58] = (unsigned char)(MUX(font&0x04000000, lumi*mult_f+buf[58]*mult_b,buf[58]));
                buf[60] = (unsigned char)(MUX(font&0x02000000, lumi*mult_f+buf[60]*mult_b,buf[60]));
                buf[62] = (unsigned char)(MUX(font&0x01000000, lumi*mult_f+buf[62]*mult_b,buf[62]));               
               
                buf[1]   = (unsigned char)(MUX(font&0x0080, chroma_u, buf[1] ));
                buf[3]   = (unsigned char)(MUX(font&0x0040, chroma_v, buf[3] ));
                buf[5]   = (unsigned char)(MUX(font&0x0020, chroma_u, buf[5] ));
                buf[7]   = (unsigned char)(MUX(font&0x0010, chroma_v, buf[7] ));
                buf[9]   = (unsigned char)(MUX(font&0x0008, chroma_u, buf[9] ));
                buf[11]   = (unsigned char)(MUX(font&0x0004, chroma_v,buf[11]));
                buf[13]   = (unsigned char)(MUX(font&0x0002, chroma_u,buf[13]));
                buf[15]   = (unsigned char)(MUX(font&0x0001, chroma_v,buf[15]));
                buf[17]   = (unsigned char)(MUX(font&0x8000, chroma_u,buf[17]));
                buf[19]   = (unsigned char)(MUX(font&0x4000, chroma_v,buf[19]));
                buf[21] = (unsigned char)(MUX(font&0x2000, chroma_u,  buf[21]));
                buf[23] = (unsigned char)(MUX(font&0x1000, chroma_v,  buf[23]));
                buf[25] = (unsigned char)(MUX(font&0x0800, chroma_u,  buf[25]));
                buf[27] = (unsigned char)(MUX(font&0x0400, chroma_v,  buf[27]));
                buf[29] = (unsigned char)(MUX(font&0x0200, chroma_u,  buf[29]));
                buf[31] = (unsigned char)(MUX(font&0x0100, chroma_v,  buf[31]));

                buf[33]   = (unsigned char)(MUX(font&0x800000, chroma_u, buf[33] ));
                buf[35]   = (unsigned char)(MUX(font&0x400000, chroma_v, buf[35] ));
                buf[37]   = (unsigned char)(MUX(font&0x200000, chroma_u, buf[37] ));
                buf[39]   = (unsigned char)(MUX(font&0x100000, chroma_v, buf[39] ));
                buf[41]   = (unsigned char)(MUX(font&0x080000, chroma_u, buf[41] ));
                buf[43]   = (unsigned char)(MUX(font&0x040000, chroma_v,buf[43]));
                buf[45]   = (unsigned char)(MUX(font&0x020000, chroma_u,buf[45]));
                buf[47]   = (unsigned char)(MUX(font&0x010000, chroma_v,buf[47]));
                buf[49]   = (unsigned char)(MUX(font&0x80000000, chroma_u,buf[49]));
                buf[51]   = (unsigned char)(MUX(font&0x40000000, chroma_v,buf[51]));
                buf[53] = (unsigned char)(MUX(font&0x20000000, chroma_u,  buf[53]));
                buf[55] = (unsigned char)(MUX(font&0x10000000, chroma_v,  buf[55]));
                buf[57] = (unsigned char)(MUX(font&0x08000000, chroma_u,  buf[57]));
                buf[59] = (unsigned char)(MUX(font&0x04000000, chroma_v,  buf[59]));
                buf[61] = (unsigned char)(MUX(font&0x02000000, chroma_u,  buf[61]));
                buf[63] = (unsigned char)(MUX(font&0x01000000, chroma_v,  buf[63]));
               
                buf += stride*2;
        }
}

zhangjy46

0个粉丝

2

问答

0

专栏

0

资料

zhangjy46 2016-06-23 10:24:49
认可0
非常感谢,谢谢分享。

love_lin

1个粉丝

22

问答

0

专栏

1

资料

love_lin 2016-06-24 12:01:11
认可0
本帖最后由 love_lin 于 2016-6-24 12:06 编辑

@ngswfx,我现在有个问题,就是我想移动显示OSD菜单,我理解了下设置FB相关参数,但是一直设置int ioctl (int fd,FBIOPUT_VSCREENINFO,struct fb_var_screeninfo *var);一直出错!!
以下是我设置的参数值,能帮我解释下为何吗?
[code]344     maxW = WIDTH_1024;   
345     maxH = HEIGHT_768;   
346   
347     stVarInfo.xres_virtual = 1920;
348     stVarInfo.yres_virtual = 1080;
349     stVarInfo.xres = maxW;
350     stVarInfo.yres = maxH;
351     stVarInfo.activate = FB_ACTIVATE_NOW;
352     stVarInfo.bits_per_pixel = 16;
353     stVarInfo.xoffset = 50;
354     stVarInfo.yoffset = 50;
355     stVarInfo.red = r16;  
356     stVarInfo.green = g16;
357     stVarInfo.blue = b16;
358     stVarInfo.transp= a16;
359     s32Ret = ioctl(g_fd, FBIOPUT_VSCREENINFO, &stVarInfo);
360     if(s32Ret < 0){
361         close(g_fd);
362         printf("set screen error\n");  
363         return -1;
364     }
365     stLayerInfo.BufMode = HIFB_LAYER_BUF_ONE;
366     stLayerInfo.u32Mask = HIFB_LAYERMASK_BUFMODE;
367     s32Ret = ioctl(g_fd, FBIOPUT_LAYER_INFO, &stLayerInfo);
368     if(s32Ret < 0){      
369         close(g_fd);      
370         return -1;
371     }
372     Show = HI_TRUE;
373     if (ioctl(g_fd, FBIOPUT_SHOW_HIFB, &Show) < 0){
374         close(g_fd);      
375         return -1;
376     }
[/code]

不知道偏移量stVarInfo.xoffset = 50;
stVarInfo.yoffset = 50;这两个变量怎么理解,只能用默认的值(0),一改就出错。

////// stVarInfo.xres_virtual = 1920;
348     stVarInfo.yres_virtual = 1080; 这个值不能设置为1920和1080??

////如果把他设置成默认值1280和720也设置不成功,帮忙解释下!!!

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-24 15:20:18
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32334&ptid=11624]love_lin 发表于 2016-6-24 12:01[/url]
@ngswfx,我现在有个问题,就是我想移动显示OSD菜单,我理解了下设置FB相关参数,但是一直设置int ioctl (i ...[/quote]

看海斯的SDK文档吧,里面关于这几个参数有详细的描述。

///////当然做移动,也可以自己在叠加时候做移动。
所有叠加的东西都偏移就可以了。

枫叶尚卿

0个粉丝

6

问答

0

专栏

0

资料

枫叶尚卿 2016-06-30 17:53:11
认可0
请问楼主,你这个用的是点阵字体吗?

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-06-30 20:22:50
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32932&ptid=11624]枫叶尚卿 发表于 2016-6-30 17:53[/url]
请问楼主,你这个用的是点阵字体吗?[/quote]

对,点阵的

angelzyb

0个粉丝

0

问答

0

专栏

0

资料

angelzyb 2016-07-19 11:12:04
认可0
真厉害呢,收藏下

love_lin

1个粉丝

22

问答

0

专栏

1

资料

love_lin 2016-07-27 09:23:33
认可0
[quote][url=forum.php?mod=redirect&goto=findpost&pid=32201&ptid=11624]ngswfx 发表于 2016-6-22 19:00[/url]
///////////关键部分代码  附件中有字库,不过字库就大一些了,不知道打包到文件会压缩成怎样。

// ...[/quote]

@ngswfx,目前我的OSD菜单已基本完成,只是字体16x16小了些,但是我没能理解你这个字库实现的原理,所以没法这些写24x24和32x32的,试了下您的32x32不行,而且也没看到设置字体颜色的。您能给我解释下字库里面的HZ16_Space[]和HZ16Lib[]的意义和查找他们的原理吗??

ngswfx

1个粉丝

55

问答

1

专栏

40

资料

ngswfx 2016-07-27 09:32:55
认可0
本帖最后由 ngswfx 于 2016-7-27 09:53 编辑

[quote][url=forum.php?mod=redirect&goto=findpost&pid=34873&ptid=11624]love_lin 发表于 2016-7-27 09:23[/url]
@ngswfx,目前我的OSD菜单已基本完成,只是字体16x16小了些,但是我没能理解你这个字库实现的原理,所以没 ...[/quote]

具体细节我也不懂,但基本可以断定(猜测):

如果16*16字库,其实有256个点,如果某个点为黑,可以采用1bit来表示,这样水平一行16bit,可以用2个字节表示。为此,对于16*16字库,应该需要用32个字节表示。所以你打开字库文件,会发现一行是32个,尤其第一行,全是0,相当与空格。

对于32*32字库,应该需要32*4=128个字节表示。所以你打开字库文件,会发现最开始4行全是0,什么都没有,相当于空格了。


其实还可以裁剪字库,制作自己定义的一些小型化字库,即达到要求,又让flash空间占用超级小(前提是程序是固定的,没有额外汉字需求,例如星期一,这一类中文需求,如果没有地名,唯一中文需求就是星期这一类,完全可以裁剪使用)。

//某一个汉字,如果你把他放到到能看清某一个点的情况,然后水平一行行扫描,如果为黑,这个bit就是1,如果没有,这个bit就是0,等全部扫描完一遍。就会产生如下:

///////////////////////////////////////////空格,什么都没有的字符,二进制可能如下
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
0000000000000000
//////////////////////////////////////////////////////
//////////////如果是数字1,二进制可能如下(类似,自己随便画的):
0000000000000000
0000000000000000
0000001110000000
0000111110000000
0001101110000000
0000001110000000
0000001110000000
0000001110000000
0000001110000000
0000001110000000
0000001110000000
0000001110000000
0000001110000000
0000011111000000
0000000000000000
0000000000000000

////////////然后,你就把这一堆二进制,转换为16进制,就会得到32个字节的串。程序在干活时,其实就是对比每一位,如果是二进制1,就让对应的像素点为255(全白,如果是1555格式,需要处理2个字节),如果是二进制0,对应像素点,就为0(全黑),等一个汉字区域扫描结束,在buff中,就形成了相应的汉字。
////////////////////////////////////////////////////////////
///////////////14楼不是有32字库的读取代码吗,直接用,然后稍作修改即可。自己多测试,原理是一样的。我也没弄过32的字库。


/////////////这个字库是通用的,网上有大量的相关教程的,都可以给你提供思路,你可以搜索一下。上面仅仅是我的理解,不知道对不对。
加载中···
或将文件直接拖到这里
悬赏:
E币
网盘
* 网盘链接:
* 提取码:
悬赏:
E币

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
+ 添加网盘链接/附件

Markdown 语法

  • 加粗**内容**
  • 斜体*内容*
  • 删除线~~内容~~
  • 引用> 引用内容
  • 代码`代码`
  • 代码块```编程语言↵代码```
  • 链接[链接标题](url)
  • 无序列表- 内容
  • 有序列表1. 内容
  • 缩进内容
  • 图片![alt](url)
举报反馈

举报类型

  • 内容涉黄/赌/毒
  • 内容侵权/抄袭
  • 政治相关
  • 涉嫌广告
  • 侮辱谩骂
  • 其他

详细说明

易百纳技术社区