信息科学与技术学院学士学位论文
根据编码标准,所有的字符集若要正确显示出来,都必须将非Unicode编码格式转换为Unicode编码。根据得出的字符集编码方式,如果是Unicode编码,不要进行转换。在非Unicode编码的情况下再继续判断,如果是Utf-8编码,进行单独的转换,否则对相应的语言编码进行相应的编码转换,该转换都是对相应的编码二进制表将其读取。
根据Utf-8的字符编码的规定,Utf-8编码的转换步骤和方法如下:
(1)在ASCII码范围内的字符,即小于0x80的字符编码,可直接支持显示,不用进行编码的解码;
(2)在0x80到0x7FF的范围内,要Utf-8编码形式为高字节为110xxxxxx,低字节为10xxxxxx,将高字节中的110抽去,低字节的10抽去,最后剩下的就是Unicode编码;
(3)在0x800到0x7FFF的范围内,Utf-8的编码形式为1110xxxx 10xxxxxx 10xxxxxx,用同样的方法将Utf-8前端的标示符抽去,剩下的经过组合成Unicode编码。
总体来说,在非Unicode编码中只有Utf-8编码有规律可找,其他编码形式都要经过查表来进行解码。
在接收到命令后,可以向上翻页,向下翻页,上一行,下一行,其实现原理类似,分析向下行显示,功能实现流程如图4-7所示。
接收到右键 填充背景到屏幕 设置当前偏移量 否 是 当前偏移>0 设置下一页下一行的偏移量 传送字符串到屏幕 刷屏 设置上一页上一行的偏移 图4-7 下一行显示流程图
21
信息科学与技术学院学士学位论文
当系统接收到向下行显示的命令后,具体的实现步骤如下: (1)填充背景到屏幕;
(2)设置当前偏移为下一行偏移,画出下一行; (3)判断是否到屏幕末以及文件末; (4)设置下一行下一页的偏移; (5)设置上一行上一页的偏移; (6)刷新屏幕。
4.3 软件运行环境
为了保证系统运行的可靠性,对于软件的运行环境具有一定的要求。软件的运行环境分为硬件环境和软件环境。
(1)硬件开发环境 PC机
处理器:基于ARM920T内核的S3C2410处理器 内存: 64MB以上 FS2410 开发板 (2)软件环境
Ubuntu Linux10.04操作系统 Windows 98/2000/XP操作系统(可选) 嵌入式Linux开发环境
4.4 本章小结
系统设计是每个系统的灵魂所在,这一章主要阐述系统的功能设计,通过对系统设计的两个功能模块,即命令模式功能和数据模式功能,数据模块功能可以基本从大局上掌握系统的框架。系统设计这是整个系统的核心,它直接展示了系统的功能实现方法和原理以及整个系统的控制流。
22
信息科学与技术学院学士学位论文
5 系统实现
5.1系统关键技术
实现TXT电子书阅读器的开发,主要用到的技术就是SDL,SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发函数库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函式,让开发者只要用相同或是相似的程序码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。 5.1.1 SDL的功能
(1)视频
可设置8bpp或更高的任意色彩深度的视频模式。如果某个模式硬件不支持,可以选择转化为另一模式,支持可以直接写入线性的图像帧缓冲(framebuffer),用颜色键值(colorkey)或者alpha混合属性创建surface,将surface显示到屏幕上。
Surface的blit能自动的转化为目标格式。blit是优化过的,并能使用硬件加 速。x86平台上有针对MMX优化过的blit,硬件加速的blit和fill(填充)操作,如果硬件支持的话。
(2)事件
当应用程序的visibility发生改变的事情,主要检测到的事件主要有:键盘输入 、和鼠标输入,当用户要求的退出的时候调用SDL_QUIT() 函数实现退出应用程序,每种事件都能通过SDL_EventState()关闭或者打开,事件经由用户指定的过滤函数再被加入到内部的事件队列,可支持线程安全的事件队列。
(3)音频
可以设置8位和16位的音频,单声道或者立体声,如果格式硬件不支持,可以选择进行转换,由独立的线程执行音频部分,并提供用户回调(callback)机制。
23
信息科学与技术学院学士学位论文
设计上考虑到了客户定制的软混音器,但实际上在例程中就包含了一个完整的音频/音乐输出库。
(4)CD音频
具有完整的CD音频控制API。 (5)线程
简单的线程创建API ,可用于同步的简单的二进制信号量(semaphores)。 (6)定时器
可读取已流逝的毫秒数或等待指定的毫秒数,可支持设置一个10毫秒精度的周期性定时器。
(7)字节序无关
侦测当前系统的字节序 ,快速转换数据的函数,读写指定字节序的数据。 SDL支持的系统如下: (1)Linux
视频显示使用X11,利用XFree86 DGA扩展的优势,全屏显示使用新的w MTRR加速,声音使用OSS API,使用clone()系统调用和SysV IPC,或者glibc-2.1的pthreads实现线程。
(2)Win32
有两个版本,一个是适合所有基于Win32的系统的安全版本,另一个是基于DirectX的高性能版本,安全版本的视频显示采用GDI。高性能版本采用DirectDraw,并可支持硬件加速,安全版本的音频回放采用waveOut API。高性能版本采用DirectSound。
(3)BeOS
视频显示采用Bwindow,音频回放采用BSoundPlayer API。 5.1.2 SDL开发基本介绍
(1)初始化库
24
信息科学与技术学院学士学位论文
调用SDL_Init()动态的加载和初始化SDL库,该函数带有一组标记来表示哪部分需要激活:SDL_INIT_AUDIO 、SDL_INIT_VIDEO、SDL_INIT_CDROM、SDL_INIT_TIMER,或者是采用SDL_INIT_EVERYTHNG,在使用完毕SDL最后调用SDL_Quit()函数来完成退出操作。
(2)视频
简便的选择和设置视频模式,可实现在屏幕上绘制像素,该功能主要可以通过直接写入图形帧缓冲(framebuffer)和调用屏幕更新函数来绘制屏幕并刷新,另外也可以实现加载和显示图片的功能。在SDL中只提供了SDL_LoadBMP()函数以及SDL_BlitSurface()函数将图片blit进图形帧缓冲,从而显示图片,SDL_BlitSurface()自动对blit矩形进行裁边,blit矩形在调用SDL_UpdateRects()时被用作更新屏幕变化了的部分。
(3)事件
SDL中支持的事件主要包括等待事件和事件轮询,前者等待事件采用的调用函数为SDL_WaitEvent();而在事件轮询中调用SDL_PollEvent()函数可实现对按键以及鼠标事件输入的轮询判断。
5.2 编码实现
编码的实现主要包括主函数实现、字符编码的解码实现、TXT主窗口的创建、等待命令、翻页显示等。 5.2.1 主函数的实现
主函数是整个程序的灵魂,涵盖了主要的设计思路,其主要设计思路为: (1)读取电子书的大小,分配相应的空间;
(2)分析传入的参数是否合理,设置放大率,旋转和偏移量; (3)初始化有关SDL资源; (4)语言编码初始化;
(5)根据文件得到字符集编码格式;
25