主题:关于使用Skia渲染时不能显示韩文等特殊文字

admin 2018年12月08日 60

不少网友发现使用GDI渲染模块的时候可以显示韩文,但是换成skia渲染就不行了,不知道是什么原因。其实原因很简单,因为skia和gdi的字体渲染是不一样的。

在GDI里,使用一个字体,如果一些字符在字体里没有,GDI会自动加载一个包含这些字符的字体,并使用这个字体来渲染。

但是Skia里没有这种机制,结果就是渲染不出这些文字。出现这种情况一般是因为支持多语言的需要,使用GDI虽然显示出来了,实际上可能并不是用户期望的字体。要解决这个问题,实际上还是需要根据选择的语言来切换字体。这就需要在切换语言的时候能够重建SOUI中使用的字体库。

 git的master分支已经实现了在切换多语言时自动更新字体,实现方式参考demos/multilang这个demo注意下面的代码:

void CMainDlg::OnLanguage(int nID)
{
        ITranslatorMgr *pTransMgr =  SApplication::getSingletonPtr()->GetTranslator();
        m_LangID = nID;
        bool bCnLang = nID == R.id.lang_cn;

        pugi::xml_document xmlLang;
        if (SApplication::getSingletonPtr()->LoadXmlDocment(xmlLang, bCnLang?_T("cn"):_T("en"), _T("lang")))
        {
                CAutoRefPtr<ITranslator> lang;
                pTransMgr->CreateTranslator(&lang);
                lang->Load(&xmlLang.child(L"language"), 1);//1=LD_XML
                pTransMgr->SetLanguage(lang->name());
                pTransMgr->InstallTranslator(lang);

                SFontPool::getSingletonPtr()->UpdateFonts();//update fonts that defined by translator
                SDispatchMessage(UM_SETLANGUAGE,0,0);
        }

}

SFontPool::getSingletonPtr()->UpdateFonts()会自动从当前语言包中指定的字体信息进行必要的替换。 

在语言翻译的XML中,新版本增加了一个fonts节点如下:


<fonts>
    <!--定义字体更新策略, name是在布局中定义的字体的name属性,这里可以修改字体的字符集及字体名-->
    <font name="default" charset="GBK" face="微软雅黑"/>
    <font name="test" charset="GBK" face="华文彩云"/>
  </fonts>

这fonts中,每一个font定义一种根据name属性进度字体替换的规则,在布局文件中可以指定一个字体的name属性如下:


<text size="-1,-1" extend_left="5" font="name:test,bold:1">@string/title</text>

注意font="name:test,bold:1"这个属性中的name:test,这一行命名这个使用的字体的名字为test, 在updateFonts的时候,会自动将这里的test这个font的face修改成"华文彩云"。 

当然如果不是其它语言可能还要修改charset这个属性才会正常显示。