diff options
author | Neil <nyamatongwe@gmail.com> | 2020-02-15 12:47:29 +1100 |
---|---|---|
committer | Neil <nyamatongwe@gmail.com> | 2020-02-15 12:47:29 +1100 |
commit | b82a2f50548c33bc6727a54e193a2cccaf4e12f7 (patch) | |
tree | cab786fc8fdce3580a68bd38e7dd5946e8def1aa /src | |
parent | 0eb0a3e5746f7d94c23337b24db9aa2d4871b739 (diff) | |
download | scintilla-mirror-b82a2f50548c33bc6727a54e193a2cccaf4e12f7.tar.gz |
Extract image conversion from RGBA to BGRA premultiplied into common function.
Diffstat (limited to 'src')
-rw-r--r-- | src/XPM.cxx | 15 | ||||
-rw-r--r-- | src/XPM.h | 2 |
2 files changed, 17 insertions, 0 deletions
diff --git a/src/XPM.cxx b/src/XPM.cxx index f95580403..380ae14c4 100644 --- a/src/XPM.cxx +++ b/src/XPM.cxx @@ -264,6 +264,21 @@ void RGBAImage::SetPixel(int x, int y, ColourDesired colour, int alpha) { pixel[3] = static_cast<unsigned char>(alpha); } +// Transform a block of pixels from RGBA to BGRA with premultiplied alpha. +// Used for DrawRGBAImage on some platforms. +void RGBAImage::BGRAFromRGBA(unsigned char *pixelsBGRA, const unsigned char *pixelsRGBA, size_t count) noexcept { + for (size_t i = 0; i < count; i++) { + const unsigned char alpha = pixelsRGBA[3]; + // Input is RGBA, output is BGRA with premultiplied alpha + pixelsBGRA[2] = pixelsRGBA[0] * alpha / 255; + pixelsBGRA[1] = pixelsRGBA[1] * alpha / 255; + pixelsBGRA[0] = pixelsRGBA[2] * alpha / 255; + pixelsBGRA[3] = alpha; + pixelsRGBA += bytesPerPixel; + pixelsBGRA += bytesPerPixel; + } +} + RGBAImageSet::RGBAImageSet() : height(-1), width(-1) { } @@ -50,6 +50,7 @@ class RGBAImage { float scale; std::vector<unsigned char> pixelBytes; public: + static constexpr size_t bytesPerPixel = 4; RGBAImage(int width_, int height_, float scale_, const unsigned char *pixels_); explicit RGBAImage(const XPM &xpm); RGBAImage(const RGBAImage &) = default; @@ -65,6 +66,7 @@ public: int CountBytes() const; const unsigned char *Pixels() const; void SetPixel(int x, int y, ColourDesired colour, int alpha); + static void BGRAFromRGBA(unsigned char *pixelsBGRA, const unsigned char *pixelsRGBA, size_t count) noexcept; }; /** |