TNB Library
TnbBitmapAnimater.h
[詳解]
1#pragma once
18#include "TnbBitmapImage.h"
19#include "TnbSimpleVector.h"
20
21
22
23//TNB Library
24namespace TNB
25{
26
27
28
42{
44 virtual ~IBitmapWipable(void) { }
45
50 virtual IBitmapWipable* Clone(void) const = 0;
51
62 virtual CBitmapHandle Wipe(CBitmapHandle baseBmp, CBitmapHandle overBmp, UINT par, UINT max) const = 0;
63
66};
67
68
69
81{
82 DEFSUPER(IBitmapWipable);
83protected:
85public:
86
89 {
90 }
91
96 virtual IBitmapWipable* Clone(void) const
97 {
98 if ( m_pWiper.IsNull() ) return NULL;
99 return new CReverseAdaptWiper(*m_pWiper);
100 }
101
112 virtual CBitmapHandle Wipe(CBitmapHandle baseBmp, CBitmapHandle overBmp, UINT par, UINT max) const
113 {
114 return m_pWiper->Wipe(overBmp, baseBmp, max - par, max);
115 }
116};
117
118
119
143{
144 DEFSUPER(IBitmapWipable);
145protected:
149 void m_AllRemove(void)
150 {
152 }
153public:
154
157 {
158 }
159
162 {
163 m_AllRemove();
164 }
165
170 virtual IBitmapWipable* Clone(void) const
171 {
173 loop ( i, m_wipers.GetSize() )
174 {
175 P->AddWiper(*m_wipers[i]);
176 }
177 return P;
178 }
179
190 virtual CBitmapHandle Wipe(CBitmapHandle baseBmp, CBitmapHandle overBmp, UINT par, UINT max) const
191 {
192 loop ( i, m_wipers.GetSize() )
193 {
194 overBmp = m_wipers[i]->Wipe(baseBmp, overBmp, par, max);
195 }
196 return overBmp;
197 }
198
205 {
206 m_AllRemove();
207 AddWiper(w);
208 }
209
216 {
217 m_wipers.Add(w.Clone());
218 }
219};
220
221
222
234{
235 DEFSUPER(IBitmapWipable);
236public:
241 virtual IBitmapWipable* Clone(void) const { return new CPenetrateWiper(); }
242
253 virtual CBitmapHandle Wipe(CBitmapHandle baseBmp, CBitmapHandle overBmp, UINT par, UINT max) const
254 {
255 CBitmapImage bi;
256 bi.Set(baseBmp);
257 bi.InsertOnAlphaBlend(0, 0, overBmp, 100 * par / max);
258 return bi.GetBitmapHandle();
259 }
260};
261
262
263
276{
277 DEFSUPER(IBitmapWipable);
278 BYTE m_pos;
279public:
280
282 enum
283 {
284 HEIGHT_FIX = 0x10,
285 WIDTH_FIX = 0x20
286 };
287
292 CStretchWiper(BYTE uPos = 5) : m_pos(uPos)
293 {
294 }
295
300 virtual IBitmapWipable* Clone(void) const { return new CStretchWiper(m_pos); }
301
312 virtual CBitmapHandle Wipe(CBitmapHandle baseBmp, CBitmapHandle overBmp, UINT par, UINT max) const
313 {
314 CBitmapImage bi;
315 bi.Set(baseBmp);
316 const SIZE& size = bi.GetSize();
317 int cx = size.cx;
318 if ( (m_pos & WIDTH_FIX) == 0 )
319 {
320 cx = cx * par / max;
321 }
322 int cy = size.cy;
323 if ( (m_pos & HEIGHT_FIX) == 0 )
324 {
325 cy = cy * par / max;
326 }
327 if ( cx > 0 && cy > 0 )
328 {
329 int po = m_pos & 0x0F;
330 int x = size.cx - cx;
331 int y = size.cy - cy;
332 if ( po >= 7 )
333 {
334 y = 0;
335 }
336 else if ( po >= 4 )
337 {
338 y /= 2;
339 }
340 switch ( po % 3 )
341 {
342 case 1: x = 0; break;
343 case 2: x /= 2; break;
344 }
345 bi.Insert(x, y, overBmp, SRCCOPY, cx, cy);
346 }
347 return bi.GetBitmapHandle();
348 }
349};
350
351
352
378class CBitmapAnimater //: CCopyImmposible
379{
380 struct TBaseFrame
381 {
382 CBitmapHandle bmp;
383 UINT count;
384 IBitmapWipable::Ptr pWiper;
385 };
387 size_t m_length;
389 // 全けし
390 void m_RemoveAll(void)
391 {
392 m_frames.RemoveAll();
393 m_length = 0;
394 m_cache.RemoveAll();
395 }
396 //
397 bool m_AddBaseFrame(CBitmapHandle bmp, UINT count, const IBitmapWipable* pWiper)
398 {
399 if ( ! bmp.IsNull() )
400 {
401 if ( count == 0 )
402 {
403 count = 1;
404 }
405 TBaseFrame b;
406 b.bmp = bmp;
407 b.count = count;
408 if ( pWiper != NULL )
409 {
410 b.pWiper = pWiper->Clone();
411 }
412 m_frames.Add(b);
413 m_length += b.count;
414 return true;
415 }
416 return false;
417 }
418public:
419
421 CBitmapAnimater(void) : m_length(0)
422 {
423 }
424
434 bool SetFirstFrame(CBitmapHandle bmp, const IBitmapWipable& defaultWiper)
435 {
436 m_RemoveAll();
437 return m_AddBaseFrame(bmp, 1, &defaultWiper);
438 }
439
448 {
449 m_RemoveAll();
451 return m_AddBaseFrame(bmp, 1, &w);
452 }
453
463 bool AddBaseFrame(CBitmapHandle bmp, UINT count, const IBitmapWipable& wiper)
464 {
465 if ( m_length > 0 )
466 {
467 return m_AddBaseFrame(bmp, count, &wiper);
468 }
469 return false;
470 }
471
480 bool AddBaseFrame(CBitmapHandle bmp, UINT count = 1)
481 {
482 if ( m_length > 0 )
483 {
484 return m_AddBaseFrame(bmp, count, NULL);
485 }
486 return false;
487 }
488
493 size_t GetLength(void) const
494 {
495 return m_length;
496 }
497
504 CBitmapHandle FrameAt(INDEX index) const
505 {
506 if ( index >= m_length ) { return CBitmapHandle(); }
507 const TBaseFrame* P = NULL;
508 loop ( i, m_frames.GetSize() )
509 {
510 P = &m_frames[i];
511 if ( index < P->count )
512 {
513 break;
514 }
515 index -= P->count;
516 }
517 ASSERTLIB( P != NULL );
518 if ( P->count == 1 )
519 {
520 return P->bmp;
521 }
522 const IBitmapWipable* pWiper = P->pWiper;
523 if ( pWiper == NULL )
524 {
525 pWiper = m_frames[0].pWiper;
526 }
527 if ( pWiper == NULL || index + 1 == P->count )
528 {
529 return P->bmp;
530 }
531 return pWiper->Wipe((P - 1)->bmp, P->bmp, down_cast<UINT>(index + 1), P->count);
532 }
533
541 {
543 if ( index < m_length )
544 {
545 if ( m_cache.GetSize() != m_length )
546 {
547 m_cache.SetSize(m_length);
548 }
549 b = m_cache.At(index);
550 if ( b.IsNull() )
551 {
552 b = FrameAt(index);
553 m_cache.Set(index, b);
554 }
555 }
556 return b;
557 }
558
560 void FlashCache(void)
561 {
562 m_cache.RemoveAll();
563 }
564};
565
566
567
568}; //TNB
ビットマップイメージ管理関係のヘッダ
#define loop(VAR, CNT)
loop構文.
Definition: TnbDef.h:343
簡易配列型情報管理関係のヘッダ
ビットマップアニメクラス
void FlashCache(void)
[処理] キャッシュ消去
bool AddBaseFrame(CBitmapHandle bmp, UINT count, const IBitmapWipable &wiper)
[設定] 次のベースフレーム画像設定
CBitmapHandle FrameAt(INDEX index) const
[取得] フレーム取得
size_t GetLength(void) const
[取得] フレーム数取得
CBitmapHandle FrameAtWithCache(INDEX index)
[取得] フレーム取得
bool AddBaseFrame(CBitmapHandle bmp, UINT count=1)
[設定] 次のベースフレーム画像設定
CBitmapAnimater(void)
コンストラクタ
bool SetFirstFrame(CBitmapHandle bmp, const IBitmapWipable &defaultWiper)
[設定] 最初のフレーム画像設定
bool SetFirstFrame(CBitmapHandle bmp)
[設定] 最初のフレーム画像設定
HBITMAP型ハンドルハンドル
ビットマップイメージ管理クラス
bool Insert(int x, int y, const CBitmapImage &bmpimg, DWORD raster=SRCCOPY, int cx=0, int cy=0)
[挿入] イメージ挿入.
const SIZE & GetSize(void) const
[取得] イメージサイズ取得.
bool Set(int cx, int cy, COLORREF color=CLR_INVALID)
[設定] イメージ設定.
CBitmapHandle GetBitmapHandle(void)
[取得] ビットマップハンドル取得
bool InsertOnAlphaBlend(int x, int y, const CBitmapImage &bmpimg, int parsent=100, int cx=0, int cy=0)
[挿入] 半透過処理付イメージ挿入.
マルチアダプトワイパークラス
CWipablesVecter m_wipers
使用するワイパー
void AddWiper(const IBitmapWipable &w)
[設定] ワイパー設定(追加).
CMultiAdaptWiper(void)
コンストラクタ
void m_AllRemove(void)
全情報けし
void SetWiper(const IBitmapWipable &w)
[設定] ワイパー設定.
CSimpleVectorT< IBitmapWipable::Ptr > CWipablesVecter
ワイパーポインタ配列型
virtual IBitmapWipable * Clone(void) const
[複製] クローン
virtual CBitmapHandle Wipe(CBitmapHandle baseBmp, CBitmapHandle overBmp, UINT par, UINT max) const
[変換] ワイプ.
~CMultiAdaptWiper(void)
デストラクタ
透過ワイプ処理クラス
virtual IBitmapWipable * Clone(void) const
[複製] クローン
virtual CBitmapHandle Wipe(CBitmapHandle baseBmp, CBitmapHandle overBmp, UINT par, UINT max) const
[変換] ワイプ.
bool IsNull(void) const
[確認] NULLチェック
リバースアダプトワイパークラス
CReverseAdaptWiper(const IBitmapWipable &w)
コンストラクタ
virtual IBitmapWipable * Clone(void) const
[複製] クローン
IBitmapWipable::Ptr m_pWiper
使用するワイパー
virtual CBitmapHandle Wipe(CBitmapHandle baseBmp, CBitmapHandle overBmp, UINT par, UINT max) const
[変換] ワイプ.
bool Set(INDEX index, const TYP &t)
[設定] 要素の設定.
void RemoveAll(void)
[削除] 空化
size_t GetSize(void) const
[取得] サイズ取得
void SetSize(size_t s)
[設定] サイズ設定
const TYP & At(INDEX index) const
[取得] 要素の参照取得.
INDEX Add(const TYP &t)
[追加] 要素一つ追加.
伸張ワイプ処理クラス
CStretchWiper(BYTE uPos=5)
コンストラクタ
virtual IBitmapWipable * Clone(void) const
[複製] クローン
@ HEIGHT_FIX
高さ固定
virtual CBitmapHandle Wipe(CBitmapHandle baseBmp, CBitmapHandle overBmp, UINT par, UINT max) const
[変換] ワイプ.
TNB Library
Definition: TnbDoxyTitle.txt:2
ビットマップワイパブルインターフェース
virtual IBitmapWipable * Clone(void) const =0
[複製] クローン
virtual ~IBitmapWipable(void)
デストラクタ
CPointerHandleT< IBitmapWipable > Ptr
ポインタハンドル型宣言
virtual CBitmapHandle Wipe(CBitmapHandle baseBmp, CBitmapHandle overBmp, UINT par, UINT max) const =0
[変換] ワイプ.