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: 26808 $ 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 //! @brief TextureContainer を取得します。 209 //! 210 //! @return 211 //! 登録されたテクスチャを保持する TextureContainer への参照を返します。 212 //! 213 //! @since 2010/12/03 初版。 214 //! GetTextureContainer()215 TextureContainer& GetTextureContainer() 216 { 217 return m_TextureList; 218 } 219 220 //! @brief TextureContainer を取得します。 221 //! 222 //! @returns 223 //! 登録されたテクスチャを保持する TextureContainer への参照を返します。 224 //! 225 //! @since 2010/12/03 初版。 226 //! GetTextureContainer()227 const TextureContainer& GetTextureContainer() const 228 { 229 return m_TextureList; 230 } 231 232 //! @brief FontContainer を取得します。 233 //! 234 //! @return 235 //! 登録されたフォントを保持する FontContainer への参照を返します。 236 //! 237 //! @since 2010/12/03 初版。 238 //! GetFontContainer()239 FontContainer& GetFontContainer() 240 { 241 return m_FontList; 242 } 243 244 //! @brief FontContainer を取得します。 245 //! 246 //! @return 247 //! 登録されたフォントを保持する FontContainer への参照を返します。 248 //! 249 //! @since 2010/12/03 初版。 250 //! GetFontContainer()251 const FontContainer& GetFontContainer() const 252 { 253 return m_FontList; 254 } 255 256 //@} 257 258 protected: 259 //! @details :private 260 ARCHandle m_ArcHandle; 261 262 //! @details :private 263 void* m_ArcBuf; 264 265 //! @details :private 266 FontContainer m_FontList; 267 268 //! @details :private 269 TextureContainer m_TextureList; 270 271 //! @details :private 272 wchar_t m_ResRootDir[ROOTPATH_MAX]; 273 274 //! @details :private 275 wchar_t m_ResNameWork[ROOTPATH_MAX]; 276 }; 277 278 class MultiArcResourceAccessor; 279 280 //--------------------------------------------------------------------------- 281 //! :category リソースアクセサ 282 //! 283 //! @brief アーカイブの情報を保持するためのクラスです。 284 //! 285 //! @since 2009/09/18 初版。 286 //--------------------------------------------------------------------------- 287 class ArcResourceLink 288 { 289 friend class MultiArcResourceAccessor; 290 291 public: 292 //! パス名の最大長です。 293 static const int ROOTPATH_MAX = ArcResourceAccessor::ROOTPATH_MAX; 294 295 //---------------------------------------- 296 //! @name コンストラクタ/デストラクタ 297 //@{ 298 299 //! @brief コンストラクタです。 300 //! 301 //! @since 2009/09/18 初版。 302 //! ArcResourceLink()303 ArcResourceLink() 304 { 305 } 306 307 //@} 308 309 //---------------------------------------- 310 //! @name 設定/取得 311 //@{ 312 313 //! @brief アーカイブを設定し、初期化します。 314 //! 315 //! @details 316 //! アーカイブのフォーマットが正しくなければ失敗します。 317 //! 318 //! @param archiveStart アーカイブの先頭アドレスです。 319 //! @param resourceRootDirectory リソースのルートディレクトリ名です。 320 //! 321 //! @return アーカイブの設定が成功した場合は true を、失敗した場合は false を返します。 322 //! 323 //! @since 2009/09/18 初版。 324 //! 325 bool Set( 326 void* archiveStart, 327 const char* resourceRootDirectory 328 ); 329 330 //! @brief アーカイブの先頭アドレスを取得します。 331 //! 332 //! @return 設定されているアーカイブの先頭アドレスを返します。 333 //! 334 //! @since 2009/09/18 初版。 335 //! 336 const void* GetArchiveDataStart() const; 337 338 //! @brief リソースのルートディレクトリ名を取得します。 339 //! 340 //! @return リソースのルートディレクトリ名を返します。 341 //! 342 //! @since 2009/09/18 初版。 343 //! GetResRootDir()344 const wchar_t* GetResRootDir() const 345 { 346 return m_ResRootDir; 347 } 348 349 //@} 350 351 //! :private 352 //! リストのリンク情報です。 353 ut::LinkListNode m_Link; 354 355 protected: 356 //! @details :private GetArcHandle()357 ARCHandle* GetArcHandle() 358 { 359 return &m_ArcHandle; 360 } 361 362 //! @details :private 363 ARCHandle m_ArcHandle; 364 365 //! @details :private 366 wchar_t m_ResRootDir[ROOTPATH_MAX]; 367 }; 368 369 namespace internal 370 { 371 372 typedef ut::LinkList<ArcResourceLink, offsetof(ArcResourceLink, m_Link)> ArcResourceList; 373 374 } // namespace internal 375 376 //--------------------------------------------------------------------------- 377 //! :category リソースアクセサ 378 //! 379 //! @brief 複数のアーカイブリソースにアクセスするためのクラスです。 380 //! 381 //! @since 2009/09/18 初版。 382 //--------------------------------------------------------------------------- 383 class MultiArcResourceAccessor : public ResourceAccessor 384 { 385 public: 386 //! パス名の最大長です。 387 static const int ROOTPATH_MAX = ArcResourceAccessor::ROOTPATH_MAX; 388 389 //---------------------------------------- 390 //! @name コンストラクタ/デストラクタ 391 //@{ 392 393 //! @brief コンストラクタです。 394 //! 395 //! @since 2009/09/18 初版。 396 //! 397 MultiArcResourceAccessor(); 398 399 //! @brief デストラクタです。 400 //! 401 //! @since 2009/09/18 初版。 402 //! 403 virtual ~MultiArcResourceAccessor(); 404 405 //@} 406 407 //---------------------------------------- 408 //! @name 設定/取得 409 //@{ 410 411 //! @brief アーカイブ情報を登録します。 412 //! 413 //! @details 414 //! ArcResourceLink を登録します。 415 //! 416 //! @param pLink ArcResourceLinkオブジェクトへのポインタです。 417 //! 418 //! @since 2009/09/18 初版。 419 //! 420 void Attach(ArcResourceLink* pLink); 421 422 //! @brief 指定したアーカイブデータの登録を解除します。 423 //! 424 //! @param archiveStart アーカイブデータへのポインタ。 425 //! 426 //! @return 登録が解除できた場合、ArcResourceLink オブジェクトへのポインタを 427 //! 返します。解除できなかった場合、NULLを返します。 428 //! 429 //! @since 2009/09/18 初版。 430 //! 431 ArcResourceLink* Detach(const void* archiveStart); 432 433 //! @brief 指定したアーカイブ情報の登録を解除します。 434 //! 435 //! @details 436 //! ArcResourceLink の登録を解除します。 437 //! 438 //! @param pLink ArcResourceLink オブジェクトへのポインタです。 439 //! 440 //! @since 2009/09/18 初版。 441 //! 442 void Detach(ArcResourceLink* pLink); 443 444 //! @brief 登録されているすべてのアーカイブ情報を登録解除します。 445 //! 446 //! @sa Detach 447 //! 448 //! @since 2009/09/18 初版。 449 //! 450 void DetachAll(); 451 452 virtual void* GetResource( 453 ResType resType, 454 const char* name, 455 u32* pSize = 0 456 ); 457 458 //! @brief フォントオブジェクトを登録します。 459 //! 460 //! @details 461 //! フォントオブジェクトをリソースアクセサに設定し、 462 //! GetFont() の検索対象に含まれるようにします。 463 //! 464 //! @param name フォントリソースの名前です。 465 //! @param pFont フォントオブジェクトへのポインタです。 466 //! 467 //! @return 登録キーを返します。キーは登録の抹消に使用します。 468 //! 469 //! @sa UnregistFont 470 //! 471 //! @since 2010/01/26 初版。 472 //! 473 FontKey RegistFont(const char* name, font::Font* pFont); 474 475 //! @brief フォントオブジェクトの登録を解除します。 476 //! 477 //! @param key フォントの登録時に取得した登録キーを指定します。 478 //! 479 //! @sa RegistFont 480 //! 481 //! @since 2010/01/26 初版。 482 //! 483 void UnregistFont(FontKey key); 484 485 //! @brief テクスチャを登録します。 486 //! 487 //! @details 488 //! テクスチャをリソースアクセサに設定し、 489 //! GetTexture() の検索対象に含まれるようにします。 490 //! 491 //! @param name テクスチャの名前です。 492 //! @param textureInfo テクスチャ情報です。 493 //! 494 //! @return 登録キーを返します。キーは登録の抹消に使用します。 495 //! 496 //! @sa UnregistTexture 497 //! 498 //! @since 2010/01/26 初版。 499 //! 500 TextureKey RegistTexture(const char* name, const TextureInfo& textureInfo); 501 502 //! @brief テクスチャの登録を解除します。 503 //! 504 //! @param key テクスチャの登録時に取得した登録キーを指定します。 505 //! 506 //! @sa RegistTexture 507 //! 508 //! @since 2010/01/26 初版。 509 //! 510 void UnregistTexture(TextureKey key); 511 512 //! @brief テクスチャ情報を取得します。 513 //! 514 //! @details 515 //! name で指定したテクスチャリソース名と関連付けられた 516 //! テクスチャ情報を取得します。 517 //! 518 //! テクスチャを所有していない場合には LoadTexture() でロードを試みます。 519 //! 520 //! @param name テクスチャリソースの名前です。 521 //! 522 //! @return テクスチャ情報を返します。 523 //! テクスチャを所有していない場合にはロードを試みます。 524 //! ロードできなかった場合にはテクスチャオブジェクトには無効な値 525 //! (TextureInfo::INVALID) が設定されます。 526 //! 527 //! @sa LoadTexture 528 //! 529 //! @since 2010/06/18 初版。 530 //! 531 virtual const TextureInfo GetTexture(const char* name); 532 533 //! @brief フォントを取得します。 534 //! 535 //! @details 536 //! name で指定したフォントリソース名と関連付けられた 537 //! フォントオブジェクトを取得します。 538 //! 539 //! 指定されたフォントが登録されていなかった場合には 540 //! LoadFont() により生成したフォントを登録します。 541 //! 542 //! @param name フォントリソースの名前です。 543 //! 544 //! @return フォントへのポインタを返します。 545 //! 546 //! @sa LoadFont 547 //! 548 //! @since 2010/07/16 初版。 549 //! 550 virtual font::Font* GetFont(const char* name); 551 552 //! @brief TextureContainer を取得します。 553 //! 554 //! @return 555 //! 登録されたテクスチャを保持する TextureContainer への参照を返します。 556 //! 557 //! @since 2010/12/03 初版。 558 //! GetTextureContainer()559 TextureContainer& GetTextureContainer() 560 { 561 return m_TextureList; 562 } 563 564 //! @brief TextureContainer を取得します。 565 //! 566 //! @returns 567 //! 登録されたテクスチャを保持する TextureContainer への参照を返します。 568 //! 569 //! @since 2010/12/03 初版。 570 //! GetTextureContainer()571 const TextureContainer& GetTextureContainer() const 572 { 573 return m_TextureList; 574 } 575 576 //! @brief FontContainer を取得します。 577 //! 578 //! @return 579 //! 登録されたフォントを保持する FontContainer への参照を返します。 580 //! 581 //! @since 2010/12/03 初版。 582 //! GetFontContainer()583 FontContainer& GetFontContainer() 584 { 585 return m_FontList; 586 } 587 588 //! @brief FontContainer を取得します。 589 //! 590 //! @return 591 //! 登録されたフォントを保持する FontContainer への参照を返します。 592 //! 593 //! @since 2010/12/03 初版。 594 //! GetFontContainer()595 const FontContainer& GetFontContainer() const 596 { 597 return m_FontList; 598 } 599 600 //@} 601 602 protected: 603 //! @details :private 604 internal::ArcResourceList m_ArcList; 605 606 //! @details :private 607 FontContainer m_FontList; 608 609 //! @details :private 610 TextureContainer m_TextureList; 611 612 //! @details :private 613 wchar_t m_ResNameWork[ROOTPATH_MAX]; 614 }; 615 616 } // namespace lyt 617 } // namespace nw 618 619 /* NW_LYT_ARCRESOURCEACCESSOR_H_ */ 620 #endif 621