久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2047|回復(fù): 0
收起左側(cè)

Directfb中文顯示

[復(fù)制鏈接]
ID:107189 發(fā)表于 2016-3-6 15:13 | 顯示全部樓層 |閱讀模式
Directfb 的DrawString其實支持中文顯示,不過只支持utf-8編碼,所以主要的問題就是讓
把我們常用的gb2312編碼轉(zhuǎn)換成utf-8編碼。其實是有現(xiàn)成的函數(shù)可以轉(zhuǎn)換的,只是庫比
較大,所以還是自己實現(xiàn)吧。

首先得把gb2312轉(zhuǎn)換成Unicode,然后再把Unicode轉(zhuǎn)換成utf-8。gb2312轉(zhuǎn)換成Unicode
比較容易,windows下有個函數(shù)MultiByteToWideChar可以實現(xiàn),我們可以利用這個函數(shù)
生成一個數(shù)組,以后用的時候直接查表就可以了。下邊是生成表的代碼。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <windows.h>
int main()
{
    wchar_t wstr[8] = {0};
    FILE *fp;
    unsigned char rowCode,colCode;
    char szStr[64] = {0};
    char szBuff[2] = {0};
    unsigned char row;
    unsigned char col;
    fp = fopen("GB2Uni_LUT.h", "w+, ccs=UNICODE");
    if(fp)
    {
        strcpy( szStr, "unsigned short Unicode[87][94]={\n");
        fwrite(szStr,1,strlen(szStr),fp);
        for(row = 0; row < 87; row++)
        {
            for(col = 0; col < 94; col++)
            {
                rowCode = row + 0xA1;
                colCode = col + 0xA1;
                szBuff[0] = rowCode;
                szBuff[1] = colCode;
                if( MultiByteToWideChar(CP_THREAD_ACP,MB_ERR_INVALID_CHARS,szBuff,2,wstr,8))
                {
                    sprintf(szStr,"0x%04X,",wstr[0]);
                    fwrite(szStr,1,strlen(szStr),fp);
                }
                else
                {
                    fwrite( "0x0000,", 1, 13, fp );  
                }
            }
            fwrite( "\n", 1, 1, fp );
        }
        strcpy( szStr, "};\n");
        fwrite( szStr, 1, strlen( szStr ), fp );
        fclose(fp);
    }
    return 0;
}
然后就可以考慮Unicode轉(zhuǎn)換成utf-8了,理解起來比較麻煩,代碼實現(xiàn)比較簡單,
原理參照另一篇日志Unicode,UTF8等編碼規(guī)范[轉(zhuǎn)]。
下面是gb2312轉(zhuǎn)utf-8的代碼實現(xiàn)。
int GB2UTF_8(char *p_desStr, char *p_srcStr)
{
int x ,y;
short s_Temp = 0;
char chighChar = 0;
char clowChar = 0;
assert(p_srcStr);
assert(p_desStr);
while ('\0' != *p_srcStr)
{
  if(((unsigned char)*(p_srcStr))>=0xA0)
  {
   //gb2312轉(zhuǎn)unicode
   chighChar = *p_srcStr-0xA1;//大端序
   clowChar = *(p_srcStr+1)-0xA1;//
   x = (int)chighChar;
   y = (int)clowChar;
   s_Temp = Unicode[x][y];//取unicode編碼
   //unicode轉(zhuǎn)utf-8
   chighChar = (0xff00&s_Temp)>>8;
   clowChar = (0x00ff&s_Temp);
   char cTemp[3];
   cTemp[0] = 0xE0 | ((0xF0 & chighChar)>>4);
   cTemp[1] = 0x80 | (((0x0F & chighChar)<<2) | ((0xC0 & clowChar)>>6));
   cTemp[2] = 0x80 | (0x3F & clowChar);
   memcpy(p_desStr,cTemp,sizeof(cTemp));
   p_desStr += 3;                    
   p_srcStr += 2;
  }
  else
  {
   memcpy(p_desStr, p_srcStr, 1);
   p_srcStr += 1;   
   p_desStr += 1;
  }
}
return 0;
}
其中Unicode這個數(shù)組就是利用最上面的程序生成的。

下面是directfb顯示的例子。是在Linux下運行的。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <directfb.h>
#include <assert.h>
static IDirectFB *dfb = NULL;
static IDirectFBSurface *primary = NULL;
static IDirectFBFont *pFont = NULL;
static int screen_width  = 0;
static int screen_height = 0;

#define DFBCHECK(x...)                                         \
{                                                          \
    DFBResult err = x;                                         \
                                                               \
    if (err != DFB_OK)                                         \
    {                                                          \
        fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
        DirectFBErrorFatal( #x, err );                         \
    }                                                          \
}
int main (int argc, char **argv)
{
DFBSurfaceDescription dsc;
DFBFontDescription font_dsc;
char *TmpString = NULL;
DFBCHECK (DirectFBInit (&argc, &argv));
DFBCHECK (DirectFBCreate (&dfb));
DFBCHECK (dfb->SetCooperativeLevel (dfb, DFSCL_FULLSCREEN));

dsc.flags = DSDESC_CAPS;
dsc.caps  = DSCAPS_PRIMARY | DSCAPS_FLIPPING;

DFBCHECK (dfb->CreateSurface( dfb, &dsc, &primary ));
DFBCHECK (primary->GetSize (primary, &screen_width, &screen_height));
DFBCHECK (primary->FillRectangle (primary, 0, 0, screen_width, screen_height));

DFBCHECK (primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff));
//DFBCHECK (primary->FillRectangle (primary,
//                        0, screen_height / 2,
//         screen_width - 1, screen_height / 6));
font_dsc.flags = DFDESC_ATTRIBUTES|DFDESC_HEIGHT|DFDESC_WIDTH;
font_dsc.width = 32;
font_dsc.height = 32;
DFBCHECK (dfb->CreateFont (dfb, \
         "/work/font.TTF", \
         &font_dsc, \
         &pFont));
primary->SetColor (primary, 0x80, 0x80, 0xff, 0xff);
primary->SetFont (primary, pFont);
char SrcString[] = "協(xié)助李嚴(yán)鎮(zhèn)守白帝,《三國志》稱“征南\n(趙云)厚重";
TmpString = (char *)calloc(1, strlen(SrcString)*2);
GB2UTF_8(TmpString, SrcString);
DFBCHECK(primary->DrawString (primary,
                           TmpString, -1,
                           100, screen_height / 2, DSTF_LEFT));
free(TmpString);
DFBCHECK (primary->Flip (primary, NULL, 0));
//pFont->Release (pFont);
sleep (3);
primary->Release( primary );
dfb->Release( dfb );

return 23;
}
生成表和轉(zhuǎn)的代碼是在網(wǎng)上找來的,做了一點修改,directfb例子是在官網(wǎng)例子上做的修改。

回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产99| 国产欧美一区二区三区在线看 | 美女天堂 | 人人玩人人添人人澡欧美 | 亚洲福利视频一区二区 | 欧美1区2区 | 久久久精品视 | 国产精品一区二区欧美 | 宅男噜噜噜66一区二区 | 91精品一区二区三区久久久久久 | 男人天堂网址 | 夜夜撸av| 一区二区三区四区av | 中文字幕综合 | 爽爽免费视频 | 夜夜爽99久久国产综合精品女不卡 | 久久91精品国产 | 国产探花在线观看视频 | 久久亚洲国产精品 | 精品国产伦一区二区三区观看方式 | 狠狠色综合网站久久久久久久 | 91视频在线看 | 羞羞免费网站 | 午夜影视 | 久久久91精品国产一区二区精品 | 国产a视频 | 亚洲一区二区三区免费在线观看 | 五月婷婷丁香 | www.黄网| 一二区视频 | 新91视频网 | 日本一区二区高清不卡 | 亚洲97 | 黄色一级大片在线免费看产 | 亚洲综合日韩精品欧美综合区 | 欧美一级黄色网 | 国产资源一区二区三区 | 久久国产成人 | 五月婷婷在线视频 | 久久综合av | 伊人伊成久久人综合网站 |