aboutsummaryrefslogtreecommitdiffhomepage
path: root/win32/PlatWin.cxx
diff options
context:
space:
mode:
authorNeil <nyamatongwe@gmail.com>2020-06-06 16:13:43 +1000
committerNeil <nyamatongwe@gmail.com>2020-06-06 16:13:43 +1000
commit34b22f7165d91eae9d720f629196f9b4e8f7a9b2 (patch)
tree390850c452feeb54e6d3ada38371c855e07f6eef /win32/PlatWin.cxx
parentd94ed9026036e6b98001ef2adbf5ce605fbb8a29 (diff)
downloadscintilla-mirror-34b22f7165d91eae9d720f629196f9b4e8f7a9b2.tar.gz
Avoid type-pun union when converting from RGBA colour to DWORD as this may be
undefined or implementation defined behaviour. Drop some casts by hoisting out part of dwordMultiplied.
Diffstat (limited to 'win32/PlatWin.cxx')
-rw-r--r--win32/PlatWin.cxx22
1 files changed, 9 insertions, 13 deletions
diff --git a/win32/PlatWin.cxx b/win32/PlatWin.cxx
index da2671260..b2b90fa5e 100644
--- a/win32/PlatWin.cxx
+++ b/win32/PlatWin.cxx
@@ -738,23 +738,19 @@ void AllFour(DWORD *pixels, int width, int height, int x, int y, DWORD val) noex
pixels[(height-1-y)*width+width-1-x] = val;
}
-DWORD dwordFromBGRA(byte b, byte g, byte r, byte a) noexcept {
- union {
- byte pixVal[4];
- DWORD val;
- } converter;
- converter.pixVal[0] = b;
- converter.pixVal[1] = g;
- converter.pixVal[2] = r;
- converter.pixVal[3] = a;
- return converter.val;
+constexpr DWORD dwordFromBGRA(byte b, byte g, byte r, byte a) noexcept {
+ return (a << 24) | (r << 16) | (g << 8) | b;
+}
+
+constexpr byte AlphaScaled(unsigned char component, unsigned int alpha) noexcept {
+ return static_cast<byte>(component * alpha / 255);
}
DWORD dwordMultiplied(ColourDesired colour, unsigned int alpha) noexcept {
return dwordFromBGRA(
- static_cast<byte>(colour.GetBlue() * alpha / 255),
- static_cast<byte>(colour.GetGreen() * alpha / 255),
- static_cast<byte>(colour.GetRed() * alpha / 255),
+ AlphaScaled(colour.GetBlue(), alpha),
+ AlphaScaled(colour.GetGreen(), alpha),
+ AlphaScaled(colour.GetRed(), alpha),
static_cast<byte>(alpha));
}