1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

マイコン用GUIライブラリ emWin Graphical API5.4

Posted at

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本のカラーバーを次の順序で表示します

  1. Black e Red
  2. White e Red
  3. Black e Green
  4. White e Green
  5. Black e Blue
  6. White e Blue
  7. Black e White
  8. Black e Yellow
  9. 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終わり=

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?