65.9K
CodeProject 正在变化。 阅读更多。
Home

将开源 Indix 库移植到 BREW

starIconstarIconstarIconstarIconstarIcon

5.00/5 (2投票s)

2010年6月1日

CPOL

7分钟阅读

viewsIcon

22145

downloadIcon

162

“Indix”是一个用 C 语言编写的开源组件,用于印度字体渲染。Indix 是 CDAC 发布的印度语言规则的实际实现。

在移动设备上渲染印度语言的快速方法。

引言

手机在城市大众中流行已久。移动设备的普及在农村大众中不断增加,不仅用于打电话,还用于应用程序。越来越多的人开始探索和使用手机进行各种其他用途,例如音乐、游戏、聊天等娱乐,以及银行和交易等实用应用程序。

农村地区手机用户的增长速度也很快。他们使用应用程序的一个主要障碍是语言障碍。提供母语应用程序有助于为用户个性化整个应用程序,并增加农村大众对应用程序的兴趣,激励他们使用应用程序。

城市大众也可以在特定上下文中以他们的母语享受显示的内容。例如,当应用程序以印度语显示小说摘要或电影评论时,这种情况是成立的。这种小的定制极大地增强了读者的体验,因为无论翻译得多么好,在语言更改时,对话的冲击力有时会丢失。

通过向农村大众提供母语应用程序,可以轻松获得经济效益。通过提供母语支持,可以向他们提供现有的大多数应用程序。因此,成熟的移动领域公司正在瞄准农村人口以增加收入。更快的上市时间将确保在该领域取得早期成功。

开发人员采用各种方法和字体引擎来在手机上渲染印度语言。绘制自定义字体的一种常见方法基于图像裁剪和使用语言语法规则来排序和显示裁剪的图像。每种语言的规则都不同,因此必须研究并集成所考虑的语言到应用程序的代码中。

在印度语言语法规则方面进行了大量的研究。中央政府有一个授权机构和印度语言规则标准。任何声称能够渲染印度语言的字体引擎都必须遵守所有这些标准。

“Indix”是一个用 C 语言编写的开源组件,用于印度字体渲染。Indix 是 CDAC 发布的印度语言规则的实际实现。通过将此库移植到 BREW,我们可以为应用程序提供印度语言支持。该库还能够毫不费力地显示多语言文本。

Indix 包含所有语言的规则,并计算需要显示的字形。它使用 FreeType 从字体文件 (TTF 文件) 渲染计算出的字形。点击此处了解更多关于 Indix 的信息。

要求

移植 INDIX 的步骤

先决条件

  • 安装 BREW SDK 3.1.2(或更高版本)和 RVDS 3.0
  • 下载 elf2mod 实用程序
  • 下载 Freetype 源代码
  • 下载 Indix 源代码

步骤 1:设置 Visual Studio 工作区和链接

创建一个新的 BREW 工作区,并包含所有 Indix 和 FreeType 源代码(*src* 和 *include* 文件夹)。在项目属性中指定所有必需的路径,以消除所有链接错误。

步骤 1:设置 Visual Studio 工作区和链接

*stdio.h* 中存在的 IO 函数在 BREW 中不起作用。我们必须提供在 BREW 中起作用的相同定义。提供所有在 BREW 中起作用的标准 IO 和文件操作的定义。给它一个名字,例如“*brew_stdio.h*”。

int b_fclose(IFile *pIFile)
{
if (pIFile == stdin || pIFile == stderr || pIFile == stdout) {
DBGPRINTF("fclose: cannot close stdin, stdout or stderr.");
      return 1;
}

      IFILE_Release(pIFile);
return 0;
 }

在 *{PATH}.\include\ft2build.h* 中包含 ".\brew_stdio.h"。

步骤 3:文件修改

将所有 `#include<stdlib.h>` 替换为 `#include “AEEStdlib.h”`。

修改以下文件。

  1. 文件:*.\include\indix\indic\include\indictypes.h*

    将以下定义粘贴到文件的开头。

    typedef signed char int8_t;
    typedef unsigned char u_int8_t;
    typedef short int16_t;
    typedef unsigned short u_int16_t;
    typedef int int32_t;
    typedef unsigned int u_int32_t;
    typedef long long int64_t;
    typedef unsigned long long u_int64_t;
    typedef int32_t register_t;
  2. 文件:*.\include\freetype\config\ftstdlib.h*

    如下所示覆盖宏的定义

    将 C 函数替换为 BREW 宏,适用于内存和字符串操作等。

    例如:替换如下定义

    #define ft_memchr   memchr
    #define ft_memcmp   memcmp
    #define ft_memcpy   memcpy
    #define ft_memmove  memmove
    		.
    		.
    		.

    使用以下宏

    #define ft_memchr   MEMCHR
    #define ft_memcmp   MEMCMP
    #define ft_memcpy   MEMCPY
    #define ft_memmove  MEMMOVE
    		.
    		.
    		.

    将 C 函数替换为 *.\brew_stdio.h* 中的函数 - 文件操作。

    例如:替换如下定义

    #include 
    
    #define FT_FILE     FILE
    #define ft_fclose   fclose
    #define ft_fopen    fopen
    #define ft_fread    fread
    #define ft_fseek    fseek
    #define ft_ftell    ftell
    		.
    		.
    		.

    有了

    #include "brew_stdio.h" 	// to override the c function definitions 
    			// with BREW definitions.
    
    #define FT_FILE     IFile
    #define ft_fclose   b_fclose
    #define ft_fopen    b_fopen
    #define ft_fread    b_fread
    #define ft_fseek    b_fseek
    #define ft_ftell    b_ftell
    		.
    		.
    		.
  3. 文件:*.\include\indix\otlayout\include\fterrcompat.h*

    Indix 是针对 FreeType 1.4 开发的。然而,最新源代码是 FreeType 2.3.9。函数宏 `ALLOC_ARRAY` 和 `REALLOC_ARRAY` 有一个小的修改。这些定义需要根据新源代码进行修改。

    //#define ALLOC_ARRAY( _pointer_, _count_, _type_ ) \
    //  FT_SET_ERROR (FT_MEM_ALLOC_ARRAY( _pointer_, _count_, _type_))
    
    #define ALLOC_ARRAY( _pointer_, _count_, _type_ ) \
    FT_SET_ERROR (FT_MEM_ALLOC( _pointer_, _count_* sizeof ( _type_ )))
    
    /* FT_MEM_REALLOC macro broken in 2.1.0 */
    //#define REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) \
    //  FT_SET_ERROR ( FT_MEM_REALLOC( _pointer_, (_old_) * sizeof ( _type_ ),   \
    //                (_new_) * sizeof ( _type_ ) ) )
    
    #define REALLOC_ARRAY( _pointer_, _old_, _new_, _type_ ) \
    FT_SET_ERROR ( FT_REALLOC( _pointer_, (_old_) * sizeof ( _type_ ),\
                    (_new_) * sizeof ( _type_ ) ) )”

步骤 4:优化(可选)

Indix 支持从“ttf”字体文件渲染字体。然而,freetype 支持更多字体格式。为了优化可执行文件大小,应仅加载相关的驱动程序和模块。

Freetype 会预先加载所有默认模块。可以通过注释掉不必要的模块并在 *ftmodule.h* 中仅加载相关模块来优化此功能。

文件:*.\include\freetype\config\ftmodule.h*

FT_USE_MODULE( FT_Driver_ClassRec, tt_driver_class )
//FT_USE_MODULE( FT_Driver_ClassRec, t1_driver_class )
//FT_USE_MODULE( FT_Driver_ClassRec, pcf_driver_class )
		.
		.
		.
步骤 5:示例程序

Indix 允许您渲染多语言文本。Indix 和 freetype 一起返回对应于 1 或 n 个字形索引的单个位图图像。它不返回整个连接图像。

为了显示一个 `string`,示例程序连接单个位图并写入一个 BMP 文件。然后使用 BREW API 渲染该图像以在屏幕上显示文本。要渲染 Indix 支持的新语言,我们只需添加 *.ttf* 文件,并需要在 `initialiazeFont()` 函数中初始化该字体,如下所示

nCurrScriptId = IX_IndicGetScriptId(ch);
			if(nCurrScriptId == IX_S_DEVA)
				ftError = IX_openAnOpenTypeFont
				(&anOTFont, FONTFILE, IX_S_DEVA);
			else if(nCurrScriptId == IX_S_TELU)
				ftError = IX_openAnOpenTypeFont
				(&anOTFont, FONTTELUGU, IX_S_TELU);

			else if(nCurrScriptId == IX_S_TAML)
				ftError = IX_openAnOpenTypeFont
				(&anOTFont, FONTTAMIL, IX_S_TAML);
			else if(nCurrScriptId == IX_S_ORYA)
				ftError = IX_openAnOpenTypeFont
				(&anOTFont, FONTORIYA, IX_S_ORYA);
			else if(nCurrScriptId == IX_S_GUJR)
				ftError = IX_openAnOpenTypeFont
				(&anOTFont, FONTGUJARATI, IX_S_GUJR);

			else /*if(nCurrScriptId == IX_S_LATIN)*/
				ftError = IX_openAnOpenTypeFont
				(&anOTFont, FONTENGLISH, IX_S_LATIN);

有关如何渲染文本的更多详细信息,请参阅附件中的 *ft_BREW.c*。

步骤 6:在 RVDS 中编译和链接

将所有源文件包含到工作区中并使用默认的 BREW 设置。

target_path.JPG

目标设置:后链接器已禁用,因为我们使用 brew elf2mod 实用程序从 .elf 生成 .mod 文件。

访问路径:在项目“访问路径”选项卡中指定所有必需的路径,以消除所有链接错误。

compiler_settings.JPG

编译器设置:armcc --split_sections --apcs=inter -O0 -DDYNAMIC_APP

linker_settings.JPG

链接器设置:armlink --reloc --split --verbose --ro_base=0x0 --datacompressor=off --errors=err.txt --first=AEEMod_Load --output=ft.elf

最后一步:生成 .mod 文件

使用 `elf2mod` 实用程序将 elf 转换为 BREW 可执行文件(*.mod*),如下所示。

elf2mod ft.elf

将在同一文件夹中创建一个 *ft.mod* 文件。

将 *ft.mod* 与相应的语言 *.ttf* 文件一起添加到构建文件中以进行渲染。

使用 BREW Apploader 将构建文件加载到手机上并启动应用程序。
按 1 查看以印地语字体显示的演示字符串“Welcome”。

有关更多详细信息,请查看文章随附的示例代码(ft_BREW.7z)。要快速查看示例代码输出,请查看相应的附加构建文件(*ft_BREW/build*)。

相关资源

作者

Deepti Chunduru

Deepti Chunduru 是孟买大学计算机工程学士。她与塔塔咨询服务有限公司合作。她的研究兴趣是移动计算。

Prashant Gotarne

Prashant Gotarne 是孟买大学计算机工程学士。他是塔塔咨询服务有限公司孟买创新实验室的研究团队成员。他的研究兴趣是移动计算、计算机安全和图像处理。

潘卡吉·多克

Pankaj Doke 是孟买大学计算机工程学士。他是塔塔咨询服务有限公司孟买创新实验室的研究团队负责人。他的研究兴趣是移动计算、计算机安全、模式识别、机器学习和大型系统。

桑杰·金巴胡内

Sanjay Kimbahune 拥有 Amravati 大学电子工程学士学位。他是 Tata Consultancy Services Limited 孟买创新实验室的研究科学家。他的研究兴趣是移动计算和电信系统。

版权所有 © 2010 Tata Consultancy Services Ltd. 保留所有权利

© . All rights reserved.