# Scanner-logiscan

Andreas
Beck

    becka@sunserver1.rz.uni-duesseldorf.de

川岸良治 - 日本語訳

    kawagisi@yk.rim.or.jp

1995/02/14
v0.0.4j
1997年11月15日
この翻訳のリリース
v0.0.4
1995年2月14日
logiscan-0.0.4 パッケージのリリース

LOGITECH SCANMAN+ 400dpi ハンドヘルドスキャナ用ドライバ "logiscan v0.0.4" に付属のドキュメント類

## この文書について

LOGITECH SCANMAN+ 400 dpi handheld scanner driver version 0.0.4

このドキュメントは、 LOGITECH SCANMAN+ 400 dpi ハンドヘルドスキャナ用ドラ イバ Version 0.0.4 に付属のドキュメントを作者 Andreas Beck <becka@sunserver1.rz.uni-duesseldorf.de> の許可を得て翻訳したものです。

      第１部  元のファイル名： README
              ファイルの日付： Feb 14  1995
              作者          ： Andreas Beck
      第２部  元のファイル名： README.ioctl
              ファイルの日付： Dec 24  1994
              作者          ： Andreas Beck
      第３部  demo ディレクトリの中の README
              ファイルの日付： Nov 21  1994
              作者          ： Andreas Beck

      作成日 ： 1997年11月15日
      翻訳者 ： 川岸 良治  <kawagisi@yk.rim.or.jp>

【訳注1】ファイルの入手と展開

このソフト(logiscan0.0.4) は下記から入手できます。

- ftp://tsx-11.mit.edu/pub/linux/ALPHA/scanner/

これをダウンロードしたら次のようにして `/usr/src/` ディレクトリに展開します。

      # cd  /usr/src
      # tar xvfz ~/logiscan-x.x.tar.gz

(上記は `logiscan-x.x.tar.gz` が、`~/` ディレクトリにある場合ですが、それ以外の 時はそのディレクトリに合わせて変えて下さい) `/usr/src/logiscan-x.x/` ディレクトリが作られ、 そこにファイルが展開されます。 `logiscan-0.0.4.tar.gz` には下記のようなドキュメントファイルが入っています。

        (1) README
        (2) README.ioctl (logi32.o によって提供される ioctl インタフェースを使う
                          アプリケーション開発者のガイドライン)
        (3) CHANGELOG    (変更履歴)
        (4) CREDITS      (このプログラムの作成に協力した人の一覧)
        (5) COPYING      (GNU GENERAL PUBLIC LICENSE  Version 2, June 1991)
        (6) demo ディレクトリの中の README

この文書 Scanner-HOWTO-logiscan は、上記のうち (1) (2) (6) を訳した ものです。 (3) (4) (5) は原文をご覧下さい。

【訳注2】最新版とメールアドレス

最新版は、logiscan0.0.5 で下記からダウンロードできます。

- http://sunserver1.rz.uni-duesseldorf.de/~becka

作者へのメールはアドレスが変更されていますので注意して下さい。

      (旧)  becka@hp.rz.uni-duesseldorf.de
      (新)  becka@sunserver1.rz.uni-duesseldorf.de

ここで訳した３つドキュメント自体は 0.0.4 と 0.0.5 で変更が無く、全く同じ のようです。作者のメールアドレスは、0.0.5 でも古いままなので要注意です。

## `README`

### Copyright

    Copyright (C) 1994  Andreas Beck <becka@hp.rz.uni-duesseldorf.de>
    【訳注】現在のアドレスは、becka@sunserver1.rz.uni-duesseldorf.de

このプログラムはフリーソフトウェアです。あなたは、これを Free Software Foundation が発行している GNU General Public License のライセンスのバージ ョン２、または(あなたのオプションで)それ以降の条件に従って再配布したり変 更することができます。

このプログラムは、役に立つことを期待して配布しています。しかし、いかなる 保証もありません。商品性や特定用途への適合性についての暗黙の保証すらあり ません。詳しくは、GNU の General Public License をご覧下さい。

あなたは、このプログラムと一緒に GNU General Public License のコピーを受 け取るべきです。そうでないならば、 Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA に手紙を書いて下さい。

### はじめに

Hi folks!

これは LOGITECH SCANMAN+ スキャナ用のドライバで、専用のインタフェース ボードを通してドライブされます。このスキャナにはいくつかのバージョンが ありますが、このドライバは少なくともそれらのいくつかをサポートします。

1. 古い Logitech Scanman : 200dpi 固定の白黒スキャナ (どなたかこれをお持ちですか？ これはディザ処理ができますか？ 今のところこれは解像度固定で Scanman32 として扱われます)

2. 少し新しい Logitech Scanman32 (aka Scanman+) : 白黒の 100〜400 dpi のスキャナで、 6x6 ディザ処理(解像度を 1/6 に下げて 37色にする)が可能。

3. Logitech Scanman256 :

   100〜400 dpi の グレイスケール・スキャナで、ディザ処理無しで 1bit(白黒２値), 4bit(16階調), 6bit(64階調), 8bit(256階調)の解像度が あります。 このタイプのスキャナには注意して下さい旭既に述べたようにこれにはいくつか のバージョンがあります(異なったハードウェアを使用しています)。 ある人が私にこの Rev-03 ボードの扱い方を教えてくれたので、この問題は 現在ではフィックスされていると思うのですが、もしかして他のものがあった としたら... 従ってドライバが "`incompatible scanner-interface` " と報告してきたら それは別の互換性の無いボードであるか、あるいはベース I／O アドレスの設定 が間違っています。このような時は、あなたのスキャナ・ソフトウェア・ディス クに入っている `HHSCAND.SYS` を私に送って下さい。

   ドライバは `insmod` を使ってロードする時にスキャナのタイプ を自動検出します。

   ドライバが "Unknown" とレポートするがスキャナは動作するという場合 (これは code-tweaking が必要ですが...)、あなたのハードウェアをどのようにして検出 するかを見つけるよう試して、どのような変更が必要かを私に教えて下さい。 私は、あなたのパッチを今後のリリースに入れるようにします。 全てを変更するようなパッチを私に送らないで下さい。即ち、私は現在のものから 本当に異なるものを扱うようなスキャナはサポートしません。

   このドライバはスキャナに付属の MS-LOSS 用スキャナドライバ 【訳注】 MS-LOSS というのは、タイプミスではないと思います。(^_^) を逆アセンブル して集めた情報を元にしています。これ以外の追加情報、要望、提案、バグ報告 があれば、遠慮無く私に言って下さい。(下記のバグ報告をご覧下さい) 私は特に、他のスキャナ・デバイスドライバを書く人からのフィードバックを 得ることに興味があります。

   私たちは Linux の全てのスキャナドライバに使われるインタフェースを一つに まとめることができるかもしれません。そうなれば多くの人達が書くであろう、 カラフルな X ベースのスキャナプログラムが、多くのスキャナでサポートされ 動作するようになるでしょう。

   私は既に M105 と A4-tech ドライバの作者とは連絡済みで、私たちはスキャナオ プション用の ioctl の"万能"セットの設定にトライしています。 あなたがこの作業に参加することに興味があるなら(あなたはこのような API の 経験があるかもしれない) README.ioctl を 読み、私(または Thomas または Michael 下記参照)に送って下さい。

   また、あなたが素敵なスキャナプログラムを書いたら私に送って下さい。

### インストールの方法

1. ドライバは、カーネル・ローダブル・モジュールなので、明らかに最初に するべきことは `modutils' パッケージを持っていない場合はこれを入手し インストールすることです。

2. `src` ディレクトリに移って `logi32.h` の先頭を見て下さい。 必要に応じて、またハードウェア設定に応じて定義を編集します。 IOBASE だけはディップスイッチの設定に合わせなければいけませんが、 IRQ と DMA はソフトウェアで選択可能です。 IRQ と DMA は他のハードウェアによって使われていないものを使って下さ い。(SoundBlaster がインストールされているなら DMA 1 は使われている と思います)

   設定できるものは IRQ が 2(9),3,4,5,7,9(2),11,12 で、DMA が 1 または 3 です。最新のカーネル(スタックドモジュールをサポートしている)と、 対応した modutils では、モジュールのロード時にこれらの値(と、メジ ャーデバイス番号。4)項参照 )を変更することができます。 これをどのようにするのかは、"`man insmod`" で 調べて下さい。 関係のある変数は `logi32.c` の先頭、または ドライバを常駐させた時に ksyms の出力の中で見つかります。

3. `scanner.h` をどこか適当な場所(`usr/local/include` がお勧め)に移して 下さい。`scanner.h` は あなたのシステム上で "ただ一つのバージョン" で提供されているのだということをよく覚えておいて下さい。 私は、ドライバがスキャナソフトウェアではない他の `scanner.h` とコンパイルされた時のトラブルを沢山聞いて います。

   PINT (UNIX 用の共通スキャナインタフェース。Copyright (C) 1994 Kenneth Stailey ken@spacenet.com)のサポート下でコンパイルしたいなら `Makefile` で `-D` に相当すること をイネーブルにし、<`scanio.h`> ファイル を他の適切な場所に移して下さい。(これは他のシステム上の `/usr/&lsqb;local&rsqb;/include/sys` にあるよう に見えるという点に注意して下さ い。だから、それをそこに置くというのは良い考えです)

   ドライバをコンパイルするには、

         make

   と入力して下さい。 モジュールを組み込むには、

         insmod logi32.o

   と入力して下さい。

   シンボルが無いとローダが文句を言ってきた時は、それらを `kernel/ksyms.c` に加えて下さい。 (または、もっと良いのは、そのドライバにとっては本当に古くさい カーネルをアップデートすることです...)

   `kernel/ksyms.c` を変更するべきだったなら、 カーネルを再コンパイル し、その変更を反映させるためにリブートする必要があります。

4. デバイスのスペシャルファイルを作成します。

         mknod -m 444 /dev/logiscan c 26 0

   `/dev/scan` にシンボルリンクを張ります。

         ln -s /dev/logiscan /dev/scan

   MAKEDEV の最新バージョンは、適切なデバイスを生成することもできる はずです。「MAKEDEV を使う前に」 `logi32.o` が ロードされていなければ ならないことに注意して下さい。 MAKEDEV は、logitech スキャナドライ バを検出し、そこに存在するメジャーデバイスを見つけるために `/proc/devices` の情報を使うからです。 さらに詳しいことは、関係するドキュメントをご覧下さい。

   #### (注)

   上記の `26' はメジャーデバイス番号です。 それが既に使われている場合(それをロードしようとする際、ド ライバは「cannot register major number：メジャー番号が登録 できません」と文句を言う)は、他の使われていない番号を選び `logi32.h' の LOGI32_SCANNER_MAJOR の定義をそれに変更して 下さい。

   新しいカーネルでは、メジャーを動的に割り付けることができます。 このようにしたい時は、定義を 0 に「セットして下さい。 但し、こうすると、ドライバをロードする度にメジャーが変わるの で、毎回デバイスのスペシャルファイルを作成する必要があるとい うことに注意して下さい。

5. ``logi32.o`' をカーネルモジュールをキープする ためのどこかにコピーして下さい。

6. 動作確認

   (s)vgalib が動作しているなら、 `./demo` ディレクトリの gifscan をビルドして下さい。svgalib が無いなら、このパッケージに入っ ているスクリプト scan.sh は不要です。 だれか、あなたのために小さなスキャンプログラムを作ってくれる いい人を見つけるまでは、`cat </dev/scan >` ファイルのようなやり 方で満足する他ありません。(または、GIF ファイルに "blind-scan" できるようにするために gifscan から全ての vga に関するものを 取り除く必要があります) pbm ファイルに直接スキャンしたものを格納する pbmscan という新 しいパッケージがあります。これは svgalib が不要で、GIF に書き 込むよりかなり高速です。 私は PINT インタフェース用に何があるか知りません。これを使った 良いアプリケーションを教えて下さい。 (可能なら)私のドライバで動くなら

### ロード時のパラメータの変更方法

新しい `modutils` (と スタックドモジュールサポート)で、 ロード時に下記のパラメ ータの値を与えることができます。従って設定を変えたい場合でも、ドライバを再 コンパイルする必要はありません。

"`insmod logi32.o LOGI_FOOBAR=%d`" でドライバをロード します。`%d` がパラメータ を設定するための値です。この機能に関するより詳しいことは `insmod` のドキュメントをご覧下さい。

使用できるパラメータは以下のとおりです。

      LOGI_DEBUG	これを 0 以外の値にして、デバッグモードでコンパイルすると、
                    ドライバはデバッグ情報を出力します。そうでないときはこの変数は
                    現れません。

      LOGI_MAJOR	メジャー番号。0 は「カーネルにフリーなものを選択させる」ことを
                    意味します。

      LOGI_IOBASE	スキャナのベースアドレスです。これは正しくなければなりません。
                    そうでないとドライバは初期化とボードの検出に失敗します。

      LOGI_IRQ	スキャナが使用する IRQ です。

      LOGI_DMA	DMA チャンネルです。

### プログラマのための注意事項

ドライバはスキャナとの通信のために DMA 転送とIRQを使用します。いずれのチャ ネルもソフトウェアで設定できます。(詳しくは logi32.h をご覧下さい) スキャナは１ラインスキャンする度に割り込み要求を発行するので、有効なデータを 得るために busy-wait 処理をする必要はありません。

ドライバは内部に(ダイナミックアロケートの)バッファをキープします。このバッフ ァのデフォルトのサイズは、50 スキャンライン分 (`logi32.h` を参照)ですが ioctl コールを通して調整可能です。(下記参照) `/dev/scan` を 使っているプロセスが現在 実行していてもいなくても、スキャナからのデータ転送はバッファがフルになるまで 有効であることに注意して下さい。これは、プロセスが停止したりスワップアウトし ても、バッファスペースがあるのでデータ抜けは無いということを意味します。

ドライバは、一回の `read(2)` コールで任意のバイト数を 読み込むことができるよう になっていますが、内部バッファは一回の read(2) コールでバッファにフィットし た以上のバイト数を要求した場合はうまくいかないという点に注意して下さい。 通常、b/w モードでスキャンする場合は一回に１スキャンライン分を読み込み、 ハーフトーンモードの場合はたぶん数スキャンライン分を読み込むでしょう。 read(2) コールがシグナルによって割り込まれると、read(2) は読み込んだバイト数 を返します。私はこれが EINTR の戻りの `標準的な' 振る舞いとは異なることを 知っていますが、スキャナではこの方法が理にかなっているのです。(別の方法では 内部バッファの既存のデータをいくらか失ってしまう) スキャナデバイス上で select(2) をすると、バッファの中に最低でも１スキャンラ インのデータがあれば、デバイスは `ready' として認識されます。しかしこれも 変更できます。(下記参照)

サポートされた ioctl 機能のために、 README.ioctl をお読み下さい。しかし、 ioctl インタフェースはまだ開発中であり、従って変更がありそうです。

### バグ報告の注意点

バグを経験されたら私に教えて下さい。あなたのバグ報告にはそれを再現する方法、 または少なくとも私が分かるように正確な状況を説明したものを添付して下さい。 メッセージの中のバグ結果、例えば

      general protection: xxxx
      EIP:    0010:xxxxxxxx
      EFLAGS: xxxxxxxx
      eax: xxxxxxxx   ebx: xxxxxxxx   ecx: xxxxxxxx   edx: xxxxxxxx
      esi: xxxxxxxx   edi: xxxxxxxx   ebp: xxxxxxxx
      ds: xxxx  es: xxxx  fs: xxxx  gs: xxxx
      Pid: xx, process nr: xx
      xx xx xx xx xx xx xx xx xx xx

が、画面あるいはシステムログにあれば、それを正確にコピーし、スキャナドライ バがロードされているロケーションと比較して、その範囲内かどうかを見て下さい。 これは `insmod` を実行すると表示されます。

      module `Logi32' (2 pages @ 0x0080c000) created
    			     ^^^^^^^^^^ 私が知りたいのはこれです...

これがその範囲内ではない(カーネルのどこか他の所)場合、`zSystem.map` で EIP の値 (`0010:'に続いたものではない) を捜し、`zSystem.map` の関係ある部分を含めて下さい。

もしそうならば '`nm -n logi32.o >logi32.map`' コマンドを使ってドライバのマップ を作り、あなたのレポートにこれを含めて下さい。 あなたのバグ報告に、これら２つの部分のどちらかが欠けているなら、私にとって意 味が無いということに注意して下さい。

### さらなるヘルプと情報

ドライバ用のメーリングリストがあり、そこには最新の情報ファイルがあります。

      >>>> info logiscan
      &lsqb;Last updated on: Wed Aug 10 10:41:58 1994&rsqb;
                                 LOGISCAN MILINGLIST
                             ~~~~~~~~~~~~~~~~~~~~~~~~~~~

#### !!! 重要な注意 !!!

このメーリングリストは、LOGITECH の公式なリストではありません !!!

     .---------------------------------------------------------------------------.
     |  このメーリングリストは、 Linux 用の Logitech スキャナドライバの開発者    |
     |  (主に Andreas Beck <becka@hp.rz.uni-duesseldorf.de>) とそのユーザ間の    |
     |  コミュニケーションを容易にするためにセットされています。                 |
     |  これは Andreas の、または その他の Linux 用の Logitech スキャナドライバ  |
     |  の新しいバージョンとパッチを配布するためにも使われています。             |
     |                                                                           |
     |  Linux ではない他のオペレーティングシステムで Logitech スキャナの問題が   |
     |  あるときはこのリストを購読しないで下さい。ここではヘルプを得られません   |
     `---------------------------------------------------------------------------'

リストを購読するには、メッセージボディに下記のように書いたメールを majordomo@venture.net に送って下さい。

      subscribe logiscan &lsqb;return mail address, optional&rsqb;

次に意見等は下記に送って下さい。

      logiscan@venture.net

購読をやめるときは、メッセージボディに下記のように書いたメールを majordomo@venture.net に送って下さい。

      unsubscribe logiscan

この情報のテキストを欲しいときは、下記のように書いたメールを majordomo@venture.net に送って下さい。

      info logiscan

      Bye, Andreas.

      Andreas Beck		becka@hp.rz.uni-duesseldorf.de
      Germany

【訳注】現在のアドレスは、becka@sunserver1.rz.uni-duesseldorf.de

      **************************************************************************
      M105 スキャナドライバを書き、かなりベースとなった
      Thomas Faehnle     Thomas.Faehnle@student.uni-ulm.de   に大変感謝します。
      **************************************************************************
      さらに、同じ ioctl インタフェースを使って A4Tech カラースキャナドライバを
      書いた Michael Beck       beck@hp832.informatik.hu-berlin.de にも。
      **************************************************************************
      さらに、同じ ioctl インタフェースを使って GS4500 スキャナドライバを書いた
      Jan Willamowius    jan@janhh.sh.sub.de  にも。
      **************************************************************************

## `README.ioctl`

### はじめに

Hi folks!

これは専用のインタフェースボードを通してドライブされる LOGITECH SCANMAN+ スキャナ用のドライバです。

これは `logi32.o` によって提供される ioctl インタフェース を使うアプリケーション開発者のガイドラインです。

どんな提案も歓迎します、そして私は他のスキャナ用デバイスドライバの作者からの フィードバックを、共通のインタフェースを作成することが出来るように、正当に評 価します。

私は今までに Kenneth Stailey ken@spacenet.com からフィードバックを受け取って います。彼は、私が将来オプションとしてサポートする予定の PINT と呼ばれる UNIX 用のスキャナインタフェースを既に持っています。

このパッケージの `pint` サブディレクトリにあるドキュメント を参照して下さい。 これはバージョン 0.0.3 なので、ここで述べた定義はドライバの開発に応じて頻繁 に変更されるかもしれないことに注意して下さい。

私はこれまでスキャナ、または同様のデバイスの ioctl インタフェースを設計した ことがないということを白状しなければなりません。そこで私のアプローチに何か 間違っている点が無いか、また、どうすればもっとよくなるかを教えて下さい。

また、あなたがこの ioctl API を使って素晴らしいスキャンニング・プログラムを 書かれたら、私に送って下さい。

### サポートされている ioctl 機能

以下に、サポートされている ioctl 機能を書きます。

      **********************************************************************
      #define HSIOCGSCC               0x73e8  /* Get Scanner Capabilities */
      **********************************************************************

(ioctls の MAGIC NUMBERS は、近い将来 ioctl の仕様がより安定になり"メジャー クリーンアップ"が起きた時に、変更されるだろうと思います) これはスキャナのシステム・コールの中で最も重要です。 というのは、スキャナにどのようにアクセスし、何がサポートされているのかという 必要な情報のほとんど全てを提供するからです。

この関数は下記の構造体を返します。

      struct scanner_capabilities {

              int o_scm_mono;	  /* Options for monochrome mode */
              int o_scm_grey;         /* Options for greyscale  mode */
              int o_scm_true;         /* Options for true-color mode */

              int o_xdpi;             /* Options for x resolution */
              int o_ydpi;             /* Options for y resolution */

              int o_bright;           /* Options for brightness */
              struct minmax bright;
              int o_contrast;         /* Options for contrast */
              struct minmax contrast;
              int o_hue;              /* Options for hue */
              struct minmax hue;
              int o_sat;              /* Options for saturation */
              struct minmax sat;

              int phys_width;         /* Width in mm */
              int phys_length;        /* Length in mm */

              int av_options;         /* Number of available Options (0-32) */

      };

頭に '`o_`' が付くフィールドは全て "オプション・フィールド" で下記のフラグと組み合わせることができます。(つまり、これはビットフィールド です)

      #define SCC_SOFTSELECT  0x0001  /* オプションをソフトウェアで選択可能 */
      #define SCC_SOFTDETECT  0x0002  /* オプションをソフトウェアで検出可能 */
      #define SCC_HARDSWITCH  0x0004  /* オプションはハードウェアスイッチ   */
                                      /* (ユーザの関与が必要) */
      #define SCC_EMULATE     0x0008  /* オプションはドライバでエミュレートされる */
      #define SCC_CANDO       0x000f  /* 上記の何かがセットされたらドライバが */
                                      /* サポートするオプション */

このオプションをどのように使うかの例を示します。

ハードウェアスイッチを使ってスキャナの dpi を選択できて、その設定をドライバ が読み込むことができるなら、このように書きます：

      SCC_SOFTDETECT|SCC_HARDSWITCH

スキャナが１つの dpi 設定に固定されているなら"ハードウェアスイッチ" はありま せんが、ふつうドライバは固定レートを "検出可能" であるというふりをします。 (しかしレートは固定なので本当に検出する必要はありません)：

      SCC_SOFTDETECT

スイッチで dpi 設定を選択できるが、ドライバがその設定を読み込む方法が無い (これは実際にはあるはずがないが、世の中には奇妙なハードウェアがあります) という場合は、SCC_HARDSWITCH をセットしなければなりません。

これのアプリケーションにとっての意味は

SCC_SOFTDETECT が指定されていない場合、パラメータの値を知らないのでない限り それを入力するよう促されるべきです。(私は SCC_SOFTSELECT が SCC_SOFTDETECT を 含まないというようなケースを想像できません...) そして値をドライバに教えるため に明示的に SMOD-call によってセットしなければなりません。

SCC_HARDSWITCH は、アプリケーションがユーザにハードウェアを正しく設定するよう に促す必要があることを意味するでしょう。(これが既に行われていることが分かって いる、例えば SOFTDETECT が処理した...場合を除く)

SCC_EMULATE オプションは、これが選択されたとき、ハードウェアが他のモードで あっても、またはこのモードをサポートしていなくてもドライバはこのモードをエミ ュレートするだろうということを意味します。 (例えば、全てのモノクロスキャナは通常、モノクロデータを全ての３ RGB 値に拡張 することによりトゥルーカラーモードをエミュレートします)

`phys_*` フィールドは、最大スキャンウィンドウの物理的サイズを mm で表します。

minmax-structs は、パラメータの範囲、下記のように 定義された構造体です。

      struct minmax {int min,max;};

av_options フィールドには、この特別なスキャナの 使用可能なオプションの番号が入ります。この値は、 0-32 (inclusive) の範囲で、 HSIOCGOPT コールからのデータの正確な変換が必要です。

      *********************************************************************
      #define HSIOCGOPT               0x73e7  /* Get option descriptions */
      *********************************************************************

このコールは、下記フォーマットの32までのオプションデスクリプタ(これは `av_options` エントリを予約するには十分でしょう)のフィールド を返します。

      struct scanner_option {int  options;    /* Option availability */
                              char name&lsqb;20&rsqb;;};

'オプション'フラグは上記の '`o_`'の値の一つとして(すなわち、 ハードウェアまたはソフトウェアによってオプションが選択されたら、そしてそれが ソフトで検出可能、あるいはドライバ機能がエミュレートするようなものならば) 扱われます。

オプションとして、ユーザがオプションを 選択／非選択／表示 するための オプション名を示すユーザダイアログを提案します。

これが出来ない、あるいはしたくない(例えば OCR のようなバックグランド処理)場合、 その名前からオプションの意味を引き出すようにするべきです。

互換性を保証するために、デバイスドライバの作成者は、何かの機能の名付けの彼らの アイデアを私に確認することが奨励されます。これは、同じオプションに対して複数の 名前を避けるために、そしてこの文書を私が更新することができるようにするため です。

現在、ドライバによって使われるオプションは１つだけあります。

      オプション: "Dithering"
      機能F     : dithered greyscale モードを on/off する
      ドライバ  : logi32.o
      作者      : becka@hp.rz.uni-duesseldorf.de

      **************************************************************
      #define HSIOCGSCT               0x73e9  /* Get Scanner Type */
      **************************************************************

このコールは、通常の ioctl インタフェースではアクセスできない特殊なスキャナの 特別の機能をアプリケーションが使えるようにするために、スキャナハードウェアを 識別します。 下記の構造体を返します。

      struct scanner_type {
        char manufacturer&lsqb;20&rsqb;,model&lsqb;20&rsqb;;
      };

      **********************************************************
      #define HSIOCGMOD               0x73ea  /* Get modeinfo */
      **********************************************************

このコールは、スキャナの現在のモード情報を得ます。

      struct modeinfo_struct {
        int xdpi,ydpi;                /* resolution */
        int sc_mode;
        int depth;                    /* number of different colors (-1) */
        int bpl;                      /* bytes per scanline */
        int left,right;               /* margins in Pixels */
        int top,bottom;               /* margins in Lines */
        int bright;                   /* brightness */
        int contrast;                 /* contrast */
        int hue;                      /* hue */
        int sat;                      /* saturation */
        int options;                  /* enabled options */
      };

sc_mode は、下記のいずれか一つの値をとります。

      #define SCM_UNKNOWN 0           /* Scanner modes : */
      #define SCM_MONO 1              /* 1 BitPerPixel   */
      #define SCM_GREY 2              /* 8 BitsPerPixel  */
      #define SCM_TRUE 3              /* 24 Bit RGB      */

０の場合、スキャナは未定義の状態です。(起きるべきではない) 新しいモードをセットすることもできますが、むしろアボートするべきです...。

スキャンモードは転送されたデータのフォーマットと異なります：

MONO モードはバイナリエンコードされた黒と白の値のビット列を送ります。 即ち、0x83 0x10 を読み込んだ場合、スキャナヘッドの下のパターンは、

      * . . . . . * *  . . . * . . . . ;

つまり、１バイトにつき常に８個のピクセル(画素)があり、一行には常に複数の ８ピクセルがあります。(これは左右を通して再現される筈です...)

グレーモードは、0〜255 までの範囲で測定された灰色の値のバイト列を送ります。 実際のデプスは、depth フィールドを使うことによって 見つけることができますが、たとえ depth が 0 (即ち、 スキャナが実際に黒白モードである)でも、1 ピクセルにつき常に 0 または 255 を 送ります。即ち、１ピクセルにつき１バイトなのです。

トゥルーモードは、バイトで RGB 値を送ります。従って、1 ピクセルに付き3バイト あります。実際のデプスの解像度は 0xrrggbb で、rr はスキャナが識別できる赤色の 番号です。 即ち、24ビットモデルだと 0xffffff とレポートするべきところを 4096色のスキャナ (4ビットの赤、緑、青)では 0x0f0f0f とレポートするわけです。

bpl は、read コールでアプリケーションに送られる bytes per line (1ラインあたりのバイト数) の数です。

Left, right, top, bottom は、マージンをセット します。

Bright, Contrast, Hue, Saturation は、画像のそれぞれの特性値です。

オプションは、選択されたオプションのビットフィールドとしてみなされます。

      **********************************************************
      #define HSIOCSMOD               0x73eb  /* Set modeinfo */
      **********************************************************

このコールは、スキャナモードをセットするために使います。 あなたが与えた構造体はスキャナまたはドライバが扱うことの出来る本当の値を反映 するために"変更される"という点に注意して下さい。

例えば、400dpi(X方向), 600dpi (y方向), フル・デプスで 24ビットモード、 マージンは 5-1003 (方向x),13-4000 (y方向) という条件でスキャンさせたい場合 下記のようにして SMOD をコールします。

      { 400,600,
        SCM_TRUE,
        0xffffff,
        0,/* bpl doesn't matter */
        5,1003,13,4000,
        ...
      }

スキャナが両方の軸で 300dpi しかサポートできない場合、ハードウェアスイッチを 経由して SCM_MONO にセットします。(そしてドライバはデータを変換できない &lsqb;!&rsqb;) ８の倍数で１０インチまでのページ長の水平方向の境界のみサポートし、 構造体は次のように変更されるでしょう。

      { 300,300,
        SCM_MONO,
        0,
        126,/* Bytes per line filled in */
        0,1008,13,3000
      }

ドライバは TRUE-MOD をエミュレートできる必要があるという点に注意して下さい。 怠けもののソフトウェアがそれをあてにするかもしれませんから...

      *************************************************************************
      #define HSIOCGREG               0x73ec  /* play with strange registers */
      #define HSIOCSREG               0x73ef
      *************************************************************************

これはドライバの開発に使用し、通常はユーザレベルのアプリケーションにはアクセ ス出来ません。このコールの機能は、スキャナからスキャナへ、あるいはドライバか らドライバへ、とは違います。

      *************************************************************************
      #define HSIOCGBUF               0x73f0  /* get/set current buffer size */
      #define HSIOCSBUF               0x73f1
      *************************************************************************

スキャンするラインの現在のバッファサイズを取得／設定します。

      *************************************************************************
      #define HSIOCSSTH               0x73f2  /* get/set select(2) threshold */
      #define HSIOCGSTH               0x73f3
      *************************************************************************

スレッシュホールドの選択値を取得／設定します。

      *********************************************************************
      #define HSIOCGSIB               0x73f4  /* get scanlines in buffer */
      *********************************************************************

これはスキャナの内部バッファの fill-gauge の一種として使われるでしょう。 これは典型的にはデータフローの量をユーザが制御するスキャナ(例えばハンドスキャ ナ)によって使われ、バッファが満杯になったときにユーザにもっと遅くスキャンする よう伝えることが出来るようにします。

Bye, Andreas.

### 付録

この仕様を使ったスキャナドライバの開発者

      Andreas Beck            becka@hp.rz.uni-duesseldorf.de          (logi32)
      【訳注】現在のアドレスは、becka@sunserver1.rz.uni-duesseldorf.de
      Thomas Faehnle          Thomas.Faehnle@student.uni-ulm.de       (m105)
      Jan Willamowius         jan@janhh.sh.sub.de                     (GS4500)
      Michael Beck            beck@hp832.informatik.hu-berlin.de      (A4Tec)
      Willem Dantum           willemd@knoware.nl                      (Genius B105G)

この仕様を利用できるスキャナプログラム

      gifscan :     Thomas Faehnle によってかかれ Andreas Beck によって変更された
                    オリジナルの svgalib ベースのデモアプリケーション
      pbmscan :     Andreas Matthias <andy@titan.central.de> によって書かれた
                    pbm ファイルにスキャン(結果を格納)するコマンドラインツール

## `demo/README`

LOGITECH SCANMAN 400 dpi ハンドヘルド・スキャナドライバ用の GIFSCAN version 0.0.3

### Copyright

    Copyright (C) 1994  Andreas Beck <becka@hp.rz.uni-duesseldorf.de>
    【訳注】現在のアドレスは、becka@sunserver1.rz.uni-duesseldorf.de

このプログラムはフリーソフトウェアです。あなたは、これを Free Software Foundation が発行している GNU General Public License のライセンスのバージ ョン２、または(あなたのオプションで)それ以降の条件に従って再配布したり変 更することができます。

このプログラムは、役に立つことを期待して配布しています。しかし、いかなる 保証もありません。商品性や特定用途への適合性についての暗黙の保証すらあり ません。詳しくは、GNU の General Public License をご覧下さい。

あなたは、このプログラムと一緒に GNU General Public License のコピーを受 け取るべきです。そうでないならば、 Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA に手紙を書いて下さい。

### デモプログラムについて

Hi folks!

これは LOGITECH SCANMAN+ スキャナ用ドライバのための小さなデモンストレーション プログラムです。

このプログラムの一部は、Thomas Faehnle <Thomas.Faehnle@student.uni-ulm.de> によって書かれたもので、私は彼の努力に感謝したいと思います。

私はオリジナルの 'scandemo' を LOGI32 ドライバ／スキャナの拡張された能力(スキャ ナの識別、SIB-ioctl,ディザ中間調)に合わせ、且つスキャンした画像を共通のフォーマ ットに格納するための信頼できる方法を提供するためにかなり変更しました。

scandemo のこのバージョンは gifscan にリネームし、このパッケージの早期バージョ ンで提供されていたスクリプトをすっかり置き換えました。

スクリプトは、スキャナが送っているライン幅を正しく決定するための可能性が 無いし、従って異なったスキャナや間違ったパラメータで使った時、間違った結果を 作るのでスクリプトは捨てました。

私は主に下記の理由から GIF フォーマット(これは (c) by Compuserve だと思う)を 選択しました。

- ほとんどのグラフィックスパッケージがこれを扱っている。

- 私は既に Gif への格納を扱う C のソース(Mess按OSから)を書いている

- 圧縮率が極めてよい

#### 【訳注】

Mess按OS というのは MS-DOS のことを茶化しているのです。

GIF 圧縮は遅く PBM フォーマットは記述するのが大変容易であることに気が付いている ので、私はその能力をも追加しました。申し訳ないけど誰がオリジナルの PPM (P4)コー ドを gifscan に追加したか思い出せません。(彼に感謝します) 私はそれを Greyscale (P5) 画像に書くための変更をしたところです。

プログラムをビルドするために "make" をします。 #include <scanner.h> は、スキャナドライバをコンパイルするために使われる ものと同じであることに注意して下さい。 このファイルは頻繁に変更されるので、常に最新版を /usr/local/include に入れる ようにして下さい。 ioctl インタフェースはまだまだ工事の最中ですから、古い gifscan のバイナリは これを新しいドライバと共に使うと通常はブレークします。

Logitech スキャナには黒白モードとグレースケールモードがあります。 これは不幸にもソフトウェアで検出不可能です。(それともだれかこの方法を知って ますか？)

そこで私は -g x というスイッチ(x はグレースケール・マトリクスのサイズ)を 追加しました。(未熟なオプション処理であることは分かっていますが、たった一つ のスイッチのために getopt をインクルードしたくなかったのです...)

      **************************************************************************
      現バージョンでもこのスイッチは使えますが、新しいスタイルのスキャナドライバ
      はオプションとしてディザを提供する(Logi32 は)筈なので、今後は使うべきでは
      ありません。
      **************************************************************************

黒白モードにはこれを１(デフォルト)に、グレースケールモードには６をセットし なければなりません。(これはスキャナ内部マトリクスのサイズなので) １から１６までの範囲の値は、他のスキャナでは有効かもしれませんが、LOGITECH では強いモアレ効果が出てしまいます。

#### 【訳注】

モアレ効果というのは、原画像には無い模様が発生する現象です。

今度サポートされた Scanman256 には真のグレースケールモードがあります。 そのモードの全て(黒白、4,6,8 bit)が、今サポートされるべきでした。

スキャン中は下記のキーが使えます。(ビジー待ちや、入力されるスキャンデータの 選択をしたくないのでキーは、スキャナが動くまでは認識されません)

      <Esc>,q,x,Q,X   : gifscan を終了します。
      i,I             : (I)nverse モードを切替えます。
      w,W             : スキャン速度ワーニングモードを切替えます。
                        (バッファが満杯に近くなると、画面が赤／紫になります)
      f               : GIF ファイルへの格納を開始します。
                        (何らかのキーを押すと停止します)
      p               : ppm ファイルへの格納を開始します。
      0-9             : オプション番号を切替えます。
      b/B,c/C,h/H,s/S : Brightness(輝度)、Contrast(コントラスト)、Hue(色調)、
                        Saturation(彩度)を調整します。
      'm'             : 強制的に SCM_MONO (モノクロモード)処理にします。
      'g'             : force SCM_GREY-operation
                        強制的に SCM_GREY (グレースケールモード)処理にします。
      'a'             : SCM (スキャナモード)の自動検出を許可します。

オプションは起動時に表示されます。これらのキーはファイルをスキャン(セーブ モード)中は無効であることに注意して下さい。これは、(読み取り幅や bpp のような) スキャン画像の基本パラメータを変更し、セーブするコードをあいまいにするかも しれないからです。(GIF では異なるライン幅を使うことはできません)

また、GIF 圧縮は能率的ですが遅く、特に 1ビット GIF でエンコードすると セーブモードを使った場合、スキャナをかなり遅く操作する必要があります。

このオプションはすぐに消え去るだろうから、だれも "bit-count-code" (私は以前の バージョンであるとほのめかした)を書き直す必要はありません。

Bye, Andreas.

### TODO

- やるべきこと：
- より良いユーザインタフェース、ファイルのネーミング、例えば ダイアログボックスとか...
- BTW (？)：
- svgalib グラフィックスを持っていない／欲しくない／必要でない人の ために PBMSCAN と呼ばれる新しいコマンドラインのスキャンツールがあります。

    Andreas Beck		becka@hp.rz.uni-duesseldorf.de
    Germany

【訳注】現在のアドレスは、becka@sunserver1.rz.uni-duesseldorf.de

      **************************************************************************
      Thomas Faehnle		Thomas.Faehnle@student.uni-ulm.de
      には深く感謝します。
      **************************************************************************

    =====================================================
     Ryoji Kawagishi   E-Mail: kawagisi@yk.rim.or.jp
                               KFA02544@niftyserve.or.jp
    =====================================================

(sgml conversion, y.senda, ysenda@pop01.odn.ne.jp, 2001/09)