39 static const char*
const vals[] = {
40 "-rgba",
"-rgb",
"-alpha",
"-fadePeriod",
"-fadeTarget",
43 result.insert(result.end(), std::begin(vals), std::end(vals));
47 static void get4(
const TclObject& value,
unsigned* result)
54 }
else if (len == 1) {
55 unsigned val = value.
getInt();
60 throw CommandException(
"Expected either 1 or 4 values.");
65 if (name ==
"-rgba") {
69 }
else if (name ==
"-rgb") {
74 newRGBA[i] = (rgba[i] & 0x000000ff) |
75 ((newRGB[i] << 8) & 0xffffff00);
78 }
else if (name ==
"-alpha") {
80 get4(value, newAlpha);
83 newRGBA[i] = (rgba[i] & 0xffffff00) |
84 (newAlpha[i] & 0x000000ff);
87 }
else if (name ==
"-fadePeriod") {
88 updateCurrentFadeValue();
90 }
else if (name ==
"-fadeTarget") {
91 updateCurrentFadeValue();
92 fadeTarget = std::max(0.0, std::min(1.0 , value.
getDouble()));
93 }
else if (name ==
"-fadeCurrent") {
94 startFadeValue = std::max(0.0, std::min(1.0, value.
getDouble()));
101 void OSDImageBasedWidget::setRGBA(
const unsigned newRGBA[4])
103 if ((rgba[0] == newRGBA[0]) &&
104 (rgba[1] == newRGBA[1]) &&
105 (rgba[2] == newRGBA[2]) &&
106 (rgba[3] == newRGBA[3])) {
111 for (
auto i :
xrange(4)) {
112 rgba[i] = newRGBA[i];
116 static void set4(
const unsigned rgba[4],
unsigned mask,
unsigned shift, TclObject& result)
118 if ((rgba[0] == rgba[1]) && (rgba[0] == rgba[2]) && (rgba[0] == rgba[3])) {
119 result.setInt((rgba[0] & mask) >> shift);
122 for (
auto i :
xrange(4)) {
123 result.addListElement(
int((rgba[i] & mask) >> shift));
129 if (name ==
"-rgba") {
130 set4(rgba, 0xffffffff, 0, result);
131 }
else if (name ==
"-rgb") {
132 set4(rgba, 0xffffff00, 8, result);
133 }
else if (name ==
"-alpha") {
134 set4(rgba, 0x000000ff, 0, result);
135 }
else if (name ==
"-fadePeriod") {
137 }
else if (name ==
"-fadeTarget") {
139 }
else if (name ==
"-fadeCurrent") {
146 static bool constantAlpha(
const unsigned rgba[4])
148 return ((rgba[0] & 0xff) == (rgba[1] & 0xff)) &&
149 ((rgba[0] & 0xff) == (rgba[2] & 0xff)) &&
150 ((rgba[0] & 0xff) == (rgba[3] & 0xff));
154 return constantAlpha(rgba);
162 bool OSDImageBasedWidget::isFading()
const
164 return (startFadeValue != fadeTarget) && (fadePeriod != 0.0);
167 double OSDImageBasedWidget::getCurrentFadeValue()
const
170 return startFadeValue;
175 double OSDImageBasedWidget::getCurrentFadeValue(uint64_t now)
const
177 assert(now >= startFadeTime);
179 int diff = int(now - startFadeTime);
180 assert(fadePeriod != 0.0);
181 double delta = diff / (1000000.0 * fadePeriod);
182 if (startFadeValue < fadeTarget) {
183 double tmp = startFadeValue + delta;
184 if (tmp >= fadeTarget) {
185 startFadeValue = fadeTarget;
186 return startFadeValue;
190 double tmp = startFadeValue - delta;
191 if (tmp <= fadeTarget) {
192 startFadeValue = fadeTarget;
193 return startFadeValue;
199 void OSDImageBasedWidget::updateCurrentFadeValue()
203 startFadeValue = getCurrentFadeValue(now);
214 void OSDImageBasedWidget::getTransformedXY(
const OutputRectangle& output,
215 double& outx,
double& outy)
const
220 double x = factor *
getX();
221 double y = factor *
getY();
243 paint(output,
false);
266 void OSDImageBasedWidget::paint(
OutputSurface& output,
bool openGL)
271 assert(openGL == gui.
isOpenGL()); (void)openGL;
275 if ((fadedAlpha != 0) &&
image.get()) {
277 getTransformedXY(output, x, y);
278 image->draw(output,
int(x + 0.5),
int(y + 0.5), fadedAlpha);