如何在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,一经查实,立即删除!

相关文章

VS2008创建dll,并使用dll

原来一直使用vc6.0做开发,但是公司主要使用vs2008工具,刚开始使用的时候感觉非常不好用,但是一周下来,不禁感叹,还是新的好啊,嘿嘿! 这里总结一下vs2008下创建dll并使用dll导出函数的方法&#…

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通配符 可在任意位置…

React开发(245):ant design form自定义验证

<Form.Item label"联系人手机号&#xff1a;">{getFieldDecorator(contactMobile, {initialValue: type update ? activeUpdateData.contactMobile : ,rules: [{ required: true, message: 请输入联系人手机号 },{ pattern: isPhone, message: 手机号格式不…

武汉科技大学计算机转专业吗,武汉科技大学普通本科生专业选择与转专业管理办法...

武科大教〔2018〕28号第一条为了进一步深化教育教学改革&#xff0c;稳步推进学分制和大类培养&#xff0c;为学生提供灵活多样的学习方式&#xff0c;充分调动学生学习的积极性和主动性&#xff0c;促进学生个性化发展&#xff0c;根据《普通高等学校学生管理规定》(教育部令第…

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

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

microwindows位图解析

From: http://blog.csdn.net/bisword/article/details/2740054 第1章 microwinodows图形显示框架 1.1 microwindows体系结构 Microwindows 采用了分层结构设计方法,其层次结构如下图所示。同时, 这里也列出 Microwindows 源代码目录树下的主要目录结构,以便于对照参考。 mic…

jQuery:动态改变html表单的目标页(Target)

看到Rick Strahl的最新博客Changing an HTML Form’s Target with jQuery&#xff0c;读完之后感觉文中给出的解决方案很简单很实用。借鉴原文&#xff0c;断断续续重新整理小结一下&#xff0c;本文最后提供一个简单demo下载&#xff0c;希望对您也有帮助。 1、问题来源 “页面…

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

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

Qt sqlit3的增、删、改、查、判断等基本操作接口

1、Qt sqlit3简介 Qt SQLite&#xff08;sql&#xff09;是一款不需要服务器的开源轻量级的数据库软件&#xff0c;可以集成在其他软件中&#xff0c;适合嵌入式系统应用。Qt5以上版本直接支持SQLite。具体的特性和语法可以参考RUNOOB. 这里我把自己项目中用到的基本操作函数贴…

ECNUOJ 2143 端午节快乐

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

Linux下通过命令设置系统时间

Linux下通过命令设置系统时间&#xff1a; date -s "09/22/2012 09:30:30" clock -w

教你看编号选希捷硬盘

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

一键圣诞帽 html5源码,HTML5在线教程之微信小程序“圣诞帽”的实现思路详解

HTML5在线教程之微信小程序“圣诞帽”的实现思路详解大家应该还记得微信小程序“圣诞帽”吧&#xff0c;在圣诞的那几天可谓是非常的火爆&#xff0c;大家都争相使用&#xff0c;本篇文章小编给大家分享一下微信小程序“圣诞帽”的实现思路详解&#xff0c;对此感兴趣的小伙伴随…

STM32 应用程序加密的一种设计方案

0、前言 STM32编译后的代码存在FLASH中&#xff0c;通过外部工具可以读出来全部数据&#xff0c;一旦硬件抄板一样&#xff0c;再将FLASH数据全部拷贝至抄板单片机中&#xff0c;既可以完全实现硬件和软件功能抄袭。因此&#xff0c;需要对自己的应用程序加密&#xff0c;即使…

使用HTML5实现刮刮卡效果

http://www.helloweba.com/view-blog-270.html转载于:https://www.cnblogs.com/wln3344/p/4618226.html

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

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

mount: unknown filesystem type 'LVM2_member'解决方案

From: http://hi.baidu.com/williwill/item/7a36fdd92340b2ee55347f13 系统启动到request_module: runaway loop modprobe binfmt-464c挂起 利用U盘系统&#xff0c;挂载硬盘出现&#xff1a;mount: unknown filesystem type LVM2_member 解决办法&#xff1a; 需要安装 lvm2:…

计算机专业英语的题目,计算机专业英语题目

比较题1.SRAM and DRAM*RAM is short for random access memory.Static RAM(SRAM) keeps data in the main memory,without frequent refreshing,for as long as power is supplied to the cicuit. SRAM is very fast but it is much more expensive than DRAM and takes more …