找回密码
 注册
搜索
查看: 1709|回复: 6

[讨论] MTK平台上如何获得字符的字体点阵信息

[复制链接]
发表于 2007-2-28 14:52:05 | 显示全部楼层 |阅读模式
请问各位高手,在MTK平台上面如何获得字体的点阵信息。
在我的手上的sdk里面,有一个函数GetFontData貌似是可以取得点阵,但是是被注释掉的,而且我也只是看见它的原型声明而已,此函数又是为static的,哪位大侠能够给出具体的阐释或者GetFontData的源码?谢谢
或者MTK的字体是不用点阵的?
发表于 2007-2-28 18:41:18 | 显示全部楼层
你是问这支Function吗?

PixcomFontEngine.c (plutommi\mmi\miscframework\miscframeworksrc)        168285        2007-1-29

/**************************************************************

   FUNCTION NAME     : GetFontdata()

   PURPOSE           : To get the font information.

   INPUT PARAMETERS  : U32 Ch, stFontAttribute Font, U8 *CharData

   OUTPUT PARAMETERS : nil

   RETURNS           : UNIT32

   REMARKS           : This is used to get the font information

**************************************************************/
#ifdef __MMI_HINDI_ALG__
static U32 GetFontdata(U32 Ch, stFontAttribute Font, U8 **ppCharData, U16 *pnWidth, U16 *pnDWidth, U16 *pnHeight)
#else
static U32 GetFontdata(U32 Ch, stFontAttribute Font, U8 **ppCharData, U16 *pnWidth, U16 *pnHeight)
#endif
{
    U8 count;
    S32 NumChar = 0;
    S32 index = -1;
    S32 nFontIndex = -1;
    U32 nIndexInList;
    U32 nBase;
    U32 nHashKey = 0;
    CharHashTable *charHashTable;

#ifdef __MMI_HINDI_ALG__
    sCustFontData *CurrentFont = gpCurrentFont;

    *pnDWidth = 0;
#endif /* __MMI_HINDI_ALG__ */

    if (Ch & 0xFF00)
    {
        charHashTable = charHashTableOthers;
        nHashKey = Ch & OTHERS_CHAR_HT_MASK;
    }
    else
    {
        charHashTable = charHashTableLatin;
        nHashKey = Ch & LATIN_CHAR_HT_MASK;
    }

    if (charHashTable[nHashKey].unicode == Ch && charHashTable[nHashKey].gnCurrentFont == gnCurrentFont)
    {
        *ppCharData = charHashTable[nHashKey].CharData;
        *pnWidth = charHashTable[nHashKey].Width;
        *pnHeight = charHashTable[nHashKey].Height;
    #ifdef __MMI_HINDI_ALG__
        *pnDWidth = charHashTable[nHashKey].DWidth;
    #endif
        return charHashTable[nHashKey].NumChar;
    }

    charHashTable[nHashKey].unicode = Ch;
    GetLangIndex(&count, &nFontIndex, &index, Ch, &nBase);
    charHashTable[nHashKey].count = count;
    charHashTable[nHashKey].gnCurrentFont = gnCurrentFont;
    charHashTable[nHashKey].index = index;

    if (index > -1)
    {

        /* Comments : No error handling is being  done if some characters come that is not
           currently supported then nothing can be displayed */

        SetFontValues(gnCurrentFont, count);
        charHashTable[nHashKey].Width = *pnWidth = gpCurrentFont->nWidth;
        charHashTable[nHashKey].Height = *pnHeight = gpCurrentFont->nHeight;

        if (gpCurrentFont->nEquiDistant)
        {

            charHashTable[nHashKey].NumChar = NumChar = gpCurrentFont->nCharBytes;
            nIndexInList = index + (NumChar * (Ch - nBase));
            charHashTable[nHashKey].CharData = *ppCharData = (gpCurrentFont->pDataArray + nIndexInList);

        }
        else
        {
            nIndexInList = index + (Ch - nBase);
            charHashTable[nHashKey].Width = *pnWidth = gpCurrentFont->pWidthArray[nIndexInList];
            charHashTable[nHashKey].NumChar = NumChar =
                (gpCurrentFont->pOffsetArray[nIndexInList + 1] - gpCurrentFont->pOffsetArray[nIndexInList]);
            charHashTable[nHashKey].CharData = *ppCharData =
                (gpCurrentFont->pDataArray + gpCurrentFont->pOffsetArray[nIndexInList]);

        }
    #ifdef __MMI_HINDI_ALG__
        if (gpCurrentFont->pDWidthArray)
            charHashTable[nHashKey].DWidth = *pnDWidth = gpCurrentFont->pDWidthArray[nIndexInList];
        gpCurrentFont = CurrentFont;
    #endif /* __MMI_HINDI_ALG__ */
        return NumChar;
    }
    else
    {

        /* MTK Add Steven 2005.06.03 */
    #if defined(__MMI_ZI__)
        index = SearchInZiExtraFont(Ch, &nBase);
    #else
        index = SearchInPropFont(Ch, &nBase);
    #endif

        if (index == -1)
        {
        #if defined(__MMI_ZI__)
            index = SearchInPropFont(Ch, &nBase);
            if (index == -1)
            {
        #endif /* defined(__MMI_ZI__) */

                Ch = 65515; /* 0x4E01;//0x000F; */
                index = SearchInPropFont(Ch, &nBase);
                if (index == -1)
                {
                #ifdef __MMI_HINDI_ALG__
                    gpCurrentFont = CurrentFont;
                #endif
                    return NumChar;
                }
            #if defined(__MMI_ZI__)
            }
            charHashTable[nHashKey].Height = *pnHeight = gMTKProprietaryFont.nHeight;
            nIndexInList = index + (Ch - nBase);
            charHashTable[nHashKey].Width = *pnWidth = gMTKProprietaryFont.pWidthArray[nIndexInList];
            charHashTable[nHashKey].NumChar = NumChar =
                (gMTKProprietaryFont.pOffsetArray[nIndexInList + 1] - gMTKProprietaryFont.pOffsetArray[nIndexInList]);
            charHashTable[nHashKey].CharData = *ppCharData =
                (gMTKProprietaryFont.pDataArray + gMTKProprietaryFont.pOffsetArray[nIndexInList]);
            goto label_out;
            #endif /* defined(__MMI_ZI__) */

        }

    #if defined(__MMI_ZI__)
        charHashTable[nHashKey].Height = *pnHeight = gZiExtraCharacter.nHeight;
        nIndexInList = index + (Ch - nBase);
        charHashTable[nHashKey].Width = *pnWidth = gZiExtraCharacter.pWidthArray[nIndexInList];
        charHashTable[nHashKey].NumChar = NumChar =
            (gZiExtraCharacter.pOffsetArray[nIndexInList + 1] - gZiExtraCharacter.pOffsetArray[nIndexInList]);
        charHashTable[nHashKey].CharData = *ppCharData =
            (gZiExtraCharacter.pDataArray + gZiExtraCharacter.pOffsetArray[nIndexInList]);
      label_out:;
    #else /* defined(__MMI_ZI__) */
        charHashTable[nHashKey].Height = *pnHeight = gMTKProprietaryFont.nHeight;
        nIndexInList = index + (Ch - nBase);
        charHashTable[nHashKey].Width = *pnWidth = gMTKProprietaryFont.pWidthArray[nIndexInList];
        charHashTable[nHashKey].NumChar = NumChar =
            (gMTKProprietaryFont.pOffsetArray[nIndexInList + 1] - gMTKProprietaryFont.pOffsetArray[nIndexInList]);
        charHashTable[nHashKey].CharData = *ppCharData =
            (gMTKProprietaryFont.pDataArray + gMTKProprietaryFont.pOffsetArray[nIndexInList]);
    #endif /* defined(__MMI_ZI__) */
        /* MTK End */

    }
#ifdef __MMI_HINDI_ALG__
    gpCurrentFont = CurrentFont;
#endif
    return NumChar;
}

上面是06B W07.04 版中该函数的实现
点评回复

使用道具 举报

 楼主| 发表于 2007-3-16 17:50:18 | 显示全部楼层
谢谢您,Luke6174,这样看来,MTK把这些东西封装得挺深的。
点评回复

使用道具 举报

发表于 2007-3-19 19:33:52 | 显示全部楼层
MTK是用的点阵,而且OFFSET都是使用0填充的。
一般使用BDF文件导入即可使用,如果没有BDF文件需要购买或者自己做一个。
而其他方面的办法没有,毕竟被封装了。
点评回复

使用道具 举报

发表于 2007-4-9 14:57:44 | 显示全部楼层
BDF是什么啊,是不是就是点阵字库?
点评回复

使用道具 举报

发表于 2007-4-12 20:06:16 | 显示全部楼层
点阵可以自已写个程序用windows的字体生成个。很简单的。
点评回复

使用道具 举报

发表于 2012-8-22 16:12:25 | 显示全部楼层
推荐一个工具 GuiTool, 支持 BDF 字库,以及多种字库格式。
下载地址:http://ishare.iask.sina.com.cn/f/33532600.html
点评回复

使用道具 举报

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|52RD我爱研发网 ( 沪ICP备2022007804号-2 )

GMT+8, 2024-12-24 10:26 , Processed in 0.052245 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表