// IDB.cpp : コンソール アプリケーションのエントリ ポイントを定義します。 // #ifndef __IDB_IDB_H_ #define __IDB_IDB_H_ #include #include #include #include "CtrIcon.h" #include #ifndef BOOL typedef int BOOL; #endif //BOOL #ifndef TRUE // Any non zero value is considered TRUE #define TRUE 1 #endif //TRUE #ifndef FALSE #define FALSE 0 #endif // FALSE #define IDB_VERSION 9 // アイコンデータベースのバージョン #define IDB_ICON_DATA_MAX 512 // アイコンデータの最大件数 #define IDB_OWNER_ICON_DATA_MAX 256 // オーナーアイコンデータの最大件数 #define IDB_PICTURE_DATA_WIDTH 48 // アイコンテクスチャの幅 #define IDB_PICTURE_DATA_HEIGHT 48 // アイコンテクスチャの高さ #define IDB_PICTURE_DATA_DEPTH 2 // アイコンテクスチャのbit深度 #define IDB_PICTURE_DATA_SIZE (IDB_PICTURE_DATA_WIDTH*IDB_PICTURE_DATA_HEIGHT*IDB_PICTURE_DATA_DEPTH) #define IDB_APP_INFO_SHORT_TITLE_LENGTH 64 // 短いソフトタイトル(1行) #define IDB_APP_INFO_LONG_TITLE_LENGTH 128 // 長いソフトタイトル(2行) #define IDB_APP_INFO_PUBLISHER_LENGTH 64 // 発売元 #define IDB_RATING_MAX 16 // 1つのROMに設定できる最大レーティング数 #define IDB_LANGUAGE_MAX 16 // 1つのアイコン情報に入る最大言語数 enum IDB_IconFormat { IDB_ICON_FORMAT_CTR, IDB_ICON_FORMAT_TWL, IDB_ICON_FORMAT_NTR, IDB_ICON_FORMAT_MAX, IDB_ICON_FORMAT_INVALID = 0x7fffffff // 問合せ時にIDB_ICON_FORMAT_INVALIDを }; // データベースを取得するためのキーとなるユニークなID struct IDB_Key { nn::ProgramId programID; // プログラムID s32 remasterVersion; // リマスターバージョン() u8 padding[4]; // パディング(常に0) }; #define IDB_KEY_LATEST_VERSION (-1) // IDB_Key.remasterVersionにこれを指定するとオーナー枠、フレンド枠問わず最新のバージョンを取得する #define IDB_KEY_LATEST_VERSION_OWNER (-2) // IDB_Key.remasterVersionにこれを指定するとオーナー枠を優先して最新のバージョンを取得する // アプリ情報 struct IDB_SoftwareInfo { wchar_t shortTitle[IDB_APP_INFO_SHORT_TITLE_LENGTH]; // 短いタイトル wchar_t longTitle[IDB_APP_INFO_LONG_TITLE_LENGTH]; // 長いタイトル wchar_t publisher[IDB_APP_INFO_PUBLISHER_LENGTH]; // 発売元 } ; // NTR互換アイコン本体 struct IDB_NTRIconDataRaw { u8 image[ NN_CTR_BANNER_IMAGE_SIZE ]; u8 pltt[ NN_CTR_BANNER_PLTT_SIZE ]; }; // NTR互換アイコン struct IDB_NTRIconData { IDB_NTRIconDataRaw data; // このパディングは無効な領域を参照している事があるのでアクセスしてはならない u8 padding[sizeof(nn::CTR::SystemMenuDataIcon)-sizeof(IDB_NTRIconDataRaw)]; }; // TWL互換アイコン struct IDB_TWLIconData { nn::CTR::LegacyBannerAnime data; // このパディングは無効な領域を参照している事があるのでアクセスしてはならない u8 padding[sizeof(nn::CTR::SystemMenuDataIcon)-sizeof(nn::CTR::LegacyBannerAnime)]; }; // 1つのアイコンの全データ struct IDB_Icon { IDB_Key key; nn::CTR::SystemMenuDataRegion region; // リージョン情報(リージョン違いのアイコンは区別するが、gameCodeに含まれているため) u8 rating[IDB_RATING_MAX]; // レーティング情報 u32 matchMakeGameCode; // 合流ゲームID u64 matchMakeGameCodeBit; // 合流ゲームモードビット nn::CTR::SystemMenuDataTitle info[IDB_LANGUAGE_MAX]; // タイトル名などのソフト情報 IDB_IconFormat format; union { // それぞれIDB_IconFormatが nn::CTR::SystemMenuDataIcon *data; // ≒ IDB_IconPicture *data; IDB_ICON_FORMAT_CTRのとき IDB_TWLIconData *twlData; // IDB_ICON_FORMAT_TWLのとき IDB_NTRIconData *ntrData; // IDB_ICON_FORMAT_NTRのとき }; }; ///////////////////////////////////////////////////////////////////////////////// // コンパイル時アサート(静的アサート) ///////////////////////////////////////////////////////////////////////////////// // NW_COMPILER_ASSERT( sizeof(char)==1 ); // 8bit // NW_COMPILER_ASSERT( sizeof(u8)==1 ); // 8bit // NW_COMPILER_ASSERT( sizeof(u16)==2 ); // 16bit // NW_COMPILER_ASSERT( sizeof(u32)==4 ); // 32bit // NW_COMPILER_ASSERT( sizeof(IDB_FormatType)==sizeof(s32) ); // enumは32bit // NW_COMPILER_ASSERT( sizeof(IDB_Region)==sizeof(s32) ); // enumは32bit // NW_COMPILER_ASSERT( IDB_ICON_DATA_MAX>IDB_OWNER_ICON_DATA_MAX ); // オーナー枠はアイコンデータの最大個数以下 ///////////////////////////////////////////////////////////////////////////////// // 関数宣言 ///////////////////////////////////////////////////////////////////////////////// /*! @brief ライブラリの初期化を行います。 IDB_GetBufferSize()とIDB_IsInitialized()を除く、 他の関数を呼び出す前に一回だけ呼んでください。 @param[in] buffer IDBが使用するバッファを指定します。 同じonMemory引数を指定したIDB_GetBufferSize()で 取得したサイズのバッファを指定してください。 指定したバッファはライブラリで占有しますので、 IDB_Finalize()で開放するまでは外部からアクセスしないで下さい。 @param[in] onMemory 全ファイル(7M前後)をメモリにロードしたままにします。 高速に動作しますが、大量のメモリを必要とします。 また、IDB_Finalizeが低速になります。 @param[in] readOnly trueの時、ReadOnlyモードで動作するようになります。 ReadOnlyモードの時はIDB_Update()関数を呼ぶことが出来ません。 この引数がfalseの時はIDBの整合性を保つためHOMEメニューをはじめとする 各種アプレットに移行するときにFinalizeを呼ぶ必要があります。 ReadOnlyモードでも、IDBのファイルが存在しないなどの時には IDB_Initialize()中にファイルの書き込みが行われる事があります。 IDB_Initialize()中はHOME等のアプレットへは遷移しないで下さい。 また、データの最終アクセス日時も更新されなくなります。 この結果、よく参照するアイコンデータが消えやすくなります。 */ void IDB_Initialize( u8 *buffer, bool onMemory, bool readOnly ); /*! @brief ライブラリの終了処理を行います。 IDB_Initilize()で指定したbufferを返します。 このバッファは開放することができます。 呼んだ後、再度使用する場合はIDB_Initilize()を呼んでください。 通常はIDBへのライトバックが行われますが、 ReadOnlyモードで動作しているときは行われません。 ReadOnlyモードで動作していないときは 各種アプレットに移行するときにこの関数を呼ぶ必要があります。 */ u8 * IDB_Finalize( void ); /*! @brief IDBが使用するバッファのサイズを返します。 IDB_Initilize()を呼ぶ前にも呼ぶことができます。 onMemoryがfalseの時は12kbyte前後のバッファを使用します。 onmemoryをtrueにした場合、IDB_Initilizeのonmemory をtrueに指定した時に要求されるサイズを返します。(7M前後) @param[in] onMemory IDB_Initialize()のonMemoryと同じ値を与えてください。 */ u32 IDB_GetBufferSize( bool onMemory = false ); /*! @brief IDBを使用する準備が出来たかどうかを返します。 IDB_Initilize()を呼ぶ前にも呼ぶことができます。 */ BOOL IDB_IsInitialized( void ); /*! @brief アイコンデータの登録を行います。IDB_Index型の変数を返します。 必ずアイコンデータが登録されるという保証はありません。 登録できなかった場合はFALSEを返します。 関数は値のコピーを行いますので、登録したアイコンデータ(inIcon)の インスタンスは本関数呼出し後に削除してもかまいません。 @param[in] inIcon 登録するアイコンデータへのポインタです。 */ BOOL IDB_Update( IDB_Icon *inIcon ); /*! @brief アイコンデータの取得を行います。 データが存在した場合はTRUEを、しなかった場合はFALSEを返します。 FALSEを返したとき、*outIconの中身は更新されません。 IDB_Updateでアイコンを登録した直後でも存在しないことがあります。 @param[in] outIcon データを取得するアイコンデータへのポインタです。 実体を初期化する必要はありませんが、 outIcon->dataだけは有効なIDB_IconPicture型を指している必要があります。 @param[key] outIcon 取得するデータを一意に識別するキーです。 @return データが取得できた場合はTRUE */ BOOL IDB_Select( IDB_Icon *outIcon, IDB_Key *key ); BOOL IDB_IsContains( IDB_Key *key ); u32 IDB_GetDataNum(); #endif // ifndef __IDB_IDB_H_