グラデーション文字のHTMLを吐く各種言語拡張モジュール by SWIG(PHP,Python,Perl,Ruby対応)
# Makefileを直してruby版に対応しました08/08/25
久々のSwigネタです.
最近,C++ばっかり書いていてPHPをほとんど書かなくなってきました.
それでライブラリを作るならPHPやPythonなどそれぞれの言語で書くより,C++で書いたものを各種言語で共通して使えるようになればいいと思うようになり,SWIGの出番になりました.
今回は腕慣らしということで簡単なモジュールを作ってみました(ダウンロード 08/08/25修正).
グラデーション文字のHTMLを吐いてくれる関数text_gradationです
C++では
std::string text_gradation(const char* text, int fr, int fg, int fb, int tr, int tg, int tb);
というインターフェイスで
text_gradation("Gooooooooooooooooooooooal", 255, 0, 0, 255, 0, 255)
を表示すると
Gooooooooooooooooooooooal
となります.
第2~第4引数は開始色のRGBで第5~第7引数は終了色のRGBです.ポイントはRGBレベルで補間するのではなく,一度HSVに変換して補間し再びRGBに戻しています.
色相環を赤→黄→緑→青→紫の順に周り補間するので開始を赤,終了を紫にすると色相を一周した補間になります.
一応マルチバイトにも対応していて
text_gradation("北京オリンピック開催中", 255, 0, 0, 0, 0, 0);
を表示すると
北京オリンピック開催中
となります.ただしデフォルトでUTF8のみ対応です…(この辺は詳しくないので手抜きです)
上記ソースをこちらからダウンロードできます(08/08/25修正)
wget http://makingx.net/distribute/text_gradation-0.1.tar.gz tar xzvf text_gradation-0.1.tar.gz cd text_gradation make make main ./main
でテストできます.UTF8以外でコンパイルするときは
make CHARSET=EUC_JP make CHARSET=SHIFT_JIS
としてください.
これを各種スクリプト言語で使えるようにします.
SWIGを使うと非常に簡単に各種言語用ラッパーができます.インターフェイスファイルはたったのこれだけ
%module text_gradation %include "std_string.i" %{ #include "text_gradation.h" %} %include "text_gradation.h"
headerを上手に書けば.hをインクルードするだけです.
tgzにSWIGで生成した各言語用のC++ファイル(text_gradation_wrap.cpp)を同梱しました.
SWIGをインストールしている場合はtext_gradation_wrap.cppを削除してもmakeで作成できます.
各言語で使う場合には
PHPの場合
cd php make make install
あとは
dl("text_gradation.so"); echo text_gradation("Gooooooooooooooooooooooal", 255, 0, 0, 255, 0, 255);
などいつものように使えます
Pythonの場合
詳しくないのですがmakeするとsetup.pyを作ります
cd python make make install # = python setup.py install
使い方は
from text_gradation import * print text_gradation("Gooooooooooooooooooooooal", 255, 0, 0, 255, 0, 255)
Perlの場合
Python同様,詳しくないのですがmakeするとMakefile.PLを作り拡張用Makefileを生成します
cd perl make # Makefile.perlができる make install # = make -f Makefile.perl install
使い方は
use text_gradation; print text_gradation::text_gradation("Gooooooooooooooooooooooal", 255, 0, 0, 255, 0, 255);
でしょうか.
Rubyの場合
これもextconf.rbを生成します
cd ruby make # Makefile.rubyができる make install # = make -f Makefile.ruby install
使い方は
require "text_gradation" puts Text_gradation::text_gradation("Gooooooooooooooooooooooal", 255, 0, 0, 255, 0, 255)
Tが大文字になっているのに注意(勝手に変わっていてsoをstringsするまで気づかなかった…)
まとめ
SWIGを使うと言語依存しない拡張ライブラリを簡単に作成できます.
ただし,配列の扱いに関しては統一的に扱い難いと思います.(typemapを各言語用に書きまくる?std::vectorで配列っぽいことはできるけど..)
もちろん純粋に各言語の拡張モジュールを作る場合よりもオーバーヘッドがあり,最適ではありませんが開発コストなど考えると
使用する開発言語が多言語化したきた今,非常に有益なツールだと思います.
ぼくはこれから積極的に使っていきたいと思います!
Swigサイコー!
ダウンロード(08/08/25修正)


10 月 29th, 2008 at 2:41:21
People should read this.