1 //
2 // Copyright 2013 The ANGLE Project Authors. All rights reserved.
3 // Use of this source code is governed by a BSD-style license that can be
4 // found in the LICENSE file.
5 //
6
7 // copyimage.cpp: Defines image copying functions
8
9 #include "image_util/copyimage.h"
10
11 namespace angle
12 {
13
14 namespace
15 {
SwizzleBGRAToRGBA(uint32_t argb)16 inline uint32_t SwizzleBGRAToRGBA(uint32_t argb)
17 {
18 return ((argb & 0x000000FF) << 16) | // Move BGRA blue to RGBA blue
19 ((argb & 0x00FF0000) >> 16) | // Move BGRA red to RGBA red
20 ((argb & 0xFF00FF00)); // Keep alpha and green
21 }
22
CopyBGRA8ToRGBA8Fast(const uint8_t * source,int srcYAxisPitch,uint8_t * dest,int destYAxisPitch,int destWidth,int destHeight)23 void CopyBGRA8ToRGBA8Fast(const uint8_t *source,
24 int srcYAxisPitch,
25 uint8_t *dest,
26 int destYAxisPitch,
27 int destWidth,
28 int destHeight)
29 {
30 for (int y = 0; y < destHeight; ++y)
31 {
32 const uint32_t *src32 = reinterpret_cast<const uint32_t *>(source + y * srcYAxisPitch);
33 uint32_t *dest32 = reinterpret_cast<uint32_t *>(dest + y * destYAxisPitch);
34 const uint32_t *end32 = src32 + destWidth;
35 while (src32 != end32)
36 {
37 *dest32++ = SwizzleBGRAToRGBA(*src32++);
38 }
39 }
40 }
41 } // namespace
42
CopyBGRA8ToRGBA8(const uint8_t * source,int srcXAxisPitch,int srcYAxisPitch,uint8_t * dest,int destXAxisPitch,int destYAxisPitch,int destWidth,int destHeight)43 void CopyBGRA8ToRGBA8(const uint8_t *source,
44 int srcXAxisPitch,
45 int srcYAxisPitch,
46 uint8_t *dest,
47 int destXAxisPitch,
48 int destYAxisPitch,
49 int destWidth,
50 int destHeight)
51 {
52 if (srcXAxisPitch == 4 && destXAxisPitch == 4)
53 {
54 CopyBGRA8ToRGBA8Fast(source, srcYAxisPitch, dest, destYAxisPitch, destWidth, destHeight);
55 return;
56 }
57
58 for (int y = 0; y < destHeight; ++y)
59 {
60 uint8_t *dst = dest + y * destYAxisPitch;
61 const uint8_t *src = source + y * srcYAxisPitch;
62 const uint8_t *end = src + destWidth * srcXAxisPitch;
63
64 while (src != end)
65 {
66 *reinterpret_cast<uint32_t *>(dst) =
67 SwizzleBGRAToRGBA(*reinterpret_cast<const uint32_t *>(src));
68 src += srcXAxisPitch;
69 dst += destXAxisPitch;
70 }
71 }
72 }
73
74 } // namespace angle
75