![見出し画像](https://assets.st-note.com/production/uploads/images/149928093/rectangle_large_type_2_3259ade221fb9ef1df6d5c100cdaecf8.png?width=1200)
面で画を描く - ラスターオペレーション
コンピュータが扱える画像の情報が多くなってくると、もう点や線ではなく、予め用意されたひと塊の画像をアレコレするほうが便利になってきました。基本的には今でも前者がベクトル画像で後者がビットマップ画像と別のレイヤの話ではあるのですが、徐々にビットマップ画像で画面を作ることが主流になっていきました。
パソコンの場合、BASICの命令にGET@ PUT@が登場します。GET@を使って描画済みの画面のデータを配列変数に取り込み、これを使ってPUT@で他の場所に同じものを描くことができるわけです(領域のコピペですね)。
GET@(X1,Y1)-(X2,Y2),配列変数名
PUT@(X1,Y1)-(X2,Y2),配列変数名[,演算]
配列変数は整数型を指定します。演算のところにXORとかすれば既にある画面と配列に格納されたデータで排他的論理和された結果の画面になります。
なんとN-BASIC時代からあるんですね。BASICによって色をどう扱うかにも違いがあり、必要な配列の大きさの計算もちょっと面倒なのですが、一度、この形式のデータに変換してしまえばディスクから読み込んだりREAD DATAを使って用意した画面をいくつでもペタペタと貼り込むように出せるのですから、なかなか便利なものでした。
このように点と線を組み合わせてグラフィック画面を作るのではなく、あらかじめ用意した面を使って画面を作るのが主流になっていきました。この方がいちいち数学的な計算をする必要もなく、結局のところメモリからメモリへのデータの転送に過ぎないので、パフォーマンスが段違いなのですよね。
格子状に並んだピクセル(画素)の集合体で表現することをラスターと呼び、ラスターで表現した画像のことをラスターイメージやラスターグラフィックスと言うこともあります。そして領域と領域の演算をドット単位で行うことをラスターオペレーション(Rop)と呼び、これをいかに効率よく行うかが追求されるようになりました。(これに対し、線で構成されたオブジェクトの集合体をベクトル、ベクトルで表現したグラフィックスをベクターグラフィックスと呼びます)
Bit Block Transfer
Bit blit
ラスタオペレーション
Ropも当初はすべてソフトでゴリゴリと行っていたのですが、スプライトと呼ばれるハードウェアが導入され、メモリにあるデータを読み書きしなくても画面上でRopを行ってくれるようにもなり、遅いCPUでもリアルタイムで画面を合成してくれるようになりました。その後GUIの時代になりグラボと呼ばれるハードウェアが使われるようになると、Ropはボード側の処理となり、CPUからは指示を出すだけで実行してくれるように成ります。
WindowsなどのGUIを搭載しているOSにおいては、いわゆるグラフィック処理以前にウィンドウ自身の描画やアイコンの表現は、これらRopを基本としており、OSのAPIも基本的な操作として用意され、当たり前のようにこれらの処理が行われています。
BitBlt
三項ラスター演算
言ってみればBASIC時代にPUT@のデータをゴリゴリと用意していたのが、リソースファイルという形で用意するようになり、それを使って画面を作っていくようになったわけです。Ropで大事なのは目的の領域が長方形であれば簡単なのですが、不定形領域を対象とする場合、上手にRopを行うことで、既に描かれた画面を活かして周囲のデータをマスクして影響を与えなくしたりします。他にも二重に描画して強調したり、色だけ薄くして選択中を示したり、これらの操作をRopだけで済ますことでレスポンスの良いGUIが作られているのですね。
ヘッダ画像は、以下のものを使わせていただきました。
https://commons.wikimedia.org/wiki/File:XBlit_final.png
By farcical+zorakoid - I derived this work from PD image, Public Domain, https://commons.wikimedia.org/w/index.php?curid=82986964
この記事が気に入ったらサポートをしてみませんか?