xref: /aosp_15_r20/external/angle/src/image_util/LoadToNative_unittest.cpp (revision 8975f5c5ed3d1c378011245431ada316dfb6f244)
1*8975f5c5SAndroid Build Coastguard Worker //
2*8975f5c5SAndroid Build Coastguard Worker // Copyright 2023 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 // LoadToNative_unittest.cpp: Unit tests for pixel loading functions.
7*8975f5c5SAndroid Build Coastguard Worker 
8*8975f5c5SAndroid Build Coastguard Worker #include <gmock/gmock.h>
9*8975f5c5SAndroid Build Coastguard Worker #include <vector>
10*8975f5c5SAndroid Build Coastguard Worker #include "common/debug.h"
11*8975f5c5SAndroid Build Coastguard Worker #include "common/mathutil.h"
12*8975f5c5SAndroid Build Coastguard Worker #include "image_util/loadimage.h"
13*8975f5c5SAndroid Build Coastguard Worker 
14*8975f5c5SAndroid Build Coastguard Worker using namespace angle;
15*8975f5c5SAndroid Build Coastguard Worker using namespace testing;
16*8975f5c5SAndroid Build Coastguard Worker 
17*8975f5c5SAndroid Build Coastguard Worker namespace
18*8975f5c5SAndroid Build Coastguard Worker {
19*8975f5c5SAndroid Build Coastguard Worker 
20*8975f5c5SAndroid Build Coastguard Worker template <typename Type>
initializeRGBInput(std::vector<Type> & rgbInput,size_t width,size_t height,size_t depth,size_t inputPixelBytes,size_t inputByteOffset,size_t inputRowPitch,size_t inputDepthPitch)21*8975f5c5SAndroid Build Coastguard Worker void initializeRGBInput(std::vector<Type> &rgbInput,
22*8975f5c5SAndroid Build Coastguard Worker                         size_t width,
23*8975f5c5SAndroid Build Coastguard Worker                         size_t height,
24*8975f5c5SAndroid Build Coastguard Worker                         size_t depth,
25*8975f5c5SAndroid Build Coastguard Worker                         size_t inputPixelBytes,
26*8975f5c5SAndroid Build Coastguard Worker                         size_t inputByteOffset,
27*8975f5c5SAndroid Build Coastguard Worker                         size_t inputRowPitch,
28*8975f5c5SAndroid Build Coastguard Worker                         size_t inputDepthPitch)
29*8975f5c5SAndroid Build Coastguard Worker {
30*8975f5c5SAndroid Build Coastguard Worker     ASSERT(rgbInput.size() == inputDepthPitch * depth + inputByteOffset);
31*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
32*8975f5c5SAndroid Build Coastguard Worker     {
33*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
34*8975f5c5SAndroid Build Coastguard Worker         {
35*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
36*8975f5c5SAndroid Build Coastguard Worker             {
37*8975f5c5SAndroid Build Coastguard Worker                 size_t inputIndex =
38*8975f5c5SAndroid Build Coastguard Worker                     inputByteOffset + z * inputDepthPitch + y * inputRowPitch + x * inputPixelBytes;
39*8975f5c5SAndroid Build Coastguard Worker 
40*8975f5c5SAndroid Build Coastguard Worker                 rgbInput[inputIndex]     = x % 256;
41*8975f5c5SAndroid Build Coastguard Worker                 rgbInput[inputIndex + 1] = y % 256;
42*8975f5c5SAndroid Build Coastguard Worker                 rgbInput[inputIndex + 2] = z % 256;
43*8975f5c5SAndroid Build Coastguard Worker             }
44*8975f5c5SAndroid Build Coastguard Worker         }
45*8975f5c5SAndroid Build Coastguard Worker     }
46*8975f5c5SAndroid Build Coastguard Worker }
47*8975f5c5SAndroid Build Coastguard Worker 
48*8975f5c5SAndroid Build Coastguard Worker template <typename Type, uint8_t fourthValue>
verifyRGBToRGBAResults(const char * strCase,std::vector<Type> & rgbInput,std::vector<Type> & rgbaOutput,size_t width,size_t height,size_t depth,size_t inputPixelBytes,size_t inputByteOffset,size_t inputRowPitch,size_t inputDepthPitch,size_t outputPixelBytes,size_t outputByteOffset,size_t outputRowPitch,size_t outputDepthPitch)49*8975f5c5SAndroid Build Coastguard Worker void verifyRGBToRGBAResults(const char *strCase,
50*8975f5c5SAndroid Build Coastguard Worker                             std::vector<Type> &rgbInput,
51*8975f5c5SAndroid Build Coastguard Worker                             std::vector<Type> &rgbaOutput,
52*8975f5c5SAndroid Build Coastguard Worker                             size_t width,
53*8975f5c5SAndroid Build Coastguard Worker                             size_t height,
54*8975f5c5SAndroid Build Coastguard Worker                             size_t depth,
55*8975f5c5SAndroid Build Coastguard Worker                             size_t inputPixelBytes,
56*8975f5c5SAndroid Build Coastguard Worker                             size_t inputByteOffset,
57*8975f5c5SAndroid Build Coastguard Worker                             size_t inputRowPitch,
58*8975f5c5SAndroid Build Coastguard Worker                             size_t inputDepthPitch,
59*8975f5c5SAndroid Build Coastguard Worker                             size_t outputPixelBytes,
60*8975f5c5SAndroid Build Coastguard Worker                             size_t outputByteOffset,
61*8975f5c5SAndroid Build Coastguard Worker                             size_t outputRowPitch,
62*8975f5c5SAndroid Build Coastguard Worker                             size_t outputDepthPitch)
63*8975f5c5SAndroid Build Coastguard Worker {
64*8975f5c5SAndroid Build Coastguard Worker     ASSERT(rgbInput.size() == inputDepthPitch * depth + inputByteOffset);
65*8975f5c5SAndroid Build Coastguard Worker     ASSERT(rgbaOutput.size() == outputDepthPitch * depth + outputByteOffset);
66*8975f5c5SAndroid Build Coastguard Worker     for (size_t z = 0; z < depth; z++)
67*8975f5c5SAndroid Build Coastguard Worker     {
68*8975f5c5SAndroid Build Coastguard Worker         for (size_t y = 0; y < height; y++)
69*8975f5c5SAndroid Build Coastguard Worker         {
70*8975f5c5SAndroid Build Coastguard Worker             for (size_t x = 0; x < width; x++)
71*8975f5c5SAndroid Build Coastguard Worker             {
72*8975f5c5SAndroid Build Coastguard Worker                 size_t inputIndex =
73*8975f5c5SAndroid Build Coastguard Worker                     inputByteOffset + z * inputDepthPitch + y * inputRowPitch + x * inputPixelBytes;
74*8975f5c5SAndroid Build Coastguard Worker                 size_t outputIndex = outputByteOffset + z * outputDepthPitch + y * outputRowPitch +
75*8975f5c5SAndroid Build Coastguard Worker                                      x * outputPixelBytes;
76*8975f5c5SAndroid Build Coastguard Worker 
77*8975f5c5SAndroid Build Coastguard Worker                 bool rMatch = rgbInput[inputIndex] == rgbaOutput[outputIndex];
78*8975f5c5SAndroid Build Coastguard Worker                 bool gMatch = rgbInput[inputIndex + 1] == rgbaOutput[outputIndex + 1];
79*8975f5c5SAndroid Build Coastguard Worker                 bool bMatch = rgbInput[inputIndex + 2] == rgbaOutput[outputIndex + 2];
80*8975f5c5SAndroid Build Coastguard Worker                 bool aMatch = rgbaOutput[outputIndex + 3] == fourthValue;
81*8975f5c5SAndroid Build Coastguard Worker 
82*8975f5c5SAndroid Build Coastguard Worker                 EXPECT_TRUE(rMatch && gMatch && bMatch && aMatch)
83*8975f5c5SAndroid Build Coastguard Worker                     << "Case " << strCase << ": Mismatch at Index (" << x << ", " << y << ", " << z
84*8975f5c5SAndroid Build Coastguard Worker                     << ")" << std::endl
85*8975f5c5SAndroid Build Coastguard Worker                     << "Expected output: (" << static_cast<uint32_t>(rgbInput[inputIndex]) << ", "
86*8975f5c5SAndroid Build Coastguard Worker                     << static_cast<uint32_t>(rgbInput[inputIndex + 1]) << ", "
87*8975f5c5SAndroid Build Coastguard Worker                     << static_cast<uint32_t>(rgbInput[inputIndex + 2]) << ", "
88*8975f5c5SAndroid Build Coastguard Worker                     << static_cast<uint32_t>(fourthValue) << ")" << std::endl
89*8975f5c5SAndroid Build Coastguard Worker                     << "Actual output: (" << static_cast<uint32_t>(rgbaOutput[outputIndex]) << ", "
90*8975f5c5SAndroid Build Coastguard Worker                     << static_cast<uint32_t>(rgbaOutput[outputIndex + 1]) << ", "
91*8975f5c5SAndroid Build Coastguard Worker                     << static_cast<uint32_t>(rgbaOutput[outputIndex + 2]) << ", "
92*8975f5c5SAndroid Build Coastguard Worker                     << static_cast<uint32_t>(rgbaOutput[outputIndex + 3]) << ")";
93*8975f5c5SAndroid Build Coastguard Worker             }
94*8975f5c5SAndroid Build Coastguard Worker         }
95*8975f5c5SAndroid Build Coastguard Worker     }
96*8975f5c5SAndroid Build Coastguard Worker }
97*8975f5c5SAndroid Build Coastguard Worker 
98*8975f5c5SAndroid Build Coastguard Worker template <uint8_t fourthValue>
TestLoadUbyteRGBToRGBA(ImageLoadContext & context,const char * strCase,size_t width,size_t height,size_t depth,size_t inputByteOffset,size_t outputByteOffset,size_t inputRowAlignment)99*8975f5c5SAndroid Build Coastguard Worker void TestLoadUbyteRGBToRGBA(ImageLoadContext &context,
100*8975f5c5SAndroid Build Coastguard Worker                             const char *strCase,
101*8975f5c5SAndroid Build Coastguard Worker                             size_t width,
102*8975f5c5SAndroid Build Coastguard Worker                             size_t height,
103*8975f5c5SAndroid Build Coastguard Worker                             size_t depth,
104*8975f5c5SAndroid Build Coastguard Worker                             size_t inputByteOffset,
105*8975f5c5SAndroid Build Coastguard Worker                             size_t outputByteOffset,
106*8975f5c5SAndroid Build Coastguard Worker                             size_t inputRowAlignment)
107*8975f5c5SAndroid Build Coastguard Worker {
108*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kInitialByteValue = 0xAA;
109*8975f5c5SAndroid Build Coastguard Worker 
110*8975f5c5SAndroid Build Coastguard Worker     size_t inputPixelBytes  = 3;
111*8975f5c5SAndroid Build Coastguard Worker     size_t inputRowPitch    = rx::roundUpPow2(width * inputPixelBytes, inputRowAlignment);
112*8975f5c5SAndroid Build Coastguard Worker     size_t inputDepthPitch  = height * inputRowPitch;
113*8975f5c5SAndroid Build Coastguard Worker     size_t inputActualBytes = depth * inputDepthPitch;
114*8975f5c5SAndroid Build Coastguard Worker 
115*8975f5c5SAndroid Build Coastguard Worker     size_t outputPixelBytes  = 4;
116*8975f5c5SAndroid Build Coastguard Worker     size_t outputRowPitch    = width * outputPixelBytes;
117*8975f5c5SAndroid Build Coastguard Worker     size_t outputDepthPitch  = height * outputRowPitch;
118*8975f5c5SAndroid Build Coastguard Worker     size_t outputActualBytes = depth * outputDepthPitch;
119*8975f5c5SAndroid Build Coastguard Worker 
120*8975f5c5SAndroid Build Coastguard Worker     // Prepare the RGB input and RGBA output for copy. The offset values are used to add unused
121*8975f5c5SAndroid Build Coastguard Worker     // bytes to the beginning of the input and output data, in order to test address alignments.
122*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> rgbInput(inputByteOffset + inputActualBytes, kInitialByteValue);
123*8975f5c5SAndroid Build Coastguard Worker     initializeRGBInput<uint8_t>(rgbInput, width, height, depth, inputPixelBytes, inputByteOffset,
124*8975f5c5SAndroid Build Coastguard Worker                                 inputRowPitch, inputDepthPitch);
125*8975f5c5SAndroid Build Coastguard Worker 
126*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> rgbaOutput(outputByteOffset + outputActualBytes, kInitialByteValue);
127*8975f5c5SAndroid Build Coastguard Worker 
128*8975f5c5SAndroid Build Coastguard Worker     // Call loading function.
129*8975f5c5SAndroid Build Coastguard Worker     LoadToNative3To4<uint8_t, fourthValue>(
130*8975f5c5SAndroid Build Coastguard Worker         context, width, height, depth, rgbInput.data() + inputByteOffset, inputRowPitch,
131*8975f5c5SAndroid Build Coastguard Worker         inputDepthPitch, rgbaOutput.data() + outputByteOffset, outputRowPitch, outputDepthPitch);
132*8975f5c5SAndroid Build Coastguard Worker 
133*8975f5c5SAndroid Build Coastguard Worker     // Compare the input and output data.
134*8975f5c5SAndroid Build Coastguard Worker     verifyRGBToRGBAResults<uint8_t, fourthValue>(
135*8975f5c5SAndroid Build Coastguard Worker         strCase, rgbInput, rgbaOutput, width, height, depth, inputPixelBytes, inputByteOffset,
136*8975f5c5SAndroid Build Coastguard Worker         inputRowPitch, inputDepthPitch, outputPixelBytes, outputByteOffset, outputRowPitch,
137*8975f5c5SAndroid Build Coastguard Worker         outputDepthPitch);
138*8975f5c5SAndroid Build Coastguard Worker }
139*8975f5c5SAndroid Build Coastguard Worker 
140*8975f5c5SAndroid Build Coastguard Worker template <uint8_t fourthValue>
TestLoadSbyteRGBToRGBA(ImageLoadContext & context,const char * strCase,size_t width,size_t height,size_t depth,size_t inputByteOffset,size_t outputByteOffset,size_t inputRowAlignment)141*8975f5c5SAndroid Build Coastguard Worker void TestLoadSbyteRGBToRGBA(ImageLoadContext &context,
142*8975f5c5SAndroid Build Coastguard Worker                             const char *strCase,
143*8975f5c5SAndroid Build Coastguard Worker                             size_t width,
144*8975f5c5SAndroid Build Coastguard Worker                             size_t height,
145*8975f5c5SAndroid Build Coastguard Worker                             size_t depth,
146*8975f5c5SAndroid Build Coastguard Worker                             size_t inputByteOffset,
147*8975f5c5SAndroid Build Coastguard Worker                             size_t outputByteOffset,
148*8975f5c5SAndroid Build Coastguard Worker                             size_t inputRowAlignment)
149*8975f5c5SAndroid Build Coastguard Worker {
150*8975f5c5SAndroid Build Coastguard Worker     constexpr int8_t kInitialByteValue = 0xAA;
151*8975f5c5SAndroid Build Coastguard Worker 
152*8975f5c5SAndroid Build Coastguard Worker     size_t inputPixelBytes  = 3;
153*8975f5c5SAndroid Build Coastguard Worker     size_t inputRowPitch    = rx::roundUpPow2(width * inputPixelBytes, inputRowAlignment);
154*8975f5c5SAndroid Build Coastguard Worker     size_t inputDepthPitch  = height * inputRowPitch;
155*8975f5c5SAndroid Build Coastguard Worker     size_t inputActualBytes = depth * inputDepthPitch;
156*8975f5c5SAndroid Build Coastguard Worker 
157*8975f5c5SAndroid Build Coastguard Worker     size_t outputPixelBytes  = 4;
158*8975f5c5SAndroid Build Coastguard Worker     size_t outputRowPitch    = width * outputPixelBytes;
159*8975f5c5SAndroid Build Coastguard Worker     size_t outputDepthPitch  = height * outputRowPitch;
160*8975f5c5SAndroid Build Coastguard Worker     size_t outputActualBytes = depth * outputDepthPitch;
161*8975f5c5SAndroid Build Coastguard Worker 
162*8975f5c5SAndroid Build Coastguard Worker     // Prepare the RGB input and RGBA output for copy. The offset values are used to add unused
163*8975f5c5SAndroid Build Coastguard Worker     // bytes to the beginning of the input and output data, in order to test address alignments.
164*8975f5c5SAndroid Build Coastguard Worker     std::vector<int8_t> rgbInput(inputByteOffset + inputActualBytes, kInitialByteValue);
165*8975f5c5SAndroid Build Coastguard Worker     initializeRGBInput<int8_t>(rgbInput, width, height, depth, inputPixelBytes, inputByteOffset,
166*8975f5c5SAndroid Build Coastguard Worker                                inputRowPitch, inputDepthPitch);
167*8975f5c5SAndroid Build Coastguard Worker 
168*8975f5c5SAndroid Build Coastguard Worker     std::vector<int8_t> rgbaOutput(outputByteOffset + outputActualBytes, kInitialByteValue);
169*8975f5c5SAndroid Build Coastguard Worker 
170*8975f5c5SAndroid Build Coastguard Worker     // Call loading function.
171*8975f5c5SAndroid Build Coastguard Worker     LoadToNative3To4<int8_t, fourthValue>(
172*8975f5c5SAndroid Build Coastguard Worker         context, width, height, depth,
173*8975f5c5SAndroid Build Coastguard Worker         reinterpret_cast<uint8_t *>(rgbInput.data() + inputByteOffset), inputRowPitch,
174*8975f5c5SAndroid Build Coastguard Worker         inputDepthPitch, reinterpret_cast<uint8_t *>(rgbaOutput.data() + outputByteOffset),
175*8975f5c5SAndroid Build Coastguard Worker         outputRowPitch, outputDepthPitch);
176*8975f5c5SAndroid Build Coastguard Worker 
177*8975f5c5SAndroid Build Coastguard Worker     // Compare the input and output data.
178*8975f5c5SAndroid Build Coastguard Worker     verifyRGBToRGBAResults<int8_t, fourthValue>(strCase, rgbInput, rgbaOutput, width, height, depth,
179*8975f5c5SAndroid Build Coastguard Worker                                                 inputPixelBytes, inputByteOffset, inputRowPitch,
180*8975f5c5SAndroid Build Coastguard Worker                                                 inputDepthPitch, outputPixelBytes, outputByteOffset,
181*8975f5c5SAndroid Build Coastguard Worker                                                 outputRowPitch, outputDepthPitch);
182*8975f5c5SAndroid Build Coastguard Worker }
183*8975f5c5SAndroid Build Coastguard Worker 
TestLoadByteRGBToRGBAForAllCases(ImageLoadContext & context,size_t inputCase,size_t width,size_t height,size_t depth,size_t inputByteOffset,size_t outputByteOffset,size_t inputRowAlignment)184*8975f5c5SAndroid Build Coastguard Worker void TestLoadByteRGBToRGBAForAllCases(ImageLoadContext &context,
185*8975f5c5SAndroid Build Coastguard Worker                                       size_t inputCase,
186*8975f5c5SAndroid Build Coastguard Worker                                       size_t width,
187*8975f5c5SAndroid Build Coastguard Worker                                       size_t height,
188*8975f5c5SAndroid Build Coastguard Worker                                       size_t depth,
189*8975f5c5SAndroid Build Coastguard Worker                                       size_t inputByteOffset,
190*8975f5c5SAndroid Build Coastguard Worker                                       size_t outputByteOffset,
191*8975f5c5SAndroid Build Coastguard Worker                                       size_t inputRowAlignment)
192*8975f5c5SAndroid Build Coastguard Worker {
193*8975f5c5SAndroid Build Coastguard Worker     std::string strCaseUFF = "UFF_" + std::to_string(inputCase);
194*8975f5c5SAndroid Build Coastguard Worker     TestLoadUbyteRGBToRGBA<0xFF>(context, strCaseUFF.c_str(), width, height, depth, inputByteOffset,
195*8975f5c5SAndroid Build Coastguard Worker                                  outputByteOffset, inputRowAlignment);
196*8975f5c5SAndroid Build Coastguard Worker     std::string strCaseU01 = "U01_" + std::to_string(inputCase);
197*8975f5c5SAndroid Build Coastguard Worker     TestLoadUbyteRGBToRGBA<0x01>(context, strCaseU01.c_str(), width, height, depth, inputByteOffset,
198*8975f5c5SAndroid Build Coastguard Worker                                  outputByteOffset, inputRowAlignment);
199*8975f5c5SAndroid Build Coastguard Worker     std::string strCaseS7F = "S7F_" + std::to_string(inputCase);
200*8975f5c5SAndroid Build Coastguard Worker     TestLoadSbyteRGBToRGBA<0x7F>(context, strCaseS7F.c_str(), width, height, depth, inputByteOffset,
201*8975f5c5SAndroid Build Coastguard Worker                                  outputByteOffset, inputRowAlignment);
202*8975f5c5SAndroid Build Coastguard Worker     std::string strCaseS01 = "S01_" + std::to_string(inputCase);
203*8975f5c5SAndroid Build Coastguard Worker     TestLoadSbyteRGBToRGBA<0x01>(context, strCaseS01.c_str(), width, height, depth, inputByteOffset,
204*8975f5c5SAndroid Build Coastguard Worker                                  outputByteOffset, inputRowAlignment);
205*8975f5c5SAndroid Build Coastguard Worker }
206*8975f5c5SAndroid Build Coastguard Worker 
207*8975f5c5SAndroid Build Coastguard Worker // Tests the ubyte (0xFF) RGB to RGBA loading function for one RGB pixel.
TEST(LoadToNative3To4,LoadUbyteRGBToRGBADataOnePixelWithFourthCompOfFF)208*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadUbyteRGBToRGBADataOnePixelWithFourthCompOfFF)
209*8975f5c5SAndroid Build Coastguard Worker {
210*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
211*8975f5c5SAndroid Build Coastguard Worker     uint8_t rgbInput[]             = {1, 2, 3};
212*8975f5c5SAndroid Build Coastguard Worker     uint8_t rgbaOutput[]           = {0, 0, 0, 0};
213*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kFourthValue = 0xFF;
214*8975f5c5SAndroid Build Coastguard Worker 
215*8975f5c5SAndroid Build Coastguard Worker     LoadToNative3To4<uint8_t, kFourthValue>(context, 1, 1, 1, rgbInput, 3, 3, rgbaOutput, 4, 4);
216*8975f5c5SAndroid Build Coastguard Worker 
217*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(rgbaOutput[0] == rgbInput[0] && rgbaOutput[1] == rgbInput[1] &&
218*8975f5c5SAndroid Build Coastguard Worker                 rgbaOutput[2] == rgbInput[2] && rgbaOutput[3] == kFourthValue)
219*8975f5c5SAndroid Build Coastguard Worker         << "Pixel mismatch";
220*8975f5c5SAndroid Build Coastguard Worker }
221*8975f5c5SAndroid Build Coastguard Worker 
222*8975f5c5SAndroid Build Coastguard Worker // Tests the ubyte (0x01) RGB to RGBA loading function for one RGB pixel.
TEST(LoadToNative3To4,LoadUbyteRGBToRGBADataOnePixelWithFourthCompOf01)223*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadUbyteRGBToRGBADataOnePixelWithFourthCompOf01)
224*8975f5c5SAndroid Build Coastguard Worker {
225*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
226*8975f5c5SAndroid Build Coastguard Worker     uint8_t rgbInput[]             = {1, 2, 3};
227*8975f5c5SAndroid Build Coastguard Worker     uint8_t rgbaOutput[]           = {0, 0, 0, 0};
228*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kFourthValue = 0x01;
229*8975f5c5SAndroid Build Coastguard Worker 
230*8975f5c5SAndroid Build Coastguard Worker     LoadToNative3To4<uint8_t, kFourthValue>(context, 1, 1, 1, rgbInput, 3, 3, rgbaOutput, 4, 4);
231*8975f5c5SAndroid Build Coastguard Worker 
232*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(rgbaOutput[0] == rgbInput[0] && rgbaOutput[1] == rgbInput[1] &&
233*8975f5c5SAndroid Build Coastguard Worker                 rgbaOutput[2] == rgbInput[2] && rgbaOutput[3] == kFourthValue)
234*8975f5c5SAndroid Build Coastguard Worker         << "Pixel mismatch";
235*8975f5c5SAndroid Build Coastguard Worker }
236*8975f5c5SAndroid Build Coastguard Worker 
237*8975f5c5SAndroid Build Coastguard Worker // Tests the sbyte (0x7F) RGB to RGBA loading function for one RGB pixel.
TEST(LoadToNative3To4,LoadSbyteRGBToRGBADataOnePixelWithFourthCompOf7F)238*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadSbyteRGBToRGBADataOnePixelWithFourthCompOf7F)
239*8975f5c5SAndroid Build Coastguard Worker {
240*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
241*8975f5c5SAndroid Build Coastguard Worker     int8_t rgbInput[]              = {1, 2, 3};
242*8975f5c5SAndroid Build Coastguard Worker     int8_t rgbaOutput[]            = {0, 0, 0, 0};
243*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kFourthValue = 0x01;
244*8975f5c5SAndroid Build Coastguard Worker 
245*8975f5c5SAndroid Build Coastguard Worker     LoadToNative3To4<int8_t, kFourthValue>(context, 1, 1, 1, reinterpret_cast<uint8_t *>(rgbInput),
246*8975f5c5SAndroid Build Coastguard Worker                                            3, 3, reinterpret_cast<uint8_t *>(rgbaOutput), 4, 4);
247*8975f5c5SAndroid Build Coastguard Worker 
248*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(rgbaOutput[0] == rgbInput[0] && rgbaOutput[1] == rgbInput[1] &&
249*8975f5c5SAndroid Build Coastguard Worker                 rgbaOutput[2] == rgbInput[2] && rgbaOutput[3] == static_cast<int8_t>(kFourthValue))
250*8975f5c5SAndroid Build Coastguard Worker         << "Pixel mismatch";
251*8975f5c5SAndroid Build Coastguard Worker }
252*8975f5c5SAndroid Build Coastguard Worker 
253*8975f5c5SAndroid Build Coastguard Worker // Tests the sbyte (0x01) RGB to RGBA loading function for one RGB pixel.
TEST(LoadToNative3To4,LoadSbyteRGBToRGBADataOnePixelWithFourthCompOf01)254*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadSbyteRGBToRGBADataOnePixelWithFourthCompOf01)
255*8975f5c5SAndroid Build Coastguard Worker {
256*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
257*8975f5c5SAndroid Build Coastguard Worker     int8_t rgbInput[]              = {1, 2, 3};
258*8975f5c5SAndroid Build Coastguard Worker     int8_t rgbaOutput[]            = {0, 0, 0, 0};
259*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kFourthValue = 0x01;
260*8975f5c5SAndroid Build Coastguard Worker 
261*8975f5c5SAndroid Build Coastguard Worker     LoadToNative3To4<int8_t, kFourthValue>(context, 1, 1, 1, reinterpret_cast<uint8_t *>(rgbInput),
262*8975f5c5SAndroid Build Coastguard Worker                                            3, 3, reinterpret_cast<uint8_t *>(rgbaOutput), 4, 4);
263*8975f5c5SAndroid Build Coastguard Worker 
264*8975f5c5SAndroid Build Coastguard Worker     EXPECT_TRUE(rgbaOutput[0] == rgbInput[0] && rgbaOutput[1] == rgbInput[1] &&
265*8975f5c5SAndroid Build Coastguard Worker                 rgbaOutput[2] == rgbInput[2] && rgbaOutput[3] == static_cast<int8_t>(kFourthValue))
266*8975f5c5SAndroid Build Coastguard Worker         << "Pixel mismatch";
267*8975f5c5SAndroid Build Coastguard Worker }
268*8975f5c5SAndroid Build Coastguard Worker 
269*8975f5c5SAndroid Build Coastguard Worker // Tests the ubyte (0xFF) RGB to RGBA loading function for 4 RGB pixels, which should be read
270*8975f5c5SAndroid Build Coastguard Worker // together.
TEST(LoadToNative3To4,LoadUbyteRGBToRGBADataFourPixelsWithFourthCompOfFF)271*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadUbyteRGBToRGBADataFourPixelsWithFourthCompOfFF)
272*8975f5c5SAndroid Build Coastguard Worker {
273*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
274*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kPixelCount = 4;
275*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> rgbInput(kPixelCount * 3);
276*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> rgbaOutput(kPixelCount * 4, 0);
277*8975f5c5SAndroid Build Coastguard Worker     size_t index = 0;
278*8975f5c5SAndroid Build Coastguard Worker     for (auto &inputComponent : rgbInput)
279*8975f5c5SAndroid Build Coastguard Worker     {
280*8975f5c5SAndroid Build Coastguard Worker         inputComponent = ++index;
281*8975f5c5SAndroid Build Coastguard Worker     }
282*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kFourthValue = 0xFF;
283*8975f5c5SAndroid Build Coastguard Worker 
284*8975f5c5SAndroid Build Coastguard Worker     LoadToNative3To4<uint8_t, kFourthValue>(context, 4, 1, 1, rgbInput.data(), 3, 3,
285*8975f5c5SAndroid Build Coastguard Worker                                             rgbaOutput.data(), 4, 4);
286*8975f5c5SAndroid Build Coastguard Worker 
287*8975f5c5SAndroid Build Coastguard Worker     for (index = 0; index < kPixelCount; index++)
288*8975f5c5SAndroid Build Coastguard Worker     {
289*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(rgbaOutput[index * 4] == rgbInput[index * 3] &&
290*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 1] == rgbInput[index * 3 + 1] &&
291*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 2] == rgbInput[index * 3 + 2] &&
292*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 3] == kFourthValue)
293*8975f5c5SAndroid Build Coastguard Worker             << "Mismatch at pixel " << index;
294*8975f5c5SAndroid Build Coastguard Worker     }
295*8975f5c5SAndroid Build Coastguard Worker }
296*8975f5c5SAndroid Build Coastguard Worker 
297*8975f5c5SAndroid Build Coastguard Worker // Tests the ubyte (0x01) RGB to RGBA loading function for 4 RGB pixels, which should be read
298*8975f5c5SAndroid Build Coastguard Worker // together.
TEST(LoadToNative3To4,LoadUbyteRGBToRGBADataFourPixelsWithFourthCompOf01)299*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadUbyteRGBToRGBADataFourPixelsWithFourthCompOf01)
300*8975f5c5SAndroid Build Coastguard Worker {
301*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
302*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kPixelCount = 4;
303*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> rgbInput(kPixelCount * 3);
304*8975f5c5SAndroid Build Coastguard Worker     std::vector<uint8_t> rgbaOutput(kPixelCount * 4, 0);
305*8975f5c5SAndroid Build Coastguard Worker     size_t index = 0;
306*8975f5c5SAndroid Build Coastguard Worker     for (auto &inputComponent : rgbInput)
307*8975f5c5SAndroid Build Coastguard Worker     {
308*8975f5c5SAndroid Build Coastguard Worker         inputComponent = ++index;
309*8975f5c5SAndroid Build Coastguard Worker     }
310*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kFourthValue = 0x01;
311*8975f5c5SAndroid Build Coastguard Worker 
312*8975f5c5SAndroid Build Coastguard Worker     LoadToNative3To4<uint8_t, kFourthValue>(context, 4, 1, 1, rgbInput.data(), 3, 3,
313*8975f5c5SAndroid Build Coastguard Worker                                             rgbaOutput.data(), 4, 4);
314*8975f5c5SAndroid Build Coastguard Worker 
315*8975f5c5SAndroid Build Coastguard Worker     for (index = 0; index < kPixelCount; index++)
316*8975f5c5SAndroid Build Coastguard Worker     {
317*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(rgbaOutput[index * 4] == rgbInput[index * 3] &&
318*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 1] == rgbInput[index * 3 + 1] &&
319*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 2] == rgbInput[index * 3 + 2] &&
320*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 3] == kFourthValue)
321*8975f5c5SAndroid Build Coastguard Worker             << "Mismatch at pixel " << index;
322*8975f5c5SAndroid Build Coastguard Worker     }
323*8975f5c5SAndroid Build Coastguard Worker }
324*8975f5c5SAndroid Build Coastguard Worker 
325*8975f5c5SAndroid Build Coastguard Worker // Tests the sbyte (0x7F) RGB to RGBA loading function for 4 RGB pixels, which should be read
326*8975f5c5SAndroid Build Coastguard Worker // together.
TEST(LoadToNative3To4,LoadSbyteRGBToRGBADataFourPixelsWithFourthCompOf7F)327*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadSbyteRGBToRGBADataFourPixelsWithFourthCompOf7F)
328*8975f5c5SAndroid Build Coastguard Worker {
329*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
330*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kPixelCount = 4;
331*8975f5c5SAndroid Build Coastguard Worker     std::vector<int8_t> rgbInput(kPixelCount * 3);
332*8975f5c5SAndroid Build Coastguard Worker     std::vector<int8_t> rgbaOutput(kPixelCount * 4, 0);
333*8975f5c5SAndroid Build Coastguard Worker     size_t index = 0;
334*8975f5c5SAndroid Build Coastguard Worker     for (auto &inputComponent : rgbInput)
335*8975f5c5SAndroid Build Coastguard Worker     {
336*8975f5c5SAndroid Build Coastguard Worker         inputComponent = ++index;
337*8975f5c5SAndroid Build Coastguard Worker     }
338*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kFourthValue = 0x01;
339*8975f5c5SAndroid Build Coastguard Worker 
340*8975f5c5SAndroid Build Coastguard Worker     LoadToNative3To4<int8_t, kFourthValue>(context, 4, 1, 1,
341*8975f5c5SAndroid Build Coastguard Worker                                            reinterpret_cast<uint8_t *>(rgbInput.data()), 3, 3,
342*8975f5c5SAndroid Build Coastguard Worker                                            reinterpret_cast<uint8_t *>(rgbaOutput.data()), 4, 4);
343*8975f5c5SAndroid Build Coastguard Worker 
344*8975f5c5SAndroid Build Coastguard Worker     for (index = 0; index < kPixelCount; index++)
345*8975f5c5SAndroid Build Coastguard Worker     {
346*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(rgbaOutput[index * 4] == rgbInput[index * 3] &&
347*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 1] == rgbInput[index * 3 + 1] &&
348*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 2] == rgbInput[index * 3 + 2] &&
349*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 3] == static_cast<int8_t>(kFourthValue))
350*8975f5c5SAndroid Build Coastguard Worker             << "Mismatch at pixel " << index;
351*8975f5c5SAndroid Build Coastguard Worker     }
352*8975f5c5SAndroid Build Coastguard Worker }
353*8975f5c5SAndroid Build Coastguard Worker 
354*8975f5c5SAndroid Build Coastguard Worker // Tests the sbyte (0x01) RGB to RGBA loading function for 4 RGB pixels, which should be read
355*8975f5c5SAndroid Build Coastguard Worker // together.
TEST(LoadToNative3To4,LoadSbyteRGBToRGBADataFourPixelsWithFourthCompOf01)356*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadSbyteRGBToRGBADataFourPixelsWithFourthCompOf01)
357*8975f5c5SAndroid Build Coastguard Worker {
358*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
359*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kPixelCount = 4;
360*8975f5c5SAndroid Build Coastguard Worker     std::vector<int8_t> rgbInput(kPixelCount * 3);
361*8975f5c5SAndroid Build Coastguard Worker     std::vector<int8_t> rgbaOutput(kPixelCount * 4, 0);
362*8975f5c5SAndroid Build Coastguard Worker     size_t index = 0;
363*8975f5c5SAndroid Build Coastguard Worker     for (auto &inputComponent : rgbInput)
364*8975f5c5SAndroid Build Coastguard Worker     {
365*8975f5c5SAndroid Build Coastguard Worker         inputComponent = ++index;
366*8975f5c5SAndroid Build Coastguard Worker     }
367*8975f5c5SAndroid Build Coastguard Worker     constexpr uint8_t kFourthValue = 0x01;
368*8975f5c5SAndroid Build Coastguard Worker 
369*8975f5c5SAndroid Build Coastguard Worker     LoadToNative3To4<int8_t, kFourthValue>(context, 4, 1, 1,
370*8975f5c5SAndroid Build Coastguard Worker                                            reinterpret_cast<uint8_t *>(rgbInput.data()), 3, 3,
371*8975f5c5SAndroid Build Coastguard Worker                                            reinterpret_cast<uint8_t *>(rgbaOutput.data()), 4, 4);
372*8975f5c5SAndroid Build Coastguard Worker 
373*8975f5c5SAndroid Build Coastguard Worker     for (index = 0; index < kPixelCount; index++)
374*8975f5c5SAndroid Build Coastguard Worker     {
375*8975f5c5SAndroid Build Coastguard Worker         EXPECT_TRUE(rgbaOutput[index * 4] == rgbInput[index * 3] &&
376*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 1] == rgbInput[index * 3 + 1] &&
377*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 2] == rgbInput[index * 3 + 2] &&
378*8975f5c5SAndroid Build Coastguard Worker                     rgbaOutput[index * 4 + 3] == static_cast<int8_t>(kFourthValue))
379*8975f5c5SAndroid Build Coastguard Worker             << "Mismatch at pixel " << index;
380*8975f5c5SAndroid Build Coastguard Worker     }
381*8975f5c5SAndroid Build Coastguard Worker }
382*8975f5c5SAndroid Build Coastguard Worker 
383*8975f5c5SAndroid Build Coastguard Worker // Tests the byte RGB to RGBA loading function when the width is 4-byte aligned. This loading
384*8975f5c5SAndroid Build Coastguard Worker // function can copy 4 bytes at a time in a row.
TEST(LoadToNative3To4,LoadByteRGBToRGBADataAlignedWidth)385*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadByteRGBToRGBADataAlignedWidth)
386*8975f5c5SAndroid Build Coastguard Worker {
387*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
388*8975f5c5SAndroid Build Coastguard Worker     size_t alignedTestWidths[] = {4, 20, 128, 1000, 4096};
389*8975f5c5SAndroid Build Coastguard Worker     for (auto &width : alignedTestWidths)
390*8975f5c5SAndroid Build Coastguard Worker     {
391*8975f5c5SAndroid Build Coastguard Worker         ASSERT(width % 4 == 0);
392*8975f5c5SAndroid Build Coastguard Worker         TestLoadByteRGBToRGBAForAllCases(context, width, width, 3, 1, 0, 0, 1);
393*8975f5c5SAndroid Build Coastguard Worker     }
394*8975f5c5SAndroid Build Coastguard Worker }
395*8975f5c5SAndroid Build Coastguard Worker 
396*8975f5c5SAndroid Build Coastguard Worker // Tests the byte RGB to RGBA loading function when the width is not 4-byte aligned, which will
397*8975f5c5SAndroid Build Coastguard Worker // cause the loading function to copy some bytes in the beginning and end of some rows individually.
TEST(LoadToNative3To4,LoadByteRGBToRGBADataUnalignedWidth)398*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadByteRGBToRGBADataUnalignedWidth)
399*8975f5c5SAndroid Build Coastguard Worker {
400*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
401*8975f5c5SAndroid Build Coastguard Worker     size_t unalignedTestWidths[] = {5, 22, 127, 1022, 4097};
402*8975f5c5SAndroid Build Coastguard Worker     for (auto &width : unalignedTestWidths)
403*8975f5c5SAndroid Build Coastguard Worker     {
404*8975f5c5SAndroid Build Coastguard Worker         ASSERT(width % 4 != 0);
405*8975f5c5SAndroid Build Coastguard Worker         TestLoadByteRGBToRGBAForAllCases(context, width, width, 3, 1, 0, 0, 1);
406*8975f5c5SAndroid Build Coastguard Worker     }
407*8975f5c5SAndroid Build Coastguard Worker }
408*8975f5c5SAndroid Build Coastguard Worker 
409*8975f5c5SAndroid Build Coastguard Worker // Tests the byte RGB to RGBA loading function when there is depth.
TEST(LoadToNative3To4,LoadByteRGBToRGBADataWithDepth)410*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadByteRGBToRGBADataWithDepth)
411*8975f5c5SAndroid Build Coastguard Worker {
412*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
413*8975f5c5SAndroid Build Coastguard Worker     size_t unalignedTestDepths[] = {3};
414*8975f5c5SAndroid Build Coastguard Worker     for (auto &depth : unalignedTestDepths)
415*8975f5c5SAndroid Build Coastguard Worker     {
416*8975f5c5SAndroid Build Coastguard Worker         TestLoadByteRGBToRGBAForAllCases(context, depth, 3, 3, depth, 0, 0, 1);
417*8975f5c5SAndroid Build Coastguard Worker     }
418*8975f5c5SAndroid Build Coastguard Worker }
419*8975f5c5SAndroid Build Coastguard Worker 
420*8975f5c5SAndroid Build Coastguard Worker // Tests the byte RGB to RGBA loading function when the width is less than 4 bytes. Therefore the
421*8975f5c5SAndroid Build Coastguard Worker // loading function will copy data one byte at a time.
TEST(LoadToNative3To4,LoadByteRGBToRGBADataWidthLessThanUint32)422*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadByteRGBToRGBADataWidthLessThanUint32)
423*8975f5c5SAndroid Build Coastguard Worker {
424*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
425*8975f5c5SAndroid Build Coastguard Worker     size_t smallTestWidths[] = {1, 2, 3};
426*8975f5c5SAndroid Build Coastguard Worker     for (auto &width : smallTestWidths)
427*8975f5c5SAndroid Build Coastguard Worker     {
428*8975f5c5SAndroid Build Coastguard Worker         TestLoadByteRGBToRGBAForAllCases(context, width, width, 3, 1, 0, 0, 1);
429*8975f5c5SAndroid Build Coastguard Worker     }
430*8975f5c5SAndroid Build Coastguard Worker }
431*8975f5c5SAndroid Build Coastguard Worker 
432*8975f5c5SAndroid Build Coastguard Worker // Tests the byte RGB to RGBA loading function when when the width is 4-byte-aligned and the input
433*8975f5c5SAndroid Build Coastguard Worker // address has an offset.
TEST(LoadToNative3To4,LoadByteRGBToRGBAWithAlignedWidthAndInputAddressOffset)434*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadByteRGBToRGBAWithAlignedWidthAndInputAddressOffset)
435*8975f5c5SAndroid Build Coastguard Worker {
436*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
437*8975f5c5SAndroid Build Coastguard Worker     size_t inputOffsetList[] = {1, 2, 3};
438*8975f5c5SAndroid Build Coastguard Worker     for (auto &inputOffset : inputOffsetList)
439*8975f5c5SAndroid Build Coastguard Worker     {
440*8975f5c5SAndroid Build Coastguard Worker         TestLoadByteRGBToRGBAForAllCases(context, inputOffset, 8, 8, 1, inputOffset, 0, 1);
441*8975f5c5SAndroid Build Coastguard Worker     }
442*8975f5c5SAndroid Build Coastguard Worker }
443*8975f5c5SAndroid Build Coastguard Worker 
444*8975f5c5SAndroid Build Coastguard Worker // Tests the byte RGB to RGBA loading function when when the width is not 4-byte-aligned and the
445*8975f5c5SAndroid Build Coastguard Worker // input address has an offset.
TEST(LoadToNative3To4,LoadByteRGBToRGBAWithUnalignedWidthAndInputAddressOffset)446*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadByteRGBToRGBAWithUnalignedWidthAndInputAddressOffset)
447*8975f5c5SAndroid Build Coastguard Worker {
448*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
449*8975f5c5SAndroid Build Coastguard Worker     size_t inputOffsetList[] = {1, 2, 3};
450*8975f5c5SAndroid Build Coastguard Worker     for (auto &inputOffset : inputOffsetList)
451*8975f5c5SAndroid Build Coastguard Worker     {
452*8975f5c5SAndroid Build Coastguard Worker         TestLoadByteRGBToRGBAForAllCases(context, inputOffset, 7, 7, 1, inputOffset, 0, 1);
453*8975f5c5SAndroid Build Coastguard Worker     }
454*8975f5c5SAndroid Build Coastguard Worker }
455*8975f5c5SAndroid Build Coastguard Worker 
456*8975f5c5SAndroid Build Coastguard Worker // Tests the byte RGB to RGBA loading function when the width is 4-byte-aligned and the output
457*8975f5c5SAndroid Build Coastguard Worker // address has an offset.
TEST(LoadToNative3To4,LoadByteRGBToRGBAWithAlignedWidthAndOutputAddressOffset)458*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadByteRGBToRGBAWithAlignedWidthAndOutputAddressOffset)
459*8975f5c5SAndroid Build Coastguard Worker {
460*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
461*8975f5c5SAndroid Build Coastguard Worker     size_t outputOffsetList[] = {1, 2, 3};
462*8975f5c5SAndroid Build Coastguard Worker     for (auto &outputOffset : outputOffsetList)
463*8975f5c5SAndroid Build Coastguard Worker     {
464*8975f5c5SAndroid Build Coastguard Worker         TestLoadByteRGBToRGBAForAllCases(context, outputOffset, 8, 8, 1, 0, outputOffset, 1);
465*8975f5c5SAndroid Build Coastguard Worker     }
466*8975f5c5SAndroid Build Coastguard Worker }
467*8975f5c5SAndroid Build Coastguard Worker 
468*8975f5c5SAndroid Build Coastguard Worker // Tests the byte RGB to RGBA loading function when the width is not 4-byte-aligned and the output
469*8975f5c5SAndroid Build Coastguard Worker // address has an offset.
TEST(LoadToNative3To4,LoadByteRGBToRGBAWithUnalignedWidthAndOutputAddressOffset)470*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadByteRGBToRGBAWithUnalignedWidthAndOutputAddressOffset)
471*8975f5c5SAndroid Build Coastguard Worker {
472*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
473*8975f5c5SAndroid Build Coastguard Worker     size_t outputOffsetList[] = {1, 2, 3};
474*8975f5c5SAndroid Build Coastguard Worker     for (auto &outputOffset : outputOffsetList)
475*8975f5c5SAndroid Build Coastguard Worker     {
476*8975f5c5SAndroid Build Coastguard Worker         TestLoadByteRGBToRGBAForAllCases(context, outputOffset, 7, 7, 1, 0, outputOffset, 1);
477*8975f5c5SAndroid Build Coastguard Worker     }
478*8975f5c5SAndroid Build Coastguard Worker }
479*8975f5c5SAndroid Build Coastguard Worker 
480*8975f5c5SAndroid Build Coastguard Worker // Tests the byte RGB to RGBA loading function when the width is 4-byte-aligned and the input row
481*8975f5c5SAndroid Build Coastguard Worker // alignment is 4.
TEST(LoadToNative3To4,LoadByteRGBToRGBAWithAlignedWidthAndAlignment4)482*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadByteRGBToRGBAWithAlignedWidthAndAlignment4)
483*8975f5c5SAndroid Build Coastguard Worker {
484*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
485*8975f5c5SAndroid Build Coastguard Worker     size_t inputRowAlignmentList[] = {4};
486*8975f5c5SAndroid Build Coastguard Worker     for (auto &alignment : inputRowAlignmentList)
487*8975f5c5SAndroid Build Coastguard Worker     {
488*8975f5c5SAndroid Build Coastguard Worker         TestLoadByteRGBToRGBAForAllCases(context, alignment, 4, 4, 1, 0, 0, alignment);
489*8975f5c5SAndroid Build Coastguard Worker     }
490*8975f5c5SAndroid Build Coastguard Worker }
491*8975f5c5SAndroid Build Coastguard Worker 
492*8975f5c5SAndroid Build Coastguard Worker // Tests the byte RGB to RGBA loading function when the width is not 4-byte-aligned and the input
493*8975f5c5SAndroid Build Coastguard Worker // row alignment is 4.
TEST(LoadToNative3To4,LoadByteRGBToRGBAWithUnalignedWidthAndAlignment4)494*8975f5c5SAndroid Build Coastguard Worker TEST(LoadToNative3To4, LoadByteRGBToRGBAWithUnalignedWidthAndAlignment4)
495*8975f5c5SAndroid Build Coastguard Worker {
496*8975f5c5SAndroid Build Coastguard Worker     ImageLoadContext context;
497*8975f5c5SAndroid Build Coastguard Worker     size_t inputRowAlignmentList[] = {4};
498*8975f5c5SAndroid Build Coastguard Worker     for (auto &alignment : inputRowAlignmentList)
499*8975f5c5SAndroid Build Coastguard Worker     {
500*8975f5c5SAndroid Build Coastguard Worker         TestLoadByteRGBToRGBAForAllCases(context, alignment, 5, 5, 1, 0, 0, alignment);
501*8975f5c5SAndroid Build Coastguard Worker     }
502*8975f5c5SAndroid Build Coastguard Worker }
503*8975f5c5SAndroid Build Coastguard Worker }  // namespace