1 /*---------------------------------------------------------------------------* 2 Project: NintendoWare 3 File: lyt_Layout.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: 26780 $ 14 *---------------------------------------------------------------------------*/ 15 16 #ifndef NW_LYT_LAYOUT_H_ 17 #define NW_LYT_LAYOUT_H_ 18 19 #include <new> 20 21 #include <nw/os/os_Memory.h> 22 #include <nw/ut/ut_Inlines.h> 23 #include <nw/ut/ut_LinkList.h> 24 25 #include <nw/lyt/lyt_Animation.h> 26 #include <nw/lyt/lyt_Config.h> 27 #include <nw/lyt/lyt_Supplement.h> 28 #include <nw/lyt/lyt_Types.h> 29 30 namespace nw 31 { 32 namespace ut 33 { 34 35 struct Rect; 36 37 } // namespace ut 38 39 namespace font 40 { 41 42 template <typename CharType> 43 class TagProcessorBase; 44 45 } // namespace font 46 47 namespace lyt 48 { 49 namespace res 50 { 51 52 struct AnimShareInfoList; 53 54 } // namespace res 55 56 class ResourceAccessor; 57 struct ResBlockSet; 58 class Pane; 59 class GroupContainer; 60 class DrawInfo; 61 62 //! @name アニメーション 63 //@{ 64 65 //! @brief アニメーションの一覧を保持します。 66 //! 67 //! @since 2009/09/18 初版。 68 //! 69 typedef ut::LinkList<AnimTransform, offsetof(AnimTransform, m_Link)> AnimTransformList; 70 71 //@} 72 73 //--------------------------------------------------------------------------- 74 //! :category 管理 75 //! 76 //! @brief レイアウト全体を管理するためのクラスです。 77 //! 78 //! @sa Pane 79 //! @sa AnimTransform 80 //! 81 //! @since 2009/09/18 初版。 82 //--------------------------------------------------------------------------- 83 class Layout 84 { 85 public: 86 //---------------------------------------- 87 //! @name メモリ管理 88 //@{ 89 90 //! @brief 現在のメモリアロケータを取得します。 91 //! 92 //! @return メモリアロケータへのポインタを返します。 93 //! 94 //! @sa SetAllocator 95 //! 96 //! @since 2009/09/18 初版。 97 //! GetAllocator()98 static nw::os::IAllocator* GetAllocator() 99 { 100 return s_pAllocator; 101 } 102 103 //! @brief 現在のデバイスメモリ用メモリアロケータを取得します。 104 //! 105 //! @return メモリアロケータへのポインタを返します。 106 //! 107 //! @sa SetAllocator 108 //! 109 //! @since 2010/02/09 初版。 110 //! GetDeviceMemoryAllocator()111 static nw::os::IAllocator* GetDeviceMemoryAllocator() 112 { 113 return s_pDeviceMemoryAllocator; 114 } 115 116 //! @brief メモリブロックの確保に使用するメモリアロケータを設定します。 117 //! 118 //! @param pAllocator メモリアロケータへのポインタです。 119 //! 120 //! @sa AllocMemory 121 //! @sa GetAllocator 122 //! @sa SetDeviceMemoryAllocator 123 //! 124 //! @since 2009/09/18 初版。 125 //! 126 static void SetAllocator(nw::os::IAllocator* pAllocator); 127 128 //! @brief メモリブロックの確保に使用するメモリアロケータを設定します。 129 //! 130 //! @details 131 //! このメモリアロケータはデバイスメモリから確保するように 132 //! なっていなければいけません。 133 //! 134 //! @param pAllocator メモリアロケータへのポインタです。 135 //! 136 //! @sa AllocMemory 137 //! @sa GetDeviceMemoryAllocator 138 //! @sa SetAllocator 139 //! 140 //! @since 2010/02/09 初版。 141 //! 142 static void SetDeviceMemoryAllocator(nw::os::IAllocator* pAllocator); 143 144 //! @brief メモリブロックを確保します。 145 //! 146 //! @details 147 //! size バイトのメモリブロックを確保します。 148 //! この関数を使用する前に Layout::SetAllocator() によりメモリアロケータを 149 //! 設定してください。 150 //! 151 //! @param size 確保するメモリブロックのサイズです。 152 //! @param alignment 確保するメモリブロックのアライメント値です。 153 //! 154 //! @return 155 //! メモリブロックを確保できた場合はメモリブロックの先頭アドレスを、 156 //! 確保できなかった場合は NULL を返します。 157 //! 158 //! @sa SetAllocator 159 //! @sa FreeMemory 160 //! 161 //! @since 2009/09/18 初版。 162 //! 163 static void* AllocMemory(u32 size, u8 alignment = 4); 164 165 //! @brief メモリブロックをデバイスメモリから確保します。 166 //! 167 //! @details 168 //! size バイトのメモリブロックを確保します。 169 //! この関数を使用する前に Layout::SetDeviceMemoryAllocator() によりメモリアロケータを 170 //! 設定してください。 171 //! 172 //! @param size 確保するメモリブロックのサイズです。 173 //! @param alignment 確保するメモリブロックのアライメント値です。 174 //! 175 //! @return 176 //! メモリブロックを確保できた場合はメモリブロックの先頭アドレスを、 177 //! 確保できなかった場合は NULL を返します。 178 //! 179 //! @sa SetDeviceMemoryAllocator 180 //! @sa FreeDeviceMemory 181 //! 182 //! @since 2010/02/09 初版。 183 //! 184 static void* AllocDeviceMemory(u32 size, u8 alignment = 4); 185 186 //! @brief メモリブロックを開放します。 187 //! 188 //! @param mem 開放するメモリブロックの先頭アドレスです。 189 //! 190 //! @sa AllocMemory 191 //! 192 //! @since 2009/09/18 初版。 193 //! 194 static void FreeMemory(void* mem); 195 196 //! @brief メモリブロックをデバイスメモリへ開放します。 197 //! 198 //! @param mem 開放するメモリブロックの先頭アドレスです。 199 //! 200 //! @sa AllocDeviceMemory 201 //! 202 //! @since 2010/02/09 初版。 203 //! 204 static void FreeDeviceMemory(void* mem); 205 206 //@} 207 208 //---------------------------------------- 209 //! @name コンストラクタ/デストラクタ 210 //@{ 211 212 //! @brief コンストラクタです。 213 //! 214 //! @since 2009/09/18 初版。 215 //! 216 Layout(); 217 218 //! @brief デストラクタです。 219 //! 220 //! @since 2009/09/18 初版。 221 //! 222 virtual ~Layout(); 223 224 //@} 225 226 //---------------------------------------- 227 //! @name 初期化 228 //@{ 229 230 //! @brief リソースをもとにレイアウトの初期化を行います。 231 //! 232 //! @details 233 //! リソースのフォーマットが正しくなければ失敗します。 234 //! 235 //! @param lytResBuf レイアウトリソースへのポインタです。 236 //! @param pResAcsr リソースアクセサへのポインタです。 237 //! 238 //! @return 初期化に成功した場合は true を、失敗した場合は false を返します。 239 //! 240 //! @since 2009/09/18 初版。 241 //! 242 virtual bool Build( 243 const void* lytResBuf, 244 ResourceAccessor* pResAcsr); 245 246 #ifdef NW_LYT_DMPGL_ENABLED 247 //! @brief Layout::Draw を使用するか宣言します(非推奨)。 248 //! 249 //! @details 250 //! 本関数は NW_LYT_DMPGL_ENABLED マクロを定義してライブラリを 251 //! ビルドした場合にのみ利用可能です。 252 //! 253 //! デフォルトでは false に設定されています。 254 //! 255 //! Layout::Draw() による描画には、リソースから DMPGL の API を使用して 256 //! 生成したオブジェクト(シェーダ、頂点バッファ、テクスチャ)が必要です。 257 //! 258 //! (Drawer の描画では必要としません。) 259 //! 260 //! この関数により Layout::Draw を使用すると宣言した場合には、 261 //! 初期化およびリソースアクセサにおいて、DMPGL のオブジェクト生成が 262 //! 行われます。 263 //! 264 //! 本関数は GraphicsResource::StartSetup() および Layout::Build() よりも 265 //! 前に呼び出します。 266 //! 267 //! @param enable Layout::Draw を使用する場合に true を指定します。 268 //! 269 //! @sa GetLayoutDrawEnable 270 //! @sa GraphicsResource::StartSetup 271 //! @sa Build 272 //! 273 //! @since 2010/07/30 初版。 274 //! @date 2010/10/20 NW_LYT_DMPGL_ENABLED マクロを定義してライブラリをビルドした場合にのみ利用できるようにしました。 275 //! SetLayoutDrawEnable(bool enable)276 static void SetLayoutDrawEnable(bool enable) 277 { 278 s_LayoutDrawEnable = enable; 279 } 280 281 //! @brief Layout::Draw を使用するかの設定を取得します(非推奨)。 282 //! 283 //! @details 284 //! 本関数は NW_LYT_DMPGL_ENABLED マクロを定義してライブラリを 285 //! ビルドした場合にのみ利用可能です。 286 //! 287 //! デフォルト値は false です。 288 //! 289 //! @return Layout::Draw を使用する場合は true を返します。 290 //! 291 //! @sa SetLayoutDrawEnable 292 //! 293 //! @since 2010/07/30 初版。 294 //! @date 2010/10/20 NW_LYT_DMPGL_ENABLED マクロを定義してライブラリをビルドした場合にのみ利用できるようにしました。 295 //! GetLayoutDrawEnable()296 static bool GetLayoutDrawEnable() 297 { 298 #ifdef NW_PLATFORM_CTR 299 return s_LayoutDrawEnable; 300 #else 301 return true; 302 #endif 303 } 304 #endif // NW_LYT_DMPGL_ENABLED 305 306 //@} 307 308 //---------------------------------------- 309 //! @name アニメーション 310 //@{ 311 312 //! @brief アニメーションを作成します。 313 //! 314 //! @details 315 //! アニメーションオブジェクトの作成のみ行います。 316 //! 317 //! @return 生成したアニメーションへのポインタを返します。 318 //! 319 //! @since 2009/09/18 初版。 320 //! 321 virtual AnimTransform* CreateAnimTransform(); 322 323 //! @brief アニメーションを作成します。 324 //! 325 //! @details 326 //! アニメーションオブジェクトを作成し、指定されたリソースを関連付けます。 327 //! リソースのフォーマットが正しくなければ失敗します。 328 //! 329 //! アニメーションリソースにアニメーション共有情報が含まれる場合は、 330 //! BindAnimationAuto() を使用してください。 331 //! 332 //! @param animResBuf アニメーションリソースへのポインタです。 333 //! @param pResAcsr リソースアクセサへのポインタです。 334 //! 335 //! @return 336 //! アニメーションの作成に成功した場合はアニメーションへのポインタを、 337 //! 失敗した場合は NULL を返します。 338 //! 339 //! @sa BindAnimationAuto 340 //! 341 //! @since 2009/09/18 初版。 342 //! 343 virtual AnimTransform* CreateAnimTransform( 344 const void* animResBuf, 345 ResourceAccessor* pResAcsr); 346 347 //! @brief アニメーションを作成します。 348 //! 349 //! @details 350 //! アニメーションオブジェクトを作成し、指定されたリソースを関連付けます。 351 //! リソースのフォーマットが正しくなければ失敗します。 352 //! 353 //! アニメーションリソースにアニメーション共有情報が含まれる場合は、 354 //! BindAnimationAuto() を使用してください。 355 //! 356 //! @param animRes アニメーションリソースオブジェクトです。 357 //! @param pResAcsr リソースアクセサへのポインタです。 358 //! 359 //! @return 360 //! アニメーションの作成に成功した場合はアニメーションへのポインタを、 361 //! 失敗した場合は NULL を返します。 362 //! 363 //! @sa BindAnimationAuto 364 //! 365 //! @since 2009/09/18 初版。 366 //! 367 virtual AnimTransform* CreateAnimTransform( 368 const AnimResource& animRes, 369 ResourceAccessor* pResAcsr); 370 371 //! @brief アニメーションを削除します。 372 //! 373 //! @param pAnimTransform アニメーションへのポインタです。 374 //! 375 //! @since 2009/09/18 初版。 376 //! 377 virtual void DeleteAnimTransform( 378 AnimTransform* pAnimTransform); 379 380 //! @brief アニメーションを関連付けます。 381 //! 382 //! @param pAnimTrans アニメーションへのポインタです。 383 //! 384 //! @sa UnbindAnimation 385 //! @sa UnbindAllAnimation 386 //! 387 //! @since 2009/09/18 初版。 388 //! 389 virtual void BindAnimation(AnimTransform* pAnimTrans); 390 391 //! @brief アニメーションの関連付けを解除します。 392 //! 393 //! @details 394 //! pAnimTrans に NULL を渡した場合はすべての関連付けが解除されます。 395 //!( UnbindAllAnimation() と同義) 396 //! 397 //! @param pAnimTrans アニメーションへのポインタです。 398 //! 399 //! @sa BindAnimation 400 //! @sa UnbindAllAnimation 401 //! 402 //! @since 2009/09/18 初版。 403 //! 404 virtual void UnbindAnimation(AnimTransform* pAnimTrans); 405 406 //! @brief アニメーションとペインの関連付けをすべて解除します。 407 //! 408 //! @details 409 //! UnbindAnimation() の引数に NULL を渡すのと同義です。 410 //! 411 //! @sa BindAnimation 412 //! @sa UnbindAnimation 413 //! 414 //! @since 2009/09/18 初版。 415 //! 416 virtual void UnbindAllAnimation(); 417 418 //! @brief アニメーションの作成と関連付けを一度に行います。 419 //! 420 //! @details 421 //! アニメーションリソースオブジェクトの内容に応じて、 422 //! アニメーションオブジェクト(AnimTransform)を作成し、 423 //! ペインに関連付けます。 424 //! 425 //! アニメーションファイルにアニメーション共有情報が含まれている場合は、 426 //! 共有対象のペインごとにアニメーションオブジェクト(AnimTransform)が 427 //! 作成されます。 428 //! 429 //! また、アニメーション区間タグが含まれていて、関連グループが 430 //! 指定されている場合は、アニメーションを関連付けるペインを関連グループに限定します。 431 //! 432 //! この関数では、アニメーションは無効状態で関連付けます。 433 //! (アニメーションリンク情報の AnimationLink::IsEnable() が false の状態) 434 //! 435 //! @param animRes アニメーションリソースオブジェクトです。 436 //! @param pResAcsr リソースアクセサへのポインタです。 437 //! 438 //! @return 関数が成功した場合は true、失敗した場合は false を返します。 439 //! 440 //! @sa CreateAnimTransform 441 //! @sa AnimationLink 442 //! 443 //! @since 2009/09/18 初版。 444 //! 445 virtual bool BindAnimationAuto( 446 const AnimResource& animRes, 447 ResourceAccessor* pResAcsr); 448 449 //! @brief アニメーションの有効/無効状態をセットします。 450 //! 451 //! @param pAnimTrans アニメーションへのポインタです。 452 //! @param bEnable 有効にする場合は true を指定します。 453 //! 454 //! @since 2009/09/18 初版。 455 //! 456 virtual void SetAnimationEnable( 457 AnimTransform* pAnimTrans, 458 bool bEnable); 459 460 //! @brief 全てのペインのアニメーションの結果を計算します。 461 //! 462 //! @details 463 //! opiton に ANIMATEOPT_NOANIMATEINVISIBLE を指定した場合、 464 //! 非表示のペイン(Pane::IsVisible() が false)とその子供以下の 465 //! ペインのアニメーションの計算を省略します。 466 //! 467 //! @param option オプションです。 lyt::AnimateOpt を指定します。 468 //! 469 //! @sa lyt::AnimateOpt 470 //! @sa Pane::IsVisible 471 //! 472 //! @since 2009/09/18 初版。 473 //! 474 virtual void Animate(u32 option = 0); 475 476 //@} 477 478 //---------------------------------------- 479 //! @name 描画 480 //@{ 481 482 //! @brief 描画のための行列を計算します。 483 //! 484 //! @param drawInfo 描画情報です。 485 //! 486 //! @since 2009/09/18 初版。 487 //! 488 virtual void CalculateMtx(const DrawInfo& drawInfo); 489 490 #ifdef NW_LYT_DMPGL_ENABLED 491 //! @brief 描画処理を行います(非推奨)。 492 //! 493 //! @details 494 //! 本関数は NW_LYT_DMPGL_ENABLED マクロを定義してライブラリを 495 //! ビルドした場合にのみ利用可能です。 496 //! 497 //! レイアウトの描画には Drawer を使用します。 498 //! 499 //! この関数はリファレンス実装であり、使用は非推奨です。 500 //! 501 //! drawInfo には、あらかじめ DrawInfo::SetGraphicsResource() により 502 //! GraphicsResource を設定しておく必要があります。 503 //! 504 //! GLの以下の設定はユーザに任せています(lytでは設定しません)。 505 //! 506 //! ・カリング\n 507 //! ・シザー処理\n 508 //! ・ステンシルテスト\n 509 //! ・マスク処理\n 510 //! ・ポリゴンオフセット\n 511 //! ・デプステスト\n 512 //! ・アーリーデプステスト\n 513 //! ・フレームバッファオブジェクト 514 //! 515 //! @param drawInfo 描画情報です。 516 //! 517 //! @sa Drawer 518 //! @sa GraphicsResource 519 //! 520 //! @since 2009/09/18 初版。 521 //! @date 2010/06/28 本関数の使用は非推奨としました。 522 //! @date 2010/10/20 NW_LYT_DMPGL_ENABLED マクロを定義してライブラリをビルドした場合にのみ利用できるようにしました。 523 //! 524 virtual void Draw(const DrawInfo& drawInfo); 525 #endif 526 527 //@} 528 529 //---------------------------------------- 530 //! @name 取得/設定 531 //@{ 532 533 //! @brief ルートペインを取得します。 534 //! 535 //! @return 536 //! ルートペインへのポインタを返します。 537 //! ルートペインが存在しない場合は NULL を返します。 538 //! 539 //! @since 2009/09/18 初版。 540 //! GetRootPane()541 Pane* GetRootPane() const 542 { 543 return m_pRootPane; 544 } 545 546 //! @brief グループコンテナを取得します。 547 //! 548 //! @return 549 //! グループコンテナへのポインタを返します。 550 //! グループコンテナが存在しない場合は NULL を返します。 551 //! 552 //! @since 2009/09/18 初版。 553 //! GetGroupContainer()554 GroupContainer* GetGroupContainer() const 555 { 556 return m_pGroupContainer; 557 } 558 559 //! @brief 表示領域のサイズを取得します。 560 //! 561 //! @return サイズを返します。 562 //! 563 //! @since 2009/09/18 初版。 564 //! GetLayoutSize()565 const Size& GetLayoutSize() const 566 { 567 return m_LayoutSize; 568 } 569 570 //! @brief レイアウトの表示領域を取得します。 571 //! 572 //! @return 表示領域の矩形を返します。 573 //! 574 //! @since 2009/09/18 初版。 575 //! 576 const ut::Rect GetLayoutRect() const; 577 578 //! @brief レイアウト内の全てのテキストボックスペインにタグプロセッサを設定します。 579 //! 580 //! @param pTagProcessor タグプロセッサへのポインタです。 581 //! 582 //! @sa TextBox::GetTagProcessor 583 //! @sa TextBox::SetTagProcessor 584 //! 585 //! @since 2009/09/18 初版。 586 //! 587 virtual void SetTagProcessor(font::TagProcessorBase<wchar_t>* pTagProcessor); 588 589 //! @brief レイアウトに関連付けているアニメーションのリストを取得します。 590 //! 591 //! @return AnimTransform オブジェクトのリストを返します。 592 //! 593 //! @since 2009/09/18 初版。 594 //! GetAnimTransformList()595 const AnimTransformList& GetAnimTransformList() const 596 { 597 return m_AnimTransList; 598 } 599 600 //! @brief レイアウトに関連付けているアニメーションのリストを取得します。 601 //! 602 //! @since 2009/09/18 初版。 603 //! GetAnimTransformList()604 AnimTransformList& GetAnimTransformList() 605 { 606 return m_AnimTransList; 607 } 608 609 //@} 610 611 //---------------------------------------- 612 //! @name オブジェクト生成/破棄 613 //@{ 614 615 //! @brief オブジェクトを生成します。 616 //! 617 //! @tparam T 生成するオブジェクトのクラスです。 618 //! 619 //! @return 生成されたオブジェクトへのポインタを返します。 620 //! 621 //! @sa DeleteObj 622 //! 623 //! @since 2010/01/26 初版。 624 //! 625 template<typename T> NewObj()626 static T* NewObj() 627 { 628 if (void* pMem = Layout::AllocMemory(sizeof(T))) 629 { 630 return new (pMem) T(); 631 } 632 return 0; 633 } 634 635 //! @brief オブジェクトを生成します。 636 //! 637 //! @tparam T 生成するオブジェクトのクラスです。 638 //! @tparam Param1 コンストラクタの第1引数の型です。 639 //! 640 //! @param param1 コンストラクタの第1引数です。 641 //! 642 //! @return 生成されたオブジェクトへのポインタを返します。 643 //! 644 //! @sa DeleteObj 645 //! 646 //! @since 2010/01/26 初版。 647 //! 648 template<typename T, typename Param1> NewObj(Param1 param1)649 static T* NewObj(Param1 param1) 650 { 651 if (void* pMem = Layout::AllocMemory(sizeof(T))) 652 { 653 return new (pMem) T(param1); 654 } 655 return 0; 656 } 657 658 //! @brief オブジェクトを生成します。 659 //! 660 //! @tparam T 生成するオブジェクトのクラスです。 661 //! @tparam Param1 コンストラクタの第1引数の型です。 662 //! @tparam Param2 コンストラクタの第2引数の型です。 663 //! 664 //! @param param1 コンストラクタの第1引数です。 665 //! @param param2 コンストラクタの第2引数です。 666 //! 667 //! @return 生成されたオブジェクトへのポインタを返します。 668 //! 669 //! @sa DeleteObj 670 //! 671 //! @since 2010/01/26 初版。 672 //! 673 template<typename T, typename Param1, typename Param2> NewObj(Param1 param1,Param2 param2)674 static T* NewObj(Param1 param1, Param2 param2) 675 { 676 if (void* pMem = Layout::AllocMemory(sizeof(T))) 677 { 678 return new (pMem) T(param1, param2); 679 } 680 return 0; 681 } 682 683 //! @brief オブジェクトを生成します。 684 //! 685 //! @tparam T 生成するオブジェクトのクラスです。 686 //! @tparam Param1 コンストラクタの第1引数の型です。 687 //! @tparam Param2 コンストラクタの第2引数の型です。 688 //! @tparam Param3 コンストラクタの第3引数の型です。 689 //! 690 //! @param param1 コンストラクタの第1引数です。 691 //! @param param2 コンストラクタの第2引数です。 692 //! @param param3 コンストラクタの第3引数です。 693 //! 694 //! @return 生成されたオブジェクトへのポインタを返します。 695 //! 696 //! @sa DeleteObj 697 //! 698 //! @since 2010/01/26 初版。 699 //! 700 template<typename T, typename Param1, typename Param2, typename Param3> NewObj(Param1 param1,Param2 param2,Param3 param3)701 static T* NewObj(Param1 param1, Param2 param2, Param3 param3) 702 { 703 if (void* pMem = Layout::AllocMemory(sizeof(T))) 704 { 705 return new (pMem) T(param1, param2, param3); 706 } 707 return 0; 708 } 709 710 //! @brief オブジェクトを生成します。 711 //! 712 //! @tparam T 生成するオブジェクトのクラスです。 713 //! @tparam Param1 コンストラクタの第1引数の型です。 714 //! @tparam Param2 コンストラクタの第2引数の型です。 715 //! @tparam Param3 コンストラクタの第3引数の型です。 716 //! @tparam Param4 コンストラクタの第4引数の型です。 717 //! 718 //! @param param1 コンストラクタの第1引数です。 719 //! @param param2 コンストラクタの第2引数です。 720 //! @param param3 コンストラクタの第3引数です。 721 //! @param param4 コンストラクタの第4引数です。 722 //! 723 //! @return 生成されたオブジェクトへのポインタを返します。 724 //! 725 //! @sa DeleteObj 726 //! 727 //! @since 2010/01/26 初版。 728 //! 729 template<typename T, typename Param1, typename Param2, typename Param3, typename Param4> NewObj(Param1 param1,Param2 param2,Param3 param3,Param4 param4)730 static T* NewObj(Param1 param1, Param2 param2, Param3 param3, Param4 param4) 731 { 732 if (void* pMem = Layout::AllocMemory(sizeof(T))) 733 { 734 return new (pMem) T(param1, param2, param3, param4); 735 } 736 return 0; 737 } 738 739 //! :private 740 //! @brief 配列を生成します。 741 template<typename T> NewArray(u32 num)742 static T* NewArray(u32 num) 743 { 744 void* pMem = AllocMemory(sizeof(T) * num); 745 if (! pMem) 746 { 747 return 0; 748 } 749 750 T *const objAry = static_cast<T*>(pMem); 751 752 for (u32 i = 0; i < num; ++i) 753 { 754 new (&objAry[i]) T(); 755 } 756 757 return objAry; 758 } 759 760 //! @brief オブジェクトを廃棄します。 761 //! 762 //! @tparam T オブジェクトのクラスです。 763 //! 764 //! @param pObj オブジェクトへのポインタです。 765 //! 766 //! @since 2010/01/26 初版。 767 //! 768 template<typename T> DeleteObj(T * pObj)769 static void DeleteObj(T* pObj) 770 { 771 if (pObj) 772 { 773 pObj->~T(); 774 FreeMemory(pObj); 775 } 776 } 777 778 //! :private 779 //! @brief 配列を廃棄します。 780 template<typename T> DeleteArray(T objAry[],u32 num)781 static void DeleteArray(T objAry[], u32 num) 782 { 783 if (objAry) 784 { 785 for (u32 i = 0; i < num; ++i) 786 { 787 objAry[i].~T(); 788 } 789 FreeMemory(objAry); 790 } 791 } 792 793 //! :private 794 //! @brief 配列を廃棄します。 795 template<typename T> DeletePrimArray(T objAry[])796 static void DeletePrimArray(T objAry[]) 797 { 798 if (objAry) 799 { 800 FreeMemory(objAry); 801 } 802 } 803 804 //@} 805 806 protected: 807 808 //! @name 初期化 809 // @{ 810 811 //! @brief リソースからペインを生成します。 812 //! 813 //! @details 814 //! kind には以下のいずれかのデータブロック・シグニチャが指定されます。 815 //! 816 //! ・res::DATABLOCKKIND_PANE\n 817 //! ・res::DATABLOCKKIND_PICTURE\n 818 //! ・res::DATABLOCKKIND_TEXTBOX\n 819 //! ・res::DATABLOCKKIND_WINDOW\n 820 //! ・res::DATABLOCKKIND_BOUNDING 821 //! 822 //! @param kind データブロックのシグニチャです。 823 //! @param pBlock データブロックです。 824 //! @param resBlockSet データブロックセットです。 825 //! 826 //! @return 生成されたペインを返します。 827 //! 828 //! @since 2010/02/26 初版。 829 //! 830 virtual Pane* BuildPaneObj( 831 s32 kind, 832 const void* pBlock, 833 const ResBlockSet& resBlockSet); 834 835 //@} 836 837 //! @name 取得/設定 838 // @{ 839 840 //! @brief ルートペインを設定します。 841 //! 842 //! @param pPane ペインです。 843 //! 844 //! @since 2010/02/26 初版。 845 //! SetRootPane(Pane * pPane)846 void SetRootPane(Pane* pPane) 847 { 848 m_pRootPane = pPane; 849 } 850 851 //! @brief グループコンテナを設定します。 852 //! 853 //! @param pGroupContainer グループコンテナです。 854 //! 855 //! @since 2010/02/26 初版。 856 //! SetGroupContainer(GroupContainer * pGroupContainer)857 void SetGroupContainer(GroupContainer* pGroupContainer) 858 { 859 m_pGroupContainer = pGroupContainer; 860 } 861 862 //! @brief 表示領域のサイズを設定します。 863 //! 864 //! @param size 表示領域のサイズです。 865 //! 866 //! @since 2010/02/26 初版。 867 //! SetLayoutSize(const Size & size)868 void SetLayoutSize(const Size& size) 869 { 870 m_LayoutSize = size; 871 } 872 873 // @} 874 875 protected: 876 //! @details :private 877 static nw::os::IAllocator* s_pAllocator; 878 879 //! @details :private 880 static nw::os::IAllocator* s_pDeviceMemoryAllocator; 881 882 //! @details :private 883 static bool s_LayoutDrawEnable; 884 885 //! @details :private 886 AnimTransformList m_AnimTransList; 887 888 //! @details :private 889 Pane* m_pRootPane; 890 891 //! @details :private 892 GroupContainer* m_pGroupContainer; 893 894 //! @details :private 895 Size m_LayoutSize; 896 897 private: 898 // コピーコンストラクタと代入演算子の呼び出しを禁止します。実装してはいけません。 899 Layout(const Layout& other); 900 Layout& operator = (const Layout& other); 901 }; 902 903 } // namespace nw::lyt 904 } // namespace nw 905 906 #endif // NW_LYT_LAYOUT_H_ 907