diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-07 19:33:14 +0000 |
commit | 36d22d82aa202bb199967e9512281e9a53db42c9 (patch) | |
tree | 105e8c98ddea1c1e4784a60a5a6410fa416be2de /gfx/angle/checkout/src/image_util/copyimage.cpp | |
parent | Initial commit. (diff) | |
download | firefox-esr-upstream.tar.xz firefox-esr-upstream.zip |
Adding upstream version 115.7.0esr.upstream/115.7.0esrupstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'gfx/angle/checkout/src/image_util/copyimage.cpp')
-rw-r--r-- | gfx/angle/checkout/src/image_util/copyimage.cpp | 74 |
1 files changed, 74 insertions, 0 deletions
diff --git a/gfx/angle/checkout/src/image_util/copyimage.cpp b/gfx/angle/checkout/src/image_util/copyimage.cpp new file mode 100644 index 0000000000..b5c2773e21 --- /dev/null +++ b/gfx/angle/checkout/src/image_util/copyimage.cpp @@ -0,0 +1,74 @@ +// +// Copyright 2013 The ANGLE Project Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// + +// copyimage.cpp: Defines image copying functions + +#include "image_util/copyimage.h" + +namespace angle +{ + +namespace +{ +inline uint32_t SwizzleBGRAToRGBA(uint32_t argb) +{ + return ((argb & 0x000000FF) << 16) | // Move BGRA blue to RGBA blue + ((argb & 0x00FF0000) >> 16) | // Move BGRA red to RGBA red + ((argb & 0xFF00FF00)); // Keep alpha and green +} + +void CopyBGRA8ToRGBA8Fast(const uint8_t *source, + int srcYAxisPitch, + uint8_t *dest, + int destYAxisPitch, + int destWidth, + int destHeight) +{ + for (int y = 0; y < destHeight; ++y) + { + const uint32_t *src32 = reinterpret_cast<const uint32_t *>(source + y * srcYAxisPitch); + uint32_t *dest32 = reinterpret_cast<uint32_t *>(dest + y * destYAxisPitch); + const uint32_t *end32 = src32 + destWidth; + while (src32 != end32) + { + *dest32++ = SwizzleBGRAToRGBA(*src32++); + } + } +} +} // namespace + +void CopyBGRA8ToRGBA8(const uint8_t *source, + int srcXAxisPitch, + int srcYAxisPitch, + uint8_t *dest, + int destXAxisPitch, + int destYAxisPitch, + int destWidth, + int destHeight) +{ + if (srcXAxisPitch == 4 && destXAxisPitch == 4) + { + CopyBGRA8ToRGBA8Fast(source, srcYAxisPitch, dest, destYAxisPitch, destWidth, destHeight); + return; + } + + for (int y = 0; y < destHeight; ++y) + { + uint8_t *dst = dest + y * destYAxisPitch; + const uint8_t *src = source + y * srcYAxisPitch; + const uint8_t *end = src + destWidth * srcXAxisPitch; + + while (src != end) + { + *reinterpret_cast<uint32_t *>(dst) = + SwizzleBGRAToRGBA(*reinterpret_cast<const uint32_t *>(src)); + src += srcXAxisPitch; + dst += destXAxisPitch; + } + } +} + +} // namespace angle |