5.4ビットマップ・ファイルの表示
描画するビットマップ・ファイルがコンパイル時に分かっている場合,最も効率がよくお勧めの方法は,ビットマップ・ファイルをビットマップ・コンバータを使ってCのファイルに変換しプロジェクトに追加する方法ですビットマップ・コンバータについて詳しくはビットマップ・コンバータの章を参照してください
コンパイル時には分からない画像を描画する場合は,emWinでサポートされたフォーマットの画像ファイルにする必用がありますこの場合,画像ファイルのサイズをメモリ上またはストレージ・デバイス上で変更できます.画像は有効なメモリの総量が画像ファイルのサイズより小さくても描画可能です.emWinは現在ビットマップとJPEGとGIFファイルをサポートしていますPNGファイルはPNGライブラリを私たちのウェブ・サイトからダウンロードして追加することでサポートできます.このライブラリはBSDライセンスとなります. PNGのサポートについての詳細は,PNGサポートのページを参照してください.
BMPファイル・サポート
emWinで使われるビットマップファイルは通常はコンパイルされCファイルにリンクされますが,他の方法を必要とする場合もあります.
典型的な例は連続的に新しい画像を参照する場合です.ユーザーにダウンロードされたビットマップ画像を使う場合などです次の機能は,メモリにロードされたビットマップ・ファイルをサポートします
繰り返し使う画像は (アイコンなど) コンパイルしてCファイルにリンクしemWinから直接使った方が効率的ですこの作業はBitmap Converterを使うことで簡単にできます
対応フォーマット
ビットマップ・ファイルはMicrosoftによって策定されましたemWinはBMPファイル・フォーマットのバージョン3をサポートします次のテーブルに示す画像フォーマットを含みます.
Bits per pixel | Indexed | Compression Supported
---|---|---|---
1 | yes | no | yes
4 | yes | no | yes
4 | yes | yes | yes
8 | yes | no | yes
8 |yes | yes | yes
16 | no | no | yes
24 | no | no | yes
32 | no | no | yes
BMP API
次の表に有効なビットマップ・ファイルに関係する処理をアルファベット順に示しますDetailed
関数 | descriptions follow: Description |
---|---|
GUI_BMP_Draw() | メモリにロードされているBMPファイルを描画します |
GUI_BMP_DrawEx() | BMPファイルを描画します.メモリにロードする必要はありません |
GUI_BMP_DrawScaled() | メモリにロードされたBMPファイルを描画します.スケーリング(拡縮)を指定できます |
GUI_BMP_DrawScaledEx() | BMPファイルを描画します.メモリにロードする必要はありません.スケーリングを指定できます |
GUI_BMP_EnableAlpha() | 32bppのV3ビットマップ・ファイルのアルファ・チャネルを有効にします |
GUI_BMP_GetXSize() | メモリにロードされたBMPファイルのX方向のサイズを返します |
GUI_BMP_GetXSizeEx() | BMPファイルのX方向のサイズを返します.メモリにロードする必要はありません |
GUI_BMP_GetYSize() | メモリにロードされたBMPファイルのY方向のサイズを返します |
GUI_BMP_GetYSizeEx() | BMPファイルのY方向のサイズを返します.メモリにロードする必要はありません |
GUI_BMP_Serialize() | BMPファイルを生成します |
GUI_BMP_SerializeEx() | BMPファイルを与えられた矩形で生成します |
GUI_BMP_SerializeExBpp() | BMPファイルを与えられた矩形で生成します.色深度を指定できます. |
GUI_BMP_Draw()
Description
メモリにロードされたWindowsビットマップ・ファイルを現在ウィンドウの指定した位置に描画します.
シグネチャ
int GUI_BMP_Draw(const void * pBMP, int x0, int y0);
引数
引数 | 内容 |
---|---|
pBMP | BMPファイルの格納されたメモリ領域のスタート位置のポインタ |
x0 | ディスプレイの中でのBMP画像の左上のX座標 |
y0 | ディスプレイの中でのBMP画像の左上のY座標 |
返値
= 0 成功の場合
≠ 0 失敗の場合
追加情報
この章の始めの表にサポートされたBMPファイル・フォーマットを示します
2DGL_DrawBMP.cは,この関数の使い方を示しています
GUI_BMP_DrawEx()
Description
現在ウィンドウの指定位置にBMP画像を描画します.メモリにロードする必要はありません
シグネチャ
int GUI_BMP_DrawEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0);
引数
引数 | 内容 |
---|---|
pfGetData | データを取得するために呼ばれる関数のポインタGetData関数についての詳細は,データの取得のEx()関数を参照してください |
p | pfGetDataにポイントされた関数に渡されるvoidポインタ |
x0 | ディスプレイの中でのBMP画像の左上のX座標 |
y0 | ディスプレイの中でのBMP画像の左上のY座標 |
返値
= 0 成功の場合
≠ 0 失敗の場合
追加情報
この関数はBMPファイルを描画したいものの,画像をロードするのに十分なRAMが無い場合に使います
GUIライブラリはデータを読み込むために,pfGetData引数にポイントされたこの関数を呼びます
GetData関数はリクエストされたバイト数を返す必要があります
GUIにリクエストされた最大バイト数は,画像の1ラインを描画するのに必要なバイト数です
GUI_BMP_DrawScaled()
Description
メモリにロードされたBMPファイルを描画します.スケーリングと現在ウィンドウ内での描画位置を指定できます
シグネチャ
int GUI_BMP_DrawScaled(const void * pFileData, int x0, int y0, int Num, int Denom);
引数
引数 | 内容 |
---|---|
pFileData | BMPファイルの格納されたメモリ領域の先頭アドレスへのポインタ |
x0 | ディスプレイの中でのBMP画像の左上のX座標 |
y0 | ディスプレイの中でのBMP画像の左上のY座標 |
Num | スケーリング用の分子 |
Denom | スケーリング用の分母 |
返値
= 0 成功の場合
≠ 0 失敗の場合
追加情報
画像のスケーリングは,分数で指定します.引数に分子の数と分母の数を与えます
例えば,画像のサイズを2/3にしたい場合,分子の引数に2を,分母の引数に3を与えます
GUI_BMP_DrawScaledEx()
Description
BMPファイルを描画します.メモリにロードする必要はありません.描画位置とスケーリングを指定できます
シグネnチャ
int GUI_BMP_DrawScaledEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0, int Num, int Denom);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数へのポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
Num | スケーリング用の分子 |
Denom | スケーリング用の分母 |
返値
= 0 成功の場合
≠ 0 失敗の場合
追加情報
画像のスケーリングは,分数で指定します.引数に分子の数と分母の数を与えます
例えば,画像のサイズを2/3にしたい場合,分子の引数に2を,分母の引数に3を与えます
詳細についてはGUI_BMP_DrawEx()を参照してください
GUI_BMP_EnableAlpha()
Description
色深度32bppのBMPファイルの透明を有効にします
シグネチャ
void GUI_BMP_EnableAlpha(void);
追加情報
このBMPファイル・フォーマットはMicrosoftによって1990に策定されたものです
フォーマットのバージョンはV3です
これより前のバージョンはありません
さらに後にMicrosoftはV4 (with Windows 95)とV5 (with Windows 98)を策定しました
しかしこれらのフォーマットをサポートするアプリケーションは,あまりありません
残念ながらデファクト・スタンダードのV3は透明をサポートしません.
V4とV5はこれらの機能を持ちます
emWinのbitmap converterisは,アルファチャネル付きで32bppのBMP画像を保存できます
それぞれにピクセルについて上位8ビットをアルファ値として保存します
32bppBMPファイルでは,これらのビットは使用されません
BitmapConverterによって保存された,このような画像を描画するためには,GUI_BMP_EnableAlpha()を呼び出す必要があります
この手のアルファチャネルの扱い方は,新しく定義されたバージョンのV4やV5の場合とは違います.
もし32bpp BMPファイルのアルファチャネルが使われるなら,GUI_BMP_EnableAlpha()を使うのが唯一の方法です.なぜならアルファチャネルの保存は描画パフォーマンスをわずかに低下されるからです
GUI_BMP_GetXSize()
Description
メモリにロードされたBMPファイルのX方向のサイズを返します
シグネチャ
int GUI_BMP_GetXSize(const void * pBMP);
引数
引数 | 内容 |
---|---|
pBMP | BMPファイルを格納したメモリ領域の先頭へのポインタ |
返値
BMPファイルのX方向のサイズ
GUI_BMP_GetXSizeEx()
Description
BMPファイルのX方向のサイズを返します.BMPファイルはメモリにロードする必要はありません
シグネチャ
int GUI_BMP_GetXSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数へのポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
返値
BMPファイルのX方向のサイズ
GUI_BMP_GetYSize()
Description
メモリにロードされたBMPファイルのY方向のサイズを返します
シグネチャ
int GUI_BMP_GetYSize(const void * pBMP);
引数
引数 | 内容 |
---|---|
pBMP | BMPファイルを格納したメモリ領域の先頭へのポインタ |
返値
BMPファイルのY方向のサイズ
GUI_BMP_GetYSizeEx()
Description
BMPファイルのY方向のサイズを返します.BMPファイルはメモリにロードする必要はありません
シグネチャ
int GUI_BMP_GetYSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数へのポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
返値
BMPファイルのY方向のサイズ
GUI_BMP_Serialize()
Description
LCDの内容をすべて含むBMPファイルを生成します
emWinで使われている色深度でBMPを生成します.最高24 bppです
8bpp未満の色深度を使った場合,BMPファイルの色深度は8bppになります
現在使用しているデバイスがピクセル・データ読み取り先となります
メモリ・デバイスが選択された場合,その内容がファイルに書き出されます
圧縮BMPはサポートされません
シグネチャ
void GUI_BMP_Serialize(GUI_CALLBACK_VOID_U8_P * pfSerialize, void * p);
引数
引数 | 内容 |
---|---|
pfSerialize | シリアライズ関数へのポインタ |
p | シリアライズ関数へ渡されるユーザ・データへのポインタ |
例
以下に,どのようにウィンドウからBMPファイルを生成するかを示します
static void _DrawSomething(void) {
/* Draw something */
GUI_DrawLine(10, 10, 100, 100);
}
static void _WriteByte2File(U8 Data, void * p) {
U32 nWritten;
WriteFile(*((HANDLE *)p), &Data, 1, &nWritten, NULL);
}
static void _ExportToFile(void) {
HANDLE hFile = CreateFile("C:\\GUI_BMP_Serialize.bmp", GENERIC_WRITE, 0, 0,
CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
GUI_BMP_Serialize(_WriteByte2File, &hFile);
CloseHandle(hFile);
}
void MainTask(void) {
GUI_Init();
_DrawSomething();
_ExportToFile();
}
GUI_BMP_SerializeEx()
Description
指示された領域を含むBMPファイルを生成します
emWinで使われている色深度でBMPを生成します.最高24 bppです
8bpp未満の色深度を使った場合,BMPファイルの色深度は8bppになります
現在使用しているデバイスがピクセル・データ読み取り先となります
メモリ・デバイスが選択された場合,その内容がファイルに書き出されます
圧縮BMPはサポートされません
シグネチャ
void GUI_BMP_SerializeEx(GUI_CALLBACK_VOID_U8_P * pfSerialize, int x0, int y0, int xSize, int ySize, void * p);
引数
引数 | 内容 |
---|---|
pfSerialize | |
ユーザ定義のシリアライズ関数へのポインタ | |
以下を参照して下さい | |
x0 | 生成するBMPファイルのスタート地点のX座標 |
y0 | 生成するBMPファイルのスタート地点のY座標 |
xSize | X方向のサイズ |
ySize | Y方向のサイズ |
p | シリアライズ関数へ渡す,ユーザ定義データへのポインタ |
GUI_CALLBACK_VOID_U8_Pのシグネチャ
void GUI_CALLBACK_VOID_U8_P(U8 Data, void * p);
追加情報
使用例は,GUI_BMP_Serialize()の項を参照してください
GUI_BMP_SerializeExBpp()
Description
指定した色深度で,指定した領域のBMPファイルを生成します
8bpp未満の色深度を使った場合,BMPファイルの色深度は8bppになります
色深度は8の倍数である必要があります
システムの色深度が8bppを超える場合,指定する色深度は16bppかそれ以上とする必要があります
現在使用しているデバイスがピクセル・データ読み取り先となります
メモリ・デバイスが選択された場合,その内容がファイルに書き出されます
圧縮BMPはサポートされません
シグネチャ
void GUI_BMP_SerializeExBpp(GUI_CALLBACK_VOID_U8_P * pfSerialize, int x0, int y0, int xSize, int ySize, void * p, int BitsPerPixel);
引数
引数 | 内容 |
---|---|
pfSerialize | ユーザ定義のシリアライズ関数へのポインタ |
以下を参照して下さい | |
x0 | 生成するBMPファイルのスタート地点のX座標 |
y0 | 生成するBMPファイルのスタート地点のY座標 |
xSize | X方向のサイズ |
ySize | Y方向のサイズ |
p | シリアライズ関数へ渡す,ユーザ定義データへのポインタ |
ピクセルあたりのビット数
色深度
GUI_CALLBACK_VOID_U8_Pのシグネチャ
void GUI_CALLBACK_VOID_U8_P(U8 Data, void * p);
追加情報
使用例は,前述のGUI_BMP_Serialize()を参照してください
JPEGファイル・サポート
JPEG (ジェイペグと読む)は,フルカラー及びグレースケール向けの標準的な画像圧縮方式です
JPEGは自然な写真の圧縮に向いています.
図面や漫画,人工的な画像の圧縮には,あまり向いていません
JPEGにはロスがあります.非可逆圧縮方式です
もし可逆圧縮が必要であれば,JPEGを使うべきではありません
しかしながら,多くの写真画像について見た目の劣化を伴わない非常に良好な圧縮が可能で,もし低いクオリティを許容するのであれば,非常に高い圧縮率を達成できます
JPEG圧縮方法のサポート
このソフトウェアは,JPEGのベースライン.拡張されたシーケンシャル,プログレッシブ圧縮プロセスを実装します
これらのプロセスで使用される全ての変数へのアクセスを提供します.しかし一般的でない幾つかのパラメータについては実装されていません
法的な理由により,JPEGの算術符号化形式に関係するコードは提供されていません
これらに関係するパテントは,IBM,AT&T及び三菱が保有しているようです
したがって,それらのライセンスを取得せずに,それらを合法的に使用することはできません
このため,この部分のコードは含まれていません
(特許の影響を受けないHuffmanモードについて算術符号化はわずかな利益しか提供しないため,その実装が増えることはなさそうです)
JPEGファイル・サポートは標準的に定義された階層的もしくはロスレス処理を含みません
yCbCr色空間のJPEGファイルとグレースケールのJPEGファイルのみをサポートします
JPEGファイルとCソースの変換
幾つかの環境ではJPEGファイルをCファイルとしてプロジェクトに追加すると便利です
この場合は,まずJPEGファイルをCファイルに変換する必要があります
ツールとしてemWinに付属するBin2C.exeを使って行えます
Toolsサブ・フォルダに入っています
与えられたバイナリ・ファイル(この場合はJPEGファイル)をCファイルに変換します
Cファイルのファイル名は元のバイナリファイルと同じものに拡張子.cが付いたものになります
Bin2Cを使って,JPEGファイルがどのように符号化されるか次にステップを示します:
Bin2C.exeを起動し,Cファイルに変換するJPEGファイルを選択します.
例えば,’Image.jpeg’.そしてCファイルに変換します
・プロジェクトにCファイルを追加します
例
次に変換したJPEGファイルをどの様に表示するかを示します
# include "GUI.h"
# include "Image.c" /* Include the converted C file */
void MainTask(void) {
GUI_Init();
GUI_JPEG_Draw(acImage, sizeof(acImage), 0, 0);
...
}
JPEGファイルの表示
グラフィック・ライブラリはまず,画像情報をデコードします
画像のデコーディング処理には,それなりに時間がかかります
JPEGファイルが頻繁に呼ばれるウィンドウ・マネージャのコールバック関数から使用されるなら,デコーディング処理が必要とする処理時間を考慮した方がよいでしょう
メモリ・デバイスを使用することで計算時間を削減できます
一番良いのは,まず画像をメモリに描画することです
この場合,解凍処理は1度だけ行われます
メモリ・デバイスについての詳細は,メモリ・デバイスの章を参照してください
JPEGファイル・デコードのハードウェア・サポート
MCUのJPEGハードウェア・デコーダを使用できます
詳細はハードウェアJPEGデコーディングの章を参照してください
メモリ使用量
JPEGデコードでは画像のサイズに依存しない約33KBのRAMを使用します.さらに画像のデータサイズに応じたメモリを使用します必要なRAMの量は次の通りです
必要RAM量 = 画像のX方向のサイズ × 80バイト + 33 Kバイト
X方向のサイズはJPEGファイルの圧縮形式によって変わります
次の表に例を示します
画像の圧縮サイズ
ピクセルごとのRAM使用量(KB)
RAM使用量
サイズ依存(KB)
H1V1 160x120 45 12
H2V2 160x120 46 13
GRAY 160x120 38 4
デコードに必要なメモリはemWinのメモリ管理システムによって動的に確保されます
JPEG画像の描画後,RAMは解放されます
プログレッシブJPEGファイル
ベースラインと拡張シーケンシャルJPEGファイルと違い,プログレッシブJPEGはマルチ・スキャンで構成されます
それぞれのスキャンは,直前のスキャンを元にしており,JPEG画像の見た目を改善しています
1ラインのみのデコードが必要だったとしても,これらのスキャンは画像全てに対して行われます
構造体GUI_JPEG_INFOのメンバProgressiveは,JPEG画像がプログレッシブかどうかを示します
JPEG API
次の表にJPEGファイル関係の関数をアルファベット順で示します
詳細な機能を下記に示します
関数 | 処理の詳細 |
---|---|
GUI_JPEG_Draw() | メモリにロードされたJPEGを描画します |
GUI_JPEG_DrawEx() | JPEGファイルを描画します.メモリにロードする必要はありません |
GUI_JPEG_DrawScaled() | メモリにロードしたJPEGファイルをスケーリングを指定して描画します |
GUI_JPEG_DrawScaledEx() | JPEGファイルをスケーリングを指定して描画します.メモリにロードする必要はありません |
GUI_JPEG_GetInfo() |
メモリにロードされたJPEGファイルの情報をGUI_JPEG_INFO構造体に格納します
GUI_JPEG_GetInfoEx() | JPEGファイルの情報をGUI_JPEG_INFO構造体に格納します.メモリにロードする必要はありません
データ構造
構造の詳細
GUI_JPEG_INFO JPEG画像の情報
関数GUI_JPEG_Draw()
Description
メモリにロードされたJPEGファイルを現在のウィンドウの指定した場所に描画します
シグネチャ
int GUI_JPEG_Draw(const void * pFileData, int DataSize, int x0, int y0);
引数
引数 | 内容 |
---|---|
pFileData | JPEGファイルのデータを格納したメモリ領域へのポインタ |
DataSize | JPEGファイルのサイズ(バイト) |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
返値
= 0 成功
≠ 0 関数の実行が失敗(現在の実装では常に0を返します).
追加情報
Sampleフォルダにこの関数の使用例として2DGL_DrawJPG.cがあります
GUI_JPEG_DrawEx()
Description
JPEGファイルを現在のウィンドウの指定した場所に描画します.メモリにロードする必要はありません
シグネチャ
int GUI_JPEG_DrawEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数へのポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
返値
= 0 成功の場合
≠ 0 失敗の場合(現在の実装では常に0を返します).
追加情報
JPEGファイルのロードに十分なRAMがない場合,JPEGファイルを描画するためにこの関数が使われます
JPEGライブラリは,データを読み込むためにpfGetDataで示された関数を呼びます
GetData関数は有効なバイト数を返します
これは要求されたバイト数以下になるでしょう
関数は少なくとも新たに1バイトを返すことを必要とします
Sample
フォルダはGetData関数の使い方を示す例として2DGL_DrawJPGScaled.cを含みます
GUI_JPEG_DrawScaled()
Description
メモリにロードされたJPEGファイルを現在ウィンドウの指定した位置に描画します.スケーリングを指定できます
シグネチャ
int GUI_JPEG_DrawScaled(const void * pFileData, int DataSize, int x0, int y0, int Num, int Denom);
引数
引数 | 内容 |
---|---|
pFileData | jpegファイルを格納したメモリ領域の先頭へのポインタ |
DataSize | JPEGファイルのサイズ(バイト) |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
Num | スケーリング用の分子 |
Denom | スケーリング用の分母 |
返値
= 0 成功の場合
≠ 0 失敗の場合(現在の実装では常に0を返します).
追加情報
画像のスケーリングは,分数で指定します.引数に分子の数と分母の数を与えます
例えば,画像のサイズを2/3にしたい場合,分子の引数に2を,分母の引数に3を与えます
Sampleフォルダには,スケーリングを指定してJPEGを描画する例として2DGL_DrawJPGScaled.cがあります
GUI_JPEG_DrawScaledEx()
Description
JPEGファイルを現在ウィンドウの指定した位置にスケーリングを指定して描画します.メモリにロードする必要はありません.
シグネチャ
int GUI_JPEG_DrawScaledEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0, int Num, int Denom);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数へのポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
Num | スケーリング用の分子 |
Denom | スケーリング用の分母 |
返値
= 0 成功の場合
≠ 0 失敗の場合(現在の実装では常に0を返します).
追加情報
画像のスケーリングは,分数で指定します.引数に分子の数と分母の数を与えます
例えば,画像のサイズを2/3にしたい場合,分子の引数に2を,分母の引数に3を与えます
詳細についてはGUI_JPEG_DrawEx()を参照して下さい
Sampleフォルダにはこの関数の使用例として2DGL_DrawJPGScaled.cがあります
メモリにロードされたJPEGファイルの情報をGUI_JPEG_INFO構造体に格納します
シグネチャ
int GUI_JPEG_GetInfo(const void * pFileData, int DataSize, GUI_JPEG_INFO * pInfo);
引数
引数 | 内容 |
---|---|
pFileData | JPEGファイルのデータを格納したメモリ領域へのポインタ |
DataSize | JPEGファイルのサイズ(バイト) |
pInfo | この関数に情報を設定されるGUI_JPEG_INFO構造体のポインタ |
返値
= 0 成功の場合
≠ 0 失敗の場合
追加情報
Sampleフォルダにこの関数の使用例として2DGL_DrawJPG.cがあります
JPEGファイルの情報をGUI_JPEG_INFO構造体に設定します.JPEGファイルをメモリにロードする必要はありません
シグネチャ
int GUI_JPEG_GetInfoEx(GUI_GET_DATA_FUNC * pfGetData, void * p, GUI_JPEG_INFO * pInfo);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数へのポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
pInfo | この関数に情報を設定されるGUI_JPEG_INFO構造体のポインタ |
返値
= 0 成功の場合
≠ 0 失敗の場合
追加情報
この関数についての詳細と引数pfGetData及び,pについてはGUI_JPEG_GetInfo()とGUI_JPEG_DrawEx()を参照してください
Sampleフォルダにはこの関数の使用例として2DGL_DrawJPGScaled.cがあります
データ構造体
GUI_JPEG_INFO
Description
JPEG画像の情報
Type definition
typedef struct {
int XSize;
int YSize;
int Progessive;
} GUI_JPEG_INFO;
Structure members
メンバ | 内容
XSize | 画像のX方向のサイズ
YSize | 画像のY方向のサイズ
Progessive | JPEGファイルがプログレッシブかどうかを示す
次も参照して下さい
? GUI_JPEG_GetInfo()
? GUI_JPEG_GetInfoEx()
GIFファイル・サポート
GIFファイル・フォーマット (Graphic Interchange Format) はthe CompuServe Information Serviceによって1980年代に開発されました
ネットワーク経由で画像データを転送することを意図して設計されました
GIF標準ではインターレースと透明色,アプリケーション定義のデータ,rawテキストの描画をサポートしています
rawテキストや特定アプリケーションのデータの様なサポートされないデータはemWinでは無視されます
GIFファイルは,画像データの圧縮にLZW (Lempel-Zif-Welch)ファイル圧縮技術を使います
この圧縮技術には,データのロスはありません
解凍された画像は,圧縮前の画像と完全に同じです
GIFファイルのCソースへの変換
幾つかの環境では,GIFファイルをCファイルとしてプロジェクトに追加するこの方法は有効です
この方法は前述のJPEGファイルの場合と完全に同一です.JPEGファイルサポートのページを参照して下さい
GIFファイルの表示
グラフィック・ライブラリはまず,画像情報をデコードします
画像のデコーディング処理には,それなりに時間がかかります
JPEGファイルが頻繁呼ばれるウィンドウ・マネージャマネージのコールバック関数から使用されるなら,デコーディング処理が必要とする処理時間を考慮した方がよいでしょう
メモリ・デバイスを使用することで計算時間を削減できます
一番良いのは,まず画像をメモリに描画することです
この場合,解凍処理は1度だけ行われます
メモリ・デバイスについての詳細は,メモリ・デバイスの章を参照してください
メモリの使用法
emWinでのGIFの解凍処理には,解凍用の領域として約16Kバイトの動的割り当てRAMが必要です
画像を描画した後,解凍用に使用されたRAMは解放されます
GIF API
次の表にGIFファイルに関係する処理をアルファベット順位に示します
機能の詳細を下記に示します
関数
関数 | 内容 |
---|---|
GUI_GIF_Draw() | メモリにロードされたGIFファイルの最初の画像を描画する |
GUI_GIF_DrawEx() | GIFファイルの最初の画像を描画する.メモリにロードする必要はない |
GUI_GIF_DrawSub() | メモリにロードされたGIFファイルの与えられたサブ・イメージを描画する |
GUI_GIF_DrawSubEx() | GIFファイルのサブ・イメージを描画する.メモリにロードする必要はない |
GUI_GIF_DrawSubScaled() | メモリにロードされたGIFファイルのサブ・イメージをスケーリング指定して描画する |
GUI_GIF_DrawSubScaledEx() | GIFファイルのサブ・イメージをスケーリング指定して描画する.メモリにロードする必要はない |
GUI_GIF_GetComment() | メモリにロードされたGIFファイルのコメントを返す |
関数 | 処理 |
---|---|
GUI_GIF_GetCommentEx() | GIFファイルのコメントを返す.メモリにロードする必要はない |
GUI_GIF_GetImageInfo() | メモリにロードされたGIFファイルのサブ・イメージの情報を返す |
GUI_GIF_GetImageInfoEx() | GIFファイルのサブ・イメージの情報を返す.メモリにロードする必要はない |
GUI_GIF_GetInfo() | メモリにロードされたGIFファイルの情報を返す |
GUI_GIF_GetInfoEx() | GIFファイルの情報を返す.メモリにロードする必要はない |
GUI_GIF_GetXSize() メモリにロードされたビットマップ?のX方向のサイズを返す | |
GUI_GIF_GetXSizeEx() | ビットマップ?のX方向のサイズを返す.メモリにロードする必要はない |
GUI_GIF_GetYSize() | メモリにロードされたビットマップ?のY方向のサイズを返す |
GUI_GIF_GetYSizeEx() | ビットマップ?のY方向のサイズを返す.メモリにロードする必要はない |
Data structures
構造体 | 内容 |
---|---|
GUI_GIF_IMAGE_INFO | GIFファイルのサブ・イメージの情報 |
GUI_GIF_INFO | GIFファイルのサブ・イメージの情報 |
関数
GUI_GIF_Draw()
Description
現在ウィンドウの指定した場所に,メモリにロードされたGIFファイルの最初の画像を描画する
シグネチャ
int GUI_GIF_Draw(const void * pGIF, U32 NumBytes, int x0, int y0);
引数
引数 | 内容 |
---|---|
pGIF | GIFファイルを格納したメモリ領域の先頭ポインタ |
NumBytes | GIFファイルの大きさ(バイト) |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
返値
= 0 成功
≠ 0 失敗
追加情報
ファイルが1つ以上の画像を含む場合でも,この関数は最初の画像のみを表示します
透明GIF及びインターレース画像をサポートします
GUI_GIF_DrawEx()
Description
現在ウィンドウの指定した場所に,GIFファイルを描画します.メモリにロードする必要はありません
シグネチャ
int GUI_GIF_DrawEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数へのポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
返値
= 0 成功
≠ 0 失敗
追加情報
この関数は,画像を描画したいものの,画像をロードする十分なRAM領域が無い場合に使用されます
このライブラリは,データを読み込むためにpfGetDataで示された関数を呼びます
GetData関数は有効なバイト数を返します
これは要求されたバイト数以下である必要があります
関数は少なくとも新たに1バイトを返すことを必要とします
GUI_GIF_DrawSub()
Description
メモリにロードされたGIFファイルの与えられたサブ・イメージを現在ウィンドウの指定した位置に描画します
シグネチャ
int GUI_GIF_DrawSub(const void * pGIF, U32 NumBytes, int x0, int y0, int Index);
引数
引数 | 内容 |
---|---|
pGIF | GIFファイルを格納したメモリ領域の先頭ポインタ |
NumBytes | GIFファイルの大きさ(バイト) |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
Index | 表示するサブ・イメージのインデックス(1枚目の場合0を指定) |
返値
= 0 成功
≠ 0 失敗
追加情報
この関数は,現在画像と前画像との間で背景ピクセルを管理します
例えば,サブ・イメージ3を描画するとき,画像のオフセットがx20/y20でサイズがw10/h10だったとします.そして前画像の位置が x15/y15,サイズがw20/h20で背景の再描画が必要な場合に,この関数は2つの画像の間のピクセルを背景色で塗りつぶします
Sampleフォルダにある2DGL_DrawGIF.cはこの関数の使い方のサンプルです
GUI_GIF_DrawSubEx()
Description
GIFファイルの与えられたサブ・イメージを現在ウィンドウの指定した場所に描画します.メモリにロードする必要はありません
シグネチャ
int GUI_GIF_DrawSubEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0, int Index);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数へのポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
Index | 表示するサブ・イメージのインデックス(1枚目の場合0を指定) |
返値
= 0 成功
≠ 0 失敗
追加情報
この関数は,画像を描画したいものの,画像をロードする十分なRAM領域が無い場合に使用されます
GUIライブラリはデータを読み込むために,pfGetData引数にポイントされたこの関数を呼びます
詳細はGUI_GIF_DrawEx()を参照してください
GUI_GIF_DrawSubScaled()
Description
メモリにロードされたGIFファイルの与えられたサブ・イメージを現在ウィンドウの指定した場所に描画します.スケールを指定できます
シグネチャ
int GUI_GIF_DrawSubScaled(const void * pGIF, U32 NumBytes, int x0, int y0, int Index, int Num, int Denom);
引数
引数 | 内容 |
---|---|
pGIF | GIFファイルを格納したメモリ領域の先頭ポインタ |
NumBytes | GIFファイルの大きさ(バイト) |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
Index | 表示するサブ・イメージのインデックス(1枚目の場合0を指定) |
Num | スケーリング用の分子 |
Denom | スケーリング用の分母 |
返値
= 0 成功
≠ 0 失敗
追加情報
画像のスケーリングは,分数で指定します.引数に分子の数と分母の数を与えます
例えば,画像のサイズを2/3にしたい場合,分子の引数に2を,分母の引数に3を与えます
GUI_GIF_DrawSubScaledEx()
Description
GIFファイルのサブ・イメージを現在ウィンドウの指定した位置に描画します.メモリにロードする必要はありません.スケールを指定できます
シグネチャ
int GUI_GIF_DrawSubScaledEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0, int Index, int Num, int Denom);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数へのポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
Index | 表示するサブ・イメージのインデックス(1枚目の場合0を指定) |
Num | スケーリング用の分子 |
Denom | スケーリング用の分母 |
返値
= 0 成功
≠ 0 失敗
追加情報
画像のスケーリングは,分数で指定します.引数に分子の数と分母の数を与えます
例えば,画像のサイズを2/3にしたい場合,分子の引数に2を,分母の引数に3を与えます
GUI_GIF_GetComment()
Description
メモリにロードされたGIF画像のコメントを返す
シグネチャ
int GUI_GIF_GetComment(const void * pGIF, U32 NumBytes, U8 * pBuffer, int MaxSize, int Index);
引数
引数 | 内容 |
---|---|
pGIF | GIFファイルを格納したメモリ領域の先頭ポインタ |
NumBytes | GIFファイルの大きさ(バイト) |
pBuffer | コメントを格納するバッファのポインタ |
MaxSize | バッファのサイズ |
Index | コメントのインデックス(0が起点) |
返値
= 0 成功
≠ 0 失敗
追加情報
GIFファイルは1つ以上のコメントを含むことができます
この関数は,与えられたバッファにコメントをコピーします
コメントの長さがバッファより長い場合,バッファのサイズ分のコメントだけがコピーされます
Sampleフォルダにある2DGL_DrawGIF.cはこの関数の使い方のサンプルです
GUI_GIF_GetCommentEx()
Description
GIF画像のコメントを返します.メモリにロードする必要はありません
シグネチャ
int GUI_GIF_GetCommentEx(GUI_GET_DATA_FUNC * pfGetData, void * p, U8 * pBuffer, int MaxSize, int Index);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数のポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
pBuffer | コメントを格納するバッファのポインタ |
MaxSize | バッファのサイズ |
Index | コメントのインデックス(0が起点) |
返値
= 0 成功
≠ 0 失敗
追加情報
詳細はGUI_GIF_GetComment()を参照して下さい
GUI_GIF_GetImageInfo()
Description
メモリにロードされたGIFファイルのサブ・イメージの情報を返します
シグネチャ
int GUI_GIF_GetImageInfo(const void * pGIF, U32 NumBytes, GUI_GIF_IMAGE_INFO * pInfo, int Index);
引数
引数 | 内容 |
---|---|
pGIF | GIFファイルを格納したメモリ領域の先頭ポインタ |
NumBytes | GIFファイルの大きさ(バイト) |
pInfo | この関数でデータを設定するGUI_GIF_IMAGE_INFO構造体のポインタ |
Index | サブ・イメージのインデックス(0が起点) |
返値
= 0 成功
≠ 0 失敗
追加情報
画像が動画として表示されるなら,この関数をサブ・イメージが表示されるべき時刻を取得するために使用するべきです
delay要素が0なら,画像は1/10秒表示されなければなりません
GUI_GIF_GetImageInfoEx()
Description
GIFファイルのサブ・イメージの情報を返します.メモリにロードする必要はありません
シグネチャ
int GUI_GIF_GetImageInfoEx(GUI_GET_DATA_FUNC * pfGetData, void * p, GUI_GIF_IMAGE_INFO * pInfo, int Index);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数のポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
pInfo | この関数でデータを設定するGUI_GIF_IMAGE_INFO構造体のポインタ |
Index | サブ・イメージのインデックス(0が起点) |
返値
= 0 成功
≠ 0 失敗
追加情報
詳細はGUI_GIF_GetImageInfo()を参照して下さい
GUI_GIF_GetInfo()
Description
メモリにロードされたGIFファイルに含まれるサブイメージのサイズや数を設定した情報の構造体を返します
シグネチャ
int GUI_GIF_GetInfo(const void * pGIF, U32 NumBytes, GUI_GIF_INFO * pInfo);
引数
引数 | 内容 |
---|---|
pGIF | GIFファイルを格納したメモリ領域の先頭ポインタ |
NumBytes | GIFファイルの大きさ(バイト) |
pInfo | この関数で情報を埋められるGUI_GIF_INFO構造体のポインタ |
返値
= 0 成功
≠ 0 失敗
GIFファイルに含まれるサブイメージのサイズや数を設定した情報の構造体を返します.メモリにロードする必要はありません
シグネチャ
int GUI_GIF_GetInfoEx(GUI_GET_DATA_FUNC * pfGetData, void * p, GUI_GIF_INFO * pInfo);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数のポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
pInfo | この関数で情報を埋められるGUI_GIF_INFO構造体のポインタ |
返値
= 0 成功
≠ 0 失敗
GUI_GIF_GetXSize()
Description
メモリにロードされたGIF画像のX方向のサイズを返します
シグネチャ
int GUI_GIF_GetXSize(const void * pGIF);
引数
引数 | 内容 |
---|---|
pGIF | GIFファイルを格納したメモリ領域の先頭ポインタ |
返値
GIF画像のX方向のサイズ
GUI_GIF_GetXSizeEx()
Description
GIF画像のX方向のサイズを返します.メモリにロードする必要はありません
シグネチャ
int GUI_GIF_GetXSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数のポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
返値
GIF画像のX方向のサイズ
GUI_GIF_GetXSize()
Description
メモリにロードされたGIF画像のY方向のサイズを返します
シグネチャ
int GUI_GIF_GetYSize(const void * pGIF);
bitmap?ファイルを格納したメモリ領域の先頭ポインタ
返値
GIF画像のY方向のサイズ
GUI_GIF_GetXSizeEx()
Description
GIF画像のY方向のサイズを返します.メモリにロードする必要はありません
シグネチャ
int GUI_GIF_GetYSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数のポインタ |
Get-Data()関数の詳細はデータ取得Ex()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
返値
GIF画像のY方向のサイズ
Data structures
GUI_GIF_IMAGE_INFO
Description
GIFファイルのサブ・イメージの情報
Type definition
typedef struct {
int xPos;
int yPos;
int xSize;
int ySize;
int Delay;
} GUI_GIF_IMAGE_INFO;
構造体のメンバ
メンバ | 内容 |
---|---|
xPos | 最後に描画した画像のX位置 |
yPos | 最後に描画した画像のY位置 |
xSize | 最後に描画した画像のXサイズ |
ySize | 最後に描画した画像のYサイズ |
Delay | 動画でその画像が表示されるべき1/100秒単位の時間 |
以下も参照して下さい
? GUI_GIF_GetImageInfo()
? GUI_GIF_GetImageInfoEx()
GUI_GIF_INFO
Description
GIFファイルのサブ・イメージの情報
Type definition
typedef struct {
int xSize;
int ySize;
int NumImages;
} GUI_GIF_INFO;
構造体のメンバ
メンバ | 内容 |
---|---|
xSize | 画像のX方向のピクセル・サイズ |
ySize | 画像のY方向のピクセル・サイズ |
NumImages | ファイル中に含まれるサブ・イメージの数 |
以下も参照して下さい | |
? GUI_GIF_GetInfo() | |
? GUI_GIF_GetInfoEx() |
PNGファイルのサポート
PNG (Portable Network Graphics)フォーマットは,ロスの無いデータ圧縮を行う特許の絡まない画像フォーマットです.アルファ・ブレンディングをサポートします
PNG仕様のバージョン 1.0は1996年にリリースされました
2003年の終わりからPNGは国際的な標準standard (ISO/IEC 15948)になりました
emWinでPNGをサポートするには’libpng’ライブラリを使用する必要があります(Glenn Randers-Pehrson, Guy Eric SchalnatとAndreas Dilgerによって作られた)
このライブラリのemWinに適合するバージョンがウェブ・サイトにあります
ライブラリはこの章の後のほうで説明するPNG APIを使用するためにemWinに追加できます
ライセンス
’libpng’ライブラリの使用に関してBSDスタイルのライセンスとコピーライトが ダウンロード・ファイルのGUI\PNG\png.hにありますライブラリのオリジナル・バージョンは無料でwww.libpng.orgから入手可能です
PNGファイルをCソースに変換
幾つかの環境ではPNGファイルをCファイルとしてプロジェクトに追加したほうが便利です
この方法は前述のJPEGファイルの場合と完全に同一です.JPEGファイルサポートのページを参照して下さい
ビットマップ・コンバータはPNGファイルをロードし,Cのビットマップファイルへ変換できます
PNGファイルの表示
グラフィック・ライブラリは最初に画像情報をデコードします
画像のデコーディング処理には,それなりに時間がかかります
PNGファイルが頻繁に呼ばれるウィンドウ・マネージのコールバック関数から使用されるなら,デコーディング処理が必要とする処理時間を考慮した方がよいでしょう
メモリ・デバイスを使用することで計算時間を削減できます
一番良いのは,まず画像をメモリに描画することです
この場合,解凍処理は1度だけ行われます
メモリ・デバイスについての詳細は,メモリ・デバイスの章を参照してください
メモリ使用量
PNGデコードには画像のサイズに依存しない約21KBのRAMを使用します.さらに画像のデータサイズに応じたメモリを使用します必要なRAMの量は次の通りです
概算
RAM必要量 = (xSize + 1) × ySize × 4 + 54 KB
PNG API
次の表にPNGファイルに関係する関数をアルファベット順に示します
機能の詳細を下記に示します
関数 | 内容 |
---|---|
GUI_PNG_Draw() | メモリにロードしたPNGファイルを描画します |
GUI_PNG_DrawEx() | PNGファイルを描画します.メモリにロードする必要はありません |
GUI_PNG_GetXSize() | メモリにロードしたビットマップ?のX方向のサイズを返します |
GUI_PNG_GetXSizeEx() | ビットマップ?のX方向のサイズを返します.メモリにロードする必要はありません |
GUI_PNG_GetYSize() | メモリにロードしたビットマップ?のY方向のサイズを返します |
GUI_PNG_GetYSizeEx() | ビットマップのY方向のサイズを返します.メモリにロードする必要はありません |
GUI_PNG_Draw()
Description
メモリにロードされたPNGファイルを現在ウィンドウの指定した位置に描画します
シグネチャ
int GUI_PNG_Draw(const void * pFileData, int FileSize, int x0, int y0);
引数
引数 | 内容 |
---|---|
pFileData | PNGファイルを格納したメモリ領域の先頭ポインタ |
FileSize | PNGファイルのサイズ(バイト) |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
返値
= 0 成功の場合
≠ 0 失敗の場合(現在の実装では常に0を返します).
追加情報
Sampleフォルダにこの関数の使用例として2DGL_DrawPNG.cがあります
GUI_PNG_DrawEx()
Description
PNGファイルを現在ウィンドウの指定した位置に描画します.メモリにロードする必要ありません
シグネチャ
int GUI_PNG_DrawEx(GUI_GET_DATA_FUNC * pfGetData, void * p, int x0, int y0);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数のポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
x0 | ビットマップ?の左上のX座標.ディスプレイ内での位置を指定する |
y0 | ビットマップ?の左上のY座標.ディスプレイ内での位置を指定する |
返値
= 0 成功の場合
≠ 0 失敗の場合
追加情報
PNGファイルのロードに十分なRAMがない場合,PNGファイルを描画するためにこの関数が使われます
PNGライブラリは,データを読み込むためにpfGetDataで示された関数を呼びます
GetData関数は有効なバイト数を返します
これは要求されたバイト数以下である必要があります
関数は少なくとも新たに1バイトを返すことを必要とします
PNGライブラリは画像全体を格納するために,内部的にバッファを割り当てます
この関数を使っても,これを防ぐことはできません
GUI_PNG_GetXSize()
Description
メモリにロードしたPNG画像のX方向のサイズを返します
シグネチャ
int GUI_PNG_GetXSize(const void * pFileData, int FileSize);
引数
引数 | 内容 |
---|---|
pFileData | PNGファイルを格納したメモリ領域の先頭ポインタ |
FileSize | ファイルのサイズ(バイト) |
返値
PNG画像のX方向のサイズ
GUI_PNG_GetXSizeEx()
Description
PNG画像のX方向のサイズを返す.メモリにロードする必要はありません
シグネチャ
int GUI_PNG_GetXSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数のポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
返値
PNG画像のX方向のサイズ
GUI_GIF_GetXSize()
Description
メモリにロードされたPNG画像のY方向のサイズを返します
シグネチャ
int GUI_PNG_GetYSize(const void * pFileData, int FileSize);
引数
引数 | 内容 |
---|---|
pFileData | PNGファイルを格納したメモリ領域の先頭ポインタ |
FileSize | ファイルのサイズ(バイト) |
返値
PNG画像のY方向のサイズ
GUI_GIF_GetXSize()
Description
PNG画像のY方向のサイズを返します.メモリにロードする必要はありません
シグネチャ
int GUI_PNG_GetYSizeEx(GUI_GET_DATA_FUNC * pfGetData, void * p);
引数
引数 | 内容 |
---|---|
pfGetData | データ取得のために呼ばれる関数のポインタ |
GetData関数についての詳細はデータ取得のEx()関数を参照して下さい | |
p | pfGetDataで参照される関数に渡されるvoidポインタ |
返値
PNG画像のY方向のサイズ
Ex()関数を使ったデータの取得
ストリーム・ビットマップと同じようにBMP,GIF,JPEG,PNGファイルは画像全てをRAMにロードすることなく使用できます.
この様な時に~Ex()関数を使用できます
これらの関数に共通なのはGetData関数を使うことです
使用する実際の処理に応じてGetData関数の働きは微妙に異なることに留意して下さい
下記に引数の表と,例を示します
GetData'関数のシグネチャ
int GUI_GET_DATA_FUNC(void * p, const U8 * * ppData, unsigned NumBytes, U32 Off);
引数
引数 | 内容 |
---|---|
p | アプリケーション定義のvoidポインタ |
ppData | BMP,GIF,JPEG:GetData関数はリクエストされたデータの格納先ポインタを設定しなければなりません |
ストリーム・ビットマップ,PNG: | |
ポインタの示すロケーションはGetData関数に設定されなければなりません | |
NumBytes | 要求したバイト数 |
Off | ソースデータを読み込む際のオフセット |
追加情報
~Ex()関数は,少なくともデータを1ライン読み込むためにGetData関数を必要とします
GetData関数は,アプリケーションで利用する最も大きな画像の場合でも,最低1ラインは読み込めるようにすることをお勧めします
関数の内部動作
一般的にGetData関数は,初めの方でオーバーヘッド情報を読みだすために1度呼び出されます.その後実際の画像データを読み出すために数回呼び出されます
返値
実際に読み込んだバイト数を返します
読み込んだバイト数が合わない場合,描画関数は直ちにリターンします
例
次にBMP,GIF,JPEGデータで使用するGetData関数の実装例を示します.
int APP_GetData(void * p, const U8 ** ppData, unsigned NumBytes, U32 Off) {
static char _acBuffer[0x200];
HANDLE * phFile;
DWORD NumBytesRead;
phFile = (HANDLE *)p;
//
// Check buffer size
//
if (NumBytes > sizeof(acBuffer)) {
NumBytes = sizeof(acBuffer);
}
//
// Set file pointer to the required position
//
SetFilePointer(*phFile, Off, 0, FILE_BEGIN);
//
// Read data into buffer
//
ReadFile(*phFile, acBuffer, NumBytes, &NumBytesRead, NULL);
//
// Set data pointer to the beginning of the buffer
//
*ppData = acBuffer;
//
// Return number of available bytes
//
return NumBytesRead;
}
例(PNGとストリーム・ビットマップ)
次にPNG,ストリーム・ビットマップで使用する場合のGetData関数の実装例を示します.
int APP_GetData(void * p, const U8 ** ppData, unsigned NumBytes, U32 Off) {
HANDLE * phFile;
DWORD NumBytesRead;
U8 * pData;
pData = (U8 *)*ppData;
phFile = (HANDLE *)p;
//
// Set file pointer to the required position
//
SetFilePointer(*phFile, Off, 0, FILE_BEGIN);
//
// Read data into buffer
//
ReadFile(*phFile, pData, NumBytes, &NumBytesRead, NULL);
//
// Return number of available bytes
//
return NumBytesRead;
}
色
emWinはカラー及びグレースケール(階調付き),白黒ディスプレイをサポートします.
様々な種類のディスプレイでemWinアプリケーションが使われています
既存のアプリケーションを新しいディスプレイで使用するためにはコンフィグレーションを変更します(通常はLCDConf.c)
このためにアプリケーションは論理色(logical colors)を使用します
論理色(logical color)のフォーマットは,ディスプレイの要求するカラーフォーマットとは独立しています.(or better pixel-)
カラーマネジメント
アプリケーションが描画処理の色を管理する場合,その色は各色8ビットとアルファ値8ビットを含む論理色になります
通常ディスプレイコントローラには,この文書でインデックス値(index value)と呼ぶ異なるフォーマットを必要とします
論理色(Logical colors)は使用するハードウェアに依存しません
’index values’フォーマットはディスプレイ・コントローラに依存します
emWinがディスプレイのどこに何を描画する時でも,アプリケーションが使用する論理色(logical color)は,コントローラのインデックス値(index value)に変換されます
この変換は,カラーコンバージョン処理によって自動的に行われます.この処理はディスプレイ・コンフィグレーション処理のLCD_X_Config()の中で設定されていなければなりません
これは,それぞれのレイヤーごとに行います
emWinは,幾つかのカラー・コンバージョンの方法をサポートします.
固定パレットモード(Fixed palette mode)
最もおすすめのカラーコンバージョンモードは固定パレットモードです
色をインデックス値(index value)に変えたり,逆の変換をしたりするコンバージョン処理を設定します
emWinは,この章の後半で説明する,予め定義された固定パレットモードを多数提供します
アプリケーション定義のカラーコンバージョン
必要な固定パレットモードが事前に定義されていない場合,カスタム・カラーコンバージョンが使用されます
これはカラーコンバージョンを独自に定義したものです
詳細はこの章の後で説明します
カスタム・パレットモード
ディスプレイ・コントローラがパレット・ベース・カラーマネジメントを使用する場合,固定パレットモードの1つが使用されるか,カスタムパレットを定義できます
カスタム・パレットが使われる時,emWinは最適化した最小二乗法検索(least-square deviation search)を使って論理色(logical colors)を変換しますディスプレイと全ての有効なパレット色とを比べ,最も近いものを使います
カスタム・パレットモードを使うとパフォーマンスは低下する場合があります
カスタムパレットの使い方についての詳細は,この章の後半で説明します
論理色(Logical colors)
論理色に含まれる各色は8ビット,アルファチャネルも8ビットです
emWinのバージョン5.3から2つの論理色(logical color)フォーマットをサポートします.
論理色(Logical color)フォーマットABGR
昔から上記が唯一のサポートされた論理色(logical color)フォーマットでした
その期間内のemWinを使用する全てのアプリケーションから使用される論理色(logical color)フォーマットは同じであることを意味します
論理色(Logical color)フォーマットARGB (デフォルト)
異なるピクセル・フォーマットを持つハードウェアが増えるにつれ,論理色(logical color)フォーマットとしてARGBを使うオプションを追加することに決めました.これは,幾つかの状況でパフォーマンスを大きく改善します
ARGBフォーマットのアルファ定義もABGRフォーマットとは違います
emWinのバージョン5.48からそのフォーマットがデフォルトです
ABGRフォーマットを使うためにGUIConf.hに以下を追加して下さい
#define GUI_USE_ARGB 0
ARGBへ切り替え
そのカラーフォーマットをインデックス値として使用するディスプレイ・コントローラの場合,その論理色(logical color)フォーマットを使うのは意味がありますこの場合,パフォーマンスが大きく改善されます.例えばハードウェアアクセラレータ付きのオンチップのLCDコントローラを使う場合です
コンフィグレーション
前のバージョンのemWinではARGBフォーマットを使うためにコンフィグレーションが必要でした
バージョン5.48からこのフォーマットはデフォルトになりGUIConf.hの編集は不要になりました
特定の状況下では古いコンフィグレーションに戻す必要があるかもしれません
必要であれば,以下をGUIConf.hに追加するだけです
´#define GUI_USE_ARGB 0´
既存のアプリケーションへの影響
ABGRからARGBに切り替えるときや逆の切り替えをするとき考慮が必要になるかもしれません
Colors
アプリケーションで色が16進数で定義されている場合,値は変換されるか変換マクロを使用する必要があります
次の表に ARGB, ABGRで同じ色を使うための変換マクロを示します
File Description
ARGB GUI_SetColor(0xA02010);
ABGR GUI_SetColor(0xFF1020A0);
Conversion macro GUI_SetColor(GUI_MAKE_COLOR(0xFF1020A0));
事前定義の全ての色は自動的に変換されます
32 bpp メモリデバイス
emWinは32bppメモリデバイス用の幾つかの機能を持っています
これらの機能ではメモリデバイス・フォーマットが決まっている事が必要です
ABGRモードを使う場合,フォーマットはGUICC_8888です
ARGBに切り替えるとフォーマットはGUICC_M8888Iです
DIB bitmaps
ビットマップ・コンバータに作られたパレットベースのbitmapsはパレットカラーの配列を含みます
例
static GUI_CONST_STORAGE GUI_COLOR _Colors8x1[] = {
0x000000, 0xC04040, 0x40C020, 0xC0A000,
0x4020E0, 0xC040A0, 0x00FFFF, 0xFFFFFF
};
All existing bitmaps need to be changed:
static GUI_CONST_STORAGE GUI_COLOR _Colors8x1[] = {
0xFF000000, 0xFF4040C0, 0xFF20C040, 0xFF00A0C0,
0xFFE02040, 0xFFA040C0, 0xFFFFFF00, 0xFFFFFFFF
};
アプリケーションが多くのビットマップを持つ場合 ビットマップコンバーターの設定を変えて再度変換した方が良いかもしれません
ビットマップ・コンバータの設定
ビットマップコンバータの設定でABGRの代わりにARGBに直接色を保存する場合,ARGBモードのSave colorsオプションを有効にする必要があります
定義されている色
独自に定義する色に加えて,次の表に示す,幾つかの標準的な色が事前にemWinに定義されています
例
/* Set background color to magenta */
GUI_SetBkColor(GUI_MAGENTA);
GUI_Clear();
カラーバーテスト
カラーバーのサンプルプログラムは13本のカラーバーを次の順序で表示します
- Black e Red
- White e Red
- Black e Green
- White e Green
- Black e Blue
- White e Blue
- Black e White
- Black e Yellow
- White e Yellow
10.Black e Cyan
11.White e Cyan
12.Black e Magenta
13.White e Magenta
この簡単な処理は,全てのディスプレイ,どのようなカラーフォーマットでも使用できるかもしれません
結果は表示できる色に依存します.この処理で全ての色を表示するには320 × 240サイズのディスプレイが必要です
この処理はディスプレイで異なる色設定がどのような効果を生むか確認するためのものです
ディスプレイの機能を確認するテストプログラムとしても利用されます.正しくカラーコンバージョンされているか色の確認に使います
スクリーンショットはwindowsのシミュレーションで撮られました.ディスプレイの設定が適切でハードウェアが正しく動いていれば実際のディスプレイと同じような見た目となるはずです
emWinに付属のサンプルCOLOR_ShowColorBar.cでこの処理を確認できます
固定パレットモード
次の表に有効な固定パレットモードとドライバやメモリデバイス生成時に必要な識別子を示します次に詳細な説明を示します
Identifier No. available
カラーマスク
GUICC_1 black and white 0x01 -> 00000001
GUICC_2 4 grayscales 0x03 -> 00000011
GUICC_4 16 grayscales 0x0F -> 00001111
GUICC_5 32 grayscales 0x1F -> 00011111
GUICC_16 16 0x0F -> 00001111
GUICC_1616I 16 + 4 bit alpha
blending 0xFF -> 11111111
GUICC_111 8 0x07 -> 00000BGR
GUICC_M111 8 0x07 -> 00000RGB
GUICC_222 64 0x3F -> 00BBGGRR
GUICC_M222 64 0x3F -> 00RRGGBB
GUICC_8 256 grayscales 0xFF -> 11111111
GUICC_233 256 0xFF -> BBGGGRRR
GUICC_M233 256 0xFF -> RRGGGBBB
GUICC_323 256 0xFF -> BBBGGRRR
GUICC_M323 256 0xFF -> RRRGGBBB
GUICC_332 256 0xFF -> BBBGGGRR
GUICC_M332 256 0xFF -> RRRGGGBB
GUICC_444_12 4096 0x0FFF -> 0000BBBBGGGGRRRR
GUICC_M444_12 4096 0x0FFF -> 0000RRRRGGGGBBBB
GUICC_444_12_1 4096 0xFFF0 -> BBBBGGGGRRRR0000
GUICC_444_16 4096 0x7BDE -> 0BBBB0GGGG0RRRR0
GUICC_M444_16 4096 0x7BDE -> 0RRRR0GGGG0BBBB0
GUICC_M4444I 4096 + 4 bit alpha
blending 0xFFFF -> AAAARRRRGGGGBBBB
GUICC_555 32768 0x7FFF -> 0BBBBBGGGGGRRRRR
GUICC_M555 32768 0x7FFF -> 0RRRRRGGGGGBBBBB
GUICC_M1555I 32768 + 1 bit
transparency 0xFFFF -> TRRRRRGGGGGBBBBB
GUICC_565 65536 0xFFFF -> BBBBBGGGGGGRRRRR
GUICC_M565 65536 0xFFFF -> RRRRRGGGGGGBBBBB
GUICC_666 262144 0x0003FFFF -> BBBBBBGGGGGGRRRRRR
GUICC_M666 262144 0x0003FFFF -> RRRRRRGGGGGGBBBBBB
GUICC_666_9 262144 0x01FF01FF -> 0000000BBBBBBGGG0000000GGGRRRRRR
GUICC_M666_9 262144 0x01FF01FF -> 0000000RRRRRRGGG0000000GGGBBBBBB
GUICC_822216 256 0xFF
- Bits are not explicitly assigned to a color.
GUICC_84444 240 0xFF - 明示的に色に割り当てられていません
GUICC_8666 232 0xFF - 明示的に色に割り当てられていません
Identifier No. available
カラーマスク
GUICC_8666_1 233 (232 + transparency) 0xFF - 明示的に色に割り当てられていません
GUICC_88666I 232 + 8 bits alpha
blending 0xFFFF -> AAAAAAAACCCCCCCC
GUICC_888 16M 0x00FFFFFF -> BBBBBBBBGGGGGGGGRRRRRRRR
GUICC_M888 16M 0x00FFFFFF -> RRRRRRRRGGGGGGGGBBBBBBBB
GUICC_8888 16M + 8 bit alpha
blending 0xFFFFFFFF -> AAAAAAAABBBBBBBBGGGGGGGGRRRRRRRR
GUICC_M8888 16M + 8 bit alpha
blending 0xFFFFFFFF -> AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB
GUICC_M8888I 16M + 8 bit alpha
blending 0xFFFFFFFF -> AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB
GUICC_0 - CUSTOM DEFINED FIXED PALETTE MODE
GUICC_1_2
GUICC_1_4
GUICC_1_5
GUICC_1_8
GUICC_1_16
GUICC_1_24
2 (白黒)
0x00000001
0x00000003
0x0000001F
0x000000FF
0x0000FFFF
0x00FFFFFF
Legend
R - 赤
G - 緑
B - 青
C - Color (色に明示的な割り当てが無い場合)
T - 透明ビット
A - アルファマスク
固定パレットモードの詳細
事前に定義されたそれぞれの固定パレットモードでの有効な色について詳しく説明します
GUICC_1: 1 bpp (白黒)
モノクロ・ディスプレイで使用するモードです.ピクセル当たり1ビットです
有効色: 2
GUICC_2: 2 bpp (4グレースケール)
モノクロディスプレイで使用するモードです.ピクセル当たり2ビットです
有効色: 2 × 2 = 4
GUICC_4: 4 bpp (16グレースケール)
モノクロディスプレイで使用するモードです.ピクセル当たり4ビットです
色数: 2 × 2 × 2 × 2 = 16
GUICC_5: 5 bpp (グレースケール32階調)
モノクロ・ディスプレイで使用するモードです.ピクセル当たり5ビットです
色数: 2 × 2 × 2 × 2 × 2 = 32
GUICC_111: 3 bpp (各色2段階)
ディスプレイが各ピクセル1ビットをサポートするか,深い色深度に必要な十分なメモリがない場合に,基本的な8色で十分であればこのモードを使用できます
色数: 2 × 2 × 2 = 8
カラーマスク: BGR
GUICC_M111: 3 bpp (各色2段階), 赤と青がスワップされている
ディスプレイが各ピクセル1ビットをサポートするか,深い色深度に必要な十分なメモリがない場合に,基本的な8色で十分であればこのモードを使用できます色数は111モードと同じです
色数: 2 × 2 × 2 = 8
カラーマスク: RGB
GUICC_16: 4 bpp (16色)
ディスプレイが各ピクセル4ビットをサポートするか,深い色深度に必要な十分なメモリがない場合に,基本的な16色で十分であればこのモードを使用できます
色数: 2 × 2 × 2 × 2 = 16
GUICC_1616I: 8 bpp (16色 + 4ビットアルファマスク)
GUICC_16と同じ色です下位4ビットは色を表します.上位4ビットはアルファブレンディングに使用されます
色数: 2 × 2 × 2 × 2 = 16
カラーマスク: AAAACCCC
(AAAA = 0xF - opaque)
(AAAA = 0x0 - transparent)
GUICC_222: 6 bpp (各色4階調)
ハードウェアがそれぞれの色についてパレットを持っていないなら,このモードは良い選択です
1色あたり2ビット確保されます.通常1ピクセルあたり1バイトを使用します
色数: 4 × 4 × 4 = 64
カラーマスク: BBGGRR
GUICC_M222: 6 bpp (各色4階調),赤と青がスワップされています.
ハードウェアがそれぞれの色についてパレットを持っていないなら,このモードは良い選択です
各色2ビットを使います.通常1ピクセルに1バイトを使用します
表現できる色は222モードと同じです
色数: 4 × 4 × 4 = 64
カラーマスク: RRGGBB
GUICC_8: 8 bpp (グレースケール256階調)
このモードでは 8 bppでグレースケールを表現しますグレースケールを滑らかに表示できるモードです
色数: 256階調のグレースケール
GUICC_233: 8 bpp
このモードは256色をサポートします
赤と緑色に3ビットずつが使われます.青色は2ビットで表現されます
次の写真の通り
緑と赤色は8段階,青色は4段階になります
このモードの使用はお勧めしません.リアルな影を表現できないからです
色数: 4 × 8 × 8 = 256
カラーマスク: BBGGGRRR
GUICC_M233: 8 bpp, 赤と青がスワップされています
このモードは256色をサポートします
赤と緑色に3ビットずつが使われます.青色は2ビットで表現されます
緑と赤色は8段階,青色は4段階になります
このモードの使用はお勧めしません.リアルな影を表現できないからです
色数: 4 × 8 × 8 = 256
カラーマスク: RRGGGBBB
GUICC_323: 8 bpp
このモードは256色をサポートします
赤と青色に3ビットずつが使われます.緑色は2ビットで表現されます
次の写真の通り
結果として緑と赤色は8段階,青色は4段階になります
このモードの使用はお勧めしません.リアルな影を表現できないからです
色数: 8 × 4 × 8 = 256
カラーマスク: BBBGGRRR
GUICC_M323: 8 bpp, 赤と青がスワップされています
このモードは256色をサポートします
赤と青色に3ビットずつが使われます.緑色は2ビットで表現されます
表現できる色は323モードと同じです
結果として赤色と青色は8段階,緑色は4段階になります
このモードの使用はお勧めしません.リアルな影を表現できないからです
色数: 8 × 4 × 8 = 256
カラーマスク: RRRGGBBB
GUICC_332: 8 bpp
このモードは256色をサポートします
青と緑色に3ビットずつが使われます.赤色は2ビットで表現されます
次の写真の通り
結果として緑と青色は8段階,赤色は4段階になります
このモードの使用はお勧めしません.リアルな影を表現できないからです
色数: 8 × 8 × 4 = 256
カラーマスク: BBBGGGRR
GUICC_M332: 8 bpp, 赤と青はスワップされています
このモードは256色をサポートします
赤と緑色に3ビットずつが使われます.青色は2ビットで表現されます
結果として赤色と緑色は8段階,青色は4段階になります
このモードの使用はお勧めしません.リアルな影を表現できないからです
色数: 8 × 8 × 4 = 256
カラーマスク: RRRGGGBB
GUICC_444_12:
赤と緑と青色はそれぞれ4ビットです
色数: 16 × 16 × 16 = 4096
カラーマスク: 0000BBBBGGGGRRRR
GUICC_444_16:
赤と緑と青色はそれぞれ4ビットです
色間の1ビットは使用しません
表現できる色は444_12モードと同じです
色数: 16 × 16 × 16 = 4096
カラーマスク: 0BBBB0GGGG0RRRR0
GUICC_M444_12: 赤と青はスワップされていますThe red, green and blue components are each 4 bits.
表現できる色は444_12モードと同じです
色数: 16 × 16 × 16 = 4096
カラーマスク: RRRRGGGGBBBB
GUICC_M444_16: red and blue swapped
赤と緑と青色はそれぞれ4ビットです
色間の1ビットは使用しません
表現できる色は444_12モードと同じです
色数: 16 × 16 × 16 = 4096
カラーマスク: 0RRRR0GGGG0BBBB0
GUICC_M444_12_1:
赤と緑と青色はそれぞれ4ビットです
カラーマスクの下位4ビットは使用しません
表現できる色は444_12モードと同じです
色数: 16 × 16 × 16 = 4096
カラーマスク: BBBBGGGGRRRR0000
GUICC_M4444I: 12ビットの色 + 4ビットのアルファマスク
赤と緑と青はそれぞれ4ビットを使用します.上位4ビットはアルファブレンディング用です
色数: 16 × 16 × 16 = 4096
カラーマスク: AAAARRRRGGGGBBBB
(AAAA = 0xF - opaque)
(AAAA = 0x0 - transparent)
GUICC_555: 15 bpp
15 bppの色深度のカラーコントローラを持つディスプレイではこのモードの使用が必要です赤と緑と青色それぞれが5ビットです
色数: 32 × 32 × 32 = 32768
カラーマスク: BBBBBGGGGGRRRRR
GUICC_M555: 15 bpp, 赤と青がスワップされています
15 bppの色深度のカラーコントローラを持つディスプレイではこのモードの使用が必要です
赤と緑と青色それぞれが5ビットです表現できる色は555モードと同じです
色数: 32 × 32 × 32 = 32768
カラーマスク: RRRRRGGGGGBBBBB
GUICC_M1555I: 色情報15ビット + 透明情報1ビット
表現できる色は565モードと同じです
赤と緑と青色それぞれが5ビットです.上位ビットは透明情報です
色数: 32 × 32 × 32 = 32768
カラーマスク: ARRRRRGGGGGBBBBB
(A = 1 - opaque)
(A = 0 - transparent)
16 bppの色深度のカラーコントローラを持つディスプレイではこのモードの使用が必要です
赤と青色に5ビットずつが使われます.緑色は6ビットで表現されます
色数: 32 × 64 × 32 = 65536
カラーマスク: BBBBBGGGGGGRRRRR
GUICC_M565: 16 bpp,赤と青がスワップされています
16 bppの色深度のカラーコントローラを持つディスプレイではこのモードの使用が必要です
表現できる色は565モードと同じです
色数: 32 × 64 × 32 = 65536
カラーマスク: RRRRRGGGGGGBBBBB
GUICC_666: 18 bpp
18 bppの色深度のカラーコントローラを持つディスプレイではこのモードの使用が必要です
赤と緑と青色それぞれが6ビットです
色数: 64 × 64 × 64 = 262144
カラーマスク: BBBBBBGGGGGGRRRRRR
GUICC_M666: 18 bpp, 赤と青がスワップされています
18 bppの色深度のカラーコントローラを持つディスプレイではこのモードの使用が必要です
赤と緑と青色それぞれが6ビットです
色数: 64 × 64 × 64 = 262144
カラーマスク: RRRRRRGGGGGGBBBBBB
GUICC_666_9: 18 bpp
16 bppの色深度のカラーコントローラを持つディスプレイではこのモードの使用が必要です
赤と緑と青色それぞれが6ビットです
色数: 64 × 64 × 64 = 262144
カラーマスク: 0000000BBBBB-
BGGG0000000GGGRRRRRR
GUICC_M666_9: 18 bpp,赤と青はスワップされています
18 bppの色深度のカラーコントローラを持つディスプレイではこのモードの使用が必要です
赤と緑と青色それぞれが6ビットです
色数: 64 × 64 × 64 = 262144
カラーマスク: RRRRRRGGGGGGBBBBBB
GUICC_822216: 8 bpp, 各色2段階 + 8階調グレースケール + 16段階アルファブレンディング
このモードはプログラマブルなルックアップテーブルと共に使われます.色数は256でアルファブレンディングをサポートします基本的な8色もしくは8階調グレースケールをサポートします.16段階のアルファブレンディングをサポートします
必要な色数が少なく,多階調のアルファ・ブレンディングが必要な場合に使用できます
色数: (2 × 2 × 2 + 8) × 16 = 256
GUICC_84444: 8 bpp, 各色4段階 + 16階調グレースケール + 4(3)段階アルファ・ブレンディング
このモードはプログラマブルなルックアップ・テーブルと共に使われます.色数は240でアルファ・ブレンディングをサポートします
各色4段階,さらに16階調グレースケールを使えます.4段階のアルファ・ブレンディングが各色/グレースケールで使えます
少ない段数のアルファ・ブレンディングで色数は多く欲しい場合に適しています
色数: (4 × 4 × 4 + 16) × 3 = 240
GUICC_8666: 8bpp,各色6段階 + 16階調グレースケール
このモードは頻繁にプログラマブルなルックアップ・テーブルと共に用いられます.パレット使った256色をサポートします有効な色が分かるスクリーンショットを次に示します;
全般的なアプリケーションに向くモードです各色6段階,さらに16階調グレースケール
色数: 6 × 6 × 6 + 16 = 232
GUICC_8666_1: 8bpp,各色6段階 + 16階調グレースケール + 透明
このモードは,複数レイヤーのコンフィグレーションでプログラマブルな色ルックアップテーブルと共に用いられます.パレットを使って256色をサポートします
8666と86661の違いは,86661モードの最初の色が使用されないことです
なのでカラーコンバージョン処理のGUI_Color2Index()が透明を扱っている場合,0を返すことはありません
色数: 6 × 6 × 6 + 16 = 232
GUICC_88666I: 16bpp - 8ビットカラー (各色6段階 + 16グレースケール) + 8ビット・アルファ・ブレンディング
このモードで扱える色はGUICC_8666と同じです
上位8ビットはアルファ・ブレンディングに使われます
カラーマスク: AAAAAAAACCCCCCCC
(AAAAAAAA = 0xFF - opaque)
(AAAAAAAA = 0x00 - transparent)
GUICC_888: 24 bpp
24ビットの色深度を持つディスプレイ・コントローラではこのモードの使用が必要です
赤と緑と青はそれぞれ8ビットです
色数: 256 × 256 × 256 = 16777216
カラーマスク: BBBBBBBBGGGGGGGGRRRRRRRR
GUICC_M888: 24 bpp,赤と青はスワップされています
24 bppの色深度のカラーコントローラを持つディスプレイではこのモードの使用が必要です
赤と緑と青はそれぞれ8ビットです
色数: 256 × 256 × 256 = 16777216
カラーマスク: RRRRRRRRGGGGGGGGBBBBBBBB
GUICC_8888: 32 bpp
32 bppの色深度のカラーコントローラを持つディスプレイではこのモードの使用が必要です.下位3バイトは色情報です.上位バイトはアルファ・ブレンディングに使用されます
赤と緑と青及びアルファ・ブレンディングはそれぞれ8ビットです
有効色: 256 × 256 × 256 = 16777216
カラーマスク: AAAAAAAABBBBBBBBGGGGGGGGRRRRRRRR
GUICC_M8888: 32 bpp, red and blue swapped
色深度32bppのRGBをサポートするディスプレイコントローラではこのモードの使用が必須です.下位3バイトは色情報に使われ,上位バイトはアルファ・ブレンディングに使用されます
赤と緑と青及びアルファ・ブレンディングはそれぞれ8ビットです
有効色: 256 × 256 × 256 = 16777216
カラーマスク: AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB
GUICC_M8888I: 32 bpp, 赤と青はスワップされています
このカラーモードはGUICC_M8888とアルファ・ブレンディングが反転されていること以外は完全に同じです
カラーマスク: AAAAAAAARRRRRRRRGGGGGGGGBBBBBBBB
(AAAAAAAA = 0xFF - opaque)
(AAAAAAAA = 0x00 - transparent)
GUICC_0: カスタムパレットモード
カスタムパレットモードの使い方はアプリケーション定義のカラーコンバージョンのページにあります
GUICC_1_2, GUICC_1_4, ...
GUICC_1_24
これらのカラーコンバージョン処理は,1bpp以上の色深度を持つディスプレイ・ドライバの使用を可能にします. emWinパッケージにはカラー及びグレースケールのサポートを含みません
パレット全体の色が白か黒に変換されることを確実にします
例
emWinの有効なパッケージがカラー及びグレースケールのサポートを含まない場合,16ビットのインデックス値を必要とするドライバ GUICC_1_16のみが使用可能です
このカラーコンバージョンは各色の16ビットのパレット全てを0xFFFF (通常は白)か 0x0000 (通常は黒)に変換します
アプリケーション定義のカラーコンバージョン
必要とするカラーコンバージョンに固定パレットモードが1つも適合しない場合,このモードはアプリケーション定義のカラーコンバージョン処理を使用可能にします
これらの処理の目的はRGB値をハードウェアのインデックス値に変換したり,その逆変換をすることです
カスタム・カラーコンバージョン処理の定義例
下記にどの様に動作するか分かる例を示します
static unsigned _Color2Index_User(LCD_COLOR Color) {
unsigned Index;
/* Add code for converting the RGB value to an index value for the hardware */
return Index;
}
static LCD_COLOR _Index2Color_User(unsigned Index) {
LCD_COLOR Color;
/* Add code for converting the index value into an RGB value */
return Color;
}
static unsigned _GetIndexMask_User(void) {
return 0xffff; /* Example for using 16 bits */
}
const LCD_API_COLOR_CONV LCD_API_ColorConv_User = {
_Color2Index_User,
_Index2Color_User,
};
LCD_Color2Index_User関数はRGB値をディスプレイコントローラのインデックス値に変換する必要がある場合emWinから呼ばれます. 一方でLCD_Index2Color_User()関数はインデックス値をRGB値に変換する場合に呼ばれます
LCD_GetIndexMask_User はビットマスク値を返します, これは各ビットを1に設定します.ディスプレイ・コントローラに使われます.使わないビットは0に設定するべきですGUICC_44416モードのインデックス・マスクの例は0BBBB0GGGG0RRRR0
0は使用しないビットですこのモードのビットマスクは0x7BDEです
コンフィグレーションの章のカスタム・カラーコンバージョン処理の例
ディスプレイドライバ・デバイスを作るためAPIテーブルへのポインタが必要です次の例のようにAPIテーブルはカラーコンバージョン処理への関数ポインタを含みます
APIテーブルとカラーコンバージョン処理によい場所はConfigフォルダにあるコンフィグレーションファイルのLCDConf.cですこの処理はディスプレイドライバ・デバイスを作るLCD_X_Configの中で次のように使います
void LCD_X_Config(void) {
//
// Set display driver and color conversion for 1st layer
//
GUI_DEVICE_CreateAndLink(GUIDRV_LIN_16, &LCD_API_ColorConv_User, 0, 0);
.
.
.
}
カスタムパレットモード
emWinアプリケーションの必要事項を満たす固定パレットモードがない場合,カスタムパレットモードが使えます
カスタムパレットは全ての有効色をハードウェアに使用される順番で単純に単純に並べたものです
ディスプレイ・コントローラやディスプレイとの組み合わせが色を表示できるかにかかわらず,emWinはPCでそれらをシミュレーションできます.そしてターゲットシステム上での正しい色を扱うことができます
カスタムパレットを使うには色深度が ? 8 bppである必要があります
カスタムパレットは典型的にはLCD_X_Config()関数による初期化処理の中で設定されます.これはディスプレイドライバ・デバイスの生成と設定をする処理です
ルックアップテーブルの中でLCD_SetLUTEntryEx()の設定が必要です.これはLCD_SetLUT()とLCD_SetLUTEx()に呼び出されます
これらの処理はカスタムパレット・モジュールのGUICC_0.cの中で実装されますが,ハードウェアに合わせて調整が必要です詳細はルックアップテーブルAPIを参照して下さい
例
次に,カスタムパレットの使い方の例を示します
関数にパレットを渡します:
static const LCD_COLOR _aColors_16[] = {
0x000000, 0x0000FF, 0x00FF00, 0x00FFFF,
0xFF0000, 0xFF00FF, 0xFFFF00, 0xFFFFFF,
0x000000, 0x000080, 0x008000, 0x008080,
0x800000, 0x800080, 0x808000, 0x808080,
};
static const LCD_PHYSPALETTE _aPalette_16 = {
COUNTOF(_aColors_16), _aColors_16
};
void LCD_X_Config(void) {
//
// Set display driver and color conversion for 1st layer
//
.
.
.
//
// Set user palette data (only required if no fixed palette is used)
//
LCD_SetLUTEx(0, _aPalette_16);
}
LCD_PHYSPALETTE構造体の要素
Data type Element Description int NumEntries ルックアップテーブルに幾つの要素が保存されているか
const LCD_COLOR * pPalEntries
色の配列のポインタ
この配列の要素数は,少なくともNumEntriesに保存されている数と一致する必要があります
ルックアップテーブル API
関数 | 内容 |
---|---|
LCD_SetLUT() | 現在選択されているレイヤーに対するルックアップテーブルの設定 |
LCD_SetLUTEx() | 与えられたレイヤーへのルックアップテーブルの設定 |
LCD_SetLUTEntryEx() | ルックアップテーブルにエントリを1つ追加する |
LCD_SetLUT()
Description
現在選択されたレイヤーにルックアップテーブルを設定します
この関数はモジュール GUICC_0.cで定義されます
ハードウェアに合わせて調整が必要です
シグネチャ
void LCD_SetLUT(const LCD_PHYSPALETTE * pPalette);
引数
引数 | 内容 |
---|---|
pPalette | LCD_PHYSPALETTE構造体へのポインタ |
LCD_SetLUTEx()
Description
与えらえたレイヤーへルックアップテーブルを設定します
この関数はモジュール GUICC_0.cで定義されます
ハードウェアに合わせて調整が必要です
シグネチャ
void LCD_SetLUTEx(int LayerIndex, const LCD_PHYSPALETTE * pPalette);
引数
引数 | 内容 |
---|---|
LayerIndex | ルックアップテーブルを設定するレイヤーのインデックス |
pPalette | LCD_PHYSPALETTE構造体へのポインタ |
LCD_SetLUTEntryEx()
Description
ルックアップテーブルにデータを1つセットする
シグネチャ
int LCD_SetLUTEntryEx(int LayerIndex, U8 Pos, LCD_COLOR Color);
引数
引数 | 内容 |
---|---|
LayerIndex | ルックアップテーブルのエントリをセットするレイヤーのインデックス |
Pos | この色で使用するルックアップテーブルの位置 |
色 | |
色の値は32ビット |
返値
0 on success
1 on error.
=5.4終わり=