跳转到内容

Aros/开发者/Cairo

来自 Wikibooks,开放世界中的开放书籍
用于 Aros 维基百科的导航栏
Aros 用户
Aros 用户文档
Aros 用户常见问题解答
Aros 用户应用程序
Aros 用户 DOS Shell
Aros/用户/AmigaLegacy
Aros 开发文档
Aros 开发者文档
从 AmigaOS/SDL 移植软件
适用于 Zune 初学者
Zune .MUI 类
适用于 SDL 初学者
Aros 开发者构建系统
特定平台
Aros x86 完整系统 HCL
Aros x86 音频/视频支持
Aros x86 网络支持
Aros Intel AMD x86 安装
Aros 存储支持 IDE SATA 等
Aros Poseidon USB 支持
x86-64 支持
Motorola 68k Amiga 支持
Linux 和 FreeBSD 支持
Windows Mingw 和 MacOSX 支持
Android 支持
Arm Raspberry Pi 支持
PPC Power Architecture
杂项
Aros 公共许可

目前有 Cairo 图形库的两个端口(1.5 和 1.12)。两者都位于 Aros contrib 源代码中。

您将在“contrib/development/libs/cairo”中找到一个相当新的版本。它是对 Cairo 版本 1.12.0 的补丁。此版本构建为一个静态链接库。

要编译链接库,请在您的 Aros 源代码目录中运行以下命令

make development-fontconfig

fc-cache

make development-cairo

这将构建依赖项以及 Cairo 和 Pixman 库。

Cairo 1.12 例子

[编辑 | 编辑源代码]

Cairo 1.12 使用直接的图像表面(在系统内存中处理所有内容)提供了更快的结果,可能比旧的 1.5 快约 60%。

使用图像表面,使用 cairo_image_get_data() 将 rgba 数据blit 到绘制方法中的自定义区域类。

Cairo 1.5 例子

[编辑 | 编辑源代码]

“contrib/gfx/libs/cairo/” 中的 Cairo 版本 (1.5) 相当旧。但与其他版本相比,它具有支持 Aros 作为本机后端的巨大优势。这意味着它带有一个函数“cairo_aros_surface_create”,它可以渲染到 Intuition RastPorts。第一个参数是指向 RastPort 的指针,其他参数指定了 X/Y 偏移量、宽度和高度。此端口也构建为 Aros 共享库。在 Aros-Exec Archives 中,您还会找到支持“cairo_aros_surface_create”的 Cairo 静态链接库。

旧的 1.5 版本完全由软件驱动,它涉及从视频 RAM 中的位图读取,这非常低效。

下面的第二个例子展示了如何创建和使用本机 Aros 表面的一个简单例子。

创建一个 PNG 图像的简单 Cairo 示例

使用以下命令进行编译:gcc test.c -lcairo -lpixman -lfreetype2 -lfontconfig -liconv -lxml2 -lz -lpng

#include <cairo/cairo.h>

int main (int argc, char *argv[])
{
cairo_surface_t *surface;
cairo_t *cr;

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

        cairo_select_font_face (cr, "DejaVu Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
        cairo_set_font_size (cr, 50.0);
        cairo_set_source_rgb (cr, 1.0, 0.0, 0.0);
        cairo_move_to (cr, 50, 50);
        cairo_show_text (cr, "Hello, AROS :-)");

cairo_destroy (cr);
cairo_surface_write_to_png (surface, "helloamiga.png");
cairo_surface_destroy (surface);

return 0;
}

使用 Aros 本机 RastPort 后端的简单 Cairo 示例

#include <exec/types.h>
#include <exec/exec.h>
#include <intuition/intuition.h>

#include <proto/intuition.h>
#include <proto/dos.h>
#include <proto/exec.h>

#include <cairo/cairo.h>
#include <cairo/cairo-aros.h>

#define WIDTH 400
#define HEIGHT 120

struct Window *appwin;
struct IntuitionBase *IntuitionBase;

cairo_surface_t *surface;
cairo_t *cr;

int main()
{
    IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",0L);

    if (IntuitionBase != NULL)
    {
        appwin = OpenWindowTags(NULL,
                                WA_Left, 100,
                                WA_Top, 100,
                                WA_Width, WIDTH,
                                WA_Height, HEIGHT,
                                WA_Title, "Cairo - AROS",
                                WA_CloseGadget, TRUE,
                                WA_DragBar, TRUE,
                                WA_DepthGadget, TRUE,
                                WA_IDCMP, IDCMP_CLOSEWINDOW,
                                WA_Activate, TRUE,
                                WA_GimmeZeroZero, TRUE,
                                TAG_DONE);

        surface = cairo_aros_surface_create (appwin->RPort, 0, 0, WIDTH, HEIGHT);
        cr      = cairo_create (surface);

        cairo_select_font_face (cr, "DejaVu Sans", CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
        cairo_set_font_size (cr, 50.0);
        cairo_set_source_rgb (cr, 1.0, 0.0, 0.0);
        cairo_move_to (cr, 50, 50);
        cairo_show_text (cr, "Hello, AROS :-)");

        if (appwin != NULL)
        {
            Wait(1L << appwin->UserPort->mp_SigBit);

            CloseWindow(appwin);
        }
    }

    if (IntuitionBase != NULL) CloseLibrary((struct Library *)IntuitionBase);

    return 0;
}

参考资料

[编辑 | 编辑源代码]

直接访问函数

[编辑 | 编辑源代码]

cairo_image_get_data() 及其他直接访问函数通常被应用程序错误使用,因为它们没有在访问表面数据的代码周围调用 cairo_surface_flush() 和/或 cairo_surface_mark_dirty()。您必须在读取或写入表面之前调用 cairo_surface_flush(),并且您必须在修改表面后使用 cairo_surface_mark_dirty()。

void
modify_image_surface (cairo_surface_t *surface)
{
  unsigned char *data;
  int width, height, stride;

  // flush to ensure all writing to the image was done
  cairo_surface_flush (surface);

  // modify the image
  data = cairo_image_surface_get_data (surface);
  width = cairo_image_surface_get_width (surface);
  height = cairo_image_surface_get_height (surface);
  stride = cairo_image_surface_get_stride (surface);
  modify_image_data (data, width, height, stride);

  // mark the image dirty so Cairo clears its caches.
  cairo_surface_mark_dirty (surface);
}

Cairo 库调用

cairo_surface_create_similar cairo_surface_create_similar_image cairo_surface_create_for_rectangle cairo_surface_reference cairo_surface_destroy cairo_surface_status cairo_surface_finish cairo_surface_flush cairo_surface_get_device cairo_surface_get_font_options cairo_surface_get_content cairo_surface_mark_dirty cairo_surface_mark_dirty_rectangle cairo_surface_set_device_offset cairo_surface_get_device_offset cairo_surface_set_fallback_resolution cairo_surface_get_fallback_resolution cairo_surface_get_type cairo_surface_get_reference_count cairo_surface_set_user_data cairo_surface_get_user_data cairo_surface_copy_page cairo_surface_show_page cairo_surface_has_show_text_glyphs cairo_surface_set_mime_data cairo_surface_get_mime_data cairo_surface_supports_mime_type cairo_surface_map_to_image cairo_surface_unmap_image

cairo_device_reference cairo_device_destroy cairo_device_status cairo_device_finish cairo_device_flush cairo_device_get_type cairo_device_get_reference_count cairo_device_set_user_data cairo_device_get_user_data cairo_device_acquire cairo_device_release

华夏公益教科书