1 /*---------------------------------------------------------------------------*
2   Project:  NintendoWare
3   File:     dev_DirectPrint.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: 18106 $
14  *---------------------------------------------------------------------------*/
15 
16 #ifndef NW_DEV_DIRECTPRINT_H_
17 #define NW_DEV_DIRECTPRINT_H_
18 
19 #include <nw/types.h>
20 #include <cstdarg>
21 #include <nw/sdk.h>
22 #include <nw/ut.h>
23 #include <gles2/gl2.h>
24 #include <gles2/gl2ext.h>
25 
26 namespace nw
27 {
28 namespace dev
29 {
30 
31 #ifdef NW_DEV_ENABLED
32 namespace internal
33 {
34 
35 //---------------------------------------------------------------------------
36 //! @brief フレームバッファの情報をあらわすクラスです。
37 //---------------------------------------------------------------------------
38 struct FrameBufferInfo
39 {
40     //! @brief コンストラクタです。
41     //!
42     //! @details
43     //! メンバーの初期化は行いません。
44     //!
FrameBufferInfoFrameBufferInfo45     FrameBufferInfo()
46     {
47     }
48 
49     //! @brief コンストラクタです。
FrameBufferInfoFrameBufferInfo50     FrameBufferInfo(
51         u8* address,
52         GLuint format,
53         u16 width,
54         u16 height)
55     : m_Address(address),
56       m_Format(format),
57       m_Width(width),
58       m_Height(height)
59     {
60     }
61 
62     //! バッファのメモリアドレスです。
63     u8* m_Address;
64 
65     //! バッファのフォーマットです。
66     GLuint m_Format;
67 
68     //! バッファの幅(ピクセル数)です。
69     u16 m_Width;
70 
71     //! バッファの高さ(ピクセル数)です。
72     u16 m_Height;
73 };
74 
75 } // namespace internal
76 
77 //---------------------------------------------------------------------------
78 //! @brief フレームバッファに直接描画するクラスです。
79 //---------------------------------------------------------------------------
80 class DirectPrint
81 {
82 public:
83     //! 描画の向きを表します。
84     enum Direction
85     {
86         //! 画面を横に広く使うモードです。
87         DIRECTION_HORIZONTAL,
88         //! 画面を縦に広く使うモードです。
89         DIRECTION_VERTICAL,
90         //! :private
91         DIRECTION_MAX
92     };
93 
94     //----------------------------------------
95     //! @name コンストラクタ/デストラクタ
96     //  @{
97 
98     //! @brief コンストラクタです。
99     DirectPrint();
100 
101     //! @brief デストラクタです。
102     ~DirectPrint();
103 
104     //  @}
105 
106     //----------------------------------------
107     //! @name 初期化/終了処理
108     //  @{
109 
110     //! @brief ダイレクトプリント機能を初期化します。
111     void Initialize();
112 
113     //! @brief リソースを開放します。
114     //!
115     //! @details
116     //! デストラクタの呼び出し以前にリソースを開放したい場合に使用します。
117     //!
118     void Finalize();
119 
120     //! @brief ダイレクトプリント機能が使用可能な常態かを返します。
121     bool IsActive() const;
122 
123     //  @}
124 
125     //----------------------------------------
126     //! @name 設定
127     //  @{
128 
129     //! @brief 描画対象となるフレームバッファを設定します。
130     //!
131     //! @param buffer  フレームバッファへのポインタです。
132     //! @param format  フレームバッファのフォーマットです。
133     //! @param width  フレームバッファの幅です。(ピクセル, 8の倍数)
134     //! @param height  フレームバッファの高さです。(ピクセル, 8の倍数)
135     //!
136     void SetTargetBuffer(
137         void *buffer,
138         GLuint format,
139         u16 width,
140         u16 height);
141 
142     //! @brief 描画対象となるフレームバッファを設定します。
143     //!
144     //! @details
145     //! フレームバッファに関するその他のパラメータは以前の設定が
146     //! そのまま使われます。
147     //!
148     //! @param buffer  フレームバッファへのポインタです。
149     //!
150     void SetTargetBuffer(void *buffer);
151 
152     //! @brief 描画対象のフレームバッファに
153     //! 現在アクティブなディスプレイバッファを設定します。
154     //!
155     //! @remark
156     //! 実機のみ利用できます。
157     //!
158     void SetTargetActiveDisplayBuffer();
159 
160     //! @brief 現在設定されている描画対象のフレームバッファを取得します。
161     //!
162     //! @return フレームバッファのアドレスを返します。
163     //!
GetTargetBuffer()164     void* GetTargetBuffer() const
165     {
166         return m_Buffer.m_Address;
167     }
168 
169     //! @brief 現在設定されている描画対象の幅を取得します。
170     //!
171     //! @return フレームバッファの幅を返します。
172     //!
GetTargetWidth()173     u16 GetTargetWidth() const
174     {
175         return m_Buffer.m_Width;
176     }
177 
178     //! @brief 現在設定されている描画対象の高さを取得します。
179     //!
180     //! @return フレームバッファの高さを返します。
181     //!
GetTargetHeight()182     u16 GetTargetHeight() const
183     {
184         return m_Buffer.m_Height;
185     }
186 
187     //! @brief 描画色を設定します。
188     //!
189     //! @param color 描画色です。
190     //!
191     void SetColor(ut::Color8 color);
192 
193     //! @brief 描画色を設定します。
194     //!
195     //! @param r  文字描画色の赤成分です。
196     //! @param g  文字描画色の緑成分です。
197     //! @param b  文字描画色の青成分です。
198     //!
199     void SetColor(u8 r, u8 g, u8 b);
200 
201     //! @brief 現在の描画色を取得します。
202     //!
203     //! @return 描画色を返します。
204     //!
205     ut::Color8 GetColor() const;
206 
207     //! @brief 描画の方向を指定します。
208     //!
209     //! @details
210     //! 描画方向はDIRECTION_VERTICALに初期化されます。
211     //!
212     //! @param direction  描画の方向です。
213     //!
214     //! @sa GetDirection
215     //!
216     void SetDirection(Direction direction);
217 
218     //! @brief 描画の方向を取得します。
219     //!
220     //! @return 描画の方向を返します。
221     //!
222     //! @sa SetDirection
223     //!
224     Direction GetDirection() const;
225 
226     //  @}
227 
228     //----------------------------------------
229     //! @name 描画
230     //  @{
231 
232     //! @brief 矩形領域を暗くします。
233     //!
234     //! @param x  矩形領域の位置(X方向成分)です。
235     //! @param y  矩形領域の位置(Y方向成分)です。
236     //! @param width  矩形領域の幅です。
237     //! @param height  矩形領域の高さです。
238     //!
239     void Erase(int x, int y, int width, int height);
240 
241     //! @brief 文字列を描画します。
242     //!
243     //! @details
244     //! 描画される文字列の後ろの矩形領域は暗く表示されます。
245     //! 行右端で折り返します。
246     //!
247     //! @param x  描画開始位置(X方向成分)です。
248     //! @param y  描画開始位置(Y方向成分)です。
249     //! @param format  文字列のフォーマットです。
250     //!
251     void Printf(int x, int y, const char* format, ...);
252 
253     //! @brief 文字列を描画します。
254     //!
255     //! @details
256     //! 描画される文字列の後ろの矩形領域は暗く表示されます。
257     //!
258     //! @param x  描画開始位置(X方向成分)です。
259     //! @param y  描画開始位置(Y方向成分)です。
260     //! @param turnOver  行右端で折り返す場合には true を指定します。
261     //! @param format  文字列のフォーマットです。
262     //!
263     void Printf(int x, int y, bool turnOver, const char* format, ...);
264 
265     //! @brief 文字列を描画します。
266     //!
267     //! @param x  描画開始位置(X方向成分)です。
268     //! @param y  描画開始位置(Y方向成分)です。
269     //! @param turnOver  行右端で折り返す場合には true を指定します。
270     //! @param backErase  背景を暗くする場合は true を指定します。
271     //! @param format  文字列のフォーマットです。
272     //!
273     void Printf(
274         int x,
275         int y,
276         bool turnOver,
277         bool backErase,
278         const char* format,
279         ...);
280 
281     //! @brief 文字列を描画します。
282     //!
283     //! @param x  描画開始位置(X方向成分)です。
284     //! @param y  描画開始位置(Y方向成分)です。
285     //! @param format  文字列のフォーマットです。
286     //! @param vargs  可変長引数です。
287     //! @param turnOver  行右端で折り返す場合には true を指定します。
288     //! @param backErase  背景を暗くする場合は true を指定します。
289     //!
290     void VPrintf(
291         int x,
292         int y,
293         const char* format,
294         std::va_list vargs,
295         bool turnOver = true,
296         bool backErase = true);
297 
298     //! @brief 文字列を描画します。
299     //!
300     //! @param x  描画開始位置(X方向成分)です。
301     //! @param y  描画開始位置(Y方向成分)です。
302     //! @param str  文字列です。
303     //! @param turnOver  行右端で折り返す場合には true を指定します。
304     //! @param backErase  背景を暗くする場合は true を指定します。
305     //!
306     void DrawString(
307         int x,
308         int y,
309         const char* str,
310         bool turnOver = true,
311         bool backErase = false);
312 
313     //! @brief 描画された文字列をキャッシュからメモリへストアします。
314     void StoreCache();
315 
316     //  @}
317 
318 private:
319     //! フレームバッファ情報。
320     internal::FrameBufferInfo m_Buffer;
321 
322     //! 描画色。
323     ut::Color8 m_Color;
324 
325     //! 描画方向
326     Direction m_Direction;
327 
328     //! 初期化が完了しているか。
329     bool m_Initialized;
330 };
331 
332 #else
333 class DirectPrint
334 {
335 public:
336     enum Direction
337     {
338         DIRECTION_HORIZONTAL,
339         DIRECTION_VERTICAL,
340         DIRECTION_MAX
341     };
342 
343     DirectPrint(){}
344 
345     ~DirectPrint(){}
346 
347     void Initialize(){}
348 
349     void Finalize(){}
350 
351     bool IsActive() const{ return false; }
352 
353     void SetTargetBuffer(
354         void *,
355         GLuint,
356         u16,
357         u16){}
358 
359     void SetTargetBuffer(void *){}
360 
361     void SetTargetActiveDisplayBuffer(){}
362 
363     void* GetTargetBuffer() const{ return NULL; }
364 
365     u16 GetTargetWidth() const{ return 0; }
366 
367     u16 GetTargetHeight() const{ return 0; }
368 
369     void SetColor(ut::Color8){}
370 
371     void SetColor(u8, u8, u8){}
372 
373     ut::Color8 GetColor() const{ return ut::Color8(); }
374 
375     void SetDirection(Direction){}
376 
377     Direction GetDirection() const{ return Direction(); }
378 
379     void Erase(int, int, int, int){}
380 
381     void Printf(int, int, const char*, ...){}
382 
383     void Printf(int, int, bool, const char*, ...){}
384 
385     void Printf(
386         int,
387         int,
388         bool,
389         bool,
390         const char*,
391         ...)
392     {}
393 
394     void VPrintf(
395         int,
396         int,
397         const char*,
398         std::va_list,
399         bool = true,
400         bool = true)
401     {}
402 
403     void DrawString(
404         int,
405         int,
406         const char*,
407         bool = true,
408         bool = false)
409     {}
410 
411     void StoreCache(){}
412 };
413 #endif
414 
415 } // namespace nw::dev
416 } // namespace nw
417 
418 #endif // NW_DEV_DIRECTPRINT_H_
419