以下、本発明の実施の形態を図面に基づいて説明する。
<ハードウェアの説明>
図1に、本発明の各実施形態を適用可能な表示制御装置の一例として、デジタルカメラ100の構成を示す。図1(a)はデジタルカメラの構成例を示すブロック図、図1(b)は外観図である。
図1において、内部バス111に対してCPU101、不揮発性メモリ102、メモリ103、表示制御部104、入力部105、ドライブ装置106、通信I/F107、画像処理部121、撮像部122が接続される。内部バス111に接続される各部は、内部バス111を介して互いにデータのやりとりを行うことができるようにされている。
不揮発性メモリ102は、CPU101が動作するための定数や各種プログラムなどが格納される。メモリ103は、例えばRAMからなる。CPU101は、例えば不揮発性メモリ102に格納されるプログラムに従い、メモリ103をワークメモリとして用いて、このデジタルカメラ100の各部を制御する。入力部105は、ユーザー操作を受け付け、操作に応じた制御信号を生成し、CPU101に供給する。入力部105は、ユーザー操作を受け付ける操作部材として、ボタン(十字に配置された方向ボタン105−1を含む)、回転ホイール105−2、ポインティングデバイスとしてのタッチパネル105−3などを有する。なお、タッチパネルは、例えば平面的に構成された入力部に対して接触された位置に応じた座標情報が出力されるようにした入力デバイスである。ポインティングデバイスとしてはタッチパネルの変わりにマウスやトラックボールを用いることとしてもよい。CPU101は、入力デバイスに対してなされたユーザー操作に応じて入力部105で生成され供給される制御信号に基づき、プログラムに従いこのデジタルカメラ100の各部を制御する。これにより、デジタルカメラ100に対し、ユーザー操作に応じた動作を行わせることができる。
入力部105としてタッチパネルを用いる場合、入力部105とディスプレイ110とを一体的に構成することができる。例えば、タッチパネルを光の透過率がディスプレイ110の表示を妨げないように構成し、ディスプレイ110の表示面の上層に取り付ける。そして、タッチパネルにおける入力座標と、ディスプレイ110上の表示座標とを対応付ける。これにより、恰もユーザーがディスプレイ110上に表示された画面を直接的に操作可能であるかのようなGUI(Graphical User Interface)を構成することができる。
表示制御部104は、ディスプレイ110に対して画像を表示させるための表示信号を出力する。例えば、表示制御部104に対して、CPU101がプログラムに従い生成した表示制御信号が供給される。表示制御部104は、この表示制御信号に基づき表示信号を生成してディスプレイ110に対して出力する。例えば、表示制御部104は、CPU101が生成する表示制御信号に基づき、GUIを構成するGUI画面をディスプレイ110に対して表示させる。
ドライブ装置106は、メモリーカード等の外部記憶媒体108が装着可能とされ、CPU101の制御に基づき、装着された外部記憶媒体108からのデータの読み出しや、当該外部記憶媒体108に対するデータの書き込みを行う。なお、ドライブ装置106が装着可能な外部記憶媒体108は、メモリーカードのような半導体メモリに限らず、CDやDVD、ハードディスクといったディスク記録媒体をドライブ装置106に装着するものとしてもよい。202は外部記憶媒体108を格納するスロットの蓋である。通信インターフェイス(I/F)107は、CPU101の制御に基づき、LANやインターネットといったネットワーク120に対する通信を行う。図1(b)には有線の例を図示しているが、無線通信であっても良い。
撮像部122は、フォーカスレンズを含む撮影レンズ、絞り機能を備えるシャッター、光学像を電気信号に変換するCCDやCMOS素子等の撮像素子、A/D変換器等で構成される。画像処理部121は、撮像部からの画像データ、又は、外部記憶媒体108等から読み込んだ画像データに対し、デコード、エンコード、所定の画素補間、拡大や縮小といったリサイズ処理や色変換処理を行う。
<動作説明>
以下、図2〜図4を参照して、本実施形態の動作を模式的に説明する。
本実施形態では、ディスプレイ110に複数の画像をインデックス表示して上下方向にスクロールを行う際に、新たに表示される画像のうち、スクロール前に表示されていた画像から遠い位置に配置される画像の表示処理を優先して行う例を説明する。本実施形態におけるインデックス表示では、複数の画像を行列に並べて配置するものとする。インデックス表示中での画像の配置される位置は、ある行の左端から右端、続いて次の行の左端から右端という順に、画像ファイル名順、画像番号順、撮影日時順等の所定の順序で配置されるものとする。すべての画像を1画面に表示しきれない場合は、画面をスクロールすることによって更に前、あるいは更に後の行に配置される画像を表示することができる。なお、本発明においては、画像の配置順(並び順)は、後述するとおり、時間的な表示順番とは必ずしも一致しない。
まず、表示用VRAM(表示用メモリ)とバッファメモリについて説明する。メモリ103は、表示用VRAM領域とバッファメモリ領域を有している。ディスプレイ110に画像を表示する際には、外部記憶媒体108等から表示すべき画像を読み込み、画像処理部121で画像のデコード(圧縮されている場合は解凍処理を含む)、表示用サイズへのリサイズを行い、バッファメモリに展開(格納)する。以下、これらの処理のうち少なくとも1つの処理を総称して表示準備処理と称する。バッファメモリに展開された画像のうち、ディスプレイ110に表示する画像を含む1画面分の表示データが表示用VRAMにコピーして格納される。表示用VRAMに格納された表示データは、表示制御部104を介してディスプレイ110に表示される。
図2に、インデックス表示においてスクロールを行った場合の表示用VRAMとバッファメモリの関係の模式図を示す。図2(a)は、スクロールする前の静止した状態の表示用VRAMとバッファメモリの状態を図示したものである。本実施形態では、インデックス表示の際には、1画面に6行7列の42枚の画像が表示されるものとする。なお、以下では、Y行目のX列目に表示される画像を便宜的に画像Y:Xと表記する。この場合、図2(a)に示すように、バッファメモリには、1画面分で表示される画像(表示用VRAMに格納される画像)よりも前後1行分多い、0列目1行目の画像(画像0:1)〜7列目7行目の画像(画像7:7)の56枚の画像が格納される。また、図2(a)に示すように、表示用VRAMには、バッファメモリに格納された画像のうち、1画面に表示する分の画像1:1〜画像6:7の42枚の画像がコピーされる。表示用VRAMにコピーされた画像は、図2の表示用VRAMに図示したとおりに、ディスプレイ110に表示される。なお、図示した表示用VRAMの画像に加えて他のアイコンや情報表示等と重畳して表示してもよい。
図2(b)に、図2(a)の状態から、下から上にスクロールした際の表示用VRAMとバッファメモリの状態を図示する。図2(b)における表示用VRAM(すなわち、ディスプレイ110での表示内容)では、図2(a)に比べてすべての画像が下から上に移動している。以下では、この場合のスクロール方向を上と表記する(すなわち、スクロールにおける画像の移動方向をスクロール方向とする。)。図2(b)では、スクロール前の1行目の画像が一部表示されており、スクロールの移動量は1行未満である。このようにスクロール量がバッファメモリに余分に用意した行数(本実施の形態では前後1行)未満である場合は、バッファメモリは更新せず、バッファメモリから表示用VRAMにコピーする領域の位置をずらすことで、表示位置の移動を実現する。図2(b)に破線で示したコピー範囲は、図2(a)に示すスクロール前のコピー範囲(破線の範囲)より、表示画像が上に移動した分だけ下に移動している。
図2(c)に、図2(a)の状態から図2(b)の状態を経て、ちょうど1行分上にスクロールした際の表示用VRAMとバッファメモリの状態を示す。図2(b)の状態からさらに上方向へのスクロールが進み、表示用VRAMへのコピー範囲(ディスプレイ110に表示される範囲)がちょうど2行目から7行目までとなると、さらにスクロールが進めばもう1行先の8行目の画像を表示しなければならない。そのため、この時点でバッファメモリの画像を1行繰り下げるように更新し、今まで0行目を格納していた領域は1行目の画像で上書きし、1行目〜8行目の画像を格納する。8行目の画像は今までバッファメモリには格納されていなかった画像であるため、外部記憶媒体108等から読み込み、画像処理部121で圧縮画像のデコード、表示用サイズへのリサイズ等の表示準備処理が必要である。そのため即時にバッファメモリに格納されるわけではなく、表示準備処理にかかる時間だけ遅れて格納される。図2(c)のバッファメモリでは、スクロールが丁度1行分進んだ瞬間の状態を表しているため、まだ8行目の画像8:1〜画像8:7が格納されていない状態を示している。以下、バッファメモリに黒塗りで示した箇所は、格納される予定の画像がまだ格納されていない状態であることを示すものとする。
図3(a)に、図2(a)〜(c)の状態を経て更に上にスクロールした際の表示用VRAMとバッファメモリの状態を示す。図2(a)のスクロール開始前の1行目から数えて8行目の画像にまで表示用VRAMへのコピー範囲が及んで、図中に破線で示したコピー範囲が2行目の終わり〜8行目の途中となっている。しかし、8行目の画像8:1〜画像8:5の表示準備処理が終わるよりも早くスクロールが進んだために、表示用VRAMには画像8:1〜画像8:5がコピーされていない。従ってこの状態ではディスプレイ110には画像8:1〜8:5は表示されない。なお、本実施形態では、同一行内ではスクロール前に表示されていた画像から画像の配置順が遠い画像から先に表示準備処理が行われるものとする。従ってここで説明している図3(a)では、図2(a)で表示されていた画像1:1〜画像6:7から画像の配置順が画像8:1よりも遠い、画像8:7から降順に表示準備処理が行われる。
図3(b)に、図2(a)〜(c)、図3(a)の状態を経て更に上にスクロールした際の表示用VRAMとバッファメモリの状態を示す。図2(a)のスクロール開始前の1行目から数えて9行目の画像にまで表示用VRAMへのコピー範囲が及んで、図中に破線で示したコピー範囲が3行目の途中〜9行目の途中となっている。しかし、8行目の画像8:1〜画像8:5、9行目の画像9:1〜画像9:6の表示準備処理が終わるよりも速くスクロールが進んだために、表示用VRAMには画像8:1〜画像8:5と画像9:1〜画像9:6がコピーされていない。このように、本実施形態では、同一行内の全ての画像の表示準備処理が終了するより前にスクロールが先に進んだ場合は、新たに表示される行の画像の表示準備処理を、前の行でまだ表示準備処理の済んでいない画像よりも優先して先に行う。図示の例では8行目内の全ての画像の表示準備処理が終了する前にスクロールが進んだ場合は、新たに表示される9行目の画像の表示準備処理を8行目でまだ表示準備処理の済んでいない画像よりも優先して先に行う。このようにすることで、スクロールの速さに対して表示準備処理が追いつかないことで1行分全く画像が表示されなくなる可能性を低減し、スクロールがどの行まで進んだかを識別しやすいようにしている。
図3(c)に、図2(a)〜(c)、図3(a)、(b)の状態を経て更に上にスクロールした際の表示用VRAMとバッファメモリの状態を示す。図2(a)のスクロール開始前の1行目から数えて11行目の画像にまで表示用VRAMへのコピー範囲が及んで、図中に破線で示したコピー範囲が5行目と6行目の境目〜11行目の途中となっている。この例では、8行目の画像8:1〜画像8:5、9行目の画像9:1〜9:6、更に10行目で1枚分の画像の表示準備処理が終わるよりも速くスクロールが進み、11行目に達している。この場合、1枚も表示準備処理が終了していない10行目よりも、新たに表示対象となった11行目の画像の表示準備処理を優先し、画像11:7の表示準備処理を行っている。このように、本実施の形態では、スクロール前に表示されていた画像に配置順が近い画像(図で例えば10行目の画像)よりも、スクロールによって新たに表示されることになった画像(図では11行目の画像)の表示準備処理を時間的に先に行う。言い換えると、スクロール方向(スクロールにおいて画像が移動する方向)と逆側に配置される画像の表示準備処理を、スクロール方向側に配置される画像よりも時間的に先に行う。スクロール方向と逆側とは、さらに言い換えればスクロールで画像が移動する方向に対して上流側である。一旦表示準備処理を終えてバッファメモリに格納された画像は、スクロールが行われても、少なくとも表示用VRAMへのコピー範囲にあるうちはバッファメモリに格納され続ける。そして、同一の時点でスクロール方向と逆側寄り(画像の移動方向と逆側。上流側。)に配置される画像よりもスクロール方向寄り(画像の移動方向側。下流側。)に配置される画像の方が、スクロールによる移動によって早く表示対象ではなくなる。ここで表示対象でなくなるとは、表示用VRAMへのコピー範囲に含まれなくなることである。すなわち、同一の時点でバッファメモリに格納されている画像の中では、スクロール方向と最も逆側寄り(最も上流側)の行に配置されている画像が、表示対象である期間が最も長い。従って表示対象であるうちに(表示用VRAMへのコピー範囲に含まれているうちに)表示準備処理が終了する可能性が最も高い。逆に言うと、表示準備処理を始めたものの、その処理が終了する前に表示用VRAMへのコピー範囲に含まれなくなり、ディスプレイ110に表示されずにスクロールが先に進んでしまうといったことが起こる可能性が最も低い。このように本実施の形態では、表示用VRAMへのコピー範囲に含まれる画像で表示準備処理が済んでいない画像のうち、スクロール方向と最も逆側寄り(画像の移動方向と最も逆側。最上流側。)の行に配置される画像を他の画像に比べて優先的に処理する。これによって、スクロール速度が上がっても1画面に1枚も画像が表示されていないという状況になる可能性を低減することができる。
なお、図2、図3では上方向にスクロールした例を説明したが、下方向にスクロールすることも可能であることはいうまでもない。図4に、下方向にスクロールした際の表示用VRAMとバッファメモリの関係の模式図を示す。
<処理手順>
次に、上述した動作を実現する処理の手順を、図5〜図8のフローチャートを用いて詳細に説明する。図5〜図8のフローチャートは、CPU101が不揮発性メモリ102に記録されたプログラムをメモリ103のワークメモリ領域に展開して実行し、デジタルカメラ100の各部を制御することで実現する。
まず、図5〜図8のフローチャートの説明に用いる用語の意味を記す。
表示順:表示準備処理を施す時間的な優先順序を、ディスプレイ110に表示される行列の上の行から下の行という順序にするか、下の行から上の行という順序にするかを示す変数。スクロールの方向によって変わる変数であり、メモリ103に記憶される。
処理対象行(処理対象列):ある時点において表示準備処理を施してバッファメモリに追加すべき画像の配置位置の行(列)を示す変数。画像の配置は画像ファイル名やファイル番号、撮影日時等の情報によって一意に定まっているので、インデックス表示における配置位置がわかれば画像の配置順と照らし合わせることで一意に画像を特定できる。メモリ103に記憶される。
行Offset:スクロールを1行単位よりも細かい滑らかなアニメーションとするため、バッファメモリから表示用RAMへコピーする範囲を1行以下でずらす位置を示すための変数(整数値)。メモリ103に記憶される。
行Offsetの規定値:丁度1行分のスクロールを行う間にアニメーションのために表示を更新する回数を示す定数。言い換えると、丁度1行分ずらした際の行Offsetの値を示す定数。不揮発性メモリ102に予め記憶されている。この行Offsetの規定値が大きければアニメーションはより細くなり、規定値が小さければアニメーションはより粗くなる。以下の式を満たす。
[アニメーションにおける1回の表示更新での表示画像の表示画面上での移動量]=[1行分表示するのに必要な表示用VRAM及びバッファメモリの縦方向ライン数]/[行Offsetの規定値]
スクロールカウンター:ある時点において更にスクロールすべき行数を示す変数。画面のスクロールを指示するユーザーからの操作に応じて加算あるいは減算される。実際にスクロールが行われるとスクロールされた行数分を加算または減算する。
アニメーションタイマー:スクロールにおいて表示を1回更新するまでの周期をカウントするタイマー。一般的にはこの逆数を以てフレームレートを表す。この値が小さくなる程アニメーションのフレームレートは上がるが、システムの負荷も高くなる(この周期は定数。数10msec程度)。
<インデックス表示処理(図5)>
図5は、インデックス表示の全体フローチャートである。ユーザーの操作などに基づいて、画像を表示するモードがインデックス表示モードに切り替えられると、インデックス表示を開始する。
S501ではまず、CPU101は変数を初期化し、表示順=上から下へ、処理対象行=表示用VRAMへのコピー範囲のうちの上端、処理対象列=同一行内での左端、行Offset=0にセットし、メモリ103に記憶する。
S502では、CPU101はインデックス表示を終了するか否かを判定する。デジタルカメラ100の電源が切られたり、インデックス表示以外の他のモードに切り替える操作などを受け付けるとインデックス表示を終了すると判定され、インデックス表示を終了して図5の処理を終了する。特にインデックス表示を終了すべき指示を受け付けていない場合、インデックス表示を終了しないと判定してS503へ進む。
S503では、CPU101はスクロール制御処理を行う。この処理の詳細は図6、図7を用いて後述する。この処理には、スクロールすべき行数を決める処理、画像の表示順を決める処理、実際にスクロールを行う処理、スクロールの進み具合と表示準備処理の進み具合とから処理対象行(列)を決める処理等が含まれる。
S504では、CPU101は現在表示対象となっている1画面に含まれる画像を全て表示したか否かを判定する。これはすなわち、表示用VRAMにコピーすべき全ての画像の表示準備処理が終了したか否かの判定である。全て表示したと判定した場合はS502に処理を戻し、全て表示していないと判定した場合はS505へ進む。
S505では、CPU101は表示準備処理を開始していた画像の表示準備処理が終了したか否かを判定する。表示準備処理が終了していないと判定した場合はS502に処理を戻し、表示準備処理が終了したと判定した場合はS506へ進む。
S506では、CPU101は表示準備処理が終了した画像をバッファメモリに追加する。これにより、後述する図7のS708、S709で表示用VRAMを更新した際にディスプレイ110に新たな画像が表示される。なお、スクロールが停止してアニメーションタイマーが稼動しなくなった場合は、未格納だった画像の表示準備処理が終了してバッファメモリに追加される度、アニメーションタイマーに関わらずバッファメモリから表示用VRAMへのコピーを行うものとする。これにより、スクロール停止後に表示準備処理を終えて追加された画像は、順次ディスプレイ110に表示される。
S507では、CPU101は、現時点での処理対象行、処理対象列の位置に配置すべき画像の表示準備処理を開始する。表示準備処理は画像処理部121等と協働して行われ、S507以降の処理と並行して行われる。すなわち、表示準備処理を終了していなくとも処理はS508へ進む。
S508では、CPU101は新たな処理対象列を決定する処理対象列制御処理を行う。処理対象列制御処理の詳細については図8を用いて後述する。
<スクロール制御処理(図6)>
次に、図6に示すフローチャートを用いてスクロール制御処理の詳細を説明する。図6のスクロール制御処理は、前述した図5のS503の処理の詳細である。
S601では、CPU101は、ユーザーからのスクロール指示の入力を受け付けたか否かを判定する。本実施の形態では、スクロールの指示の仕方に応じて上方向か下方向の任意の方向にスクロールを行うことができる。例えば入力部105に含まれる十字に配置された方向ボタンのうち上ボタンが押下されると、下方向へのスクロール(表示した画像の位置を下に移動するスクロール。現在表示している画像より上に配置された画像を閲覧するためのスクロールである)の指示を受けたものとする。逆に、下ボタンが押下されると、上方向へのスクロール(表示した画像の位置を上に移動するスクロール。現在表示している画像よりも下に配置された画像を閲覧するためのスクロールである)の指示を受けたものとする。タッチパネルでスクロール指示を行えるものであれば、タッチパネルを下から上になぞる操作で上方向へのスクロール、上から下になぞる操作で下方向へのスクロールの指示を受けたものとする。回転ホイールを回転する操作で、回転方向に応じたスクロールの指示を受け付けたものとしても良い。スクロール指示の入力を受け付けたと判定するとS602に進み、スクロール指示の入力を受け付けていないと判定するとS610に進む。
S602では、CPU101は、S601で受け付けたスクロール指示が、下方向へのスクロールを指示したものか否かを判定する。下方向へのスクロールを指示したものであればS603へ進み、そうでない場合は上方向へのスクロールを指示したものであるのでS604へ進む。
S603では、CPU101はS601で受け付けたスクロール指示が行われた操作の操作量に応じた分だけスクロールカウンターの値を減らす。たとえば、方向ボタンのうち上ボタンが一度押下された操作であればスクロールカウンターの値を1つ減らす。タッチパネルを上から下になぞる操作であれば、なぞられた距離に応じた数だけスクロールカウンターの値を減らす。これによりスクロールカウンターが負の値になると、後述の処理によりスクロールカウンターの絶対値が示す行数だけ下にスクロールする(表示されていた画像が下に移動し、スクロール前に画面上方に隠れて表示されていなかった行の画像が表示される)。S604では、CPU101はS601で受け付けたスクロール指示が行われた操作の操作量に応じた分だけスクロールカウンターの値を増やす。これは、S603と上下逆の処理である。これによりスクロールカウンターが正の値になると、後述の処理によりスクロールカウンターが示す行数だけ上にスクロールする。(表示されていた画像が上に移動し、スクロール前に画面下方に隠れて表示されていなかった行の画像が表示される)。
S605では、CPU101はスクロールカウンターの値がゼロ以下であるか否かを判定する。スクロールカウンターの値が負の値であればスクロール方向は下方向である。逆に、スクロールカウンターの値が正の値であればスクロール方向は上方向である。スクロールカウンターの値がゼロ以下であると判定すると、S606へ進み、スクロールカウンターの値が正の値であるとS607へ進む。
S606では、CPU101は表示準備処理を施す優先順序である表示順を、ディスプレイ110に表示される行列の上の行から下の行という順序に設定し、メモリ103に記憶する。ここでは、下スクロールによって画像が移動する方向である下方向とは逆の方向である上の行の優先順序を高くしている。
S607では、CPU101はS606とは逆に、表示順をディスプレイ110に表示される行列の下の行から上の行という順序に設定し、メモリ103に記憶する。ここでは、上スクロールによって画像が移動する方向である上方向とは逆の方向である下の行の優先順序を高くしている。
S608では、CPU101はアニメーションタイマーが稼動中か否かを判定する。すなわち、スクロールの最中であるか否かの判定である。アニメーションタイマーが稼動中でない(スクロールの最中ではない)と判定した場合は、S609に進み、S601で受け付けたスクロール指示に従ったスクロールを実行すべくアニメーションタイマーをスタートさせ、図6の処理を抜けて図5のS504へ進む。一方、アニメーションタイマーが稼動中である(スクロールの最中である)と判定するとS610に進む。
S610では、CPU101はスムーズスクロール処理を行う。スムーズスクロール処理は、アニメーションタイマーがタイムアウトするごとに行Offsetの分だけバッファメモリから表示用VRAMに読み込む部分をずらすことで、滑らかなアニメーションのスクロールを実行する処理である。スムーズスクロール処理の詳細は図7を用いて後述する。
S611では、CPU101は行Offsetがゼロであるか否かを判定する。行Offsetがゼロであると判定した場合はS612に進む。行Offsetがゼロである場合とは、インデックス表示で表示される画像群が、整数行分丁度と規定された位置に表示されている状態である。一方、行Offsetがゼロでないと判定した場合は図6の処理を抜けて図5のS504へ進む。行Offsetがゼロでない場合とは、インデックス表示で表示される画像群が、整数行分丁度の位置から行Offsetの分だけずれた位置に表示されている状態である。スクロールの途中の状態であり、アニメーションタイマーが稼動している。
S612では、CPU101はスクロールカウンターがゼロであるか否かを判定する。これは、インデックス表示で表示される画像群の表示位置が整数分丁度の位置である場合に、さらにスクロールを行うべきか否かの判定である。スクロールカウンターがゼロであると判定した場合は、これ以上スクロールを行う必要がないので、図6の処理を抜けてS504へ進む。スクロールカウンターがゼロでないと判定した場合はS613へ進み、さらにもう1行スクロールするための処理を行う。
S613では、CPU101はメモリ103に記憶された表示順が上の行から下の行という順序に設定されているか否かの判定を行う。上の行から下の行という順序に設定されている場合はS614へ進み、そうでない場合、すなわち下の行から上の行という順序に設定されている場合はS615へ進む。
S614では、下方向スクロールをもう一行分行うのに伴い、その時点で表示準備処理を行っていた行よりも、新たにスクロールで進入してくる行の表示準備処理を優先させるため、処理対象行と処理対象列を更新し、スクロールカウンターの値を1つ消費する。CPU101は処理対象行をディスプレイ110に表示される画像のうち上端の行、すなわちバッファメモリから表示用VRAMへのコピー範囲に含まれる画像のうち上端の行に設定し、メモリ103に記憶する。また、処理対象列を、行内で画像が表示されていない最も左の列に設定してメモリ103に記憶する。そして、スクロールカウンターを1つ消費すべく、スクロールカウンターの値を1増やす。
S615では、上方向スクロールをもう一行分行うのに伴い、その時点で表示準備処理を行っていた行よりも、新たにスクロールで進入してくる行の表示準備処理を優先させるため、処理対象行と処理対象列を更新し、スクロールカウンターの値を1つ消費する。CPU101は処理対象行をディスプレイ110に表示される画像のうち下端の行、すなわちバッファメモリから表示用VRAMへのコピー範囲に含まれる画像のうち下端の行に設定し、メモリ103に記憶する。また、処理対象列を、行内で画像が表示されていない最も右の列に設定してメモリ103に記憶する。そして、スクロールカウンターを1つ消費すべく、スクロールカウンターの値を1減らす。
S614あるいはS615の処理を終えると、図6の処理を抜け、図5のS504へ進む。
<スムーズスクロール処理(図7)>
次に、図7に示すフローチャートを用いてスムーズスクロール処理の詳細を説明する。図7のスムーズスクロール処理は、前述した図6のS610の処理の詳細である。
S701では、CPU101はアニメーションタイマーが稼動中か否かを判定する。アニメーションタイマーが稼動中でないと判定すると、スクロールのアニメーション表示を行う必要がないので図7の処理を抜け、図6のS611へ進む。アニメーションタイマーが稼動中であると判定するとS702に進む。
S702では、CPU101はアニメーションタイマーがタイムアウトしたか否かを判定する。アニメーションタイマーがタイムアウトしていないと判定した場合は、まだ表示を更新する必要がないので図7の処理を抜け、図6のS611に進む。アニメーションタイマーがタイムアウトしたと判定した場合は表示を更新する必要があるのでS703へ進む。
S703では、CPU101は行Offsetがゼロであるか否かを判定する。行Offsetがゼロでない場合は、インデックス表示で表示される画像群が、整数行分丁度の位置から行Offsetの分だけずれた位置に表示されている状態であり、スクロールの途中の状態である。したがって行Offsetがゼロでないと判定した場合は、S705に進み、次の表示更新までの時間を計るためにアニメーションタイマーをリスタートする。一方、行Offsetがゼロである場合はS704へ進む。
S704では、CPU101はスクロールカウンターがゼロであるか否かを判定する。行Offsetがゼロでスクロールカウンターもゼロである場合は、画像群は整数行分丁度の位置に表示されており、それ以上の行をスクロールする必要もないので、アニメーションのための表示更新は行わず、図7の処理を抜け、図6のS611に進む。一方、スクロールカウンターがゼロでない場合は、さらにスクロールをする必要があるので、S705へ進む。
S705では、CPU101はアニメーションのために次に表示を更新するまでの時間を計るためにアニメーションタイマーをリスタートする。
S706では、CPU101はメモリ103に記憶された表示順が上の行から下の行という順序に設定されているか否かの判定を行う。上の行から下の行という順序に設定されている場合はS707へ進み、そうでない場合、すなわち下の行から上の行という順序に設定されている場合はS708へ進む。なおここでの判定は、行Offsetをずらす方向をスクロール方向に合った方向とするために、スクロール方向を判定するためのステップである。したがって表示順の判定ではなく、スクロールカウンターがゼロ以下であるか否かの判定としてもよい。
S707では、下方向へのスクロールのアニメーションとして表示された画像群を一段階下へ移動するように、CPU101は行Offsetを1つ減らす。そして、更新した行Offsetの値の分だけバッファメモリから表示用VRAMへのコピー範囲をずらして表示用VRAMを更新する。ここでは、上の行の方向へ一段階コピー範囲をずらす。1段階のずらし量は前述したとおり、[アニメーションにおける1回の表示更新での表示画像の表示画面上での移動量(ライン数)]=[1行分表示するのに必要な表示用VRAM及びバッファメモリの縦ライン数]/[行Offsetの規定値]である。この処理により、ディスプレイ110における表示が更新される。
S708では、S707とは逆に、上方向へのスクロールのアニメーションとして表示された画像群を一段階上へ移動するように、CPU101は行Offsetを1つ増やす。そして、更新した行Offsetの値の分だけバッファメモリから表示用VRAMへのコピー範囲をずらして表示用VRAMを更新する。ここでは、下の行の方向へ一段階コピー範囲をずらす。この処理により、ディスプレイ110における表示が更新される。
S709では、CPU101は行Offsetの絶対値が規定値に達したか否かを判定する。規定値に達したと判定した場合はS710に進む。規定値に達した場合とは、丁度1行分のスクロールが行われた場合である。規定値に達していない場合は図7の処理を抜けて図6のS611に進む。
S710では、CPU101は行Offsetをゼロに設定し、バッファメモリから表示用VRAMへのコピー範囲のずらし量をゼロとする。同時にバッファメモリの画像をスクロール方向に合わせて1行繰り下げるか1行繰り上げるように更新する。ただし、図2(c)で説明したとおり、更新に伴い新たにバッファメモリに取り込むべき画像は表示準備処理に時間を要するため、即時格納されるわけではなく、表示準備処理が終わったものから順次格納される。
S710の処理を終えると図7の処理を抜け図6のS611に進む。
<処理対象列制御処理(図8)>
次に、図8に示すフローチャートを用いて処理対象列制御処理の詳細を説明する。図8の処理対象列制御処理は、前述した図5のS508の処理の詳細である。
S801では、CPU101はメモリ103に記憶された表示順が上の行から下の行という順序に設定されているか否かの判定を行う。上の行から下の行という順序に設定されている場合はS802へ進み、そうでない場合、すなわち下の行から上の行という順序に設定されている場合はS807へ進む。
S802では、CPU101はメモリ103に記憶された処理対象列が右端となっているか否かを判定する。右端となっている場合はS805へ進み、そうでない場合はS803へ進む。
S803では、CPU101は処理対象列を現在設定されている列から一つ右の列に設定し、メモリ103に記憶する。次にS804では、CPU101は設定された処理対象列の位置にすでに画像が表示されているかを判定する。具体的には、設定された処理対象列のバッファメモリ上での位置に、既に表示準備処理を終えた画像が格納されているか否かを判定する。既に画像が表示されていると判定した場合はS805に進み、画像が表示されていないと判定した場合は、図8の処理を抜け図5のS502に進む。画像が表示されていないと判定した場合は、S803で設定した処理対象列がそのまま次回表示準備処理を行うべき列となる(ただしスクロールが先に進まなかった場合)。
S805は、S802で処理対象列が右端と判定された場合、あるいはS804で処理対象列に既に画像が表示されていると判定された場合のいずれかの場合に行う処理である。つまりその時点の処理対象行の画像についてすべて表示準備処理が終了しているため、処理対象行を更新するための処理を行う。S805では、CPU101はメモリ103に記憶された処理対象行が表示用VRAMへのコピー範囲のうちの下端となっているか否かを判定する。下端となっている場合は現在の画面の画像はすべて表示準備処理が終わっているため、スクロールが進むまではこれ以上表示準備処理を行うべき画像はない。そのため図8の処理を抜け、図5のS502に進む。下端となっていないと判定した場合はS806に進み、CPU101は処理対象行を現在の処理対象行より1行下に設定してメモリ103に記憶する。そして処理対象列を処理対象行内で画像が表示されていない最も左の列に設定してメモリ103に記憶する。その後、図8の処理を抜け、図5のS502に進む。
一方、S807〜S811の処理は、S802〜806の処理とはスクロール方向が逆の場合の処理である。
S807では、CPU101はメモリ103に記憶された処理対象列が左端となっているか否かを判定する。左端となっている場合はS810へ進み、そうでない場合はS808へ進む。
S808では、CPU101は処理対象列を現在設定されている列から一つ左の列に設定し、メモリ103に記憶する。次にS809では、CPU101は設定された処理対象列の位置にすでに画像が表示されているかを判定する。具体的には、設定された処理対象列のバッファメモリ上での位置に、既に表示準備処理を終えた画像が格納されているか否かを判定する。既に画像が表示されていると判定した場合はS810に進み、画像が表示されていないと判定した場合は、図8の処理を抜け図5のS502に進む。画像が表示されていないと判定した場合は、S808で設定した処理対象列がそのまま次回表示準備処理を行うべき列となる(ただしスクロールが先に進まなかった場合)。
S810は、S807で処理対象列が左端と判定された場合、あるいはS809で処理対象列に既に画像が表示されていると判定された場合のいずれかの場合に行う処理である。つまりその時点の処理対象行の画像についてすべて表示準備処理が終了しているため、処理対象行を更新するための処理を行う。S810では、CPU101はメモリ103に記憶された処理対象行が表示用VRAMへのコピー範囲のうちの上端となっているか否かを判定する。上端となっている場合は現在の画面の画像はすべて表示準備処理が終わっているため、スクロールが進むまではこれ以上表示準備処理を行うべき画像はない。そのため図8の処理を抜け、図5のS502に進む。上端となっていないと判定した場合はS811に進み、CPU101は処理対象行を現在の処理対象行より1行上に設定してメモリ103に記憶する。そして処理対象列を処理対象行内で画像が表示されていない最も右の列に設定してメモリ103に記憶する。その後、図8の処理を抜け、図5のS502に進む。
なお、上述の各フローチャートには図示していないが、入力部105を介してユーザーからのスクロールの停止指示を受け付けてもよい。たとえば図6のS601の前に、ユーザーからのスクロール停止指示を受け付けたか否かの判定ステップを設ける。スクロール停止指示を受け付けていない場合にはS601に進み、スクロール停止指示を受け付けた場合にはスクロールカウンターをゼロにセットしてからS601に進む。このようにすることで、ユーザーはスクロール中に表示されている画像を見て任意のタイミングでスクロールを停止させることができる。
また、上述の各フローチャートでは1行未満の移動量で表示を更新するスムーズなアニメーションによってスクロールを実現する例を説明したが、これほどスムーズにすることは必須ではなく、一行単位のスクロールとしても構わない。その場合、行Offsetの規定値を1とすれば良い。
以上説明した図5〜図8の処理によって、図2〜図4を用いて説明した動作を実現する。図5〜図8の処理によれば、図2〜図4でも説明したとおり、ある時点である行に配置される画像の表示準備処理を行っている途中で、スクロールによって新たな行が表示される場合は、新たな行の画像の表示準備処理を優先して行う。これによって、スクロール速度が上がっても1画面に1枚も画像が表示されていないという状況になる可能性を低減し、スクロール中にもより多くの画像を表示することができる。また、同一の行内であれば、スクロール方向に応じて、スクロール前に表示されていた画像からより配置順の遠い画像を優先して表示準備処理を行う。これによって、スクロール中に現在どの範囲の画像までが表示画面に表示されるのかをユーザーがすばやく確認することが可能となる。したがってスクロールの指示操作を行っているユーザーにとってはどこでスクロールを停止させるべきかの判断をしやすい。また、スクロールの最中により多くの画像を表示できる分、まだ表示されていない画像の数が少ない。したがってスクロールを停止してからまだ表示していない画像をすべて表示するまでの処理時間が少なくなる。すなわち、スクロール停止後に全画像が表示されるまでにユーザーが待つ時間が少なくなる。
また、上記では上下方向へのスクロールを行う例を説明したが、もちろん左右方向へのスクロールを行うものにも適用可能である。さらに、斜め方向を含む任意の方向にスクロール可能な場合であっても適用可能である。この場合、スクロールによる表示範囲の変更前に表示範囲に含まれていた画像よりも、スクロールにより表示範囲に新たに含まれる画像を優先して表示するように処理を行うことにより上述の実施の形態と同様の効果を奏する。
なお、上述のバッファメモリにはディスプレイ110に表示される行数よりも上下に1行分多い格納領域を用意したが、さらに多くの行の予備格納領域を設けても良い。その場合、上述の図5ステップS504にて、CPU101が全画像の表示を完了したと判断した後、引き続き予備の領域に格納する分の画像の表示準備処理を継続する。バッファメモリに、ディスプレイ110に表示される行数よりも上下に3行分多い格納領域を用意した例を図9に示す。行Offsetがゼロの場合に表示用VRAM上にコピーされる範囲を可視格納領域、それよりも上に3行予備に用意した格納領域を上部予備格納領域、下に3行予備に用意した格納領域を下部予備格納領域と称する。可視格納領域に格納する画像については、図5〜図8で説明した順番で表示準備処理を行って画像を格納する。その後、そのまま同じ方向へスクロールした場合に新たに表示されることになる行の画像を優先して、表示準備処理を行って予備格納領域に格納する。たとえば、上方向へのスクロールを行っていた場合にはディスプレイ110上では下方向から画像が進入してくるアニメーションとなり、すなわち下の行の画像が新たに表示されることになる。そのため、可視格納領域に表示準備処理を終えた画像を格納し終えた後は、上部予備格納領域に格納される画像よりも先に、まず下部予備格納領域に対して画像を追加する。逆に、下方向へのスクロールを行っていた場合には、下部予備格納領域よりも先に、上部予備格納領域に対して画像を追加する。この事により、スクロール開始した直後の画像表示の戸切れを更に軽減する事が可能となる。ここでは予備格納領域のサイズを便宜的に可視格納領域の半分としたが、システムのメモリ状況に合わせ、そのサイズは問わない。
なお、インデックス表示で表示された複数の画像を、スクロールを伴わずに切り替える機能を追加してもよい。例えば、1画面に表示されていた1行目から6行目の画像を、スクロールを伴わずに7行目から12行目の画像に切り替えられる機能があっても良い。その場合、スクロール時とは異なる順で表示準備処理を行っても良い。例えば、スクロールを伴わない画像切り替え時は、切り替え前に表示していた画像に配置順が近い画像を優先して表示準備処理を行うことにすれば、切り替えがその方向に行われたかを判別しやすくなる。例えば、1行目から6行目の画像を、スクロールを伴わずに7行目から12行目の画像に切り替えた際には7行目から表示準備処理を開始する。また、1行目から6行目の画像を、−5行目から0行目の画像に切り替えた際には0行目から表示準備処理を開始する。一方、インデックス表示で表示された複数の画像を、スクロールを伴わずに切り替えた場合にも、スクロール時と同様に、それまで表示されていた画像から配置順が遠い画像から先に表示準備処理を行うものとしてもよい。このようにすれば、切り替えた後の画像がどの範囲の画像までを含むのかをすばやく確認することが可能となり、さらに切り替えを行うべきかの判断をしやすくなる。
また、インデックス表示における表示枚数は上述の例に限らない。一度に表示する枚数を切り替えられるようにしてもよい。例えば図2〜図4の例では6行7列を表示するものとしたが、3行3列や、10行10列といった他の枚数に切り替えられるようにしても良い。他の枚数への切り替えの際は、スクロール時とは異なる順で表示準備処理を行っても良い。例えば、枚数切り替え時は、それまでに選択していた画像に配置順が近い画像を優先して表示準備処理を行うことにすれば、切り替え前に選択していた画像を切り替え後も見失わずに判別することができる。
さらに、本発明をその好適な実施形態に基づいて詳述してきたが、本発明はこれら特定の実施形態に限られるものではなく、この発明の要旨を逸脱しない範囲の様々な形態も本発明に含まれる。さらに、上述した各実施形態は本発明の一実施形態を示すものにすぎず、各実施形態を適宜組み合わせることも可能である。上述の各フローチャートの処理はCPU101が行うものとして説明したが、それに限らず、複数のハードウェアが処理を分担することで行っても良い。
また、上述した実施形態においては、本発明をデジタルカメラに適用した場合を例にして説明したが、これはこの例に限定されない。すなわち、本発明はパーソナルコンピュータやPDA、携帯電話端末や携帯型画像ビューワ、ディスプレイ付きプリンタ装置、デジタルフォトフレーム、ゲーム機、音楽プレーヤーなど、複数の画像をスクロール可能な表示制御装置であれば適用可能である。
(他の実施形態)
本発明は、以下の処理を実行することによっても実現される。即ち、上述した実施形態の機能を実現するソフトウェア(プログラム)をネットワーク又は各種記憶媒体を介してシステム或いは装置に供給し、そのシステム或いは装置のコンピュータ(又はCPUやMPU等)がプログラムコードを読み出して実行する処理である。この場合、そのプログラム、及び該プログラムを記憶した記憶媒体は本発明を構成することになる。