1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: lyt_ArcResourceAccessor.h 4 5 Copyright (C)2009-2010 Nintendo Co., Ltd./HAL Laboratory, Inc. All rights reserved. 6 7 These coded instructions, statements, and computer programs contain 8 proprietary information of Nintendo of America Inc. and/or Nintendo 9 Company Ltd., and are protected by Federal copyright law. They may 10 not be disclosed to third parties or copied or duplicated in any form, 11 in whole or in part, without the prior written consent of Nintendo. 12 13 $Revision: 23638 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NW_LYT_ARCRESOURCEACCESSOR_H_ 17 #define NW_LYT_ARCRESOURCEACCESSOR_H_ 18 19 #include <nw/types.h> 20 21 #include <nw/ut/ut_LinkList.h> 22 #include <nw/lyt/lyt_FontContainer.h> 23 #include <nw/lyt/lyt_ResourceAccessor.h> 24 #include <nw/lyt/lyt_TextureContainer.h> 25 #include <nw/lyt/lyt_Arc.h> 26 #include <cstddef> 27 28 namespace nw 29 { 30 namespace lyt 31 { 32 33 //--------------------------------------------------------------------------- 34 //! :category リソースアクセサ 35 //! 36 //! @brief アーカイブリソースにアクセスするためのクラスです。 37 //! 38 //! @since 2009/09/18 初版。 39 //--------------------------------------------------------------------------- 40 class ArcResourceAccessor : public ResourceAccessor 41 { 42 public: 43 //! パス名の最大長です。 44 static const int ROOTPATH_MAX = 64; 45 46 //---------------------------------------- 47 //! @name コンストラクタ/デストラクタ 48 //@{ 49 50 //! @brief コンストラクタです。 51 //! 52 //! @since 2009/09/18 初版。 53 //! 54 ArcResourceAccessor(); 55 56 //@} 57 58 //---------------------------------------- 59 //! @name 設定/取得 60 //@{ 61 62 //! @brief アーカイブデータを登録します。 63 //! 64 //! @param archiveStart アーカイブデータへのポインタです。 65 //! @param resourceRootDirectory リソース検索のルートとなるディレクトリ名です。 66 //! 67 //! @return 登録に成功したら true、失敗したら falseを返します。 68 //! 69 //! @since 2009/09/18 初版。 70 //! 71 bool Attach( 72 void* archiveStart, 73 const char* resourceRootDirectory 74 ); 75 76 //! @brief 登録したアーカイブデータの登録を解除します。 77 //! 78 //! @return 登録されていたアーカイブデータへのポインタを返します。 79 //! 80 //! @since 2009/09/18 初版。 81 //! 82 void* Detach(); 83 84 virtual void* GetResource( 85 ResType resType, 86 const char* name, 87 u32* pSize = 0 88 ); 89 90 //! @brief アクセサにアーカイブが設定されているかどうかを判定します。 91 //! 92 //! @return すでにアーカイブが設定されている場合は true を返します。 93 //! 94 //! @since 2009/09/18 初版。 95 //! IsAttached()96 bool IsAttached() const 97 { 98 return m_ArcBuf != 0; 99 } 100 101 //! @brief アーカイブの先頭アドレスを取得します。 102 //! 103 //! @return 104 //! 設定されているアーカイブの先頭アドレスを返します。 105 //! アーカイブが設定されていない場合は NULL を返します。 106 //! 107 //! @since 2009/09/18 初版。 108 //! GetArchiveDataStart()109 const void* GetArchiveDataStart() const 110 { 111 return m_ArcBuf; 112 } 113 114 //! @brief フォントオブジェクトを登録します。 115 //! 116 //! @details 117 //! フォントオブジェクトをリソースアクセサに設定し、 118 //! GetFont() の検索対象に含まれるようにします。 119 //! 120 //! @param name フォントリソースの名前です。 121 //! @param pFont フォントオブジェクトへのポインタです。 122 //! 123 //! @return 登録キーを返します。キーは登録の抹消に使用します。 124 //! 125 //! @sa UnregistFont 126 //! 127 //! @since 2010/01/26 初版。 128 //! 129 FontKey RegistFont(const char* name, font::Font* pFont); 130 131 //! @brief フォントオブジェクトの登録を解除します。 132 //! 133 //! @param key フォントの登録時に取得した登録キーを指定します。 134 //! 135 //! @sa RegistFont 136 //! 137 //! @since 2010/01/26 初版。 138 //! 139 void UnregistFont(FontKey key); 140 141 //! @brief テクスチャを登録します。 142 //! 143 //! @details 144 //! テクスチャをリソースアクセサに設定し、 145 //! GetTexture() の検索対象に含まれるようにします。 146 //! 147 //! @param name テクスチャの名前です。 148 //! @param textureInfo テクスチャ情報です。 149 //! 150 //! @return 登録キーを返します。キーは登録の抹消に使用します。 151 //! 152 //! @sa UnregistTexture 153 //! 154 //! @since 2010/01/26 初版。 155 //! 156 TextureKey RegistTexture(const char* name, const TextureInfo& textureInfo); 157 158 //! @brief テクスチャの登録を解除します。 159 //! 160 //! @param key テクスチャの登録時に取得した登録キーを指定します。 161 //! 162 //! @sa RegistTexture 163 //! 164 //! @since 2010/01/26 初版。 165 //! 166 void UnregistTexture(TextureKey key); 167 168 //! @brief テクスチャ情報を取得します。 169 //! 170 //! @details 171 //! name で指定したテクスチャリソース名と関連付けられた 172 //! テクスチャ情報を取得します。 173 //! 174 //! テクスチャを所有していない場合には LoadTexture() でロードを試みます。 175 //! 176 //! @param name テクスチャリソースの名前です。 177 //! 178 //! @return テクスチャ情報を返します。 179 //! テクスチャを所有していない場合にはロードを試みます。 180 //! ロードできなかった場合にはテクスチャオブジェクトには無効な値 181 //! (TextureInfo::INVALID) が設定されます。 182 //! 183 //! @sa LoadTexture 184 //! 185 //! @since 2010/06/18 初版。 186 //! 187 virtual const TextureInfo GetTexture(const char* name); 188 189 //! @brief フォントを取得します。 190 //! 191 //! @details 192 //! name で指定したフォントリソース名と関連付けられた 193 //! フォントオブジェクトを取得します。 194 //! 195 //! 指定されたフォントが登録されていなかった場合には 196 //! LoadFont() により生成したフォントを登録します。 197 //! 198 //! @param name フォントリソースの名前です。 199 //! 200 //! @return フォントへのポインタを返します。 201 //! 202 //! @sa LoadFont 203 //! 204 //! @since 2010/07/16 初版。 205 //! 206 virtual font::Font* GetFont(const char* name); 207 208 //@} 209 210 private: 211 ARCHandle m_ArcHandle; 212 void* m_ArcBuf; 213 FontContainer m_FontList; 214 TextureContainer m_TextureList; 215 wchar_t m_ResRootDir[ROOTPATH_MAX]; 216 wchar_t m_ResNameWork[ROOTPATH_MAX]; 217 }; 218 219 class MultiArcResourceAccessor; 220 221 //--------------------------------------------------------------------------- 222 //! :category リソースアクセサ 223 //! 224 //! @brief アーカイブの情報を保持するためのクラスです。 225 //! 226 //! @since 2009/09/18 初版。 227 //--------------------------------------------------------------------------- 228 class ArcResourceLink 229 { 230 friend class MultiArcResourceAccessor; 231 232 public: 233 //! パス名の最大長です。 234 static const int ROOTPATH_MAX = ArcResourceAccessor::ROOTPATH_MAX; 235 236 //---------------------------------------- 237 //! @name コンストラクタ/デストラクタ 238 //@{ 239 240 //! @brief コンストラクタです。 241 //! 242 //! @since 2009/09/18 初版。 243 //! ArcResourceLink()244 ArcResourceLink() 245 { 246 } 247 248 //@} 249 250 //---------------------------------------- 251 //! @name 設定/取得 252 //@{ 253 254 //! @brief アーカイブを設定し、初期化します。 255 //! 256 //! @details 257 //! アーカイブのフォーマットが正しくなければ失敗します。 258 //! 259 //! @param archiveStart アーカイブの先頭アドレスです。 260 //! @param resourceRootDirectory リソースのルートディレクトリ名です。 261 //! 262 //! @return アーカイブの設定が成功した場合は true を、失敗した場合は false を返します。 263 //! 264 //! @since 2009/09/18 初版。 265 //! 266 bool Set( 267 void* archiveStart, 268 const char* resourceRootDirectory 269 ); 270 271 //! @brief アーカイブの先頭アドレスを取得します。 272 //! 273 //! @return 設定されているアーカイブの先頭アドレスを返します。 274 //! 275 //! @since 2009/09/18 初版。 276 //! 277 const void* GetArchiveDataStart() const; 278 279 //! @brief リソースのルートディレクトリ名を取得します。 280 //! 281 //! @return リソースのルートディレクトリ名を返します。 282 //! 283 //! @since 2009/09/18 初版。 284 //! GetResRootDir()285 const wchar_t* GetResRootDir() const 286 { 287 return m_ResRootDir; 288 } 289 290 //@} 291 292 //! :private 293 //! リストのリンク情報です。 294 ut::LinkListNode m_Link; 295 296 private: GetArcHandle()297 ARCHandle* GetArcHandle() 298 { 299 return &m_ArcHandle; 300 } 301 302 ARCHandle m_ArcHandle; 303 wchar_t m_ResRootDir[ROOTPATH_MAX]; 304 }; 305 306 namespace internal 307 { 308 309 typedef ut::LinkList<ArcResourceLink, offsetof(ArcResourceLink, m_Link)> ArcResourceList; 310 311 } // namespace internal 312 313 //--------------------------------------------------------------------------- 314 //! :category リソースアクセサ 315 //! 316 //! @brief 複数のアーカイブリソースにアクセスするためのクラスです。 317 //! 318 //! @since 2009/09/18 初版。 319 //--------------------------------------------------------------------------- 320 class MultiArcResourceAccessor : public ResourceAccessor 321 { 322 public: 323 //! パス名の最大長です。 324 static const int ROOTPATH_MAX = ArcResourceAccessor::ROOTPATH_MAX; 325 326 //---------------------------------------- 327 //! @name コンストラクタ/デストラクタ 328 //@{ 329 330 //! @brief コンストラクタです。 331 //! 332 //! @since 2009/09/18 初版。 333 //! 334 MultiArcResourceAccessor(); 335 336 //! @brief デストラクタです。 337 //! 338 //! @since 2009/09/18 初版。 339 //! 340 virtual ~MultiArcResourceAccessor(); 341 342 //@} 343 344 //---------------------------------------- 345 //! @name 設定/取得 346 //@{ 347 348 //! @brief アーカイブ情報を登録します。 349 //! 350 //! @details 351 //! ArcResourceLink を登録します。 352 //! 353 //! @param pLink ArcResourceLinkオブジェクトへのポインタです。 354 //! 355 //! @since 2009/09/18 初版。 356 //! 357 void Attach(ArcResourceLink* pLink); 358 359 //! @brief 指定したアーカイブデータの登録を解除します。 360 //! 361 //! @param archiveStart アーカイブデータへのポインタ。 362 //! 363 //! @return 登録が解除できた場合、ArcResourceLink オブジェクトへのポインタを 364 //! 返します。解除できなかった場合、NULLを返します。 365 //! 366 //! @since 2009/09/18 初版。 367 //! 368 ArcResourceLink* Detach(const void* archiveStart); 369 370 //! @brief 指定したアーカイブ情報の登録を解除します。 371 //! 372 //! @details 373 //! ArcResourceLink の登録を解除します。 374 //! 375 //! @param pLink ArcResourceLink オブジェクトへのポインタです。 376 //! 377 //! @since 2009/09/18 初版。 378 //! 379 void Detach(ArcResourceLink* pLink); 380 381 //! @brief 登録されているすべてのアーカイブ情報を登録解除します。 382 //! 383 //! @sa Detach 384 //! 385 //! @since 2009/09/18 初版。 386 //! 387 void DetachAll(); 388 389 virtual void* GetResource( 390 ResType resType, 391 const char* name, 392 u32* pSize = 0 393 ); 394 395 //! @brief フォントオブジェクトを登録します。 396 //! 397 //! @details 398 //! フォントオブジェクトをリソースアクセサに設定し、 399 //! GetFont() の検索対象に含まれるようにします。 400 //! 401 //! @param name フォントリソースの名前です。 402 //! @param pFont フォントオブジェクトへのポインタです。 403 //! 404 //! @return 登録キーを返します。キーは登録の抹消に使用します。 405 //! 406 //! @sa UnregistFont 407 //! 408 //! @since 2010/01/26 初版。 409 //! 410 FontKey RegistFont(const char* name, font::Font* pFont); 411 412 //! @brief フォントオブジェクトの登録を解除します。 413 //! 414 //! @param key フォントの登録時に取得した登録キーを指定します。 415 //! 416 //! @sa RegistFont 417 //! 418 //! @since 2010/01/26 初版。 419 //! 420 void UnregistFont(FontKey key); 421 422 //! @brief テクスチャを登録します。 423 //! 424 //! @details 425 //! テクスチャをリソースアクセサに設定し、 426 //! GetTexture() の検索対象に含まれるようにします。 427 //! 428 //! @param name テクスチャの名前です。 429 //! @param textureInfo テクスチャ情報です。 430 //! 431 //! @return 登録キーを返します。キーは登録の抹消に使用します。 432 //! 433 //! @sa UnregistTexture 434 //! 435 //! @since 2010/01/26 初版。 436 //! 437 TextureKey RegistTexture(const char* name, const TextureInfo& textureInfo); 438 439 //! @brief テクスチャの登録を解除します。 440 //! 441 //! @param key テクスチャの登録時に取得した登録キーを指定します。 442 //! 443 //! @sa RegistTexture 444 //! 445 //! @since 2010/01/26 初版。 446 //! 447 void UnregistTexture(TextureKey key); 448 449 //! @brief テクスチャ情報を取得します。 450 //! 451 //! @details 452 //! name で指定したテクスチャリソース名と関連付けられた 453 //! テクスチャ情報を取得します。 454 //! 455 //! テクスチャを所有していない場合には LoadTexture() でロードを試みます。 456 //! 457 //! @param name テクスチャリソースの名前です。 458 //! 459 //! @return テクスチャ情報を返します。 460 //! テクスチャを所有していない場合にはロードを試みます。 461 //! ロードできなかった場合にはテクスチャオブジェクトには無効な値 462 //! (TextureInfo::INVALID) が設定されます。 463 //! 464 //! @sa LoadTexture 465 //! 466 //! @since 2010/06/18 初版。 467 //! 468 virtual const TextureInfo GetTexture(const char* name); 469 470 //! @brief フォントを取得します。 471 //! 472 //! @details 473 //! name で指定したフォントリソース名と関連付けられた 474 //! フォントオブジェクトを取得します。 475 //! 476 //! 指定されたフォントが登録されていなかった場合には 477 //! LoadFont() により生成したフォントを登録します。 478 //! 479 //! @param name フォントリソースの名前です。 480 //! 481 //! @return フォントへのポインタを返します。 482 //! 483 //! @sa LoadFont 484 //! 485 //! @since 2010/07/16 初版。 486 //! 487 virtual font::Font* GetFont(const char* name); 488 489 //@} 490 491 private: 492 internal::ArcResourceList m_ArcList; 493 FontContainer m_FontList; 494 TextureContainer m_TextureList; 495 wchar_t m_ResNameWork[ROOTPATH_MAX]; 496 }; 497 498 } // namespace lyt 499 } // namespace nw 500 501 /* NW_LYT_ARCRESOURCEACCESSOR_H_ */ 502 #endif 503