动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > Oracle教程
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ Oracle教程 ]的信息

本月文章推荐
.Oracle 9i 数据库管理实务讲座(一.
.各种索引的结构分析 BTree索引与.
.Oracle PL/SQL语言初级教程之操作.
.关于/**/注释段在SQLPlus Worksh.
.Oracle的数据库对象中表与视图.
.Oracle数据库技术(4).
.Fravo Oracle 1Z0-032 v3.0.
.关于使用RMAN进行clone数据库二.
.哈希分区表使用时注意事项.
.在RedHat 7.x 上实现reiserfs & .
.ORACLE应用经验(2).
.一些 schema 的常用脚本归类介绍.
.轻轻松松教Linux(上)--软体启动.
.Oracle Database 10 g : 为 DBA .
.实例讲解如何使用Oracle数据库to.
.如何使用DBMS_LOB从文件中加载CL.
.自动转换Foxpro/Oracle台站数据库.
.9i新特性之——在线表格重定义研.
.关键字:oracle_sid,server_name.
.保证Oracle数据库安全性的策略和.

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

发表日期:2008-2-9 |



  作者:魏永明
  
  主题七:MiniGUI 1.1.0 引入的新 GDI 功能和函数之二
  
  1 引言
  我们在本系列主题五中曾经具体描述了在 MiniGUI 1.1.0 版本开发过程中添加的新 GDI 功能和函数。这些接口首次出现在版本 1.1.0Pre4 当中。目前 MiniGUI 1.1.0Pre7 版本已经发布,该版本中的新 GDI 接口趋于稳定,相对 1.1.0Pre4 版本而言,又新增了若干高级图形接口。这些接口涉及到直线和曲线生成器、复杂曲线的绘制、封闭曲线填充、复杂区域的创建、直接的显示缓冲区访问、YUV 覆盖和 Gamma 校正等等。本文将就这些主题具体描述各个接口的用法。
  
  2 曲线和填充生成器
  在一般的图形系统中,通常给用户提供若干用于进行直线或者复杂曲线,比如圆弧、椭圆和样条曲线的绘图函数。用户可以通过这些函数进行绘图,但不能利用这些系统中已有的曲线生成算法完成其他的工作。在 MiniGUI 新的 GDI 接口设计当中,我们采用了一种非凡的设计方法来实现曲线和封闭曲线的填充,这种方法非常灵活,而且给用户提供了直接使用系统内部算法的机会:
  
  1)系统中定义了若干用来生成直线和曲线的函数,我们称之为"曲线生成器";
  2)用户在调用生成器之前,需要定义一个回调函数,并将函数地址传递给曲线生成器,曲线生成器在生成了一个曲线上的点或者封闭曲线中的一条水平填充线时,将调用这个回调函数。
  3)用户可以在回调函数当中完成针对新的点或者新的水平填充线的操作。对 MiniGUI 绘图函数来说,就是完成绘图工作。
  4)因为回调函数在生成器的运行过程中不断调用,为了保持一致的上下文环境,系统答应用户在调用曲线生成器时传递一个表示上下文的指针,生成器将把该指针传递给回调函数。
  
  下面将分小节讲述目前的 MiniGUI 版本所提供的曲线和填充生成器。
  
  2.1 直线剪切器和直线生成器
  
  直线剪切器和生成器的原型如下:
  
  /* 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);
  
  直线剪切器并不是生成器,它用于对给定的直线进行剪切操作。cliprc 是给定的直线,而 _x0、_y0、_x1 和 _y1 传递要剪切的直线起始端点,并通过这些指针返回剪切之后的直线起始端点。MiniGUI 内部使用了 Cohen-Sutherland 算法。
  
  LineGenerator 是采用 Breshenham 算法的生成器。该生成器从给定直线的起始端点开始,每生成一个点调用一次 cb 回调函数,并传递上下文 context、以及新的点相对于上一个点的步进值或者差量。比如,传递 stepx =1,stepy = 0 表示新的点比上一个点在 X 轴上前进一步,而在 Y 轴上保持不变。回调函数可以在步进值基础上实现某种程度上的优化。
  
  2.2 圆生成器
  
  MiniGUI 定义的圆生成器原型如下:
  
  /* 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);
  
  
  首先要指定圆心坐标以及半径,并传递上下文信息以及回调函数,每生成一个点,生成器将调用一次 cb 回调函数,并传递三个值:x1、x2 和 y。这三个值实际表示了圆上的两个点:(x1, y) 和 (x2, y)。因为圆的对称性,生成器只要计算圆上的四分之一圆弧点即可得出圆上所有的点。
  
  2.3 椭圆生成器
  
  椭圆生成器和圆生成器类似,原型如下:
  
  /* 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);
  
  首先要指定椭圆心坐标以及 X 轴和 Y 轴半径,并传递上下文信息以及回调函数,每生成一个点,生成器将调用一次 cb 回调函数,并传递三个值:x1、x2 和 y。这三个值实际表示了椭圆上的两个点:(x1, y) 和 (x2, y)。因为椭圆的对称性,生成器只要计算椭圆上的二分之一圆弧点即可得出椭圆上所有的点。
  
  2.4 圆弧生成器
  
  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 ang1, fixed ang2, CB_ARC cb);
  
  首先要指定圆弧的圆心、半径、起始弧度和终止弧度。需要注重的是,起始弧度和终止弧度是采用定点数表示的,而不是浮点数,并且是弧度而不是角度。然后传递 cb 回调函数。
每生成一个圆弧上的点,该函数将调用回调函数,并传递新点的坐标值 (x, y)。
  
  有关定点数的信息,请参阅本系列"主题六:MiniGUI 提供的非 GUI/GDI 接口"一文。
  
  2.5 垂直单调多边形生成器
  
  通常而言,多边形有凸多边形和凹多边形之分。这里的垂直单调多边形,是为了优化多边形填充算法而针对计算机图形特点而提出的一种非凡多边形,这种多边形的定义如下:
  
  垂直单调多边形是指,多边形的边和计算机屏幕上的所有水平扫描线,只能有一个或者两个交点,不会有更多交点。
  
  图 1 给出了凸多边形、凹多边形和垂直单调多边形的几个示例。
  
  基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(七)
  
  需要注重的是,凸多边形一定是垂直单调多边形,但垂直单调多边形可以是凹多边形。显然,普通的多边形填充算法需要判定多边形边和每条屏幕扫描线之间的交点个数,而垂直单调多边形则可以免去这一判定,所以可以大大提高多边形填充的速度。
  
  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 x1, int x2, int y);
  BOOL GUIAPI MonotoneVerticalPolygonGenerator (void* context, const POINT* pts, int vertices, CB_POLYGON cb);
  
  PolygonIsMonotoneVertical 用来判定给定的多边形是否是垂直单调多边形,而 MonotoneVerticalPolygonGenerator 函数是垂直多边形生成器。在 MiniGUI 当中,多边形是由组成多边形的顶点来表示的。pts 表示顶点数组,而 vertices 表示顶点个数。生成器生成的实际是填充多边形的每一条水平线,端点为 (x1, y) 和 (x2, y)。
  
  2.6 一般矩形生成器
  
  MiniGUI 还提供了一般的矩形生成器,该生成器可以处理凸多边形,也可以处理凹多边形。原型如下:
  
  /* 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);
  
  和垂直单调多边形生成器一样,该函数生成的是填充多边形的每一条水平扫描线:x1 是水平线的起始X坐标;x2 是水平线的终止 X 坐标;y 是水平线的 Y 坐标值。
  
  2.7 填注生成器
  
  填注(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 x1, int x2, 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 函数用来填充一条扫描线,传递的是水平扫描线的端点,即(x1, y) 和 (x2, y)。
  
  2.8 曲线和填充生成器的用法
  
  曲线和填充生成器的用法非常简单。为了对曲线和填充生成器有个更好的了解,我们首先看 MiniGUI 内部是如何使用曲线和填充生成器的。
  
  下面的程序段来自 MiniGUI 的 FloodFill 函数(src/newgdi/flood.c):
  
  static void _flood_fill_draw_hline (void* context, int x1, int x2, int y)
  {
  PDC pdc = (PDC)context;
  RECT rcOutput = {MIN (x1, x2), y, MAX (x1, x2) + 1, y + 1};
  
  ENTER_DRAWING (pdc, rcOutput);
上一篇:Linux 中 x86 的内联汇编 人气:486
下一篇:基于 Linux 和 MiniGUI 的嵌入式系统软件开发指南(六) 人气:581
浏览全部Oracle教程的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-9-5 Coppermine Photo Gallery v1.4.
2008-9-5 清松网络日记本 v2.4
2008-9-5 AyWeb企业网站管理系统 v2.3 bui
2008-9-5 美女写真小偷程序联盟 v3.0 buil
2008-9-5 老Y文章管理系统 v2.1
2008-9-5 SiteDynamic企业网站管理系统 v1
2008-9-5 MyCOM企业网站管理系统 v1.0 Bui
2008-9-5 乐风CMS影视版 2008
2008-9-5 幻影电影视频系统TvsCms v1.3 伪
2008-8-23 Mini WinMount V0.4
2008-8-23 Vista优化大师3.11正式版
2008-8-23 Wine 1.13
2008-8-23 KlipFolio 5.0 Build 5899-80
2008-8-23 Windows Sysinternals Desktops
2008-8-23 OneTap Movies1.2破解版
2008-8-23 AnnotaterPDF阅读1.1.503 破解版
2008-8-23 SoundMeter分贝测量仪 v1.0汉化破
2008-8-23 iDrum音乐节拍1.0破解版
  发表评论
姓 名: 验证码:
内 容:
站长工具:网站收录查询 | Google PR查询 | ALEXA排名查询 | CSS在线编辑器 | 广告代码 | Html转换js | js/vbs加密 | md5加密 | 进制转换
实用工具:汉字翻译拼音 | 符号对照表 | 个税计算 | 经典小工具 | 汉字简繁转换 | 普通单位换算 | 公制单位换算 | 生辰老黄历 | 国内电话区号 国家代码与域名缩写 | 文字加密解密 | 健康查询 | 万年历 | 汉字横竖排版 | 手机号码查询 | 计算器 | ip搜索
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号
ホームページ制作 不動産検索システム 求人情報
防水工事·改修工事 フットサル大会 探偵