1//
2// Copyright (c) 2013-2014 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// loadimage.h: Defines image loading functions
8
9#ifndef LIBGLESV2_RENDERER_LOADIMAGE_H_
10#define LIBGLESV2_RENDERER_LOADIMAGE_H_
11
12#include "libGLESv2/angletypes.h"
13
14#include <cstdint>
15
16namespace rx
17{
18
19void LoadA8ToRGBA8(size_t width, size_t height, size_t depth,
20                   const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
21                   uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
22
23void LoadA8ToBGRA8(size_t width, size_t height, size_t depth,
24                   const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
25                   uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
26
27void LoadA8ToBGRA8_SSE2(size_t width, size_t height, size_t depth,
28                        const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
29                        uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
30
31void LoadA32FToRGBA32F(size_t width, size_t height, size_t depth,
32                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
33                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
34
35void LoadA16FToRGBA16F(size_t width, size_t height, size_t depth,
36                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
37                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
38
39void LoadL8ToRGBA8(size_t width, size_t height, size_t depth,
40                   const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
41                   uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
42
43void LoadL8ToBGRA8(size_t width, size_t height, size_t depth,
44                   const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
45                   uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
46
47void LoadL32FToRGBA32F(size_t width, size_t height, size_t depth,
48                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
49                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
50
51void LoadL16FToRGBA16F(size_t width, size_t height, size_t depth,
52                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
53                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
54
55void LoadLA8ToRGBA8(size_t width, size_t height, size_t depth,
56                    const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
57                    uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
58
59void LoadLA8ToBGRA8(size_t width, size_t height, size_t depth,
60                    const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
61                    uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
62
63void LoadLA32FToRGBA32F(size_t width, size_t height, size_t depth,
64                        const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
65                        uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
66
67void LoadLA16FToRGBA16F(size_t width, size_t height, size_t depth,
68                        const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
69                        uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
70
71void LoadRGB8ToBGRX8(size_t width, size_t height, size_t depth,
72                     const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
73                     uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
74
75void LoadRG8ToBGRX8(size_t width, size_t height, size_t depth,
76                    const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
77                    uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
78
79void LoadR8ToBGRX8(size_t width, size_t height, size_t depth,
80                   const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
81                   uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
82
83void LoadR5G6B5ToBGRA8(size_t width, size_t height, size_t depth,
84                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
85                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
86
87void LoadR5G6B5ToRGBA8(size_t width, size_t height, size_t depth,
88                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
89                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
90
91void LoadRGBA8ToBGRA8_SSE2(size_t width, size_t height, size_t depth,
92                           const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
93                           uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
94
95void LoadRGBA8ToBGRA8(size_t width, size_t height, size_t depth,
96                      const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
97                      uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
98
99void LoadRGBA4ToBGRA8(size_t width, size_t height, size_t depth,
100                      const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
101                      uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
102
103void LoadRGBA4ToRGBA8(size_t width, size_t height, size_t depth,
104                      const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
105                      uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
106
107void LoadBGRA4ToBGRA8(size_t width, size_t height, size_t depth,
108                      const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
109                      uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
110
111void LoadRGB5A1ToBGRA8(size_t width, size_t height, size_t depth,
112                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
113                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
114
115void LoadRGB5A1ToRGBA8(size_t width, size_t height, size_t depth,
116                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
117                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
118
119void LoadBGR5A1ToBGRA8(size_t width, size_t height, size_t depth,
120                       const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
121                       uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
122
123void LoadRGB10A2ToRGBA8(size_t width, size_t height, size_t depth,
124                        const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
125                        uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
126
127void LoadRGB16FToRGB9E5(size_t width, size_t height, size_t depth,
128                          const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
129                          uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
130
131void LoadRGB32FToRGB9E5(size_t width, size_t height, size_t depth,
132                        const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
133                        uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
134
135void LoadRGB16FToRG11B10F(size_t width, size_t height, size_t depth,
136                          const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
137                          uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
138
139void LoadRGB32FToRG11B10F(size_t width, size_t height, size_t depth,
140                          const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
141                          uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
142
143void LoadG8R24ToR24G8(size_t width, size_t height, size_t depth,
144                      const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
145                      uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
146
147template <typename type, size_t componentCount>
148inline void LoadToNative(size_t width, size_t height, size_t depth,
149                         const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
150                         uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
151
152template <typename type, uint32_t fourthComponentBits>
153inline void LoadToNative3To4(size_t width, size_t height, size_t depth,
154                             const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
155                             uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
156
157template <size_t componentCount>
158inline void Load32FTo16F(size_t width, size_t height, size_t depth,
159                         const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
160                         uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
161
162void LoadRGB32FToRGBA16F(size_t width, size_t height, size_t depth,
163                         const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
164                         uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
165
166template <size_t blockWidth, size_t blockHeight, size_t blockSize>
167inline void LoadCompressedToNative(size_t width, size_t height, size_t depth,
168                                   const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
169                                   uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
170
171void LoadR32ToR16(size_t width, size_t height, size_t depth,
172                  const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
173                  uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
174
175template <typename type, uint32_t firstBits, uint32_t secondBits, uint32_t thirdBits, uint32_t fourthBits>
176inline void Initialize4ComponentData(size_t width, size_t height, size_t depth,
177                                     uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
178
179void LoadR32ToR24G8(size_t width, size_t height, size_t depth,
180                    const uint8_t *input, size_t inputRowPitch, size_t inputDepthPitch,
181                    uint8_t *output, size_t outputRowPitch, size_t outputDepthPitch);
182
183template <typename T>
184inline T *OffsetDataPointer(uint8_t *data, size_t y, size_t z, size_t rowPitch, size_t depthPitch);
185
186template <typename T>
187inline const T *OffsetDataPointer(const uint8_t *data, size_t y, size_t z, size_t rowPitch, size_t depthPitch);
188
189}
190
191#include "loadimage.inl"
192
193#endif // LIBGLESV2_RENDERER_LOADIMAGE_H_
194