Chinaunix首页 | 论坛 | 博客
  • 博客访问: 523503
  • 博文数量: 235
  • 博客积分: 1209
  • 博客等级: 少尉
  • 技术积分: 1417
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 19:59
文章分类

全部博文(235)

文章存档

2012年(107)

2011年(128)

分类:

2012-01-20 23:49:05

原文地址:Cairo图形库 概述 作者:vaqeteart

参考:http://blog.sina.com.cn/s/blog_538732a70100p9ay.html
Cairo图形库  1. 概述

欢迎来到Cairo图形教程.这个教程将教你Cairo 2D矢量绘图库基本的和一些高级的主题.大部分例程我们使用GTK+编程库. 这个教程是用C语言来完成的. (如果可能,我会附加上一些cairomm的东西)

2D 矢量图形

有两种不同的计算机图形. 矢量和光栅图形. 光栅图形作为像素的集合来呈现图象.矢量图形是使用诸如点/线/曲线或多边形等几何图元来呈现图像. 这些图元使用数学方程来创建.

计算机图形的两种类型各有优缺点.矢量图形比之光栅图形的优点是:

  • 更小
  • 无限制缩放
  • 移动缩放填充旋转不会降低图形的质量

Cairo

Cairo 是一个创建2D矢量图形的库. 它是用C编写的. 和其他计算机语言的绑定有 Python, Perl, C++, C#, Java. Cairo 是一个多平台的库,可工作在linux, BSDs, OSX上.

Cairo 支持多种后台.

  • X Window System
  • Win32 GDI
  • Mac OS X Quartz
  • PNG
  • PDF
  • PostScript
  • SVG

这意味着,我们可以使用它在Linux/BSDs, Windows, OSX上绘制,并且我们可以使用它来创建PNG图像,PDF文件,PostScript文件和SVG文件.

我们可以比较Cairo库和 Windows上的GDI+ 库还有Mac OS上的Quartz 2D. Cairo 是一个开源软件库. 从版本2.8开始, cairo 库就是GTK+系统的一部分了.

Compiling exampes

这个例子用C语言创建. 我们使用GNU C编译器来编译它们.

gcc -o example `pkg-config --cflags --libs gtk+-2.0` example.c

 

Cairo 定义

在教程的这个部分,我们为Cairo图形库提供一些有用的定义.它将帮助我们更好的理解Cairo绘图模型.

要在Cairo里画点东西,我们必须先创建一个Cairo上下文(context).Cairo上下文拥有描绘绘制怎样完成的所有的图形状态参数. 它包括诸如线宽/颜色/要绘制到的表面信息,还有很多其它东西. 它允许实际的绘制函数带较少的参数来简化接口. gdk_cairo_create()函数调用为绘制创建一个cairo上下文(context)

cairo_t *cr;
cr = gdk_cairo_create(widget->window);

这两行创建一个cairo上下文(context). 在这个例子里,上下文绑定到一个GdkDrawable. 一个 cairo_t 结构包含渲染设备的当前状态,包含已经绘制的形状的坐标.技术上说,cairo_t对象被称为Cairo上下文.

所有cairo绘制都是对于cairo_t对象的. 一个Cairo上下文被绑定到一个明确的表面的.一个pdf/svg/png/gdkDrawable等等.

GDK并不封装Cairo API.它允许创建一个Cairo上下文,可被用作在GDKdrawable上绘制.有另外的函数允许转换GDK的矩形和区域到Cairo路径并使用像素缓冲来做绘制操作.

Path

一条路径由很多线组成.这些线被两个或者更多的锚点连接.  路径可以由直线段和曲线组成. 有两种路径.开放的和闭合的路径. 在闭合路径中,起点和终点重合.在开放路径中,起点和终点不重合.

在Cairo中,我们以一个空路径开始.首先我们定义一个路径然后我们通过画线和填充使之可见. 很重要一点,每次cairo_stroke()或者cairo_fill()函数调用之后,路径就空了.我们必须定义一条新的路径.

一条路径可以由很多子路径组成.

Source

Source是我们绘制时使用的颜料.我们可以拿source和笔或墨水比较.我们用它们来绘制轮廓或者填充形状. 有四种基本的source: Colors, gradients, patterns 和 images

Surface

Surface是我们需要绘制到的目标地. 我们可以使用PDF或PostScript表面渲染文档,直接通过Xlib和Win32表面绘制到一个平台.

文档提及下列表面:

typedef enum _cairo_surface_type {
  CAIRO_SURFACE_TYPE_IMAGE,
  CAIRO_SURFACE_TYPE_PDF,
  CAIRO_SURFACE_TYPE_PS,
  CAIRO_SURFACE_TYPE_XLIB,
  CAIRO_SURFACE_TYPE_XCB,
  CAIRO_SURFACE_TYPE_GLITZ,
  CAIRO_SURFACE_TYPE_QUARTZ,
  CAIRO_SURFACE_TYPE_WIN32,
  CAIRO_SURFACE_TYPE_BEOS,
  CAIRO_SURFACE_TYPE_DIRECTFB,
  CAIRO_SURFACE_TYPE_SVG,
  CAIRO_SURFACE_TYPE_OS2
} cairo_surface_type_t;
Mask

在源应用到表面之前要先经过过滤. Mask用作过滤器. Mask决定源应用到哪,不应用到哪. Mask的不透明部分允许你拷贝源.  透明部分不让你拷贝源到表面.

Pattern

一个cairo 样式描绘了当绘制到表面时的源. 在cairo中,一个样式就是某种能够从之读取并用作一个绘制操作的源或者mask. 样式可以是实心的,基于表面的,或者甚至是渐变图案.

阅读(2411) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~