📄 基于 linux 和 minigui 的嵌入式系统软件开发指南(七).htm
字号:
width=160></TD></TR>
<TR>
<TD align=right>
<TABLE cellSpacing=0 cellPadding=3 width=160 border=0>
<TBODY>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part7/index.shtml#1">1
引言</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part7/index.shtml#2">2
曲线和填充生成器</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part7/index.shtml#3">3
绘制复杂曲线</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part7/index.shtml#4">4
封闭曲线填充</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part7/index.shtml#5">5
建立复杂区域</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part7/index.shtml#6">6
直接访问显示缓冲区</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part7/index.shtml#7">7
YUV Overlay 和 Gamma 校正</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part7/index.shtml#8">8
小结</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End TOC --><!-- Start Related Content Area -->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=160 bgColor=#000000 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(七).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=middle
background="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(七).files/bg-gold.gif"
height=5><B>相关内容:</B></TD></TR>
<TR>
<TD width=160 bgColor=#666666 height=1><IMG height=1 alt=""
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(七).files/c.gif"
width=160></TD></TR>
<TR>
<TD align=right>
<TABLE cellSpacing=0 cellPadding=3 width="98%" border=0>
<TBODY>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part1/index.shtml">主题一:选择MiniGUI-Threads
或者 MiniGUI-Lite</A> </TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part2/index.shtml">主题二:理解消息循环和窗口过程</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part3/index.shtml">主题三:对话框和控件编程</A></TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part4/index.shtml">主题四:使用
GDI 函数</A> </TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part5/index.shtml">主题五:MiniGUI
1.1.0 版本引入的新 GDI 功能和函数</A> </TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part6/index.shtml">主题六:MiniGUI
提供的非 GUI/GDI 接口</A> </TD></TR>
<TR>
<TD><A
href="http://www-900.ibm.com/developerWorks/cn/linux/theme/special/index.html#minigui">嵌入式与MiniGUI专栏</A></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><!-- End Related dW Content Area -->
<TABLE cellSpacing=0 cellPadding=0 width=160 border=0>
<TBODY>
<TR>
<TD width=150 bgColor=#000000 colSpan=2 height=2><IMG height=2
alt="" src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(七).files/c.gif"
width=160></TD></TR>
<TR>
<TD width=150 bgColor=#ffffff colSpan=2 height=2><IMG height=2
alt="" src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(七).files/c.gif"
width=160></TD></TR></TBODY></TABLE><!-- END STANDARD SIDEBAR AREA --></TD></TR></TBODY></TABLE><!-- START SUBTITLE AND CONTENT --><SPAN
class=atitle2>主题七:MiniGUI 1.1.0 引入的新 GDI 功能和函数之二</SPAN>
<P><A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part7/index.shtml#author1">魏永明</A>
(<A
href="mailto:ymwei@minigui.org">ymwei@minigui.org</A>)<BR>自由撰稿人<BR>2001年11月17日</P>
<BLOCKQUOTE>我们在<A
href="http://www-900.ibm.com/developerWorks/cn/linux/embed/minigui/guide/part5/index.shtml">“MiniGUI
1.1.0 版本引入的新 GDI 功能和函数”</A>一文中描述了在 1.1.0Pre4 版本中添加的新 GDI
相关函数的功能及其使用。目前,MiniGUI 1.1.0Pre7 版本已经发布,该版本较 1.1.0Pre4 版本新增了若干 GDI 函数,新
GDI 接口也相对成熟。本文将描述新增的 GDI 接口及其使用。</BLOCKQUOTE>
<P><A id=1 name=1><SPAN class=atitle2>1
引言</SPAN></A><BR>我们在本系列主题五中曾经详细描述了在 MiniGUI 1.1.0 版本开发过程中添加的新 GDI
功能和函数。这些接口首次出现在版本 1.1.0Pre4 当中。目前 MiniGUI 1.1.0Pre7 版本已经发布,该版本中的新 GDI
接口趋于稳定,相对 1.1.0Pre4
版本而言,又新增了若干高级图形接口。这些接口涉及到直线和曲线生成器、复杂曲线的绘制、封闭曲线填充、复杂区域的创建、直接的显示缓冲区访问、YUV
覆盖和 Gamma 校正等等。本文将就这些主题详细描述各个接口的用法。</P>
<P><A id=2 name=2><SPAN class=atitle2>2
曲线和填充生成器</SPAN></A><BR>在一般的图形系统中,通常给用户提供若干用于进行直线或者复杂曲线,比如圆弧、椭圆和样条曲线的绘图函数。用户可以通过这些函数进行绘图,但不能利用这些系统中已有的曲线生成算法完成其他的工作。在
MiniGUI 新的 GDI
接口设计当中,我们采用了一种特殊的设计方法来实现曲线和封闭曲线的填充,这种方法非常灵活,而且给用户提供了直接使用系统内部算法的机会:</P>
<P>1)系统中定义了若干用来生成直线和曲线的函数,我们称之为"曲线生成器";<BR>2)用户在调用生成器之前,需要定义一个回调函数,并将函数地址传递给曲线生成器,曲线生成器在生成了一个曲线上的点或者封闭曲线中的一条水平填充线时,将调用这个回调函数。<BR>3)用户可以在回调函数当中完成针对新的点或者新的水平填充线的操作。对
MiniGUI
绘图函数来说,就是完成绘图工作。<BR>4)因为回调函数在生成器的运行过程中不断调用,为了保持一致的上下文环境,系统允许用户在调用曲线生成器时传递一个表示上下文的指针,生成器将把该指针传递给回调函数。</P>
<P>下面将分小节讲述目前的 MiniGUI 版本所提供的曲线和填充生成器。</P>
<P><A id=21 name=21><SPAN class=atitle3>2.1 直线剪切器和直线生成器</SPAN></A></P>
<P>直线剪切器和生成器的原型如下:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>/* Line clipper */
BOOL GUIAPI LineClipper (const RECT* cliprc, int *_x0, int *_y0, int *_x1, int *_y1);
/* Line generators */
typedef void (* CB_LINE) (void* context, int stepx, int stepy);
void GUIAPI LineGenerator (void* context, int x1, int y1, int x2, int y2, CB_LINE cb);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>直线剪切器并不是生成器,它用于对给定的直线进行剪切操作。cliprc 是给定的直线,而 _x0、_y0、_x1 和 _y1
传递要剪切的直线起始端点,并通过这些指针返回剪切之后的直线起始端点。MiniGUI 内部使用了 Cohen-Sutherland 算法。</P>
<P>LineGenerator 是采用 Breshenham 算法的生成器。该生成器从给定直线的起始端点开始,每生成一个点调用一次 cb
回调函数,并传递上下文 context、以及新的点相对于上一个点的步进值或者差量。比如,传递 stepx =1,stepy = 0
表示新的点比上一个点在 X 轴上前进一步,而在 Y 轴上保持不变。回调函数可以在步进值基础上实现某种程度上的优化。</P>
<P><A id=22 name=22><SPAN class=atitle3>2.2 圆生成器</SPAN></A></P>
<P>MiniGUI 定义的圆生成器原型如下:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>/* Circle generator */
typedef void (* CB_CIRCLE) (void* context, int x1, int x2, int y);
void GUIAPI CircleGenerator (void* context, int sx, int sy, int r, CB_CIRCLE cb);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>首先要指定圆心坐标以及半径,并传递上下文信息以及回调函数,每生成一个点,生成器将调用一次 cb 回调函数,并传递三个值:x1、x2 和
y。这三个值实际表示了圆上的两个点:(x1, y) 和 (x2,
y)。因为圆的对称性,生成器只要计算圆上的四分之一圆弧点即可得出圆上所有的点。</P>
<P><A id=23 name=23><SPAN class=atitle3>2.3 椭圆生成器</SPAN></A></P>
<P>椭圆生成器和圆生成器类似,原型如下:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>/* Ellipse generator */
typedef void (* CB_ELLIPSE) (void* context, int x1, int x2, int y);
void GUIAPI EllipseGenerator (void* context, int sx, int sy, int rx, int ry, CB_ELLIPSE cb);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>首先要指定椭圆心坐标以及 X 轴和 Y 轴半径,并传递上下文信息以及回调函数,每生成一个点,生成器将调用一次 cb
回调函数,并传递三个值:x1、x2 和 y。这三个值实际表示了椭圆上的两个点:(x1, y) 和 (x2,
y)。因为椭圆的对称性,生成器只要计算椭圆上的二分之一圆弧点即可得出椭圆上所有的点。</P>
<P><A id=24 name=24><SPAN class=atitle3>2.4 圆弧生成器</SPAN></A></P>
<P>MiniGUI 定义的圆弧生成器如下所示:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>/* Arc generator */
typedef void (* CB_ARC) (void* context, int x, int y);
void GUIAPI ArcGenerator (void* context, int sx, int sy, int r, fixed ang1, fixed ang2, CB_ARC cb);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>首先要指定圆弧的圆心、半径、起始弧度和终止弧度。需要注意的是,起始弧度和终止弧度是采用定点数表示的,而不是浮点数,并且是弧度而不是角度。然后传递
cb 回调函数。每生成一个圆弧上的点,该函数将调用回调函数,并传递新点的坐标值 (x, y)。</P>
<P>有关定点数的信息,请参阅本系列"主题六:MiniGUI 提供的非 GUI/GDI 接口"一文。</P>
<P><A id=25 name=25><SPAN class=atitle3>2.5 垂直单调多边形生成器</SPAN></A></P>
<P>通常而言,多边形有凸多边形和凹多边形之分。这里的垂直单调多边形,是为了优化多边形填充算法而针对计算机图形特点而提出的一种特殊多边形,这种多边形的定义如下:</P>
<P>垂直单调多边形是指,多边形的边和计算机屏幕上的所有水平扫描线,只能有一个或者两个交点,不会有更多交点。</P>
<P>图 1 给出了凸多边形、凹多边形和垂直单调多边形的几个示例。</P><IMG height=274 alt="图 1 各种多边形"
src="基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(七).files/image1.gif" width=491
border=0>
<P>需要注意的是,凸多边形一定是垂直单调多边形,但垂直单调多边形可以是凹多边形。显然,普通的多边形填充算法需要判断多边形边和每条屏幕扫描线之间的交点个数,而垂直单调多边形则可以免去这一判断,所以可以大大提高多边形填充的速度。</P>
<P>MiniGUI 所定义的垂直单调多边形相关函数原型如下:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>/* To determine whether the specified Polygon is Monotone Vertical Polygon */
BOOL GUIAPI PolygonIsMonotoneVertical (const POINT* pts, int vertices);
/* Monotone vertical polygon generator */
typedef void (* CB_POLYGON) (void* context, int x1, int x2, int y);
BOOL GUIAPI MonotoneVerticalPolygonGenerator (void* context, const POINT* pts, int vertices, CB_POLYGON cb);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
<P>PolygonIsMonotoneVertical 用来判断给定的多边形是否是垂直单调多边形,而
MonotoneVerticalPolygonGenerator 函数是垂直多边形生成器。在 MiniGUI
当中,多边形是由组成多边形的顶点来表示的。pts 表示顶点数组,而 vertices
表示顶点个数。生成器生成的实际是填充多边形的每一条水平线,端点为 (x1, y) 和 (x2, y)。</P>
<P><A id=26 name=26><SPAN class=atitle3>2.6 一般矩形生成器</SPAN></A></P>
<P>MiniGUI 还提供了一般的矩形生成器,该生成器可以处理凸多边形,也可以处理凹多边形。原型如下:</P>
<TABLE cellSpacing=0 cellPadding=5 width="100%" bgColor=#cccccc
border=1><TBODY>
<TR>
<TD><PRE><CODE>/* General polygon generator */
typedef void (* CB_POLYGON) (void* context, int x1, int x2, int y);
BOOL GUIAPI PolygonGenerator (void* context, const POINT* pts, int vertices, CB_POLYGON cb);
</CODE>
</PRE></TD></TR></TBODY></TABLE><BR><BR>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -