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