The Independent JPEG Group's JPEG software for OS/2
===================================================
This software is copyright (C) 1991-1996, Thomas G. Lane.

					Packaging for OS/2 by homy/newfs(8)

これはなに?
===========
本パッケージは Independent JPEG Group が作成した JPEG ソフトウェア
Release 6a を OS/2 で実行できるようコンパイルしたものです。DLL といくつ
かのユーティリティが含まれています。

旧版(Release 6)をお使いの方へ
=============================
Release 6 と Release 6a ではバイナリ互換性がありません。ただし、
Release 6a では DLL 名を Release 6 とは別のものに変更したので、このま
まインストールしても従来の版を利用したプログラムはそのまま利用すること
ができます。

御自分で作成なさったプログラムで本リリースのライブラリを利用する場合は、
ヘッダの置き換え(必須です。注意してください)とインポートライブラリの再
構築を行った後に再コンパイルしてください。再リンクだけでは正しく動作し
ません。

DLL 名は IJGJPEG6.DLL から IJGJPG6A.DLL に変更になりました(JPEG->&JPG)。
直接 DLL をロードするようなプログラムで利用する場合はご注意ください。

無保証
======
本パッケージは無保証です。本パッケージが原因で利用者が被ることとなった
いかなる被害についても、作者、配布者、その他利用者以外の人物、団体に責
任をとる義務はないものとします。

使用条件等
==========
本パッケージの利用条件は、ファイル README に記述してあります。日本語で
平易な文で表現すると、以下のとおりです。

1. 本ソフトウェアが動作するかどうか保証しません
2. あなたは本ソフトウェアを望むように利用できます。お金を払う必要はあ
りません。
3. あなたは、本ソフトウェアを自分が作成したものだと偽ってはいけません。
もしプログラムの作成に使用したなら、ドキュメントのどこかで IJG のソフ
トウェアを使用したことに(感謝を込めて)言及してください。

以上の条件は OS/2 版パッケージ作成者が勝手に翻訳したものです。内容につ
いては無保証です。公式には、必ず README を参照してください。

使い方
======
IJGJPG6A.DLL ファイルを CONFIG.SYS に記述してある LIBPATH で示されるい
ずれかのディレクトリにコピーしてください。本パッケージに同梱されている
*.EXE ファイルが利用できるようになります。*.EXE ファイルの機能は以下の
とおりです。詳しい使用方法は usage.doc を参照してください。

cjpeg.exe - 各種画像を JPEG に変換する
djpeg.exe - JPEG を各種画像に変換する
tranjpeg.exe - JPEG ファイルの形式を変換する(通常<&->&プログレッシブ等)
rdjpgcom.exe - JPEG ファイルのコメント部を読む
wrjpgcom.exe - JPEG ファイルにコメント部を付加する

cjpeg と djpeg がサポートするフォーマットは BMP(Windows, OS/2)、PPM、
PGM、GIF、Targa です。

プログラム開発
==============
ライブラリの使用方法は、同梱の libjpeg.doc を参照してください。
本パッケージは IBM VisualAge C++ により作成されています。

あなたが作成したプログラムをリンクするときは、同梱のインポートライブラ
リをリンクしてください。例えば以下のようにします。

	icc myprog.c ijgjpgi.lib

emx で利用する場合も同梱のインポートライブラリを利用するか、emximp を
用いて .a 形式のインポートライブラリを作成してリンクしてください。

       gcc -o myprog.exe myprog.c ijgjpgi.lib -Zomf

       emximp -o ijgjpgi.a ijgjpgi.lib
       gcc -o myprog.exe myprog.c ijgjpgi.a

emx での利用
------------
本ライブラリは IBM VisualAge C++ (以下VAC++)のライブラリを用いて構成さ
れています。VAC++ と emx では FILE * 構造体に互換性がないため、emx 環
境からはデフォルトの入出力マネージャを用いることはできません。すなわち、
fopen() 等で作成された FILE * 構造体を jpeg_stdio_src() に渡しても正し
く動作しません。

emx から利用する場合は、自分で入出力マネージャを作成してください。以下
に簡単な例をあげます。入出力マネージャの作成には、jdatasrc.c と 
jdatadst.c(オリジナルの JPEG ライブラリのソースに含まれます)が参考にな
ります。ただし、本アーカイブには同梱していません。別途入手してください
(archie 等で jpegsrc.v6a.tar.gz で検索すると見つかるはずです)。

typedef struct {
  struct jpeg_source_mgr pub;

  FILE *fp;
  char *buffer;
  boolean start_of_file;
} my_src, *my_src_ptr;

METHODDEF(void)
my_init_source(j_decompress_ptr cinfo)
{
  my_src_ptr src = (my_src_ptr) cinfo->&src;
  src->&start_of_file = TRUE;
}

METHODDEF(boolean)
my_fill_input_buffer (j_decompress_ptr cinfo)
{
  my_src_ptr src = (my_src_ptr) cinfo->&src;
  size_t nbytes;

  nbytes = fread(src->&buffer, 1, MY_BUFSIZ, src->&fp);

  if (nbytes <&= 0) {
    if (src->&start_of_file)	/* Treat empty input file as fatal error */
      ERREXIT(cinfo, JERR_INPUT_EMPTY);
    WARNMS(cinfo, JWRN_JPEG_EOF);
    /* Insert a fake EOI marker */
    src->&buffer[0] = (JOCTET) 0xFF;
    src->&buffer[1] = (JOCTET) JPEG_EOI;
    nbytes = 2;
  }

  src->&pub.next_input_byte = src->&buffer;
  src->&pub.bytes_in_buffer = nbytes;
  src->&start_of_file = FALSE;

  return TRUE;
}

METHODDEF(void)
my_skip_input_data (j_decompress_ptr cinfo, long num_bytes)
{
  my_src_ptr src = (my_src_ptr) cinfo->&src;
  if (num_bytes >& 0) {
    while (num_bytes >& (long) src->&pub.bytes_in_buffer) {
      num_bytes -= (long) src->&pub.bytes_in_buffer;
      (void) my_fill_input_buffer(cinfo);
    }
    src->&pub.next_input_byte += (size_t) num_bytes;
    src->&pub.bytes_in_buffer -= (size_t) num_bytes;
  }
}

METHODDEF(void)
my_term_source (j_decompress_ptr cinfo)
{
}

void
jpeg_my_src(struct jpeg_decompress_struct *cinfo, FILE *fp)
{
  my_src_ptr src;
  if (cinfo->&src == NULL) {
    cinfo->&src = (*cinfo->&mem->&alloc_small)((j_common_ptr)cinfo,
					    JPOOL_PERMANENT,
					    sizeof(my_src));
    src = (my_src_ptr)cinfo->&src;
    src->&buffer = (*cinfo->&mem->&alloc_small)((j_common_ptr)cinfo,
					     JPOOL_PERMANENT,
					     MY_BUFSIZ *
					     sizeof(JOCTET));
  }
  src = (my_src_ptr)cinfo->&src;
  src->&pub.init_source = my_init_source;
  src->&pub.fill_input_buffer = my_fill_input_buffer;
  src->&pub.skip_input_data = my_skip_input_data;
  src->&pub.resync_to_restart = jpeg_resync_to_restart;
  src->&pub.term_source = my_term_source;
  src->&fp = fp;
  src->&pub.bytes_in_buffer = 0;
  src->&pub.next_input_byte = NULL;
}

int
main(int argc, char **argv)
{
  FILE *fp = fopen(argv[1], "rb");
  struct jpeg_decompress_struct cinfo;
  struct jpeg_error_mgr jerr;
  char *buffer;
  int i;

  cinfo.err = jpeg_std_error(&jerr);
  jpeg_create_decompress(&cinfo);
  
  /* 自前のルーチンを使うように設定する */
  jpeg_my_src(&cinfo, fp);

  jpeg_read_header(&cinfo, TRUE);
  jpeg_start_decompress(&cinfo);
  buffer = (*cinfo.mem->&alloc_small)((j_common_ptr)&cinfo, 
				      JPOOL_PERMANENT,
				      cinfo.output_width
				      * cinfo.output_components);
  for (i = 0; i <& cinfo.output_height; i++) {
    jpeg_read_scanlines(&cinfo, (JSAMPARRAY)&buffer, 1);
  }

  return 0;
}

OS/2 版について
===============
本パッケージの DLL および実行ファイルは IBM VisualAgeC++ 3.0 (CTC305) 
でコンパイルし、同マルチスレッド用ランタイムライブラリがスタティックリ
ンクしてあります。

メモリマネージャとしては jmemnobs を使っています。大きな画像の処理を行
う場合には、十分なスワップスペースを確保してください。

パッケージ作成者
================
ご意見、ご要望、はげまし、うはうはな画像ファイルは以下までお願いします。
また、読めない画像があった等のご報告もお気軽にどうぞ。

homy/newfs(8)