跳轉到內容

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

華夏公益教科書