SSブログ

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を扱う関数を追加し、それにリンクするように JFREADJFWRITEfflushferror を書き換える。追加関数はtlib(/0 オプション付)で libjpeg.lib に追加する。
  • DelphiのLongBool用にTYPEDEF_UCHAR_BOOLEANundefにする(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)に続きます。 ≫≫≫

*1:
最初から“6b”になっている、jpeg.pas。
“6a” だと jpeg_CreateDecompress 等で常に失敗する。
*2:
別に pas をプロジェクトに追加しなくて良いのだが、改良版 LoadFromStream の具合を見る為にそうしてある。
*3:

jpeg.pasのfread等を使用する場合は不要。

jpeg.pasの{$L}を使用しないで、jpeg.pasのfread等を利用する場合は、

  • jinclude.hにnamespace
  • jpeg.pasのinterfaceに手続き/関数宣言
  • 型を合わせる(unsigned intCardinal 等)

が必要。

*4:
jpeg.pasの{$L}を使用する場合は不要。
*5:
makefile の CFLAGS に 「 -u- 」を付けると下線付けは不要。
  • makecfg.exe 作成で、「_main が見つからない」エラーになるので、makefile の makecfg.exe 作成部分に「 -u 」を付ける。
  • jsimdext.inc の SEG_TEXTSEG_CONST 定義がある辺りに、
    %define EXTN(name) name
    を入れる。

jpeg.pasのfread等を使用しない場合は、 「 -u- 」で、mallocmemset等でリンクエラーになる。#pragma aliasで何とかなるが、親切なtlibから警告を受ける。

*6:
メモリに普通にJPEGファイル読み込み/LoadFromStream/Assign
*7:
メモリに普通にJPEGファイル読み込み/IStream/GetHBITMAP
*8:

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 になるようにする)


nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0