ソースコード小屋


 ここでは、私が自作したソースコード片や、 他のソフトの修正パッチなどを公開しています。

 ここにあるソースコードについては、原則としてサポートはいたしません。 ですから、これらのソースコードが何をするものなのか、 どうやって使うのかを理解できる方だけが使ってください。


Contents


libpng_deinterlace_patch -- libpng インターレース PNG 展開速度改善パッチ

 これは、libpng で MMX コードを使用していない場合の、インターレースPNGの展開速度を改善するための修正ファイル (パッチ)です。pngrutil.c の中の png_combine_row() / png_do_read_interlace() の2つの関数をほぼ全面的に刷新します。libpng version 1.2.7 を想定していますが、 それ以外のバージョンでもおそらく使えると思います。

 この修正パッチは、私から libpng の現在のメンテナである Glenn Randers-Pehrson 氏にメールで送ったのですが、libpng の開発MLのログを見ると「libpng のファイル サイズが1300バイトも大きくなるうえ、速度改善効果がどれぐらいあるかまだ不明 なので、とりあえずは採用を見送る」というようなことが書かれてあったので、 私自身が単独でここに公開することにしました。

 速度改善効果については、x86 プロセッサで gcc / MS-VC++ を使っている場合は 元のバージョンよりも 50% 〜 数倍も差があります。動作テストもしてありますし、 Susie32 PNG Plug-inbmp2png & png2bmp などでも使用されていて動作実績もあります。実際に動作させなくても、 ソフトウェアの動作速度改善手法に詳しい方が見れば、 少なくとも元のバージョンよりは速いことはソースを見比べれば明らかだと思います。

 この修正パッチを適用する(使用する)には、GNU Patch (Win32版) を使います。Windows の場合は MS-DOS プロンプト(もしくはコマンドプロンプト)を開き、 pngrutil.c があるディレクトリをカレントディレクトリにして、

patch < libpng_deinterlace_patch.diff

と入力します。自動的に pngrutil.c に対して修正が加えられます。

 このパッチファイルについては、著作権を主張しません(Public Domain Software とします)。 このパッチファイル自体の利用・改変・配布などは完全に無制限ですが、 修正済みのソースファイルを公開・配布する場合は、libpng の使用条件に基づき、 修正(改変)されたファイルは改変されている旨を明記する必要があります。

 ↓ダウンロードされず、ブラウザに内容が表示されてしまう場合は、 右クリックして「対象をファイルへ保存」してみてください。


libjpeg_h1v2_upsample_patch -- IJG JPEG Library 高画質化パッチ

 IJG JPEG Library で、 Y:1x2 Cb:1x1 Cr:1x1 (4:2:2) のサブサンプリング比を持つ JPEG ファイルを高画質に展開できるようにするためのパッチ(修正ファイル)です。

sloppy_upsample
fancy_upsample

 サブサンプリング比 Y:1x2 Cb:1x1 Cr:1x1 (4:2:2) を持つ JPEG ファイルは、 オリジナルの(改造の加えられていない) IJG JPEG Library でも一応展開できますが、 このサブサンプリング比に対応するアップサンプリング・ ルーチンが簡単なものしか用意されていないため、展開速度も遅く、また、 色の境目がはっきりしているCG画像などの場合はジャギーが目立ってしまうことがあります (右の画像・上)。このパッチは、このようなサブサンプリング比 Y:1x2 Cb:1x1 Cr:1x1 を持つ JPEG ファイルを高速に、また、 ジャギーが目立たないように高画質に展開できるようにします(右の画像・下)

 この、サブサンプリング比 Y:1x2 Cb:1x1 Cr:1x1 の JPEG ファイルは、 あまり一般的なものではありませんが、ディジタルカメラなどが出力することの多い、 サブサンプリング比 Y:2x1 Cb:1x1 Cr:1x1 (4:2:2) の JPEG ファイルに対して 「JPEG ロスレス回転」処理を行なうと、この Y:1x2 Cb:1x1 Cr:1x1 の JPEG ファイルになります。ディジタルカメラで、カメラを縦にして(縦位置で) 撮影した画像を「JPEG ロスレス回転」して正常な向きに直す、などということは、 よくやることだと思います。ですが、このような「JPEG ロスレス回転」された JPEG ファイルをオリジナルの IJG JPEG Library で展開すると、上記の理由から、JPEG ファイルを展開してから画像処理ソフトで回転させた画像に比べて画質が劣ってしまいます。 このパッチ(修正ファイル)を IJG JPEG Library に適用することで、 画像処理ソフトで回転させた画像と同じクオリティで展開することが可能になります。

 この修正パッチを適用する(使用する)には、GNU Patch (Win32版) を使います。Windows の場合は MS-DOS プロンプト(もしくはコマンドプロンプト)を開き、 jdsample.c と jmorecfg.h があるディレクトリをカレントディレクトリにして、

patch < libjpeg_h1v2_upsample_patch.diff

と入力します。自動的に、jdsample.c と jmorecfg.h に対して修正が加えられます。

 このパッチファイルについては、著作権を主張しません(Public Domain Software とします)。 このパッチファイル自体の利用・改変・配布などは完全に無制限ですが、 修正済みのソースファイルを公開・配布する場合は、IJG JPEG Library の使用条件に基づき、 修正(改変)されたファイルは改変されている旨を明記する必要があります。

 ↓ダウンロードされず、ブラウザに内容が表示されてしまう場合は、 右クリックして「対象をファイルへ保存」してみてください。


Chirp z-Transform (CZT)
-- 任意データ数での計算が可能な高速 DFT アルゴリズム

 離散フーリエ変換(DFT)を高速に計算するアルゴリズムとして、 高速フーリエ変換(FFT)が有名です。これは、対象の標本数を n とすると、 O(n*log(n)) の時間計算量で離散フーリエ変換を計算する優れたアルゴリズムですが、 大抵の場合、標本数は 2の整数乗に限定されてしまいます。かといって、 DFT の定義どおりの方法で計算すると、標本数の制限はないものの、 その時間計算量は O(n^2) になってしまいます。

 ここで紹介する Chirp z-Transform (CZT) というアルゴリズムは、 時間こそ FFT の数倍かかりますが、標本数は完全に自由で、かつ、 FFT と同じく O(n*log(n)) の時間計算量で計算できるというものです。

 数年前、大した目的もなく打ち込んで、そのまま眠っていたものなのですが、 何らかの役に立つこともあろうかと思ったので、 一部修正して公開してみることにしました。

 この CZT は、その計算の途中で FFT を利用するため、 FFT のコードも同梱してあります。この FFT のコードは、 これだけで FFT として利用できます。 また、ごく簡単なテストプログラムも同梱しました。

 このソフトは、Public Domain Software とします。著作権は主張しません。 利用・改変・配布などは完全に無制限です。どうぞご自由にご利用ください。

 2003/09/15 版の変更点: ソースコード中の三角関数表の計算法をごくシンプルなものに変更しました。 また、linux (gcc) 用の Makefile (Makefile.lin) を追加しました。


Pi 読み込み/書き出しライブラリ

 Pi 形式画像ファイルを読み書きするためのルーチン(ライブラリ)です。 Susie32 Pi Plug-in でも使用しているものです。 動作テスト用のサンプルアプリケーションとして、 bmp2png & png2bmp を改造して Pi <-> BMP コンバータにした bmp2pi & pi2bmp が付属しています。

 ライブラリといっても、 その都度コンパイルしスタティックにリンクして使用することを想定しています。 可能な限り移植性が上がるように考慮しましたが、 Win32 と Linux(x86) 以外ではテストしていません。 特定の環境でうまく動作しないようならば、その都度修正して使ってください。

 使い方に関しては、付属のサンプルアプリケーション bmp2pi & pi2bmp やライブラリそのもののソースコード、 Susie32 Pi Plug-in のソース を参考にしてください。 (IJG の) libjpeg や libpng を使ったことのある方なら簡単にわかると思います。

 このソースコードの利用条件については、同梱の pilib.h / common.h の著作権表示をご覧ください。一言で言えば、 いわゆる「オープンソース・ソフトウェア」で、商用目的を含め、自由に利用できます。


アセンブリ言語版 DCT ルーチン for IJG JPEG Software

 JPEG 画像の圧縮・展開用ライブラリとして広く普及している Independent JPEG Group's JPEG Library の中の、DCT 演算部分を Intel i386 アセンブリ言語で書き直したものです。

 DCT ルーチンをアセンブリ言語に書き直すと、 JPEG の圧縮・展開速度にどれくらい差が出るか興味があったので、 '99年頃に作ったものです。Pentium-133MHz での実験結果は、 浮動小数点 DCT の場合で 15% 前後、整数 DCT で 10% 程度の高速化が認められましたが、 体感ではあまり変わりありませんでした(^^;。 本当は MMX 命令を使って書きたかったのですが、 当時私は MMX のないマシンを使っていたので、できませんでした(T_T)。

 その後、あまり使う意味がないと思いながらも、 自分だけで使う JPEG 関連ソフトで使っていたのですが、 アセンブリ言語のソースコードが何らかの参考になるかもしれないと、 ふと思ったので公開してみます。

 なお、このアーカイブに含まれるアセンブリ言語のソースファイル(*.asm)は、 Microsoft の MASM や Borland の TASM ではアセンブルできません。 Netwide Assembler (NASM) というフリーのアセンブラを使います。NASM は、Win32版・ DJGPP版・MS-DOS版 などがダウンロードできますから、あらかじめ 適切なものをダウンロードしてインストールしてください。

 このソフトは、フリーソフトウェアとします。利用・改変・転載・再配布などは、 各種の商用利用を含め無制限です。ご自由にご利用ください。


counter トップページに戻る