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: 25594 $
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 private:
876     static nw::os::IAllocator* s_pAllocator;
877     static nw::os::IAllocator* s_pDeviceMemoryAllocator;
878     static bool s_LayoutDrawEnable;
879 
880     AnimTransformList m_AnimTransList;
881     Pane* m_pRootPane;
882     GroupContainer* m_pGroupContainer;
883     Size m_LayoutSize;
884 
885 private:
886     // コピーコンストラクタと代入演算子の呼び出しを禁止します。実装してはいけません。
887     Layout(const Layout& other);
888     Layout& operator = (const Layout& other);
889 };
890 
891 } // namespace nw::lyt
892 } // namespace nw
893 
894 #endif // NW_LYT_LAYOUT_H_
895