向量图形绘图库-Cairo
2023-02-10 21:46:13 阿炯

Cairo 是一个开源的2D图形库,为软件开发者提供了一个基于矢量图形、独立于设备的 API。它支持输出到一些不同的后端,后端支持包括 X11、Apple Quartz、Win32,以及 PNG、PDF、PostScript、DirectFB 和 SVG 等文件格式。Cairo是一个功能强大的2D图形库,它支持多种输出设备,并且提供了丰富的绘图功能。Cairo库可以被用于创建高质量的图形和可视化,广泛应用于图形用户界面(GUI)、数据可视化、绘图软件等领域。


提供在多个背景下做二维空间的绘图,高级的更可以使用硬件加速功能。虽然Cairo是使用C语言撰写的,但提供了许多其他种语言的调用,包括有C++、C#、Java、Python、Perl、Ruby、Scheme、Smalltalk以及许多种语言,cairo在GNU宽通用公共许可证(LGPLv2.1)与Mozilla公共许可证(MPLv1.1)两种许可协议下发行。

特点
跨平台支持:支持多种操作系统,包括Linux、Windows、macOS等,使得开发者能够在不同平台上使用相同的API来进行图形绘制。

多种输出设备支持:支持多种输出设备,包括屏幕、打印机、PDF文档、SVG图像等,使得开发者可以轻松地将绘制的图形输出到不同的媒介中。

矢量图形支持:以矢量图形的方式来表示绘制的图形,这意味着图形可以无损地缩放和变换而不会失真,从而适用于高品质的图形渲染需求。

丰富的绘图功能:提供了丰富的绘图功能,包括直线、曲线、多边形、文本、图像处理等,使得开发者能够实现各种复杂的图形效果。

其提供了几个核心特性,使其成为向量图形渲染的理想选择:

向量图形渲染:基于向量图形,这意味着图形由几何形状(如线条、曲线和形状)定义,而不是像素。这使得图形可以在不同大小和分辨率下无损缩放。

设备无关性:抽象了底层绘图表面,允许开发者在多种输出设备上渲染图形,而无需更改渲染代码。

高质量渲染:使用高质量的图形渲染算法,如贝塞尔曲线和子像素抗锯齿,以确保图形看起来尽可能平滑和清晰。

易于使用的 API:API 设计简洁,易于学习和使用,使得在 C/C++ 应用程序中集成图形渲染变得简单。

核心概念
表面(Surface):表面是Cairo库中表示图形输出目标的抽象概念,它可以是屏幕、图片、PDF文档等。

绘图上下文(Context):绘图上下文是Cairo库中的关键概念,它提供了绘制图形的API,包括线条绘制、填充、文本绘制等。

路径(Path):路径是由直线段、曲线段等组成的图形描述,通过路径可以实现复杂的图形绘制。

模式(Pattern):模式是Cairo库中表示填充和描边样式的抽象概念,它可以是纯色、渐变、图案等。


Cairo支持很多不同后端的输出,在实现中被称作“surface”。支持的后端包括X Window系统、Win32 GDI、Quartz Compositor、OS/2,OpenGL环境(直接或间接地通过glitz)、内存缓冲区、PNG、PDF、PostScript、DirectFB和SVG文件。还有一些开发中的后端如:OpenVG,Qt,Skia和Windows Direct2D。大抵相似于微软的WPF和GDI+、苹果公司的Quartz 2D、Anti-Grain Geometry(AGG)。

示例代码

以下是一个简单的使用Cairo库的示例代码,演示了如何使用Cairo库创建一个简单的图形,并将其输出为PNG图像文件。

#include <cairo.h>
int main (int argc, char *argv[]) {
    cairo_surface_t *surface;
    cairo_t *cr;

    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 240, 80);
    cr = cairo_create (surface);

    cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
    cairo_select_font_face (cr, "Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL);
    cairo_set_font_size (cr, 40.0);
    cairo_move_to (cr, 10.0, 50.0);
    cairo_show_text (cr, "Hello, Cairo!");

    cairo_surface_write_to_png (surface, "hello.png");

    cairo_destroy (cr);
    cairo_surface_destroy (surface);

    return 0;
}

在这个示例代码中首先创建了一个图形表面(surface),然后创建了一个绘图上下文(context),并在上面绘制了一段文本。最后将绘制的图形输出为一个PNG图像文件。

示例2:创建一个简单的窗口并绘制一个圆

以下是一个简单的示例,演示如何使用 Cairo 在一个窗口中绘制一个圆:

#include <cairo.h>
#include <cairo-xlib.h>
#include <X11/Xlib.h>

int main() {
    Display *dpy = XOpenDisplay(NULL);
    if (dpy == NULL) {
        return 1;
    }
    int scr = DefaultScreen(dpy);
    Window win = XCreateSimpleWindow(dpy, RootWindow(dpy, scr), 10, 10, 400, 300, 1,
                                     BlackPixel(dpy, scr), WhitePixel(dpy, scr));
    XSelectInput(dpy, win, ExposureMask | KeyPressMask);
    XMapWindow(dpy, win);

    cairo_surface_t *surface = cairo_xlib_surface_create(dpy, win, DefaultVisual(dpy, scr), 400, 300);
    cairo_t *cr = cairo_create(surface);

    while (true) {
        XEvent e;
        XNextEvent(dpy, &e);
        if (e.type == Expose) {
            cairo_set_source_rgb(cr, 0, 0, 0); // 黑色
            cairo_arc(cr, 200, 150, 100, 0, 2 * M_PI); // 绘制圆
            cairo_fill(cr);
        } else if (e.type == KeyPress) {
            break;
        }
    }

    cairo_destroy(cr);
    cairo_surface_destroy(surface);
    XCloseDisplay(dpy);
    return 0;
}

在这个示例中首先创建一个 X Window,并使用 Cairo 创建一个绘图表面。然后进入一个事件循环,在窗口需要重绘时绘制一个圆。当用户按下键盘上的任意键时,程序退出。

示例3:绘制文本

Cairo 也支持文本渲染。以下是一个简单的示例,演示如何使用 Cairo 在窗口中绘制文本:

#include <cairo.h>
#include <cairo-xlib.h>
#include <X11/Xlib.h>
#include <pango/pangocairo.h>

int main() {
    Display *dpy = XOpenDisplay(NULL);
    if (dpy == NULL) {
        return 1;
    }
    int scr = DefaultScreen(dpy);
    Window win = XCreateSimpleWindow(dpy, RootWindow(dpy, scr), 10, 10, 400, 300, 1,
                                     BlackPixel(dpy, scr), WhitePixel(dpy, scr));
    XSelectInput(dpy, win, ExposureMask | KeyPressMask);
    XMapWindow(dpy, win);

    cairo_surface_t *surface = cairo_xlib_surface_create(dpy, win, DefaultVisual(dpy, scr), 400, 300);
    cairo_t *cr = cairo_create(surface);

    PangoLayout *layout = pango_cairo_create_layout(cr);
    pango_layout_set_text(layout, "Hello, Cairo!", -1);
    PangoFontDescription *desc = pango_font_description_from_string("Sans 24");
    pango_layout_set_font_description(layout, desc);

    while (true) {
        XEvent e;
        XNextEvent(dpy, &e);
        if (e.type == Expose) {
            cairo_set_source_rgb(cr, 0, 0, 0); // 黑色
            pango_cairo_update_layout(cr, layout);
            pango_cairo_show_layout(cr, layout);
        } else if (e.type == KeyPress) {
            break;
        }
    }

    pango_font_description_free(desc);
    g_object_unref(layout);
    cairo_destroy(cr);
    cairo_surface_destroy(surface);
    XCloseDisplay(dpy);
    return 0;
}

在这个示例中使用 Pango 库与 Cairo 结合来渲染文本。Pango 是一个开源的文本渲染库,可以与 Cairo 很好地集成,提供高质量的文本渲染功能。

在图形绘制的领域中,Cairo 是一个备受赞誉的 2D 图形库,以其卓越的性能和跨平台特性而闻名。在多个平台的操作系统上都能稳定地运行,为开发者提供一致的图形绘制体验。它支持多种输出目标,包括屏幕、打印机、PDF 文件等。这使得开发者可以轻松地创建适用于不同场景的图形内容。无论是为网页设计精美的图表,还是为打印文档添加高质量的插图,Cairo 都能胜任;且功能非常强大。它提供了丰富的绘图原语,如线条、矩形、圆形、文本等。开发者可以使用这些原语来构建复杂的图形。同时Cairo 还支持图形的变换、裁剪、透明度等高级特性,让图形更加生动和富有表现力。

知名应用
因为能够提供高级的跨平台2D绘图的支持,Cairo在开源社区十分流行。

GTK+从2005年的v2.8版开始,使用cairo去渲染它的大多数控件,从GTK+ v3开始,所有的渲染任务由cairo完成。
Mono项目,包括Moonlight,在很早便设想用cairo作为后端驱动GDI+(libgdiplus)和 System.Drawing名字空间。
Mozilla项目在最近版本的Gecko排版引擎中使用cairo,用来渲染生成的图形输出。
Gecko 1.8,Firefox 2.0和SeaMonkey 1.0的排版引擎,使用cairo渲染SVG和<canvas>内容。
Gecko 1.9,作为Firefox 3底层使用cairo对网页内容和用户界面进行渲染。
Poppler库使用cairo渲染PDF文档,cairo使得对反锯齿矢量图形和透明对象的绘制成为可能。
矢量绘图应用程序Inkscape使用cairo图形库显示其概要模式,以及自从v0.46正式使用它输出PDF和PostScript文档。
FontForge在2008年10月中旬启用cairo为默其认渲染图形库。
R语言经cairo用PDF,PostScript和SVG格式输出图像。
Gnuplot v4.4现在使用cairo来渲染PDF和PNG输出。

Cairo库是一个功能强大且灵活的2D图形库,它支持多种输出设备,并提供了丰富的绘图功能。无论是创建图形用户界面、进行数据可视化,还是实现绘图软件,Cairo库都能够满足开发者的需求,并提供高质量的图形渲染效果。如果需要进行2D图形绘制,那么它将是一个值得考虑的选择。为了满足特定项目的需求,开发者可以适当增加代码来扩展 Cairo 的功能。例如,可以开发自定义的图形过滤器,为图形添加特殊效果。或者实现与其他图形库或工具的集成,以增强图形处理的能力。比如在数据可视化项目中,开发者可以利用 Cairo 绘制各种类型的图表。通过增加代码,可以实现动态更新图表、添加交互功能等,提升用户体验。在图形设计软件中,Cairo 可以作为核心图形引擎。开发者可以通过增加代码来实现更多的绘图工具和特效,满足专业设计师的需求。

其拥有活跃的社区和丰富的文档资源。开发者可以在社区中交流经验、寻求帮助,快速解决遇到的问题。文档也为开发者提供了详细的使用指南和示例代码,帮助他们快速上手。


最新版本:1.17
Cairo 1.17.8 版本已于2023年2月上旬发布,近年来 Cairo 的开发停滞不前,2018 年底推出了 Cairo 1.16 稳定版,然后就没有了消息。接着就是当前最新的 Cairo 1.17.8 版本,Cairo 1.17.8 修复了各种错误,改进了对 macOS 和 Windows 的支持,支持渲染 COLRv1 字体,删除了 Autotools 构建系统以专注于 Meson。此外该版本还删除了 OpenGL/GLES 支持,因为该后端大约十年没有得到维护。macOS 和 Windows 的支持改进涉及大量错误修复和构建更改,详情可查看更新公告

官方主页:https://www.cairographics.org/