@@ -124,27 +124,39 @@ calculateDifferencePredefinedPixelFormat(const InputFrameParameters &frame1,
124124 dst += 4 ;
125125 }
126126
127- return {outputImage, sse.getMSE ()};
127+ return {outputImage, sse.getMSE (false )};
128128}
129129
130130template <typename T>
131- rgba_t getRGBAndConvertEndianness (const DataPointers<T> dataPointers, const Endianness endianness)
131+ rgba_t getRGBAndConvertEndianness (const DataPointers<T> dataPointers,
132+ const PixelFormatRGB &pixelFormat)
132133{
133134 constexpr auto bitDepth =
134135 (std::is_same_v<T, uint8_t > ? 8 : (std::is_same_v<T, uint16_t > ? 16 : 32 ));
135136
136137 auto r = *dataPointers.r ;
137138 auto g = *dataPointers.g ;
138139 auto b = *dataPointers.b ;
140+ T a = 0 ;
139141
140- if (endianness == Endianness::Big)
142+ if (pixelFormat. getEndianness () == Endianness::Big)
141143 {
142144 r = swapBytesEndianness<bitDepth>(r);
143145 g = swapBytesEndianness<bitDepth>(g);
144146 b = swapBytesEndianness<bitDepth>(b);
145147 }
146148
147- return rgba_t ({.r = static_cast <int >(r), .g = static_cast <int >(g), .b = static_cast <int >(b)});
149+ if (pixelFormat.hasAlpha ())
150+ {
151+ a = *dataPointers.a ;
152+ if (pixelFormat.getEndianness () == Endianness::Big)
153+ a = swapBytesEndianness<bitDepth>(a);
154+ }
155+
156+ return rgba_t ({.r = static_cast <int >(r),
157+ .g = static_cast <int >(g),
158+ .b = static_cast <int >(b),
159+ .a = static_cast <int >(a)});
148160}
149161
150162template <typename T>
@@ -163,9 +175,9 @@ std::pair<QImage, MSE> calculateDifferenceAndMSE(const InputFrameParameters &fra
163175 calculatePointersToStartOfComponents<T>(frame2.rawDataItem , frame2.frameSize , pixelFormat);
164176
165177 const auto frameSize = Size (std::min (frame1.frameSize .width , frame2.frameSize .width ),
166- std::min (frame1.frameSize .height , frame2.frameSize .height ));
178+ std::min (frame1.frameSize .height , frame2.frameSize .height ));
167179 auto outputImage = QImage (QSize (frameSize.width , frameSize.height ),
168- functionsGui::platformImageFormat (pixelFormat.hasAlpha ()));
180+ functionsGui::platformImageFormat (pixelFormat.hasAlpha ()));
169181 SSE sse;
170182
171183 unsigned char *restrict dst = outputImage.bits ();
@@ -174,8 +186,8 @@ std::pair<QImage, MSE> calculateDifferenceAndMSE(const InputFrameParameters &fra
174186
175187 for (unsigned i = 0 ; i < frameSize.width * frameSize.height ; ++i)
176188 {
177- const auto rgb1 = getRGBAndConvertEndianness (dataPointers1, pixelFormat. getEndianness () );
178- const auto rgb2 = getRGBAndConvertEndianness (dataPointers2, pixelFormat. getEndianness () );
189+ const auto rgb1 = getRGBAndConvertEndianness (dataPointers1, pixelFormat);
190+ const auto rgb2 = getRGBAndConvertEndianness (dataPointers2, pixelFormat);
179191
180192 const auto delta = rgb1 - rgb2;
181193
@@ -190,11 +202,16 @@ std::pair<QImage, MSE> calculateDifferenceAndMSE(const InputFrameParameters &fra
190202 dst += 4 ;
191203 }
192204
193- return {outputImage, sse.getMSE ()};
205+ return {outputImage, sse.getMSE (pixelFormat. hasAlpha () )};
194206}
195207
196208} // namespace
197209
210+ void PrintTo (const MSE &mse, std::ostream *os)
211+ {
212+ *os << " MSE(r=" << mse.r << " , g=" << mse.g << " , b=" << mse.b << " , a=" << mse.a << " )" ;
213+ }
214+
198215std::pair<QImage, MSE > calculateDifferenceAndMSE (const InputFrameParameters &frame1,
199216 const InputFrameParameters &frame2,
200217 const PixelFormatRGB &pixelFormat,
0 commit comments