40 }
else if (len == 1) {
41 uint32_t val = value.
getInt(interp);
46 throw CommandException(
"Expected either 1 or 4 values.");
52 if (propName ==
"-rgba") {
54 get4(interp, value, newRGBA);
56 }
else if (propName ==
"-rgb") {
58 get4(interp, value, newRGB);
61 newRGBA[i] = (rgba[i] & 0x000000ff) |
62 ((newRGB[i] << 8) & 0xffffff00);
65 }
else if (propName ==
"-alpha") {
67 get4(interp, value, newAlpha);
70 newRGBA[i] = (rgba[i] & 0xffffff00) |
71 (newAlpha[i] & 0x000000ff);
74 }
else if (propName ==
"-fadePeriod") {
75 updateCurrentFadeValue();
77 }
else if (propName ==
"-fadeTarget") {
78 updateCurrentFadeValue();
80 }
else if (propName ==
"-fadeCurrent") {
88 void OSDImageBasedWidget::setRGBA(
const uint32_t newRGBA[4])
90 if ((rgba[0] == newRGBA[0]) &&
91 (rgba[1] == newRGBA[1]) &&
92 (rgba[2] == newRGBA[2]) &&
93 (rgba[3] == newRGBA[3])) {
103 static void set4(
const uint32_t rgba[4], uint32_t
mask,
unsigned shift, TclObject& result)
105 if ((rgba[0] == rgba[1]) && (rgba[0] == rgba[2]) && (rgba[0] == rgba[3])) {
106 result = (rgba[0] &
mask) >> shift;
109 return int((rgba[i] &
mask) >> shift);
115 if (propName ==
"-rgba") {
116 set4(rgba, 0xffffffff, 0, result);
117 }
else if (propName ==
"-rgb") {
118 set4(rgba, 0xffffff00, 8, result);
119 }
else if (propName ==
"-alpha") {
120 set4(rgba, 0x000000ff, 0, result);
121 }
else if (propName ==
"-fadePeriod") {
123 }
else if (propName ==
"-fadeTarget") {
125 }
else if (propName ==
"-fadeCurrent") {
126 result = getCurrentFadeValue();
132 static constexpr
bool constantAlpha(
const uint32_t rgba[4])
134 return ((rgba[0] & 0xff) == (rgba[1] & 0xff)) &&
135 ((rgba[0] & 0xff) == (rgba[2] & 0xff)) &&
136 ((rgba[0] & 0xff) == (rgba[3] & 0xff));
140 return constantAlpha(rgba);
153 bool OSDImageBasedWidget::isFading()
const
155 return (startFadeValue != fadeTarget) && (fadePeriod != 0.0f);
160 if (isFading())
return true;
164 float OSDImageBasedWidget::getCurrentFadeValue()
const
167 return startFadeValue;
172 float OSDImageBasedWidget::getCurrentFadeValue(uint64_t now)
const
174 assert(now >= startFadeTime);
176 int diff = int(now - startFadeTime);
177 assert(fadePeriod != 0.0f);
178 float delta = diff / (1000000.0f * fadePeriod);
179 if (startFadeValue < fadeTarget) {
180 float tmp = startFadeValue + delta;
181 if (tmp >= fadeTarget) {
182 startFadeValue = fadeTarget;
183 return startFadeValue;
187 float tmp = startFadeValue - delta;
188 if (tmp <= fadeTarget) {
189 startFadeValue = fadeTarget;
190 return startFadeValue;
196 void OSDImageBasedWidget::updateCurrentFadeValue()
200 startFadeValue = getCurrentFadeValue(now);
235 paint(output,
false);
253 setError(std::move(e).getMessage());
258 void OSDImageBasedWidget::paint(
OutputSurface& output,
bool openGL)
263 assert(openGL ==
getDisplay().getOSDGUI().isOpenGL()); (void)openGL;
267 if ((fadedAlpha != 0) &&
image) {
268 ivec2 drawPos = round(getTransformedPos(output));
269 image->draw(output, drawPos, fadedAlpha);
Represents the output window/screen of openMSX.
const OSDTopWidget & getTopWidget() const
A frame buffer where pixels can be written to.
unsigned getListLength(Interpreter &interp) const
TclObject getListIndex(Interpreter &interp, unsigned index) const
double getDouble(Interpreter &interp) const
int getInt(Interpreter &interp) const
constexpr vecN< N, T > clamp(const vecN< N, T > &x, const vecN< N, T > &minVal, const vecN< N, T > &maxVal)
uint64_t getTime()
Get current (real) time in us.
This file implemented 3 utility functions:
constexpr nibble mask[4][13]
void fill(ForwardRange &&range, const T &value)
constexpr auto transform(Range &&range, UnaryOp op)
constexpr auto xrange(T e)