如何在Microwindows中显示图片和安装字体

From: http://bbs.chinaunix.net/thread-1987116-1-1.html


一、前言
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()
{
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”程序,运行后你会看到如下显示的窗口:
$ nano-X& sleep 1; nanowm& sleep 1; ./image_01&
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()
{
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()
{
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
http://www.microsoft.com/typography/fontpack/default.htm
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()
{
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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/405546.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL常用语法记录

0、说明 记录MySQL使用到的常用语法。 1、MySQLDISTINCT唯一 2、MySQLLIMIT限制 3、MySQL ORDER排序升序 4、MySQL DESC降序 5、MySQL WHERE 过滤 6、MySQL 操作符 AND OR ,AND优先级高于OR 7、MySQL IN 8、MySQL NOT 否定之后跟的任何条件 9、MySQL LIKE通配符 可在任意位置…

js DOM——JS学习笔记2015-7-2(第73天)

这个是w3cschool上面的简易版教程,虽然简易,但是对整个JS DOM,有个大致的概念,同时引入思维导图这种图表法学习方式,期待更加便于记忆和管理 转载于:https://www.cnblogs.com/zhangxg/p/4615453.html

花卉网页html,花卉管理系统(数据库+源码)

这是一个入门级示例,实现了花卉的 增加 和 查询功能资源下载此资源下载价格为2D币,请先登录资源文件列表花卉管理系统/FlowerManagerSys/.vs/FlowerManagerSys/v15/.suo , 53248花卉管理系统/FlowerManagerSys/.vs/FlowerManagerSys/v15/Server/sqlite3/…

ECNUOJ 2143 端午节快乐

端午节快乐 Time Limit:1000MS Memory Limit:65536KBTotal Submit:1720 Accepted:868 Description 有一段有趣的传说。公元前340年,爱国诗人、楚国大夫屈原,面临亡国之痛,于五月五日,悲愤地怀抱大石投汩罗江,为了不使鱼…

教你看编号选希捷硬盘

对于大部分消费者而言,很多人在选购硬盘时,都会把注意力集中在硬盘的容量上,而近期一些用户也会注意到硬盘的接口(IDE或者是SATA)等方面,但是,硬盘的性能并不仅仅表示在容量以及接口上&#xff…

两块网卡实现多台机器共享上网

组建局域网内部网络,遇到的问题:购买电信的宽带,多人拨号肯定是不行的(貌似同时超过4台机器拨一个号就自动被断开网络了)。 使用一些软件共享上网觉得既然是人家开发的软件,不太放心里面加了什么代码会监控这边的网络,…

Gvim 字体大小设置和FencView插件安装

1. GVim更改字体及大小 在命令模式下输入: set guifontlucida\ console:h14 其中,字体名有空格的话,要转义下. 2. FencView插件(Ver4.8)下载位置: http://vim.sourceforge.net/scripts/download_script.php?src_id17381 解压出来后&am…

深度学习--Matlab使用LSTM长短期记忆网络对负荷进行预测

一、LSTM描述 长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,是为了解决一般的RNN(循环神经网络)存在的长期依赖问题而专门设计出来的,所有的RNN都具有一种重复神经网络…

计算机桌面怎么全屏显示,电脑显示器如何设置成满屏

在有些时候我们的网友不清楚电脑显示器如何设置成满屏,那么下面就由学习啦小编来给你们说说电脑显示器设置成满屏的方法吧,希望可以帮到你们哦!电脑显示器设置成满屏的方法:右击桌面,选择弹出对话框中的【屏幕分辨率】如下图。弹出…

Matlab中求数据概率分布的方法

一、问题描述 对已有的一些列数据进行分析,想得到该数据的分布和统计特性,如概率密度函数,概率分布,累计概率密度等等。 例如,已有一段时间的声音测量数据,求该数据的分布特性,并给出噪声的95…

matlab设置plot图像尺寸大小、坐标轴等

Matlab作为工程中的数据可视化工具是非常的方便的。但是在具体的生成过程中通常会遇见以下几个比较常见的问题,这里以我最近在写论文中用图遇到的问题作为例子。简要说明输出图像大小位置规范的重要性。 1:colorbar的位置大小范围不一致、不合理 2&#…