1 /*
2 * Copyright 2009 Vincent Duvert, vincent.duvert@free.fr
3 * Copyright 2014 Haiku, Inc. All rights reserved.
4 *
5 * Distributed under the terms of the MIT License.
6 *
7 * Authors:
8 * Vincent Duvert, vincent.duvert@free.fr
9 * John Scipione, jscipione@gmail.com
10 */
11
12
13 #include "IconDisplay.h"
14
15 #include <stdlib.h>
16
17 #include <Bitmap.h>
18 #include <IconUtils.h>
19 #include <View.h>
20
21 #include "VectorIcon.h"
22
23
24 #define RAND_BETWEEN(a, b) ((rand() % ((b) - (a) + 1) + (a)))
25 #define SHOW_TICKS_MIN 20
26 #define SHOW_TICKS_MAX 50
27 #define STAY_TICKS_MIN 50
28 #define STAY_TICKS_MAX 100
29 #define HIDE_TICKS_MIN 20
30 #define HIDE_TICKS_MAX 50
31
32
IconDisplay()33 IconDisplay::IconDisplay()
34 :
35 fIsRunning(false),
36 fBitmap(NULL)
37 {
38 }
39
40
~IconDisplay()41 IconDisplay::~IconDisplay()
42 {
43 delete fBitmap;
44 }
45
46
47 void
Run(vector_icon * icon,BRect frame)48 IconDisplay::Run(vector_icon* icon, BRect frame)
49 {
50 delete fBitmap;
51
52 fBitmap = new BBitmap(BRect(0, 0, frame.Width(), frame.Height()), 0,
53 B_RGBA32);
54 if (BIconUtils::GetVectorIcon(icon->data, icon->size, fBitmap) != B_OK)
55 return;
56
57 fState = 0;
58 fTicks = 0;
59 fDelay = RAND_BETWEEN(SHOW_TICKS_MIN, SHOW_TICKS_MAX);
60 fFrame = frame;
61
62 fIsRunning = true;
63 }
64
65
66 void
ClearOn(BView * view)67 IconDisplay::ClearOn(BView* view)
68 {
69 if (!fIsRunning || fState == 2)
70 return;
71
72 view->FillRect(fFrame);
73 }
74
75
76 void
DrawOn(BView * view,uint32 delta)77 IconDisplay::DrawOn(BView* view, uint32 delta)
78 {
79 if (!fIsRunning)
80 return;
81
82 fTicks += delta;
83
84 rgb_color backColor = view->HighColor();
85
86 switch (fState) {
87 case 0:
88 // progressive showing
89 if (fTicks < fDelay)
90 backColor.alpha = (fTicks * 255) / fDelay;
91 else
92 fState++;
93
94 break;
95
96 case 1:
97 // completed showing
98 backColor.alpha = 255;
99 fTicks = 0;
100 fDelay = RAND_BETWEEN(STAY_TICKS_MIN, STAY_TICKS_MAX);
101 fState++;
102 break;
103
104 case 2:
105 // waiting
106 if (fTicks < fDelay)
107 return;
108
109 fTicks = 0;
110 backColor.alpha = 255;
111 fDelay = RAND_BETWEEN(HIDE_TICKS_MIN, HIDE_TICKS_MAX);
112 fState++;
113 return;
114 break;
115
116 case 3:
117 // progressive hiding
118 if (fTicks < fDelay) {
119 backColor.alpha = 255 - (fTicks * 255) / fDelay;
120 } else {
121 backColor.alpha = 0;
122 fState++;
123 }
124 break;
125
126 default:
127 // finished
128 fIsRunning = false;
129 return;
130 break;
131 };
132
133 view->SetHighColor(backColor);
134 view->DrawBitmap(fBitmap, BPoint(fFrame.left, fFrame.top));
135 backColor.alpha = 255;
136 view->SetHighColor(backColor);
137 }
138