Text::AAlibを書いています。

XSを書く練習の続き。
前回はごりごりとXSで書くというものだったので、
今回はライブラリのバインディングにチャレンジ。


扱うライブラリは

というアスキーアートを作るためのライブラリ。

現状

必要最低限な機能だけとりあえず実装しました。
機能的にドキュメント読んだだけではよくわからないところが
あるので、それについてはソースを読んで充実させていく予定です。
テストの書き方も今一つわかっていないので、他のライブラリの
実装も見て勉強する必要がありそうです。

#!perl
use strict;
use warnings;

use Text::AAlib;
use Imager;

my $file = shift or die "Usage: $0 image";

my $img = Imager->new(file => $file) or die Imager->errstr;
my ($width, $height) = ($img->getwidth, $img->getheight);

my $aa = Text::AAlib->new("a.txt", {
    width => $width, height => $height,
});

for my $y (0..($height-1)) {
    for my $x (0..($width-1)) {
        my $color = $img->getpixel(x => $x, y => $y);
        my ($h, $s, $v) = $color->hsv;

        $aa->putpixel($x, $y, $v);
    }
}

$aa->fastrender();
$aa->flush();
$aa->close();

結果

実行して得られた結果は以下のとおりです。(小飼弾さんのデフォルメ)
目を細めるとわからんでもないというところですかね。

課題

  • 未実装の APIの実装
  • 使いやすく、PerlらしいAPIの設計
  • テストを書く
  • Imager等の連携の考察


ということがまず上げられます。
他のライブラリを読んで、勉強も兼ねたいところです。

終わりに

Cで標準ライブラリ以外をバリバリ使って書くということをあまりしたことが
ないから、C言語でサンプルを書いてみる時点でめんどくさいって思いました。
Perlだとガンガンライブラリを使っていますけど、あんまりそういうこと感じた
ことがないので、バインディングモジュールの作者がとてもよく考えて、
設計・実装しているんだなと思いました。そのクオリティで作るのは難しい
かもしれないですが、頑張って設計・実装したいと思います。


今回はちゃんとできたら、CPANに上げる予定です。