グラデーション文字のHTMLを吐く各種言語拡張モジュール by SWIG(PHP,Python,Perl,Ruby対応)

8 月 15th, 2008 in C, PHP, Perl, Python, Ruby, Swig

# 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修正

One Response to “グラデーション文字のHTMLを吐く各種言語拡張モジュール by SWIG(PHP,Python,Perl,Ruby対応)”

  1. Kelli Says:

    People should read this.

Leave a Reply

Search

Blog

Twitter

Wassr

Recommend


とりあえず買っとく?

Ads

ドミノ・ピザ 5%OFF!

 iTunes Store(Japan)

Categories

Tags

Counter

total : 00059999
today : 00000060