| // |
| // 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 |