15.LCDCで仮想2画面を作るレジスタ設定
2画面切り替えで違和感のない動画を表示したい。
仕様書を読んでいると LCDCのVRAMは 320x480のサイズがあると判明。じゃぁLCDに表示するRAMの開始アドレスを指定できれば、仮想2画面を作って裏画面に描画して切り替えできるんじゃないか?
仕様書のDisplay Data RAMの章を見るとVertical Scrolling Displayというのがある。VRAMの一部をスクロール表示する機能があるようだ。画面を3分割し、上部と下部を固定表示して中央部分がスクロール表示。
スクロール対象範囲を全部書き換える代わりに、スクロール表示位置を1行分ずらし最下行だけを書き換える機能。それに加え、画面上下に固定のメニューバーなどがある想定かと。
この機能とVRAMの一部分だけを表示するPartial Areaコマンドを組み合わせてイロイロ試してうまくいったパターンがこれ。
1. Vertical Scrolling Definition で上下の固定領域を0ライン, 可変領域を 480ライン
2. Vertical Scrolling Start Address に0または240を設定 (つまり480ラインの上半分と下半分をずらして表示。320x240が2画面に見える)
3. Partial Area で0~239ラインを設定 (240-479ラインを見えない裏画面にする)
jpegのデコードの際は
1. Page Address Set で0または240を指定して書き込む領域(表示してない領域)を選ぶ
2. jpegデコード
3. デコード後 Vertical Scrolling Start Address を変更する。
これで違和感のない画面切り替えができた。Framebufferに直接書き込んでいた場合は微妙に書き換えを感じたから、動画としての見栄えはよくなった。
ただ、Partial Area で表示部を制限してる部分は白が表示される。一方、表示領域よりjpeg 画像サイズが小さいときは余白が黒なので、額縁っぽい表示になる。
あ?余白を事前に白で埋めればいいのか?まぁ後でやろう。
それよりもデコードに 100ms かかるのを何とかしないと。。。core1 でデコードするしかないか。できるかなぁ。