Aros/开发者/Cairo
目前有 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 使用直接的图像表面(在系统内存中处理所有内容)提供了更快的结果,可能比旧的 1.5 快约 60%。
使用图像表面,使用 cairo_image_get_data() 将 rgba 数据blit 到绘制方法中的自定义区域类。
“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