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