如何在Microwindows中显示图片和安装字体
生活随笔
收集整理的這篇文章主要介紹了
如何在Microwindows中显示图片和安装字体
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
From: http://bbs.chinaunix.net/thread-1987116-1-1.html
Microwindows可以運行在 支持Framebuffer的 32位的 Linux系統(tǒng)上,或者也可以使用著名的 SVGALib[45] 庫來進行圖形顯示。此外,它還被移植到16位的EL
KS 和實模式的MSDOS上。Microwindows實現了1,2,4,8,16 和 32 位的像素支持,還實現了VGA16 平面模式的支持。Microwindows 已經被移植到一些掌上電腦。它的圖形引擎被設計成能夠運行在任何支持readpixel,writepixel,drawhorzline和drawvertline,和setpalette 的系統(tǒng)之上。如果底層驅動系統(tǒng)實現了Blitting ,則上層可以提供更多的增強功能。在底層函數的支持之下,上層實現了位圖,字體,光標以及顏色的支持。除了基于調色板的1,2,4和8位像素模式,Microwindows也實現了15,16和32位像素的真彩模式。
屏幕驅動程序是系統(tǒng)中最為復雜的驅動程序,不過它的設計使之可以很容易的把新的硬件移植到Microwindows上。因為這個原因,盡管所提供的其他進程被允許使用很少的一部分核心進程,但是實際上只有很少的入口點在需要時被真正的用于和硬件通訊。本文詳細介紹圖片和字體在Microwindows中的顯示。
二、在應用程序中嵌入圖片
Microwindows包含一個工具集叫做convbmp,作用是將Windows?類型的位圖文件轉換成C的源代碼。這樣可使應用程序在允許的存儲范圍里帶有一定數目的圖片。
1、將位圖文件轉換成C源碼
首先創(chuàng)建一個目錄來編譯該例,將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對轉換后生成文件的命名規(guī)則是在原文件名前加上image_。本例使用的是penguin.bmp,所以該結構名為image_penguin。
2、Nano-X客戶端修正
0.89pre7版本的nano-X對于從客戶端傳送到主機的流量限制為每條信息10000個字節(jié)。有些函數可以將需要傳送的信息分割成小塊使之符合傳送所要求的流量而繼續(xù)傳輸;但是對于像GrDrawImageBits()這樣的函數無法實現將欲傳送的信息分割成小塊的功能。本例中的penguin位圖文件遠比10000字節(jié)要大,因此在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服務器的文件系統(tǒng)中,客戶端的應用程序只需向服務器傳送文件名,服務器會自動讀取文件。注意在服務器打開文件時,存放圖片的文件名的相對地址應當是相對于nano-X服務器的當前目錄而不是客戶端當前工作狀態(tài)下的目錄。
下例是用來說明如何從文件中讀取圖片Tux并顯示出來,每當服務器接收到exposure事件時就讀取文件。該方法較慢。另外一種方法是將文件先讀取到內存中,每次接收到exposure事件時就從內存中讀取圖片顯示。
示例:Drawing Tux 2
先創(chuàng)建一個目錄用來編譯本例,然后將位圖圖片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服務器的文件系統(tǒng)中。客戶端的應用程序只需傳送文件名,服務器會自動讀取文件。
下例說明如何從文件中讀取圖片Tux并顯示出來。算法比上面快,每次接收到exposure事件時程序直接在內存中讀取。
示例:Drawing Tux 3
先創(chuàng)建一個目錄,然后將位圖圖片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命令解壓出源代碼。解壓過程中會自動創(chuàng)建一個新的目錄叫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
該符號指定開發(fā)系統(tǒng)中FreeType所包含文件的路徑。在編譯Microwindows的過程中該路徑會被添加到包含的頭文件的搜索路徑中去。
LIBFTLIB
該符號指定在開發(fā)系統(tǒng)中FreeType庫文件的路徑。在鏈接Microwindows的過程中該路徑會被添加到包含的頭文件的搜索路徑中去。
FREETYPE_FONT_DIR
該符號指定在目標系統(tǒng)中TrueType字型的路徑。在創(chuàng)建目標系統(tǒng)中,要使用這里定義的目錄來存放TrueType字型。
⑤ 重新編譯Microwindows
修改屬性文件后,重新編譯Microwindows系統(tǒng)。
⑥ 獲取TrueType字型
在目標系統(tǒng)中創(chuàng)建目錄../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、示例
本節(jié)介紹一個簡單的使用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
總結
以上是生活随笔為你收集整理的如何在Microwindows中显示图片和安装字体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 探究VS2017运行库
- 下一篇: 什么是计算机思维?