Mercurial > otakunoraifu
comparison window/picture.h @ 0:223b71206888
Initial import
author | thib |
---|---|
date | Fri, 01 Aug 2008 16:32:45 +0000 |
parents | |
children | 5ae5533b3a9a |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:223b71206888 |
---|---|
1 #ifndef __PICTURE__ | |
2 #define __PICTURE__ | |
3 | |
4 #include<vector> | |
5 #include<list> | |
6 #ifdef HAVE_CONFIG_H | |
7 # include "config.h" | |
8 #endif | |
9 | |
10 class PicBase; | |
11 class PicContainer; | |
12 class PicRoot; | |
13 | |
14 class Surface; | |
15 | |
16 namespace Event { | |
17 class Video; | |
18 } | |
19 | |
20 /* PicBase の内容をイベントと連動させるためのインターフェース */ | |
21 class PicAnm { | |
22 public: | |
23 typedef std::vector<PicBase*>::iterator iterator; | |
24 std::vector<PicBase*> pic; | |
25 PicAnm(PicBase* pic); | |
26 PicAnm(std::vector<PicBase*> pic); | |
27 virtual ~PicAnm(); | |
28 }; | |
29 | |
30 class PicBase { | |
31 friend class PicContainer; | |
32 friend class PicWidget; | |
33 | |
34 typedef std::list<PicBase*> List; | |
35 typedef std::list<PicBase*>::iterator iterator; | |
36 | |
37 PicContainer* parent; | |
38 class PicWidget* widget; | |
39 Rect rel_pos; // relative position to the parent | |
40 Rect rel_solid_area; // solid area(not alpha-blended) to the parent | |
41 Rect clip_area; // clip area on the parent | |
42 bool is_hidden; | |
43 bool is_hidden_now; | |
44 bool is_cached; | |
45 public: | |
46 enum { /*MOBILE=1,*/ CACHE_BACK=2, /* CACHE_SELF=4,*/ NO_PICTURE=8, SOLID = 16, SURFACE_FREE = 32, FIT_SURFACE = 64, BLIT_SATURATE = 128, BLIT_MULTIPLY = 256, ALPHA_FREE=512}; | |
47 private: | |
48 int attribute; | |
49 | |
50 PicRoot* root; | |
51 iterator z_pos; | |
52 int surface_x, surface_y, surface_w, surface_h; | |
53 Surface* surface_back; | |
54 Surface* surface_own; | |
55 const unsigned char* surface_alpha; | |
56 Rect surface_alpha_rect; | |
57 int distance_root; | |
58 | |
59 void Blit(const Rect& rpos); | |
60 void Blit(void) { | |
61 is_cached = true; | |
62 Blit(Rect(0, 0, rel_pos.width(), rel_pos.height())); | |
63 } | |
64 /* | |
65 ** rpos : relative position to the widget | |
66 ** ppos : relative position to the parent | |
67 ** ppos = parent_pos(rpos) | |
68 ** rpos = child_pos(ppos, parent->this_widget) | |
69 ** cpos : relative position to a child widget | |
70 ** cpos = child_pos(rpos, a_child_widget) | |
71 ** apos : absolute position in the screen | |
72 ** apos = QueryAbsPos(rpos); | |
73 ** or | |
74 ** Rect ppos = rel_pos; | |
75 ** apos = parent->QueryAbsPos(ppos); | |
76 ** the latter form is used for 'rel_pos', | |
77 ** because rel_pos is defined as the relative position to the parent | |
78 */ | |
79 Rect QueryAbsPos(Rect& ppos); // この picture 内の rel_pos を表示するのに実際に必要な絶対座標を得る | |
80 | |
81 static Rect child_pos(Rect rpos, PicBase* child) { /* return 'cpos' */ | |
82 rpos.intersect(child->rel_pos); | |
83 rpos.rmove( -(child->rel_pos.lx), -(child->rel_pos.ty)); | |
84 return rpos; | |
85 } | |
86 Rect parent_pos(Rect rpos) { /* return 'ppos' */ | |
87 rpos.rmove(rel_pos.lx, rel_pos.ty); | |
88 rpos.intersect(rel_pos); | |
89 return rpos; | |
90 } | |
91 void SetEventWidget(class PicWidget* widget); | |
92 public: | |
93 PicBase(const Rect& rel_pos, PicContainer* parent, int attr); | |
94 virtual ~PicBase(); | |
95 void InitRoot(PicRoot* r) { root = r;} // only called from PicRoot::PicRoot | |
96 | |
97 void ReBlit(const Rect& rpos); | |
98 void ReBlit(void) { ReBlit(Rect(0, 0, rel_pos.width(), rel_pos.height()));} | |
99 void ExecReBlit(const Rect& rpos); | |
100 void SimpleBlit(Surface* screen); | |
101 | |
102 virtual void RMove(int add_x, int add_y); | |
103 void Move(int new_rx, int new_ry); | |
104 #define ZMOVE_TOP ((PicBase*)0xffff00ff) /* 最前面へ */ | |
105 #define ZMOVE_BOTTOM ((PicBase*)0xffff0fff) /* 最背面へ */ | |
106 void ZMove(PicBase* back); // back の前に移動(back と自分は同じ親を持つこと) | |
107 | |
108 void SetSurface(Surface* new_surface, int x, int y, int attribute = 0); | |
109 void SetSurface(const char* new_surface, int x, int y); | |
110 void SetSurfacePos(int x, int y); | |
111 int SurfacePosX(void); | |
112 int SurfacePosY(void); | |
113 void SetSurfaceRect(const Rect& r); | |
114 void SetSurfaceAlpha(const unsigned char* alpha, const Rect& rect); | |
115 void SetSurfaceAlphaFile(const char* file); | |
116 void SetSurfaceColorKey(int r, int g, int b); | |
117 void SetSurfaceAttribute(int attribute); | |
118 void SetSurfaceFreeFlag(bool flag=true); | |
119 void SetClipArea(const Rect& r); | |
120 | |
121 void hide(void); | |
122 void show_all(void); | |
123 void show(void); | |
124 | |
125 int PosX(void) const { return rel_pos.lx;} | |
126 int PosY(void) const { return rel_pos.ty;} | |
127 int Width(void) const { return rel_pos.width();} | |
128 int Height(void) const { return rel_pos.height();} | |
129 int DistanceRoot(void) const { return distance_root; } | |
130 bool IsHidden(void) { return is_hidden_now;} | |
131 bool IsParent(PicBase* pic); | |
132 | |
133 std::vector<PicAnm*> anm; | |
134 void ClearAnm(void); | |
135 }; | |
136 | |
137 class PicContainer : public PicBase { | |
138 friend class PicBase; | |
139 | |
140 void BlitBack(iterator z, Rect rpos); // z より後ろの領域を描画 | |
141 void BlitFront(iterator z, Rect rpos); // z を含め、zより前の領域を描画 | |
142 void BlitChildren(Rect rpos); | |
143 void BlitSelf(Rect rpos); | |
144 void BlitSelf(void) { | |
145 is_cached = true; | |
146 BlitSelf(Rect(0, 0, rel_pos.width(), rel_pos.height())); | |
147 } | |
148 public: | |
149 List children; | |
150 private: | |
151 | |
152 void set_showflag(void); | |
153 void set_nowhiddenflag(bool is_hide); | |
154 public: | |
155 PicContainer(const Rect& rel_pos, PicContainer* parent, int attr); | |
156 ~PicContainer(); | |
157 PicBase* create_leaf(const Rect& rel_pos, int attr); | |
158 PicContainer* create_node(const Rect& rel_pos, int attr); | |
159 PicRoot& Root(void) { return *root;} | |
160 void RMove(int add_x, int add_y); | |
161 }; | |
162 | |
163 typedef enum { NO_MASK, ALPHA_MASK, COLOR_MASK} MaskType; | |
164 struct PicRoot { | |
165 class PicContainer* root; | |
166 private: | |
167 class FileToSurface* ftosurface; | |
168 struct UpdateItem { | |
169 PicBase* pic; | |
170 Rect rpos; | |
171 Rect apos; | |
172 static bool less(const UpdateItem&, const UpdateItem&); | |
173 UpdateItem(PicBase* p, const Rect& _rpos, const Rect& _apos) : pic(p), rpos(_rpos), apos(_apos) {} | |
174 }; | |
175 std::vector<UpdateItem> update_rects; | |
176 | |
177 friend class FileToSurface; | |
178 void DeleteSurfaceImpl(Surface* s) const; | |
179 public: | |
180 void Update(PicBase* pic, const Rect& rpos, const Rect& apos); | |
181 void DeleteUpdatePic(PicBase* pic); | |
182 void ExecUpdate(void); | |
183 void SetWindowCaption(const char* caption); | |
184 | |
185 // Surface 操作 | |
186 Surface* NewSurfaceFromRGBAData(int w, int h, char* data, MaskType with_mask) const; // data は malloc されたものであること(SDLの内部仕様) | |
187 Surface* NewSurface(int w, int h, MaskType with_mask) const; | |
188 Surface* NewSurface(const char* filename, MaskType with_mask = ALPHA_MASK); | |
189 Surface* RotZoomSurface(Surface* from, double zoom, double rotate_angle); | |
190 void DeleteSurface(Surface* s); | |
191 void BlitSurface(Surface* src, const Rect& src_rpos, const unsigned char* alpha, const Rect& alpha_r, Surface* dest, const Rect& dest_rpos, int attribute) const; | |
192 void BlitSurface(Surface* src, const Rect& src_rpos, Surface* dest, const Rect& dest_rpos) const { | |
193 BlitSurface(src, src_rpos, 0, Rect(0,0), dest, dest_rpos, 0); | |
194 } | |
195 static bool with_mask(Surface* src); | |
196 | |
197 Surface* surface; | |
198 Surface* hw_surface; | |
199 int width, height; | |
200 PicRoot(void); | |
201 ~PicRoot(); | |
202 PicBase* create_leaf(const Rect& apos, int attr) { | |
203 return root->create_leaf(apos, attr); | |
204 } | |
205 PicContainer* create_node(const Rect& apos, int attr) { | |
206 return root->create_node(apos, attr); | |
207 } | |
208 }; | |
209 | |
210 class PicWidget { | |
211 PicBase* pic; /* 本来継承するべきだが、遅延初期化したいので instance */ | |
212 public: | |
213 PicWidget(void); | |
214 virtual ~PicWidget(); | |
215 void SetPic(PicBase* new_pic); | |
216 PicBase* Pic(void); | |
217 PicContainer* PicNode(void); | |
218 virtual void activate(void); | |
219 virtual void deactivate(void); | |
220 virtual void SetRegion(const Rect& apos); | |
221 void show(void); | |
222 void hide(void); | |
223 void show_all(void); | |
224 }; | |
225 | |
226 #endif /* PICTURE */ |