Cairo初探査


Cairoについて
Cairoは非常にポピュラーなオープンソース2 Dグラフィックスレンダリングエンジンライブラリであり、X-Windos、Win 32、画像、pdfを含む様々な出力装置をサポートしています.現在、Cairoは、Firefox/Webkit-EFL/GTK+/POpplerなど、複数のプラットフォームでグラフィックインタフェースをレンダリングするために広く使用されている.
コンパイルインストールCairo
Ubuntuからcairoの安定版を直接ダウンロードできます.
sudo apt-get install libcairo2-dev
ここでは、Cairoの最新版を使用するためにgitからソースコードをダウンロードし、インストールをコンパイルします.
git clone git://anongit.freedesktop.org/git/cairo
cd cairo
mkdir cairobuild
./autogen.sh #          
make 
sudo make install

Cairoの基本図形描画モデルと概念Cairoを用いてプログラミングする前に,Cairoの基本図形描画モデルについて理解すべきである.これらのモードには、表面(surfac)、ソース(source)、マスク(mask)、パス(path)、コンテキスト(context)、関数(verb)が含まれる.
表面(surface)Surfaceは、Cairプロットのターゲット領域であり、Cairoでcairo_を使用するsurface_tは表す.前述したCairは複数の出力装置をサポートしているので、私たちが描いたターゲット領域はpngイメージでもpdfファイルでもある可能性があります.異なるターゲットの描画の下位実装はそれぞれ異なり,surfacはこれらの描画のターゲットを抽象化した.したがって,対応するsurfaceを作成した後,バックエンド(backend)の具体的な実装に関心を持つことなく,統一した関数を呼び出してsurfaceを描画するだけでよい.
ソースソース(source)Sourceとは、ブラシの太さ、色など、私たちが描いた具体的な材料とフォーマットを指します.Cairoでは、sourceは単純な色だけでなく、グラデーションのようなパターン(patter)であってもよく、表面(surface)であってもよい.
マスクマスク(mask)Maskは、キャンバスにいくつかの部分を掘った紙で隠す描画プロセスに相当します.これにより、図面を描く過程で、空を掘った部分だけが私たちが使用しているソースに影響され、残りの部分は影響されません.
パス(path)Pathとは、Cairoの描画表面上のいくつかの仮想パスを指し、線分、閉じた四角形、さらに複雑な曲線である可能性があります.Pathは、Cairoの関数(Cairoではverbと呼ばれる)によって作成することができる.しかし、Pathは仮想パスであるため、Pathの作成は表面描画を意味しない.次に,描画関数(Cairoではdrawing verbと呼ぶ)を用いて描画する必要がある.例えばcairo_rectangle関数は閉じた長方形のパスを作成し、cairo_を通過します.fill関数はこの長方形を埋めます.
コンテキスト(context)Contextは、Cairoのコア構造であり、Cairoでcairo_を使用するtで表す.これには、以前に説明した表面、ソース、マスク、フォントなど、現在の状態での描画に関するさまざまな情報が記録されています.任意の描画の前にcair_を作成する必要があります.t構造は、同時に描画表面にバインドされる(surface).次のコードセグメントはcairo_を作成します.tは、640 x 480のpngイメージにバインドされる.
cairo_surface_t *surface;
cairo_t *cr;


surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, 640, 480);
cr = cairo_create (surface);

関数(verb)Cairoにおける描画に関する関数をverbと呼ぶ.現在、Cairoは5種類のdrawing verbをサポートしており、それぞれstroke(線を描く)、fill(塗りつぶし)、text(文字)、paint(フィルタ)、mask(カバー)である.ここでpaintは、cairo_のようなソース全体の操作に相当します.paint_with_Alpha関数は、画像全体の階調を低減するためにalpha値を設定することができる.
変換(transformation)Cairoはまた、OpenGLのような座標変換動作を提供する.変換操作には、平行移動(cairo_translate)、伸縮(cairo_scale)、回転(cairo_rotate)が含まれます.私たちもcairoを通じてtransform関数を使用して、複雑な変換を指定します.

長方形をrectangleに描画します.png画像にあります.
#include 

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

    int width = 640;
    int height = 480;
    surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
    cr = cairo_create (surface);

    /* Drawing code goes here */
    cairo_set_line_width (cr, 10);
    cairo_set_source_rgb (cr, 0, 0, 0);
    cairo_rectangle (cr, width/4, height/4, width/2, height/2);
    cairo_stroke (cr);

    /* Write output and clean up */
    cairo_surface_write_to_png (surface, "rectangle.png");
    cairo_destroy (cr);
    cairo_surface_destroy (surface);

    return 0;
}

helloworldをhelloworldに描画します.pdf上.
#include 
#include 
int
main (int argc, char *argv[])
{
    cairo_surface_t *surface;
    cairo_t *cr;
    cairo_text_extents_t te;


   /* Prepare drawing area */
    int width = 200;
    int height = 120;
      
    surface = cairo_pdf_surface_create ("helloworld.pdf", width, height);
    cr = cairo_create (surface);


    /* Drawing code goes here */
    cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
    cairo_select_font_face (cr, "Georgia",
        CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_BOLD);
    cairo_set_font_size (cr, 20);
    cairo_text_extents (cr, "helloworld", &te);
    cairo_move_to (cr, width/2 - te.width / 2 - te.x_bearing,
          height/2 - te.height / 2 - te.y_bearing);
    cairo_show_text (cr, "helloworld");


    cairo_destroy (cr);
    cairo_surface_destroy (surface);


    return 0;
}

gccコンパイル
gccコンパイルを使用してcairoのソースファイルを呼び出す場合は、cairoのヘッダファイルディレクトリとライブラリファイルが存在するディレクトリを指定します.ソースファイルの名前をcairotestと仮定します.c,cairo.hヘッダファイルが存在するディレクトリが/usr/include/cairo、cairoライブラリファイルが存在するディレクトリが/usr/local/libである場合は、次のコマンドを使用してコンパイルできます.
gcc cairotest.c -o cairotest -I/usr/include/cairo -L/usr/local/lib/ -lcairo
pkg-configを使用してcairoのディレクトリを構成し、次のコマンドを使用してコンパイルすることもできます.
gcc -o cairotest $(pkg-config --cflags --libs cairo) cairotest.c