[osask 6706] Jenny2.

  こんにちは、川合です。


I.Tak. さんは 2003/11/25 15:01:45 の「[OSASK 6696] jenny1.2」で
書きました:

>  winman0を賢くするとかそういう改造を施したOSASKが完成しました。
>ウィンドウを移動していても枠が重ならない限りは描画を止めません
>(移動させるウィンドウは止まりますが)。あとpioneer0のエラーメッ
>セージをかなり増やしました。既存のINT3はほぼ置き換えてあります。
>http://user.ecc.u-tokyo.ac.jp/~g240845/osask/
>
>  差分描画対応アプリを作るためにpioneer0のcmd03cを勝手に拡張し
>ました……大丈夫かな? pokon0がそのテストプログラムです。

  この辺の改造を取り入れたやつがやっとできました。Jenny2です。ベ
ータリリースしてあります。

  winmanの修正はほとんどそのまま採用していますが、cmd03cの拡張は
「いやそれならこっちのほうがいいよ」という方針を思いついたので、
そっちにしてあります。当然、改良pokonもそれに合うようにいじりま
した。

  さらにcmd058にオプション0x40??を追加し、グラフィックボックスを
指定してflushすることもできるようにしました。またcmd07cを追加し
て、l2d3やtek0を通常コマンドで展開できるようにしました。

>  グラフィック転送ルーチンもかなりのデキだと思います。まあ川合
>さんの好みに合うかどうかは分かりませんが, 高速イイ! と思う人は
>使ってやってください。それじゃ。

  これに関しては、時間がなくて十分には取り込めていません。たしか
vesa8のputboxの転送ルーチンはなるほどと思ったのでほぼそのまま入
れました(TOWNS版は時間がなくて手を加えていません。今後の課題で
す)。vgedrvに関しては「メモリに減色結果を展開してそこから転送す
る」というアルゴリズムに変えました。それなりには速くなっていると
思いますが、たぶんI.Tak.さんのルーチンよりは速くないだろうと思い
ます。

---

  さて、今回減色アルゴリズムを考え直すことにしました。というのは
こういう理由です。・・・とその前に、実物を見ないであれこれ議論し
ても机上の空論になりかねないので、たくさんの図を用意しました。こ
れを見ながら読んでください。

    http://hideyosi.zive.net/~k/je2_fig.lzh  (252KB)

  まず、test043aの減色を例にして、減色アルゴリズムを考察したいと
思います。ディレクトリs1_t043を見てください。

  最初の図(f1_t043)は、減色前のグラデーションパターンです。と
てもきれいです。これをJenny1の16色モードで減色したのが、f2_k4で
す。また8bitカラーモードで減色したのが、f3_k8です。

  これに対し、I.Tak.さんアルゴリズムのものがf4_itak4とf5_itak8
です。

  まず、8bitモード減色のほうから議論します。まずぱっとみると、k8
とitak8とでは、どこが違うでしょうか。はい、黒の部分の面積です。
k8のほうが黒の部分が多く、itak8は黒の部分が少ないです。全体的な
印象として、どちらがもとの絵(t043)に近いでしょうか。僕はitak8
のほうが近いと思います。

  黒の部分のバランスという観点では、16色モード減色でも同じ傾向が
見えます。itak4はもとの絵に近く、k4は黒が強いのです。

  これは次のようなアルゴリズムに起因します。k8では、RGBのそれぞ
れに4階調を持たせています。つまり2bitです。そして近い色をタイル
パターンで混ぜ合わせることによって、さらに2bitの表現力を持たせま
す。これで4bitのRGBが画面に反映できるので、合計12bit、つまり擬似
4096色ということになるわけです。

  しかしこれはちょっと問題があります。4bitの擬似階調ですが、実は
組み合わせは16通りではなく、13通りしかありません。

    15:ffのみ                      14:ffとaaの混在(75%-25%)
    13:ffとaaの混在(50%-50%)     12:ffとaaの混在(25%-75%)
    11:aaのみ                      10:aaと55の混在(75%-25%)
     9:aaと55の混在(50%-50%)      8:aaと55の混在(25%-75%)
     7:55のみ                       6:55と00の混在(75%-25%)
     5:55と00の混在(50%-50%)      4:55と00の混在(25%-75%)
     3:00のみ

  k8アルゴリズムでは、残りの2、1、0についても00のみにすることに
しました(これより暗い色がないのでしょうがない)。それで結果的に
黒の部分が広くなっています。

  k4でも同様に考えて、1bitにタイリングで2bitを加えるのですが、8
通りの組み合わせはなく結局5通りなので、黒の部分にしわ寄せしてい
ます。

  次に、itak8を見てみます。itak8では、与えられた4階調が、00、55
、aa、ffであるというところから発想がスタートです。まず、

    00 -> 00のみ
    55 -> 55のみ
    aa -> aaのみ
    ff -> ffのみ

に割り振ろうと考えます。そしてこの00〜55を次のように分割しようと
考えます。

    2a(00と55の中間) -> 00と55の混在(50%-50%)
    15(00と2aの中間) -> 00と55の混在(75%-25%)

これで、

    00 -> 00のみ
    15 -> 00と55の混在(75%-25%)

というのが決まります。そして、この間の01-14については、真ん中の
0aで分けて、

    00-0a -> 00のみ
    0b-15 -> 00と55の混在(75%-25%)

という風にするわけです。同じ事を全部の区間でやっていくと、

    00-0a -> 00のみ
    0b-15 -> 00と55の混在(75%-25%)
    16-1f -> 00と55の混在(75%-25%)
    20-2a -> 00と55の混在(50%-50%)
    2b-35 -> 00と55の混在(50%-50%)
    36-3f -> 00と55の混在(25%-75%)
    40-4a -> 00と55の混在(25%-75%)
    4b-55 -> 55のみ
        (以下略)

というふうになります。こうしてみると、00のみに変換される領域は
00と55の混在(75%-25%)に変換される領域の半分しかありません。こ
れは、ffのみに変換される領域にもいえます。

  以上を把握した上でitak8の結果を見ると、なるほど、右端と下端の
色の領域は他よりも細いです。つまり、「00のみ」「ffのみ」が出てく
る機会が少ないわけです。

  僕はこのアルゴリズムは数学的に美しいと思いますが、嫌いです。と
いうのは、4階調が00、55、aa、ffに割り当てられているということに
強く依存しているからです。もし僕が、00、40、80、c0に割り振ったら
どうだったでしょうか?3f、7f、bf、ffに割り振ったらどうだったでし
ょうか?どちらもぎりぎりまで有力な候補だったのです(結局今の割り
振りが一番見栄えが良さそうだということで採用しています)。

  僕としては、どんな風に階調が割り振られていようとも、とにかく常
に同じ変換アルゴリズムに帰着するような、単純なものが好きです。k8
は、まさにそういうアルゴリズムで、00、55、aa、ffという4段階があ
るということだけに着目し、個々の値をアルゴリズムの出発点に組み入
れていません。

  k4では00とffしか使えないものとして8色のみを使って減色していま
すが、itak4では、緑や黄色や赤に限れば、84という階調が利用できる
という所に目を付けて、階調を増やしています。この努力を僕は大変高
く買っていますが、しかし好きにはなれません。こういう特殊な事情を
前提にしたものはよろしくないと思うのです。

  以上をまとめると、itak4やitak8は、僕の好みによらず、客観的に見
てk4やk8よりももとの絵に近いということです。k4やk8はどうも暗い部
分が暗くなりすぎです。

  で、Jenny2にそのままitak4やitak8を入れればとりあえずこの問題は
解決だったのですが、さらに上を目指すことにしました。この上なく単
純なアルゴリズムに挑戦です。この結果が、f6_n4とf7_n8です。

  n8アルゴリズムは、非常に単純です。13種類しか組み合わせがないの
ならその13種類だけでやって行こう、と考えます。ということで00-ff
を単純に13等分して割り振ります。n4も全く同じで、5等分します。

  k8とitak8とn8とを比べると、やはりまずk8はもとの絵との違いが大
きすぎるので、ビリです。そしてitak8とn8ですが、なんというか、あ
まり違うようには見えません。どっちでもいいかなという気はします。
しかし、n8では「00のみ」や「ffのみ」が出てくるチャンスがitak8よ
りも多い(約2倍)あるのです。つまり、黒はより黒く、白はより白く
ということになるでしょう。僕はそういうほうがメリハリがあって好き
です(n8にメリハリがあるというよりも、n8は普通で、itak8がメリハ
リを損なっている、と考えていますが)。アルゴリズムの単純さも気に
入っていますが、そこからもたらされる結果にも満足しています。

  次に、k4とitak4とn4の比較です。まず、n4の結果の美しいこと!こ
ういう単純なのが僕は好きなのです。暗部の表現力ではitak4にはかな
いませんが、黄色の処理は、n4のほうがもとの絵に似ていると思います
。itak4はいろいろ工夫をしていますが、それがかえって裏目に出てい
る気がします。n4を見てしまうと、k4がしょぼかったということがよく
わかります。

  さて今度はs2_fujiを見てください。

  これでk8、itak8、n8を比較してみようと思います。まずk8は暗すぎ
ます。他の変換結果と比べると、やはりこれは駄目な気がします。また
itak8とn8とを比べると、雲の白さと富士山の雪の白さのところで違い
が出ています。どっちが好ましいかは見る人や、サンプル画像によって
変わってくるのでこの辺は何ともいえませんが、itak8では真っ白や真
っ黒が出にくいという傾向は確かにあるといえるでしょう。

  次に、k4、itak4、n4の比較です。まず、k4は暗いです。そしてn4は
元の絵よりも明るくなってしまったように見えます。そしてitak4はさ
らに明るくなった上に、空の色のカラーバランスが何か変です(比較の
ためにn8も併せてみるともっと分かりやすいと思います)。

  itak4では、下の草の色の変換は非常にうまいです。これは、暗部の
パレットを使った効果といえるでしょう。しかし、それが空ではうまく
いかず、全体的に白っぽくなり、花の色もなんか違います。僕にはn4が
一番好ましく、その次がk4で、最後がitak4だと感じます。

---

  このn4、n8アルゴリズムはjenny2aに入っています。TOWNS版やNEC98
版には入っていません。時間ができたら少しずついれていきます。

  12/3にはsrc43aとディスクイメージ版ベータを出して、12/9に一般公
開を予定しています。


  それでは。

--
    川合 秀実(KAWAI Hidemi)
OSASK計画代表 / システム設計開発担当
E-mail:kawai !Atmark! imasy.org
Homepage http://www.imasy.org/~kawai/



ML番号でジャンプ
ML単語検索