CodeGen_Peclで四苦八苦
森川です。
この間のSeam CarvingのPHPソースコードはあまりにも遅かったので、PHPエクステンションで作ってみることにしました。
PHPエクステンションといえばCodeGen_Pecl、ということで勉強がてら作ってみることにしました。
まずは、Do You PHPにあるとおりにHello Worldの作成です。ここまでは割とすいすい、簡単にできます。
が、しかしなのです。PHPのGDライブラリをどうやって使うのか、GDのリソースはどうやって使うのか、さっぱりわかりません。。。
と思って、いろいろと探してみると、ずばりなものがありました。
讃容日記というところで、gdextraというエクステンションが公開されており、うってつけの勉強材料!
まずは、PHPのモジュール依存の定義からです。
<deps language="c" platform="all">
<extension name="gd" />
<with>
<header name="ext/gd/libgd/gd.h" />
</with>
</deps>
こんな感じで、gdモジュールとPHP組み込みのgdライブラリのヘッダファイルの依存を定義することができます。こうしておけば、自動的にgdライブラリのヘッダファイルも読み込まれます。
これで、スクリプトを書く準備が整いましたが、肝心のリソースを使用することができません。リソースを使用するには、リソースの番号のようなものが必要なのでした。
この番号はgdモジュールのソースコードでは、static int le_gdのように定義されているのですが、当然le_gdは今作成しているモジュールからは参照することができません。
そのため、phpi_get_le_gd()という関数が用意されており、画像リソースの番号を取得することができます。
とりあえず、imagecreatetruecolorの丸々コピーのような関数は以下のXMLをpecl-genで指定すると作成できます。
<?xml version="1.0"?>
<extension name="seamcarving" version="1.0.0">
<summary>Seam Carving</summary>
<description>
This is a expanding or contracting image extension.
</description>
<license>PHP</license>
<maintainers>
<maintainer>
<user>joe</user>
<name>MORIKAWA Joe</name>
<role>lead</role>
</maintainer>
</maintainers>
<release>
<version>1.0.0</version>
<date>2007-09-13</date>
<state>alpha</state>
<notes>
- My first PHP extension.
</notes>
</release>
<deps language="c" platform="all">
<extension name="gd" />
<with>
<header name="ext/gd/libgd/gd.h" />
</with>
</deps>
<function name="seam_imagecreate">
<proto>resource seam_imagecreate(int x_size, int y_size)</proto>
<code><![CDATA[
gdImagePtr im;
if (x_size <= 0 || y_size <= 0) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "Invalid image dimensions");
RETURN_FALSE;
}
im = gdImageCreateTrueColor(x_size, y_size);
ZEND_REGISTER_RESOURCE(return_value, im, phpi_get_le_gd());
]]></code>
</function>
</extension>
ここまで来れば、あともう少しで実際のSeam Carvingエクステンションを作成できそうです。
次回をお楽しみに!
#ちゃんとしたものになったらAjax版で公開したいなぁ。 。