签到

05月06日
尚未签到

共有回帖数 0

    心忧不前

    等级:
    地址: http://cairographics.org/
    效果示例:
    圆弧:









    例子1: 直接生成一个PNG图片,在上面用自定义的字体和颜色写Hello World
    #include cairo.h

    int
    main (int argc, char *argv[])
    {
           cairo_surface_t *surface =
               cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 240, 80);
           cairo_t *cr =
               cairo_create (surface);

           cairo_select_font_face (cr, "serif", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
           cairo_set_font_size (cr, 32.0);
           cairo_set_source_rgb (cr, 0.0, 0.0, 1.0);
           cairo_move_to (cr, 10.0, 50.0);
           cairo_show_text (cr, "Hello, world");

           cairo_destroy (cr);
           cairo_surface_write_to_png (surface, "hello.png");
           cairo_surface_destroy (surface);
           return 0;
    }
    一些重要的概念:
    Context

    要用Cairo画图,首先得创建一个Cairo 上下文(context)。Cairo 上下文(context)中定义了所有的图形状态变量,它们描述了绘图是怎样完成的。其中包括信息如:线宽(line width),颜色(color)以及要绘制的图面(surface)和其他很多相关的信息。
    Path

    路径(Path)由一条或者多条线组成。这些线由两个或者多个锚点(anchor point)连接而成。路径可以由直线和曲线组成。开放路径(Open path)和闭合路径(Closed path)是两种不同的路径(Path)。在开放路径中,起点和终点不相遇。在闭合路径中,起点和终点相遇。

    在Cairo中,我们首先定义一个路径(Path),接着通过填充(filling)和描边(storking)使其可见。当调用cairo_stroke()或者cairo_fill()函数的时候,如果路径(Path)是空的,必须重新定义一个新的路径(Path)。

    路径(Path)可以由子路径(Subpaths)组成。

    Source

    图源(Source)是我们绘图过程中的画笔。我们可以将图源(Source)比作画笔或者油墨,这样就可以绘制轮廓和填充图形。有四种基本的图源(Sourse)包括颜色(Colors),渐变(gradients),模板(patterns)和图像(images)。

    Surface

    图面(Surface)是绘图的最终目标。我们可以用PDF或者PostScript图面(surface)来渲染文档。

    文档中提及了以下几种图面(Surfaces)

    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
    在图源(Source)应用到图面(surface)之前,要进行一次过滤。遮罩(Mask)作为一个过滤器,决定一个图源(Source)哪部分被应用到图面(Surface),哪部分没有。遮罩(Mask)不透明的部分允许将图源(Source)拷贝到图面(surface),透明的部分不允许复制图源(Source)到图面(Surface)。

    Pattern
    Cairo pattern(模板)代表要绘画到图面(surface)上的source(图源)。在cairo中,你可以读取一个pattern,可以将它作为绘画操作的图源或者遮罩来使用。pattern可以是纯色,一个图面,甚至是渐变。
    例子2:画圆弧

    //定义圆弧的圆点
    double xc = 128.0;
    double yc = 128.0;
    //半径
    double radius = 100.0;
    //起始弧度,45度转换为弧度:Cairo里用的都是弧度
    double angle1 = 45.0  * (M_PI/180.0);  /* angles are specified */
    //结束弧度,180度
    double angle2 = 180.0 * (M_PI/180.0);  /* in radians           */

    //设置线宽:10个单位
    cairo_set_line_width (cr, 10.0);
    //画圆弧路径,此时只形成了Path,没有实际画出来
    cairo_arc (cr, xc, yc, radius, angle1, angle2);

    //描边,把之前的Path按设置好的样式实际画出来,到此时实际图像才落地成真
    cairo_stroke (cr);

    //画两条半径和一个圆点,作为辅助线
    /* draw helping lines */
    //设置不同的颜色
    cairo_set_source_rgba (cr, 1, 0.2, 0.2, 0.6);
    //设置辅助线不同的线宽
    cairo_set_line_width (cr, 6.0);

    //先画个小圆点,圆心跟之前的一样,半径为10,一样只是个Path
    cairo_arc (cr, xc, yc, 10.0, 0, 2*M_PI);
    //Fill则把路径填充起来,落地成真实的图像
    cairo_fill (cr);

    //画两条半径
    cairo_arc (cr, xc, yc, radius, angle1, angle1);
    cairo_line_to (cr, xc, yc);
    cairo_arc (cr, xc, yc, radius, angle2, angle2);
    cairo_line_to (cr, xc, yc);
    cairo_stroke (cr);

    楼主 2015-12-05 13:09 回复

共有回帖数 0
  • 回 帖
  • 表情 图片 视频
  • 发表

登录直线网账号

Copyright © 2010~2015 直线网 版权所有,All Rights Reserved.沪ICP备10039589号 意见反馈 | 关于直线 | 版权声明 | 会员须知