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