#ifndef FNT_STRUCT_H_ #define FNT_STRUCT_H_ /** -------------------------------------------------------------------- セル情報構造体 ----------------------------------------------------------------------*/ typedef struct tagFntCellInfo { u16 width : 5; // 最大32 u16 height : 5; // 最大32 u16 dummy : 6; } tFntCellInfo; /** -------------------------------------------------------------------- 幅情報構造体 ----------------------------------------------------------------------*/ typedef struct tagFntWidthEntry { u16 offset : 8; // オフセット(書きはじめまでのピクセル数) u16 width : 8; // 幅 } tFntWidthEntry; /** -------------------------------------------------------------------- フォントCMAPの連続領域用構造体 ----------------------------------------------------------------------*/ typedef struct tagFntCtEntry { u16 start; u16 end; } tFntCtEntry; /** -------------------------------------------------------------------- フォント管理構造体 ----------------------------------------------------------------------*/ typedef struct tagFntEntry { const u16* font_image; // フォントイメージへのポインタ const u16* cmap; // コード->glyph変換用cmapへのポインタ tFntCtEntry* ctmap; // コード->glyph変換用cmapへのポインタ tFntWidthEntry* width_table; // 幅テーブル u16 glyph_num; // glyph数 u16 default_glyph; // 見つからなかったときに使われる文字のglyph s16 cell_size; // 一文字のセルサイズ(ワード単位) tFntCellInfo cell_info; // セルの情報 u16 cmap_num; // glyph_comp == 1のときのcmapの数 u16 ctmap_num; // glyph_comp == 1のときのctmapの数 u32 glyph_sort : 1; // グリフがソートされているかどうか u32 glyph_comp : 1; // グリフの連続されている部分が圧縮されているかどうか } tFntEntry; /** -------------------------------------------------------------------- 描画する先のデバイスコンテキスト管理構造体 ----------------------------------------------------------------------*/ typedef struct tagFntDrawContext { u16* canvas; u16 width; u16 height; u16 canvas_type; u8 pad[2]; tFntEntry* font; } tFntDrawContext; /** -------------------------------------------------------------------- レイアウト表示用の構造体 ----------------------------------------------------------------------*/ /** -------------------------------------------------------------------- レイアウトヘッダー ----------------------------------------------------------------------*/ typedef struct tagFntLayoutHeader { u8 name[4]; u16 version; u16 table_num; } tFntLayoutHeader; /** -------------------------------------------------------------------- CMAPヘッダー ----------------------------------------------------------------------*/ typedef struct tagFntCmapHeader { u32 ct_offset; u32 cm_offset; } tFntCmapHeader; /** -------------------------------------------------------------------- レイアウト表示のためのメッセージ構造体 ----------------------------------------------------------------------*/ typedef struct tagFntPosition { s16 pos : 12; u16 pos_origin : 2; u16 text_align : 2; } tFntPosition; // この宣言でも、2Bytesにきちんと収まる。処理系によっては、sizeof()でチェックすること。 /** ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 文字レイアウトを表示するための構造体。 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /** -------------------------------------------------------------------- メッセージ構造体 メッセージデータは、 tFntLayoutHeader header; tFntMessage message[header.table_num]; で構成されます。 ----------------------------------------------------------------------*/ typedef struct tagFntMessage { // 位置 tFntPosition x; tFntPosition y; // 文字間隔 s16 spacing_x : 8; s16 spacing_y : 8; // 色 u16 color : 8; u16 palette : 4; u16 font : 4; // メッセージへのオフセット u32 offset; } tFntMessage; /** ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ OBJのセルを扱うための構造体 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /** -------------------------------------------------------------------- セル情報構造体 セルデータは、 tFntLayoutHeader header; tFntCell cell[header.table_num]; で構成されます。 ----------------------------------------------------------------------*/ typedef struct tagFntCell { // 位置 tFntPosition x; tFntPosition y; // セルキャラクタへのインデックス u32 cell_index; } tFntCell; /** -------------------------------------------------------------------- セルキャラクタ情報構造体 セルキャラクタデータは、 tFntLayoutHeader header; tFntCellCharHeader char_header; tFntCellCharInfo cellchar_info[header.table_num]; tFntCellCharOam cellchar_oam[]; u16 char_data[]; で構成されます。 ----------------------------------------------------------------------*/ /** -------------------------------------------------------------------- セルキャラクタヘッダ ----------------------------------------------------------------------*/ typedef struct tagFntCellCharHeader { u32 cell_offset; // tFntCellChar配列へのオフセット u32 oam_offset; // tFntOamChar配列へのオフセット u32 char_offset; // キャラクタデータへのオフセット u32 char_size; // キャラクタデータのサイズ u32 char_mode : 3; // OBJVRAMMODE_CHAR_1DのEXOBJフラグ } tFntCellCharHeader; /** -------------------------------------------------------------------- セルキャラクタ情報 ----------------------------------------------------------------------*/ typedef struct tagFntCellCharInfo { u16 width : 8; // セルの大きさ情報。 u16 height : 8; u16 oam_index; // oam_offset[oam_index] から、 u16 oam_num; // oam_num分だけのoamを使用します。 } tFntCellCharInfo; /** -------------------------------------------------------------------- OAM情報 ----------------------------------------------------------------------*/ typedef struct tagFntCellCharOam { GXOamAttr attr; // CharNameの部分は、使用しません。(ロード位置をユーザ定義にするため。) u16 char_index; // キャラクタデータのインデックス。 u16 char_num; // キャラクタデータの数。(最大、64ぐらい) } tFntCellCharOam; /** ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ タッチの場所を取得するための構造体 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ /** -------------------------------------------------------------------- リージョン情報 ----------------------------------------------------------------------*/ typedef struct tagFntRegion { // 位置 tFntPosition x; tFntPosition y; // サイズ u16 width : 8; // セルの大きさ情報。 u16 height : 8; } tFntRegion; #endif // FNT_STRUCT_H_