• R/O
  • SSH
  • HTTPS

qrobosdk: コミット


コミットメタ情報

リビジョン6 (tree)
日時2008-05-08 02:08:53
作者satofumi

ログメッセージ

add for SDL wrappers

変更サマリ

差分

--- trunk/qrk_todo.txt (revision 5)
+++ trunk/qrk_todo.txt (revision 6)
@@ -1,5 +1,14 @@
11 TITLE Quick Robot Development Kit (qrk)
22
3+GUI ライブラリ
4+ サンプルの作成
5+ createScreenSample.cpp
6+ 何かキーがおされたら、終了する
7+
8+ toggleScreenSample.cpp
9+ リターンキーでトグル
10+ それ以外のキーで終了する
11+
312 この Todo リストを見るためのツールを作成する
413
514 SH7045F への書き込みツールを Qt で作る
--- trunk/libs/gui/SdlVideoInit.h (nonexistent)
+++ trunk/libs/gui/SdlVideoInit.h (revision 6)
@@ -0,0 +1,44 @@
1+#ifndef SDL_VIDEO_INIT_H
2+#define SDL_VIDEO_INIT_H
3+
4+/*!
5+ \file
6+ \brief SDL_VIDEO システムの初期化
7+
8+ \author Satofumi KAMIMURA
9+
10+ $Id$
11+*/
12+
13+#include <memory>
14+
15+
16+namespace qrk {
17+
18+ /*!
19+ \brief SDL_VIDEO システムの初期化クラス
20+ */
21+ class SdlVideoInit {
22+ SdlVideoInit(const SdlVideoInit& rhs);
23+ SdlVideoInit& operator = (const SdlVideoInit& rhs);
24+
25+ struct pImpl;
26+ const std::auto_ptr<pImpl> pimpl;
27+
28+ public:
29+ SdlVideoInit(void);
30+ ~SdlVideoInit(void);
31+
32+ /*!
33+ \brief システムの初期化
34+ */
35+ void init(void);
36+
37+ /*!
38+ \brief システムのシャットダウン
39+ */
40+ void quit(void);
41+ };
42+};
43+
44+#endif /* !SDL_VIDEO_INIT_H */
--- trunk/libs/gui/ScreenCtrl.cpp (revision 5)
+++ trunk/libs/gui/ScreenCtrl.cpp (revision 6)
@@ -9,96 +9,164 @@
99
1010 #include <string>
1111 #include "ScreenCtrl.h"
12+#include "SdlVideoInit.h"
1213
1314 using namespace qrk;
1415
1516
16-struct ScreenCtrl::pImpl
17-{
17+struct ScreenCtrl::pImpl {
18+ SdlVideoInit sdl_video_;
1819 std::string error_message_;
20+ SDL_Surface* scr_;
21+ Uint32 pre_flags_;
22+ int next_width_;
23+ int next_height_;
24+ int next_bpp_;
25+ bool is_fullscreen_;
26+ bool toggle_fullscreen_;
1927
20- static pImpl* getObject(void)
21- {
22- static pImpl obj;
23- return &obj;
28+ std::string caption_;
29+ std::string icon_caption_;
30+ const SDL_Surface* icon_surface_;
31+ const Uint8* icon_mask_;
32+
33+ pImpl(void)
34+ : error_message_(SDL_GetError()), scr_(NULL), pre_flags_(0),
35+ next_width_(640), next_height_(480), next_bpp_(0),
36+ is_fullscreen_(false), toggle_fullscreen_(false),
37+ icon_surface_(NULL), icon_mask_(NULL) {
2438 }
39+
40+ static pImpl* getObject(void) {
41+ static pImpl singleton;
42+ return &singleton;
43+ }
44+
45+ void show(Uint32 flags) {
46+
47+ if ((! scr_) && icon_surface_) {
48+ // アイコンの初期化は、SDL_SetVideoMode() を呼び出す前のみ有効
49+ SDL_WM_SetIcon(const_cast<SDL_Surface*>(icon_surface_),
50+ const_cast<Uint8*>(icon_mask_));
51+ }
52+
53+ sdl_video_.init();
54+ scr_ = SDL_SetVideoMode(next_width_, next_height_, next_bpp_, flags);
55+ if (scr_) {
56+ pre_flags_ = flags;
57+
58+ // キャプションは、画面の生成後に設定
59+ SDL_WM_SetCaption(caption_.c_str(), icon_caption_.c_str());
60+
61+ if (flags & SDL_FULLSCREEN) {
62+ // 実際にフルスクリーンかどうか、の厳密な保証はできない
63+ is_fullscreen_ = true;
64+ }
65+ }
66+ toggle_fullscreen_ = false;
67+ next_bpp_ = 0;
68+ error_message_ = SDL_GetError();
69+ }
70+
71+ void hide(void) {
72+ sdl_video_.quit();
73+ }
2574 };
2675
2776
28-ScreenCtrl::ScreenCtrl(void) : pimpl(pImpl::getObject())
29-{
77+ScreenCtrl::ScreenCtrl(void) : pimpl(pImpl::getObject()) {
3078 }
3179
3280
33-ScreenCtrl::~ScreenCtrl(void)
34-{
81+ScreenCtrl::~ScreenCtrl(void) {
3582 }
3683
3784
38-const char* ScreenCtrl::what(void)
39-{
85+const char* ScreenCtrl::what(void) {
4086 return pimpl->error_message_.c_str();
4187 }
4288
4389
44-SDL_Surface* ScreenCtrl::show(Uint32 mode)
45-{
46- return NULL;
90+SDL_Surface* ScreenCtrl::show(Uint32 flags) {
91+
92+ // 画面設定が変わっていたら、show() のときに画面を作り直す
93+ if ((! pimpl->scr_) ||
94+ pimpl->toggle_fullscreen_ ||
95+ (pimpl->next_bpp_ != 0) ||
96+ (pimpl->next_width_ != pimpl->scr_->w) ||
97+ (pimpl->next_height_ != pimpl->scr_->h)) {
98+ hide();
99+ pimpl->show(flags);
100+ }
101+ return pimpl->scr_;
47102 }
48103
49104
50-void ScreenCtrl::hide(void)
51-{
52- // !!!
105+void ScreenCtrl::hide(void) {
106+ pimpl->hide();
53107 }
54108
55109
56-void ScreenCtrl::setWindowSize(size_t width, size_t height)
57-{
58- // !!!
110+void ScreenCtrl::setWindowSize(size_t width, size_t height) {
111+ pimpl->next_width_ = width;
112+ pimpl->next_height_ = height;
59113 }
60114
61115
62-size_t ScreenCtrl::width(void)
63-{
64- // !!!
65- return 0;
116+size_t ScreenCtrl::width(void) {
117+
118+ if (! pimpl->scr_) {
119+ // ウィンドウ非表示
120+ return 0;
121+ }
122+ return pimpl->scr_->w;
66123 }
67124
68125
69-size_t ScreenCtrl::height(void)
70-{
71- // !!!
72- return 0;
126+size_t ScreenCtrl::height(void) {
127+
128+ if (! pimpl->scr_) {
129+ // ウィンドウ非表示
130+ return 0;
131+ }
132+ return pimpl->scr_->h;
73133 }
74134
75135
76-void ScreenCtrl::setFullscreen(bool on)
77-{
78- // !!!
136+void ScreenCtrl::setWindowBpp(size_t bpp) {
137+ pimpl->next_bpp_ = bpp;
79138 }
80139
81140
82-bool ScreenCtrl::fullscreen(void)
83-{
84- // !!!
85- return false;
141+void ScreenCtrl::setFullscreen(bool on) {
142+
143+ if (on != pimpl->is_fullscreen_) {
144+ Uint32 next_flags = pimpl->pre_flags_;
145+ if (on) {
146+ next_flags |= SDL_FULLSCREEN;
147+ } else {
148+ next_flags &= ~SDL_FULLSCREEN;
149+ }
150+
151+ // 画面の再生成を強制する
152+ pimpl->toggle_fullscreen_ = true;
153+ show(pimpl->pre_flags_);
154+ }
86155 }
87156
88157
89-void ScreenCtrl::setCaption(const char* caption)
90-{
91- // !!!
158+bool ScreenCtrl::isFullscreen(void) {
159+ return pimpl->is_fullscreen_;
92160 }
93161
94162
95-void ScreenCtrl::setIcon(SDL_Surface* icon, Uint8* mask)
96-{
97- // !!!
163+void ScreenCtrl::setCaption(const char* caption, const char* icon_caption) {
164+ pimpl->caption_ = caption;
165+ pimpl->icon_caption_ = icon_caption;
98166 }
99167
100168
101-void ScreenCtrl::setWindowBpp(size_t bpp)
102-{
103- // !!!
169+void ScreenCtrl::setIcon(const SDL_Surface* icon, const Uint8* mask) {
170+ pimpl->icon_surface_ = icon;
171+ pimpl->icon_mask_ = mask;
104172 }
--- trunk/libs/gui/ScreenCtrl.h (revision 5)
+++ trunk/libs/gui/ScreenCtrl.h (revision 6)
@@ -8,6 +8,8 @@
88 \author Satofumi KAMIMURA
99
1010 $Id$
11+
12+ \attention show() は複数のスレッド以外から呼び出されてはならない (SDL-1.2 の仕様)
1113 */
1214
1315 #include <SDL.h>
@@ -14,8 +16,11 @@
1416
1517
1618 namespace qrk {
17- class ScreenCtrl
18- {
19+
20+ /*!
21+ \brief 画面制御
22+ */
23+ class ScreenCtrl {
1924 ScreenCtrl(const ScreenCtrl& rhs);
2025 ScreenCtrl& operator = (const ScreenCtrl& rhs);
2126
@@ -34,25 +39,88 @@
3439 const char* what(void);
3540
3641 /*!
37- \brief 画面の生成
42+ \brief 画面の表示
3843
39- \param mode SDL_SetVideoMode に渡すモード引数
44+ \param flags SDL_SetVideoMode に渡すモード引数
4045
4146 \return SDL の返すスクリーン資源
4247 */
43- SDL_Surface* show(Uint32 mode = 0);
48+ SDL_Surface* show(Uint32 flags = 0);
49+
50+ /*!
51+ \brief 画面の非表示
52+ */
4453 void hide(void);
4554
55+ /*!
56+ \brief 画面サイズの変更
57+
58+ \param width [i] 幅
59+ \param height [i] 高さ
60+
61+ \attention 変更は、次の show() から有効になる
62+ */
4663 void setWindowSize(size_t width, size_t height);
64+
65+ /*!
66+ \brief 現在の画面幅
67+
68+ \return 画面幅
69+ */
4770 size_t width(void);
71+
72+ /*!
73+ \brief 現在の画面高さ
74+
75+ \return 画面高さ
76+ */
4877 size_t height(void);
4978
79+ /*!
80+ \brief 画面解像度の設定
81+
82+ \param bpp [i] 画面の解像度 [bit]
83+ */
84+ void setWindowBpp(size_t bpp);
85+
86+ /*!
87+ \brief 画面モード
88+
89+ \param on [i] フルスクリーン指定のとき true / 通常スクリーンのとき false
90+
91+ \attention 変更は、次の show() から有効になる
92+ */
5093 void setFullscreen(bool on = true);
51- bool fullscreen(void);
5294
53- void setCaption(const char* caption);
54- void setIcon(SDL_Surface* icon, Uint8* mask = NULL);
55- void setWindowBpp(size_t bpp);
95+ /*!
96+ \brief フルスクリーンかを返す
97+
98+ \retval true フルスクリーン
99+ \retval false 通常スクリーン
100+ */
101+ bool isFullscreen(void);
102+
103+ /*!
104+ \brief タイトル文字列の設定
105+
106+ \param caption [i] タイトル文字列
107+ \param icon_caption [i] アイコン時のタイトル文字列
108+
109+ \attention 最初に show() が呼ばれる前に呼び出されなければならない
110+ \attention 詳しくは、SDL_WM_SetCaption() を参照のこと
111+ */
112+ void setCaption(const char* caption, const char* icon_caption);
113+
114+ /*!
115+ \brief タイトルアイコンの設定
116+
117+ \param icon [i] タイトルアイコン
118+ \param mask [i] マスク領域
119+
120+ \attention 最初に show() が呼ばれる前に呼び出されなければならない
121+ \attention 詳しくは、SDL_WM_SetIcon() を参照のこと
122+ */
123+ void setIcon(const SDL_Surface* icon, const Uint8* mask = NULL);
56124 };
57125 };
58126
--- trunk/libs/gui/Makefile (revision 5)
+++ trunk/libs/gui/Makefile (revision 6)
@@ -5,7 +5,7 @@
55 # Compile options
66 CC = ${CXX}
77 CXXFLAGS = -g -O0 -Wall -Werror ${INCLUDES} `sdl-config --cflags`
8-INCLUDES = -I../
8+INCLUDES = -I../system/sdl
99
1010 # Target
1111 GUI_LIB = gui.a
@@ -14,7 +14,7 @@
1414 all : ${TARGET}
1515
1616 clean :
17- ${RM} *.ot ${TARGET}
17+ ${RM} *.o ${TARGET}
1818
1919 depend :
2020 makedepend -Y -- ${INCLUDES} -- ${wildcard *.h *.cpp}
@@ -22,5 +22,10 @@
2222 .PHONY : all clean depend
2323 ######################################################################
2424 ${GUI_LIB} : \
25+ ${GUI_LIB}(SdlVideoInit.o) \
2526 ${GUI_LIB}(ScreenCtrl.o) \
2627
28+# DO NOT DELETE
29+
30+ScreenCtrl.o: ScreenCtrl.h SdlVideoInit.h
31+SdlVideoInit.o: SdlVideoInit.h ../system/sdl/SdlInit.h
--- trunk/libs/gui/SdlVideoInit.cpp (nonexistent)
+++ trunk/libs/gui/SdlVideoInit.cpp (revision 6)
@@ -0,0 +1,43 @@
1+/*!
2+ \file
3+ \brief SDL_VIDEO システムの初期化
4+
5+ \author Satofumi KAMIMURA
6+
7+ $Id$
8+*/
9+
10+#include <SDL.h>
11+#include "SdlVideoInit.h"
12+#include "SdlInit.h"
13+
14+using namespace qrk;
15+
16+
17+struct SdlVideoInit::pImpl : private SdlInit {
18+ static bool initialized_;
19+};
20+bool SdlVideoInit::pImpl::initialized_ = false;
21+
22+
23+SdlVideoInit::SdlVideoInit(void) : pimpl(new pImpl) {
24+}
25+
26+
27+SdlVideoInit::~SdlVideoInit(void) {
28+ // exit() 時に SdlInit の実装内で SDL_Quit() が呼ばれるはずなので、何もしない
29+}
30+
31+
32+void SdlVideoInit::init(void) {
33+ if (pimpl->initialized_) {
34+ return;
35+ }
36+ pimpl->initialized_ = (SDL_InitSubSystem(SDL_INIT_VIDEO) < 0) ? false : true;
37+}
38+
39+
40+void SdlVideoInit::quit(void) {
41+ SDL_QuitSubSystem(SDL_INIT_VIDEO);
42+ pimpl->initialized_ = false;
43+}
--- trunk/libs/system/sdl/Delay.cpp (revision 5)
+++ trunk/libs/system/sdl/Delay.cpp (revision 6)
@@ -11,7 +11,6 @@
1111 #include "Delay.h"
1212
1313
14-void qrk::delay(int msec)
15- {
14+void qrk::delay(int msec) {
1615 SDL_Delay(msec);
1716 }
--- trunk/libs/system/sdl/SdlInit.cpp (nonexistent)
+++ trunk/libs/system/sdl/SdlInit.cpp (revision 6)
@@ -0,0 +1,40 @@
1+/*!
2+ \file
3+ \brief SDL システムの初期化
4+
5+ \author Satofumi KAMIMURA
6+
7+ $Id$
8+*/
9+
10+#include <SDL.h>
11+#include <stdlib.h>
12+#include "SdlInit.h"
13+
14+using namespace qrk;
15+
16+
17+struct SdlInit::pImpl {
18+ static bool initialized_;
19+};
20+bool SdlInit::pImpl::initialized_ = false;
21+
22+
23+SdlInit::SdlInit(void) : pimpl(new pImpl) {
24+
25+ if (pimpl->initialized_) {
26+ // 初期化済みならば、戻る
27+ return;
28+ }
29+
30+ if (SDL_Init(0) < 0) {
31+ // !!! 例外を投げるべきか?
32+ return;
33+ }
34+ atexit(SDL_Quit);
35+ pimpl->initialized_ = true;
36+}
37+
38+
39+SdlInit::~SdlInit(void) {
40+}
--- trunk/libs/system/sdl/SdlInit.h (nonexistent)
+++ trunk/libs/system/sdl/SdlInit.h (revision 6)
@@ -0,0 +1,34 @@
1+#ifndef SDL_INIT_H
2+#define SDL_INIT_H
3+
4+/*!
5+ \file
6+ \brief SDL システムの初期化
7+
8+ \author Satofumi KAMIMURA
9+
10+ $Id$
11+*/
12+
13+#include <memory>
14+
15+
16+namespace qrk {
17+
18+ /*!
19+ \brief SDL システムの初期化クラス
20+ */
21+ class SdlInit {
22+ SdlInit(const SdlInit& rhs);
23+ SdlInit& operator = (const SdlInit& rhs);
24+
25+ struct pImpl;
26+ const std::auto_ptr<pImpl> pimpl;
27+
28+ protected:
29+ SdlInit(void);
30+ ~SdlInit(void);
31+ };
32+};
33+
34+#endif /* !SDL_INIT_H */
--- trunk/libs/system/sdl/Makefile (revision 5)
+++ trunk/libs/system/sdl/Makefile (revision 6)
@@ -22,4 +22,5 @@
2222 .PHONY : all clean depend
2323 ######################################################################
2424 ${SYSTEM_SDL} : \
25+ ${SYSTEM_SDL}(SdlInit.o) \
2526 ${SYSTEM_SDL}(Delay.o) \
--- trunk/libs/system/Delay.h (revision 5)
+++ trunk/libs/system/Delay.h (revision 6)
@@ -10,8 +10,18 @@
1010 $Id$
1111 */
1212
13-namespace qrk
14-{
13+/*!
14+ \brief Quick Robot Development Kit
15+*/
16+namespace qrk {
17+
18+ /*!
19+ \brief 待機
20+
21+ 指定された時間だけ待機する
22+
23+ \param msec [i] 待機時間 [msec]
24+ */
1525 void delay(int msec);
1626 };
1727
旧リポジトリブラウザで表示