Turbo C++ 2006 Explorer (2) - TJPEGの高速化(1) [パソコン/ソフト]
Borland® Turbo C++™ の TJPEGImage の JPEG→BMP 変換が遅いように思えたので、宮坂賢氏の「IJG's JPEG software with x86 SIMD extension V.1.02」を使用させていただくことにした。
直接ライブラリの機能を利用するのが良いのだが、TJPEGImageを高速化したいので、TJPEGImage経由(?)でライブラリの機能を利用することにした。
無料版のTurbo C++はDelphi® Packageを扱えないらしい。今回は、JPEG_LIB_VERSIONが“6b”(*1)の jpeg.pas,jconsts.pas,(TJPEG用に改造した)libjpeg.libをプロジェクトに追加、jpeg.pas をコンパイルすると作成される jpeg.hpp を指すように#include <jpeg.hpp> を書き換えるという方法にした(*2)。
TJPEG用に、
- (*3)TJPEGImageは、IJGライブラリの(FILE*)関連を(TStream*)としているらしいので、TStreamを扱う関数を追加し、それにリンクするように
JFREAD
,JFWRITE
,fflush
,ferror
を書き換える。追加関数はtlib(/0 オプション付)で libjpeg.lib に追加する。 - Delphiの
LongBool
用にTYPEDEF_UCHAR_BOOLEAN
をundef
にする(jconfig.h)。 NO_GETENV
を#define
する(jconfig.h)。- Delphi用(Windows用?)に
RGB_x
を書き換える(jmorecfg.h)。
( R(0),G(1),B(2) を R(2),G(1),B(0)にする ) - (*4)CFLAGSに-PオプションをつけてC++としてコンパイルする必要があり、ASM関数とASM関連変数の外部参照に
extern"C"{}
をつける(jcolsamp.h,jdct.h)。 - jpeg.pas にある {$Z4} と {$A数値} に合わせる為に、 makefile の CFLAGS に「 -b -a数値 」を付ける。
数値は調整が要るかもしれない(謎)。
等の改造を行った("make test"がうまくいかないTJPEGImage専用のlibjpeg.libになった)。
TJPEGのjpeg.pasにも、
- (*3)C関数のDelphi代替関連を削除。
- IJGライブラリとやりとりする部分に下線(*5)や
cdecl
(*8)をつける。 - Win32に不必要な部分を削除。
- (*4)全ての
{$L}
を削除。(リンクはリンカに任せる)
等の改造を行った。
メモリにJPEGファイルを読み込んで表示するプログラムで、このTJPEGを使用すると、JPEGの表示にかかる時間が¼位になった(*6)。GDI+を使用(*7)した場合よりも速い。
宮坂賢さん、どうもありがとうございました。
困ったことに、Turbo C++ Explorerのilink32は、dword単位でしかデータを配置しないらしい(←無料版の制限?)。ilink32で“align 16”が機能するようになると更に速くなると思う。
≪≪≪ (その2)に続きます。 ≫≫≫
“6a” だと
jpeg_CreateDecompress
等で常に失敗する。LoadFromStream
の具合を見る為にそうしてある。jpeg.pasのfread
等を使用する場合は不要。
jpeg.pasの{$L}
を使用しないで、jpeg.pasのfread等を利用する場合は、
- jinclude.hに
namespace
- jpeg.pasの
interface
に手続き/関数宣言 - 型を合わせる(
unsigned int
はCardinal
等)
が必要。
{$L}
を使用する場合は不要。- makecfg.exe 作成で、「
_main が見つからない
」エラーになるので、makefile の makecfg.exe 作成部分に「 -u 」を付ける。 - jsimdext.inc の
SEG_TEXT
,SEG_CONST
定義がある辺りに、%define EXTN(name) name
を入れる。
jpeg.pasのfread
等を使用しない場合は、 「 -u- 」で、malloc
やmemset
等でリンクエラーになる。#pragma alias
で何とかなるが、親切なtlibから警告を受ける。
LoadFromStream
/Assign
。IStream
/GetHBITMAP
。makefile の CFLAGS に 「 -pr 」を付けると cdecl
付けは不要になるが、pas以外の変更が多くなるので止めておいた方が良いかもしれない。
ファイル名 | 書換数 |
---|---|
jmorecfg.h | 3+追加5 |
jcolsamp.h | 23 |
jdct.h | 47 |
jpegint.h | 5 |
jdmerge.c | 4 |
jcsample.c | 8 |
jccolor.c | 5 |
jdsample.c | 10 |
jdcolor.c | 5 |
ASM関数, ASM関数を呼び出す関数ポインタ, そのポインタで呼び出されるC関数は、常に JCDECL
になるようにする。その他は JCDECL
を外しておく。(お好みで、「 -pr 」以外の場合に JCDECL
になるようにする)
コメント 0