영원한사랑

Cairo is a 2D graphics library with support for multiple output devices. Currently supported output targets include the X Window System, Win32, image buffers, PostScript, PDF, and SVG file output. Experimental backends include OpenGL (through glitz), Quartz, and XCB.


cairo 는 리눅스의 핵심 그래픽 라이브러리 입니다.
X Window 에서 부터 다양한 곳에 핵심적으로 쓰이고 있습니다.

php 에 붙일 생각을 못했었는데, gd 가지고 삽질하고 있는 모습을 본 어떤분이 권해주셔서 설치했습니다.
각 리눅스 배포판에서 cairo 를 지원하므로, cairo 는 그냥 설치하시면 되고,
php 용 래퍼만 phpize 적용하시면 바로 사용하실 수 있습니다.

php-cairo : http://sourceforge.net/projects/klecks/ (gentoo ebuild)
cairo manual : http://cairographics.org/manual/

php-cairo 에 klecks 라는 프로젝트는 svg 를 다루게 해 줍니다만, 패스~

php-cairo 에는 메뉴얼이 없습니다.
cairo 의 순수 래퍼라서 cairo 메뉴얼을 보면 되기 때문일 것입니다.

작명이 일관적이지 않은 느낌도 있고, 좀 헷갈리긴 합니다만, 예제정도는 들어있으니 따라하다 보면 할 만 합니다.

struct 를 리턴하는것을 기준으로 class 를 리턴하도록 한듯 합니다.

아래는 예제를 직접 만들어 본 것입니다.
절대! 전혀! 가볍습니다.
gd 에 비해 오래걸린다는 생각이 조금도 안듭니다.
gd 보다 하는일이 많다는것을 생각한다면 훨씬 효율적일듯 합니다.

FF

IE



<?php

$surface
 = new cairo_image_surface(0, 500, 500
);
$context = new cairo_context($surface
);


$x = 30
;
$y = 30
;
$l = 16
;
$ll = 30
;
$r = 0
;

$b = 1
;
$cr = 1
;
$cg = 0
;
$cb = 0
;
$ca = 1
;

$points = makeflower($x, $y, $l, $ll, $r, 5
);
drawflower($context, $points, $cr, $cg, $cb, $ca
);
$x += 15
;
$y += 10
;
$l *= 1.05
;
$ll *= 1.05
;
$r += 7
;
$b *= 1.1
;
$cr -= .05
;
$cb += .05
;
$ca -= .05
;

for(
$i = 0; $i < 18; $i
++) {
   
$points = makeflower($x, $y, $l, $ll, $r, 5
);
   
drawflower($context, $points, $cr, $cg, $cb, $ca, $b
);
   
$x += 15
;
   
$y += 10
;
   
$l *= 1.1
;
   
$ll *= 1.1
;
   
$r += 7
;
   
$cr -= .05
;
   
$cb += .05
;
   
$ca -= .05
;
   
$b *= 1.1
;
}
$points = makeflower($x, $y, $l, $ll, $r, 5
);
drawflower($context, $points, $cr, $cg, $cb, $ca
);


$x = 30
;
$y = 80
;
$l = 30
;
$ll = 13
;
$r = 0
;

$b = 1
;
$cr = 1
;
$cg = 0
;
$cb = 0
;
$ca = 1
;

$points = makestar($x, $y, $l, $ll, $r, 5
);
drawstar($context, $points, $cr, $cg, $cb, $ca
);
$x += 15
;
$y += 17
;
$l *= 1.1
;
$ll *= 1.1
;
$r += 7
;
$b *= 1.1
;
$cr -= .03
;
$cg += .02
;
$cb += .05
;
$ca -= .05
;

for(
$i = 0; $i < 18; $i
++) {
   
$points = makestar($x, $y, $l, $ll, $r, 5
);
   
drawstar($context, $points, $cr, $cg, $cb, $ca, $b
);
   
$x += 15
;
   
$y += 17
;
   
$l *= 1.05
;
   
$ll *= 1.05
;
   
$r += 7
;
   
$cr -= .03
;
   
$cg += .02
;
   
$cb += .05
;
   
$ca -= .05
;
   
$b *= 1.1
;
}

$points = makestar($x, $y, $l, $ll, $r, 5
);
drawstar($context, $points, $cr, $cg, $cb, $ca
);

$surface->write_to_png('cairo.png'
);

function
makestar($x, $y, $l, $ll, $r, $t
)
{
   
$ra = 360 / ($t << 1
);
    for(
$i = 0; $i < $t; $i
++) {
       
$r += $ra
;
       
$points[] = (sin($r * M_PI / 180) * $l) + $x
;
       
$points[] = (cos($r * M_PI / 180) * $l) + $y
;

       
$r += $ra
;
       
$points[] = (sin($r * M_PI / 180) * $ll) + $x
;
       
$points[] = (cos($r * M_PI / 180) * $ll) + $y
;
    }

    return
$points
;
}

function
drawstar(&$context, $points, $r, $g, $b, $a, $border = false
) {
   
$context->move_to($points[0], $points[1
]);
    for(
$i = 2; $i < count($points); $i += 2
) {
       
$context->line_to($points[$i], $points[$i + 1
]);
    }
   
$context->close_path
();

   
$context->set_source_rgba($r, $g, $b, $a
);
    if(
$border === false
) {
       
$context->fill
();
    } else {
       
$context->close_path
();
       
$context->set_line_width($border
);
       
$context->stroke
();
    }
}

function
makeflower($x, $y, $l, $ll, $r, $t
)
{
   
$ra = 360 / ($t * 3
);
   
$points[] = (sin($r * M_PI / 180) * $l) + $x
;
   
$points[] = (cos($r * M_PI / 180) * $l) + $y
;
    for(
$i = 0; $i < $t; $i
++) {
       
$r += $ra
;
       
$points[] = (sin($r * M_PI / 180) * $ll) + $x
;
       
$points[] = (cos($r * M_PI / 180) * $ll) + $y
;

       
$r += $ra
;
       
$points[] = (sin($r * M_PI / 180) * $ll) + $x
;
       
$points[] = (cos($r * M_PI / 180) * $ll) + $y
;

       
$r += $ra
;
       
$points[] = (sin($r * M_PI / 180) * $l) + $x
;
       
$points[] = (cos($r * M_PI / 180) * $l) + $y
;
    }

    return
$points
;
}

function
drawflower(&$context, $points, $r, $g, $b, $a, $border = false
)
{
   
$context->move_to($points[0], $points[1
]);
    for(
$i = 2; $i < count($points); $i += 6
) {
       
$context->curve_to($points[$i], $points[$i + 1], $points[$i + 2], $points[$i + 3], $points[$i + 4], $points[$i + 5
]);
       
$context->line_to($points[$i + 4], $points[$i + 5
]);
    }
   
$context->close_path
();

   
$context->set_source_rgba($r, $g, $b, $a
);
    if(
$border === false
) {
       
$context->fill
();
    } else {
       
$context->close_path
();
       
$context->set_line_width($border
);
       
$context->stroke
();
    }
}

?>
<html>
<head>
<!--[if IE]>
<style>
div {
    width:500px;
    height:500px;
    filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src='asdf.png', sizingMethod='scale');
}
div img {
    visibility:hidden;
}
</style>
<![endif]-->
</head>
<body bgcolor="#999999">
<div>
<img src="cairo.png" />
</div>
</body>
</html>



License


Cairo is free software and is available to be redistributed and/or modified under the terms of either the GNU Lesser General Public License (LGPL) version 2.1 or the Mozilla Public License (MPL) version 1.1 at your option.




FF

IE


이것이 삽질의 원흉입니다.
파란색 도형이 gd 의 기본 함수 입니다.
보시다시피 '선' 에는 안티알리아스가 적용이 되는데 알파채널계산이 안되어 허옇게 뜹니다.
그래서 붉은색 도형을 만들다 만 것인데,
php-cairo 를 알게되어 중단했습니다.


출처:http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=57691&page=1