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