一、前言
Microwindows可以运行在 支持Framebuffer的 32位的 Linux系统上,或者也可以使用著名的 SVGALib[45] 库来进行图形显示。此外,它还被移植到16位的EL
KS 和实模式的MSDOS上。Microwindows实现了1,2,4,8,16 和 32 位的像素支持,还实现了VGA16 平面模式的支持。Microwindows 已经被移植到一些掌上电脑。它的图形引擎被设计成能够运行在任何支持readpixel,writepixel,drawhorzline和drawvertline,和setpalette 的系统之上。如果底层驱动系统实现了Blitting ,则上层可以提供更多的增强功能。在底层函数的支持之下,上层实现了位图,字体,光标以及颜色的支持。除了基于调色板的1,2,4和8位像素模式,Microwindows也实现了15,16和32位像素的真彩模式。
屏幕驱动程序是系统中最为复杂的驱动程序,不过它的设计使之可以很容易的把新的硬件移植到Microwindows上。因为这个原因,尽管所提供的其他进程被允许使用很少的一部分核心进程,但是实际上只有很少的入口点在需要时被真正的用于和硬件通讯。本文详细介绍图片和字体在Microwindows中的显示。
二、在应用程序中嵌入图片
Microwindows包含一个工具集叫做convbmp,作用是将Windows?类型的位图文件转换成C的源代码。这样可使应用程序在允许的存储范围里带有一定数目的图片。
1、将位图文件转换成C源码
首先创建一个目录来编译该例,将Microwindows源码里面Tux中的位图文件复制到该目录里。使用convbmp将位图文件转成C源码文件。
本例默认Microwindows安装在~/win下,而本例则在~/mymw/ex_image_01下编译。
$ cd ~/mymw/ex_image_01
$ cp ~/microwin/src/mwin/bmp/penguin.bmp penguin.bmp
$ convbmp penguin.bmp
penguin.c包含三个结构:第一个是关于颜色调色板的存储结构,包含了多达256种颜色,convbmp在这里面找到颜色和欲转换的图片匹配。第二个是关于图片bit位的存储数组。最后一个结构是一个public型的数组,名称为MWIMAGEHDR。本例中该数组命名为image_penguin,这是因为convbmp对转换后生成文件的命名规则是在原文件名前加上image_。本例使用的是penguin.bmp,所以该结构名为image_penguin。
2、Nano-X客户端修正
0.89pre7版本的nano-X对于从客户端传送到主机的流量限制为每条信息10000个字节。有些函数可以将需要传送的信息分割成小块使之符合传送所要求的流量而继续传输;但是对于像GrDrawImageBits()这样的函数无法实现将欲传送的信息分割成小块的功能。本例中的penguin位图文件远比10000字节要大,因此在nano-X源文件~/microwin/src/nanox/nxproto.h中将以下行
#define MAXREQUESTSZ???10000???/* max request size (65532)*/
替换成:
#define MAXREQUESTSZ???30000???/* max request size (65532)*/
然后重新编译安装Microwindows包。
3、示例:Drawing Tux 1
将以下的源代码复制到命名为“image_01.c”的文件中。确认是否安装Microwindows,如没有,请改变路径到/usr/include/microwin以便其可以指向Microwindows源码解压的所在目录下。
$ gcc image_01.c penguin.c \
> -I/usr/include/microwin \
> -o image_01 -lnano-X
Example 2-1. image_01.c
#include
#define MWINCLUDECOLORS
#include "microwin/nano-X.h"
GR_WINDOW_ID wid;
GR_GC_ID gc;
extern GR_IMAGE_HDR image_penguin;
void event_handler (GR_EVENT *event);
int main (void)
{
if (GrOpen() < 0)
{
fprintf (stderr, "GrOpen failed");
exit (1);
}
gc = GrNewGC();
wid = GrNewWindowEx (GR_WM_PROPS_APPFRAME |
GR_WM_PROPS_CAPTION |
GR_WM_PROPS_CLOSEBOX,
"Tux Window I",
GR_ROOT_WINDOW_ID, 50, 50,
image_penguin.width,
image_penguin.height,
WHITE);
GrSelectEvents (wid, GR_EVENT_MASK_EXPOSURE |
GR_EVENT_MASK_CLOSE_REQ);
GrMapWindow (wid);
GrMainLoop (event_handler);
return 0;
}
void event_handler (GR_EVENT *event)
{
switch (event->type)
{
case GR_EVENT_TYPE_EXPOSURE:
GrDrawImageBits (wid , gc , 0 , 0, &image_penguin);
break;
case GR_EVENT_TYPE_CLOSE_REQ:
GrClose();
exit (0);
}
}
以下指令用来运行“image_01.c”程序,运行后你会看到如下显示的窗口:
Figure 2-1. Tux I Example
三、绘制文件中的图片
GrDrawImageFile()函数用来从文件中读取图片,在窗口或像素映射中显示。这个函数支持多种图片格式,包括GIF,JPEG,BMP,PNG,XPM,PBM,PPM等等,读取文件时自动选定图片格式。
图片文件必须存在nano-X服务器的文件系统中,客户端的应用程序只需向服务器传送文件名,服务器会自动读取文件。注意在服务器打开文件时,存放图片的文件名的相对地址应当是相对于nano-X服务器的当前目录而不是客户端当前工作状态下的目录。
下例是用来说明如何从文件中读取图片Tux并显示出来,每当服务器接收到exposure事件时就读取文件。该方法较慢。另外一种方法是将文件先读取到内存中,每次接收到exposure事件时就从内存中读取图片显示。
示例:Drawing Tux 2
先创建一个目录用来编译本例,然后将位图图片Tux从Micorwindows的源代码中复制到该目录下。同时将下面的源码示例复制到命名为“image_02.c”的文件中。
本例假设Microwindows是安装在~/microwin路径下的而且例子在~/mymw/ex_image_02下编译。
$ ~/mymw/ex_image_02
$ ~/microwin/src/mwin/bmp/penguin.bmp penguin.bmp
用下列命令行编译该程序:
$ gcc image_02.c \
> -I/usr/include/microwin \
> -o image_02 -lnano-X
Example 2-2. image_02.c
#include
#define MWINCLUDECOLORS
#include "microwin/nano-X.h"
GR_WINDOW_ID wid;
GR_GC_ID gc;
void event_handler (GR_EVENT *event);
int main (void)
{
if (GrOpen() < 0)
{
fprintf (stderr, "GrOpen failed");
exit (1);
}
gc = GrNewGC();
wid = GrNewWindowEx (GR_WM_PROPS_APPFRAME |
GR_WM_PROPS_CAPTION |
GR_WM_PROPS_CLOSEBOX,
"Tux Window II",
GR_ROOT_WINDOW_ID, 50, 50,
100, 200,
WHITE);
GrSelectEvents (wid, GR_EVENT_MASK_EXPOSURE |
GR_EVENT_MASK_CLOSE_REQ);
GrMapWindow (wid);
GrMainLoop (event_handler);
return 0;
}
void event_handler (GR_EVENT *event)
{
switch (event->type)
{
case GR_EVENT_TYPE_EXPOSURE:
{
GR_WINDOW_INFO info;
GrGetWindowInfo (wid, &info);
GrDrawImageFromFile (wid, gc, 0, 0,
info.width, info.height,
"penguin.bmp", 0);
break;
}
case GR_EVENT_TYPE_CLOSE_REQ:
GrClose();
exit (0);
}
}
使用以下命令行运行该程序:
$ nano-X& sleep 1; nanowm& sleep 1; ./image_02&
四、从文件中读取图片
GrLoadImageFromFile()用来从文件中读取图片到内存中再返回一个ID号GR_IMAGE_ID。该ID号在调用函数GrDrawImageToFit()在窗口中绘制图片时标识图片。该函数支持多种图片格式,包括GIF,JPEG,BMP,PNG,XPM,PBM,PPM等等,读取文件时自动选定图片格式。
存放图片的文件就可放在nano-X服务器的文件系统中。客户端的应用程序只需传送文件名,服务器会自动读取文件。
下例说明如何从文件中读取图片Tux并显示出来。算法比上面快,每次接收到exposure事件时程序直接在内存中读取。
示例:Drawing Tux 3
先创建一个目录,然后将位图图片Tux从Micorwindows的源代码中复制到该目录下。同时将下面的源码示例复制到命名为“image_03.c”的文件中。
同样本例假设Microwindows是安装在~/microwin路径下的而且例子在~/mymw/ex_image_03下编译。$ ~/mymw/ex_image_03
$ ~/microwin/src/mwin/bmp/penguin.bmp penguin.bmp
用下列命令行编译该程序,
$ gcc image_03.c \
> -I/usr/include/microwin \
> -o image_03 -lnano-X
Example 2-3. image_03.c
#include
#define MWINCLUDECOLORS
#include "microwin/nano-X.h"
GR_WINDOW_ID wid;
GR_GC_ID gc;
GR_IMAGE_ID image;
void event_handler (GR_EVENT *event);
int main (void)
{
if (GrOpen() < 0)
{
fprintf (stderr, "GrOpen failed");
exit (1);
}
image = GrLoadImageFromFile ("penguin.bmp", 0);
gc = GrNewGC();
wid = GrNewWindowEx (GR_WM_PROPS_APPFRAME |
GR_WM_PROPS_CAPTION |
GR_WM_PROPS_CLOSEBOX,
"Tux Window III",
GR_ROOT_WINDOW_ID, 50, 50,
100, 200,
WHITE);
GrSelectEvents (wid, GR_EVENT_MASK_EXPOSURE |
GR_EVENT_MASK_CLOSE_REQ);
GrMapWindow (wid);
GrMainLoop (event_handler);
return 0;
}
void event_handler (GR_EVENT *event)
{
switch (event->type)
{
case GR_EVENT_TYPE_EXPOSURE:
{
GR_WINDOW_INFO info;
GrGetWindowInfo (wid, &info);
GrDrawImageToFit (wid, gc, 0, 0,
info.width, info.height,
image);
break;
}
case GR_EVENT_TYPE_CLOSE_REQ:
GrClose();
exit (0);
}
}
使用以下命令行运行该程序:
$ nano-X& sleep 1; nanowm& sleep 1; ./image_03&
五、如何使用字体
1、使用TrueType字型
Microwindows自带了两种raster字型,在…/microwin/src/fonts目录中含有工具可以用来在Microwindows中添加字型。
2、安装字型库
① 下载FreeType字型库
Microwindows使用的是公开源码的FreeType字型库,可以用它来添加字型。本文中默认的目录为/home/gray。
② 解压源代码
下载的文件是tar类型的压缩文件,用tar命令解压出源代码。解压过程中会自动创建一个新的目录叫freetype-1.3.1来存放FreeType源码。
$ tar –xzf freetype-1.3.1.tar.gz
③ 安装并编译连接该库
进入存放FreeType源码的目录:
$ cd freetype-1.3.1
使用以下命令编译该库:
$ ./configure
$ make
安装成功后更改root用户的id号和类型:
# make install
④ 修改Microwindows的属性文件
修改Microwindows的属性文件:…/microwin/src/config。更改HAVE_FREETYPE_SUPPORT等于Y,以及INCFTLIB和LIBFTLIB使之指向刚才编译过的存放FreeType库的目录。
# TrueType font support thru FreeType
HAVE_FREETYPE_SUPPORT = Y
INCFTLIB = /usr/local/include
LIBFTLIB = /usr/local/lib/libttf.so
FREETYPE_FONT_DIR = "/usr/local/microwin/fonts"
Symbol |
DescriptionPurpose |
HAVE_FREETYPE_SUPPORT |
该符号用来控制在Microwindows中FreeType源码是否被支持。如果其值为Y,表示支持FreeType,为N表示不支持。 |
INCFTLIB |
该符号指定开发系统中FreeType所包含文件的路径。在编译Microwindows的过程中该路径会被添加到包含的头文件的搜索路径中去。 |
LIBFTLIB |
该符号指定在开发系统中FreeType库文件的路径。在链接Microwindows的过程中该路径会被添加到包含的头文件的搜索路径中去。 |
FREETYPE_FONT_DIR |
该符号指定在目标系统中TrueType字型的路径。在创建目标系统中,要使用这里定义的目录来存放TrueType字型。 |
⑤ 重新编译Microwindows
修改属性文件后,重新编译Microwindows系统。
⑥ 获取TrueType字型
在目标系统中创建目录../usr/local/microwin/fonts/来存放TrueType字型。将.ttf文件存放至该目录中。
以下站点可下载一些TrueType字型。
ftp://microwindows.censoft.com/pub/microwindows/microwindows-fonts-truetype-0.89pre2.tar.gz
3、示例
本节介绍一个简单的使用TrueType字型的例子。将以下的源代码复制到名为“fonts.c”的文件中,用以下的命令编译该程序:
$ gcc fonts.c -I/usr/include/microwin \
> -o fonts -lnano-X
Example 3-1. fonts.c
#include
#define MWINCLUDECOLORS
#include "microwin/nano-X.h"
GR_WINDOW_ID wid;
GR_GC_ID gc;
GR_FONT_ID font_a, font_b, font_c, font_d;
void event_handler (GR_EVENT *event);
int main (void)
{
if (GrOpen() < 0)
{
fprintf (stderr, "GrOpen failed");
exit (1);
}
gc = GrNewGC();
GrSetGCUseBackground (gc, GR_FALSE);
GrSetGCForeground (gc, RED);
wid = GrNewWindowEx (GR_WM_PROPS_APPFRAME |
GR_WM_PROPS_CAPTION |
GR_WM_PROPS_CLOSEBOX,
"Font Test Window",
GR_ROOT_WINDOW_ID, 50, 50,
200, 130, WHITE);
GrSelectEvents (wid, GR_EVENT_MASK_EXPOSURE |
GR_EVENT_MASK_CLOSE_REQ);
font_a = GrCreateFont ("arial", 12, NULL);
font_b = GrCreateFont ("comic", 16, NULL);
font_c = GrCreateFont ("comic", 24, NULL);
font_d = GrCreateFont ("arial", 36, NULL);
GrMapWindow (wid);
GrMainLoop (event_handler);
return 0;
}
void event_handler (GR_EVENT *event)
{
switch (event->type)
{
case GR_EVENT_TYPE_EXPOSURE:
GrSetGCFont (gc, font_a);
GrText (wid, gc, 20, 20, "Arial 12", -1, GR_TFASCII);
GrSetGCFont (gc, font_b);
GrText (wid, gc, 20, 40, "Comic 16", -1, GR_TFASCII);
GrSetGCFont (gc, font_c);
GrText (wid, gc, 20, 70, "Comic 24", -1, GR_TFASCII);
GrSetGCFont (gc, font_d);
GrText (wid, gc, 20, 110, "Arial 36", -1, GR_TFASCII);
break;
case GR_EVENT_TYPE_CLOSE_REQ:
GrClose();
exit (0);
}
}
以下指令用来运行“image_01.c”程序,运行后会看到如下窗口:
$ nano-X& sleep 1; nanowm& sleep 1; ./fonts&
Figure 3-1. TrueType Font Example