[Subject Prev][Subject Next][Thread Prev][Thread Next][Subject Index][Thread Index]

[OSASK 2127] Re: BMPV02 Release



  こんにちは、川合です。


rakkyo さんは 2001/09/14 03:05:29 の「[OSASK 2119] BMPV02 Releas
e」で書きました:

>BMPV01を改良してみました。

  ありがとうございます。さっそくダウンロードして使ってみました。
またソースもみました。それで、気になる点が一つ見付かったので書い
ておきます。

  bmpv02.cの79〜80行目は.BMPファイルの8ドットアラインに対応する
ための処置で、変数tはスキップするバイト数を意味しているようです
。その計算部分を抜粋すると以下のようになります。

	t = (iX % 8) / 2;
	if(t & 1)t++;

  この式ですと、

  (iX % 8)の値とtの値の関係
    iX % 8 == 0   →   t = 0
    iX % 8 == 1   →   t = 0
    iX % 8 == 2   →   t = 2
    iX % 8 == 3   →   t = 2
    iX % 8 == 4   →   t = 2
    iX % 8 == 5   →   t = 2
    iX % 8 == 6   →   t = 4
    iX % 8 == 7   →   t = 4

ということになりますが、これは正しくないように思います。僕の想像
では、正しい関係は以下のようになるように思います。

  (iX % 8)の値とtの値の関係
    iX % 8 == 0   →   t = 0   /* アライン無し */
    iX % 8 == 1   →   t = 3   /* アラインは3バイト半 */
    iX % 8 == 2   →   t = 3   /* アラインは3バイト */
    iX % 8 == 3   →   t = 2   /* アラインは2バイト半 */
    iX % 8 == 4   →   t = 2   /* アラインは2バイト */
    iX % 8 == 5   →   t = 1   /* アラインは1バイト半 */
    iX % 8 == 6   →   t = 1   /* アラインは1バイト */
    iX % 8 == 7   →   t = 0   /* アラインは半バイト */

  そしてこの対応関係を計算するには、以下の式が有効ではないかと思
われます。

    t = (7 - (iX - 1) & 7) / 2;

  また84行目の

		if(i == 0)break;

は、常に成立しません。for文中のi > 0という条件に合致しないからで
す。したがってこの行を取り去った方がコンパクトになって速くなりま
す。

  ついでに、プログラムを隅々まで検討してみました。それで、もう一
つ気になる点を見つけました。

  関数openwin()の最初の行(119行目)

	win = lib_openwindow(AUTO_MALLOC, 0x0200, iX, iY);

はたいていの場合には問題がないですが、iXが136よりも小さい場合は
問題になります。理由は、introaのHELLOC4.TXTの64〜67行目を参照し
てください。・・・したがって、

    int ix = iX;
    if (ix < 136)
        ix = 136;
    win = lib_openwindow(AUTO_MALLOC, 0x0200, ix, iY);

などとした方がいいと思います。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
川合堂社長 / OSASK計画総指揮 / カーネル開発班
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/