xref: /aosp_15_r20/external/angle/src/image_util/copyimage.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
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