アシアルブログ

アシアルの中の人が技術と想いのたけをつづるブログです

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の丸々コピーのような関数は以下のXMLpecl-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版で公開したいなぁ。。