• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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