知识大全 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(七)

Posted

篇首语:有志者自有千计万计,无志者只感千难万难。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(七)相关的知识,希望对你有一定的参考价值。

基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(七)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

  作者 魏永明    主题七 MiniGUI 引入的新 GDI 功能和函数之二     引言  我们在本系列主题五中曾经详细描述了在 MiniGUI 版本开发过程中添加的新 GDI 功能和函数 这些接口首次出现在版本 Pre 当中 目前 MiniGUI Pre 版本已经发布 该版本中的新 GDI 接口趋于稳定 相对 Pre 版本而言 又新增了若干高级图形接口 这些接口涉及到直线和曲线生成器 复杂曲线的绘制 封闭曲线填充 复杂区域的创建 直接的显示缓冲区访问 YUV 覆蓋和 Gamma 校正等等 本文将就这些主题详细描述各个接口的用法      曲线和填充生成器  在一般的图形系统中 通常给用户提供若干用于进行直线或者复杂曲线 比如圆弧 椭圆和样条曲线的绘图函数 用户可以通过这些函数进行绘图 但不能利用这些系统中已有的曲线生成算法完成其他的工作 在 MiniGUI 新的 GDI 接口设计当中 我们采用了一种特殊的设计方法来实现曲线和封闭曲线的填充 这种方法非常灵活 而且给用户提供了直接使用系统内部算法的机会      )系统中定义了若干用来生成直线和曲线的函数 我们称之为 曲线生成器    )用户在调用生成器之前 需要定义一个回调函数 并将函数地址传递给曲线生成器 曲线生成器在生成了一个曲线上的点或者封闭曲线中的一条水平填充线时 将调用这个回调函数    )用户可以在回调函数当中完成针对新的点或者新的水平填充线的操作 对 MiniGUI 绘图函数来说 就是完成绘图工作    )因为回调函数在生成器的运行过程中不断调用 为了保持一致的上下文环境 系统允许用户在调用曲线生成器时传递一个表示上下文的指针 生成器将把该指针传递给回调函数     下面将分小节讲述目前的 MiniGUI 版本所提供的曲线和填充生成器      直线剪切器和直线生成器    直线剪切器和生成器的原型如下     /* Line clipper */  BOOL GUIAPI LineClipper (const RECT* cliprc int *_x int *_y int *_x int *_y );    /* Line generators */  typedef void (* CB_LINE) (void* context int stepx int stepy);  void GUIAPI LineGenerator (void* context int x int y int x int y CB_LINE cb);    直线剪切器并不是生成器 它用于对给定的直线进行剪切操作 cliprc 是给定的直线 而 _x _y _x 和 _y 传递要剪切的直线起始端点 并通过这些指针返回剪切之后的直线起始端点 MiniGUI 内部使用了 Cohen Sutherland 算法     LineGenerator 是采用 Breshenham 算法的生成器 该生成器从给定直线的起始端点开始 每生成一个点调用一次 cb 回调函数 并传递上下文 context 以及新的点相对于上一个点的步进值或者差量 比如 传递 stepx = stepy = 表示新的点比上一个点在 X 轴上前进一步 而在 Y 轴上保持不变 回调函数可以在步进值基础上实现某种程度上的优化      圆生成器    MiniGUI 定义的圆生成器原型如下     /* Circle generator */  typedef void (* CB_CIRCLE) (void* context int x int x int y);  void GUIAPI CircleGenerator (void* context int sx int sy int r CB_CIRCLE cb);      首先要指定圆心坐标以及半径 并传递上下文信息以及回调函数 每生成一个点 生成器将调用一次 cb 回调函数 并传递三个值 x x 和 y 这三个值实际表示了圆上的两个点 (x y) 和 (x y) 因为圆的对称性 生成器只要计算圆上的四分之一圆弧点即可得出圆上所有的点      椭圆生成器    椭圆生成器和圆生成器类似 原型如下     /* Ellipse generator */  typedef void (* CB_ELLIPSE) (void* context int x int x int y);  void GUIAPI EllipseGenerator (void* context int sx int sy int rx int ry CB_ELLIPSE cb);    首先要指定椭圆心坐标以及 X 轴和 Y 轴半径 并传递上下文信息以及回调函数 每生成一个点 生成器将调用一次 cb 回调函数 并传递三个值 x x 和 y 这三个值实际表示了椭圆上的两个点 (x y) 和 (x y) 因为椭圆的对称性 生成器只要计算椭圆上的二分之一圆弧点即可得出椭圆上所有的点      圆弧生成器    MiniGUI 定义的圆弧生成器如下所示     /* Arc generator */  typedef void (* CB_ARC) (void* context int x int y);  void GUIAPI ArcGenerator (void* context int sx int sy int r fixed ang fixed ang CB_ARC cb);    首先要指定圆弧的圆心 半径 起始弧度和终止弧度 需要注意的是 起始弧度和终止弧度是采用定点数表示的 而不是浮点数 并且是弧度而不是角度 然后传递 cb 回调函数 每生成一个圆弧上的点 该函数将调用回调函数 并传递新点的坐标值 (x y)     有关定点数的信息 请参阅本系列 主题六 MiniGUI 提供的非 GUI/GDI 接口 一文      垂直单调多边形生成器    通常而言 多边形有凸多边形和凹多边形之分 这里的垂直单调多边形 是为了优化多边形填充算法而针对计算机图形特点而提出的一种特殊多边形 这种多边形的定义如下     垂直单调多边形是指 多边形的边和计算机屏幕上的所有水平扫描线 只能有一个或者两个交点 不会有更多交点     图 给出了凸多边形 凹多边形和垂直单调多边形的几个示例         需要注意的是 凸多边形一定是垂直单调多边形 但垂直单调多边形可以是凹多边形 显然 普通的多边形填充算法需要判断多边形边和每条屏幕扫描线之间的交点个数 而垂直单调多边形则可以免去这一判断 所以可以大大提高多边形填充的速度     MiniGUI 所定义的垂直单调多边形相关函数原型如下     /* 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 x int x int y);  BOOL GUIAPI MonotoneVerticalPolygonGenerator (void* context const POINT* pts int vertices CB_POLYGON cb);    PolygonIsMonotoneVertical 用来判断给定的多边形是否是垂直单调多边形 而 MonotoneVerticalPolygonGenerator 函数是垂直多边形生成器 在 MiniGUI 当中 多边形是由组成多边形的顶点来表示的 pts 表示顶点数组 而 vertices 表示顶点个数 生成器生成的实际是填充多边形的每一条水平线 端点为 (x y) 和 (x y)      一般矩形生成器    MiniGUI 还提供了一般的矩形生成器 该生成器可以处理凸多边形 也可以处理凹多边形 原型如下     /* General polygon generator */  typedef void (* CB_POLYGON) (void* context int x int x int y);  BOOL GUIAPI PolygonGenerator (void* context const POINT* pts int vertices CB_POLYGON cb);    和垂直单调多边形生成器一样 该函数生成的是填充多边形的每一条水平扫描线 x 是水平线的起始X坐标 x 是水平线的终止 X 坐标 y 是水平线的 Y 坐标值      填注生成器    填注(flood filling)生成器比较复杂 这个函数在 MiniGUI 内部用于 FloodFill 函数 我们知道 FloodFill 函数从给定的起始位置开始 以给定的颜色向四面八方填充某个区域(像水一样蔓延 因此叫 Flood Filling) 一直到遇到与给定起始位置的象素值不同的点为止 因此 在这一过程中 我们需要两个回调函数 一个回调函数用来判断蔓延过程中遇到的点的象素值是否和起始点相同 另外一个回调函数用来生成填充该区域的水平扫描线 在进行绘图时 该函数比较的是象素值 但实际上 该函数也可以比较任何其他值 从而完成特有的蔓延动作 这就是将填注生成器单独出来的初衷 MiniGUI 如下定义填注生成器     /* General Flood Filling generator */  typedef BOOL (* CB_EQUAL_PIXEL) (void* context int x int y);  typedef void (* CB_FLOOD_FILL) (void* context int x int x int y);  BOOL GUIAPI FloodFillGenerator (void* context const RECT* src_rc int x int y         CB_EQUAL_PIXEL cb_equal_pixel CB_FLOOD_FILL cb_flood_fill);    cb_equal_pixel 被调用 以便判断目标点的象素值是否和起始点一样 起始点的象素值可以通过 context 来传递 cb_flood_fill 函数用来填充一条扫描线 传递的是水平扫描线的端点 即(x y) 和 (x y)      曲线和填充生成器的用法    曲线和填充生成器的用法非常简单 为了对曲线和填充生成器有个更好的了解 我们首先看 MiniGUI 内部是如何使用曲线和填充生成器的     下面的程序段来自 MiniGUI 的 FloodFill 函数(src/newgdi/flood c)     static void _flood_fill_draw_hline (void* context int x int x int y)    PDC pdc = (PDC)context;  RECT rcOutput = MIN (x x ) y MAX (x x ) + y + ;    ENTER_DRAWING (pdc rcOutput); cha138/Article/program/Oracle/201311/16987

相关参考

知识大全 基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(八)

基于Linux和MiniGUI的嵌入式系统软件开发指南(八)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看

知识大全 32位嵌入式系统和嵌入式Linux

32位嵌入式系统和嵌入式Linux  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  嵌入式Linu

知识大全 Linux用作嵌入式操作系统

Linux用作嵌入式操作系统  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  LinuxasanE

知识大全 恰当选择嵌入式Linux环境下的GUI系统(图)

恰当选择嵌入式Linux环境下的GUI系统(图)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 制作基于软盘的Linux系统

制作基于软盘的Linux系统  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  作者张宏伟欧阳平平 

知识大全 android系统是基于Linux对吗

android系统是基于Linux对吗  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!android

知识大全 向基于Linux的OracleRAC10g集群添加新节点

向基于Linux的OracleRAC10g集群添加新节点  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下

知识大全 在solairs上运行linux上的二进制文件

  和sparc上的solaris相比Intelx上的solaris的另一个优点是在Intel架构的计算机之间有更加优良的互操作能力    由于嵌入Linux的软件二进制文件的系统调用被从新设计来和S

知识大全 基于flush()不能按顺序输出时的解决办法

  如果是在linux下首先确认是否添加ob_start()和ob_flush()复制代码代码如下:ob_start();for($i=;$i<=;$i++)echo$i"<br/>

知识大全 安卓系统可以下载吗

安卓系统可以下载吗?就是在普通手机上安装安卓系统,可以吗?不可以。Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机