File indexing completed on 2024-04-21 04:52:47

0001 /*
0002     SPDX-FileCopyrightText: 2022 Eric Jiang
0003     SPDX-License-Identifier: GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0004 */
0005 #include "test_utils.hpp"
0006 // test specific headers
0007 #include "scopes/colorscopes/colorconstants.h"
0008 #include "scopes/colorscopes/vectorscopegenerator.h"
0009 #include "scopes/colorscopes/waveformgenerator.h"
0010 #include "scopes/colorscopes/rgbparadegenerator.h"
0011 #include "scopes/colorscopes/histogramgenerator.h"
0012 
0013 // test for a bug where pixels were assumed to be RGB which was not true on
0014 // Windows, resulting in red and blue switched. BUG: 453149
0015 // Multiple scopes are affected, including vectorscope and waveform
0016 TEST_CASE("Colorscope RGB/BGR handling")
0017 {
0018     // create a fully red image
0019     QImage inputImage(480, 320, QImage::Format_RGB32);
0020     inputImage.fill(Qt::red);
0021     QImage bgrInputImage = inputImage.convertToFormat(QImage::Format_BGR30);
0022 
0023     QSize scopeSize{256, 256};
0024 
0025     SECTION("Vectorscope handles both RGB and BGR")
0026     {
0027         VectorscopeGenerator vectorscope{};
0028         QImage rgbScope = vectorscope.calculateVectorscope(scopeSize, inputImage, 1,
0029             VectorscopeGenerator::PaintMode::PaintMode_Green2,
0030             VectorscopeGenerator::ColorSpace::ColorSpace_YUV,
0031             false, 7);
0032         QImage bgrScope = vectorscope.calculateVectorscope(scopeSize, bgrInputImage, 1,
0033             VectorscopeGenerator::PaintMode::PaintMode_Green2,
0034             VectorscopeGenerator::ColorSpace::ColorSpace_YUV,
0035             false, 7);
0036 
0037         // both of these should be equivalent, since the vectorscope should
0038         // handle different pixel formats
0039         CHECK(rgbScope == bgrScope);
0040     }
0041 
0042     SECTION("Waveform handles both RGB and BGR")
0043     {
0044         WaveformGenerator waveform{};
0045         QImage rgbScope = waveform.calculateWaveform(scopeSize, inputImage,
0046             WaveformGenerator::PaintMode::PaintMode_Yellow,
0047             false, ITURec::Rec_709, 3);
0048         QImage bgrScope = waveform.calculateWaveform(scopeSize, bgrInputImage,
0049             WaveformGenerator::PaintMode::PaintMode_Yellow,
0050             false, ITURec::Rec_709, 3);
0051 
0052         CHECK(rgbScope == bgrScope);
0053     }
0054 
0055     SECTION("RGB Parade handles both RGB and BGR")
0056     {
0057         RGBParadeGenerator rgb{};
0058         QImage rgbScope = rgb.calculateRGBParade(scopeSize, inputImage,
0059             RGBParadeGenerator::PaintMode::PaintMode_RGB,
0060             false, false, 3);
0061         QImage bgrScope = rgb.calculateRGBParade(scopeSize, bgrInputImage,
0062             RGBParadeGenerator::PaintMode::PaintMode_RGB,
0063             false, false, 3);
0064 
0065         CHECK(rgbScope == bgrScope);
0066     }
0067 
0068     SECTION("Histogram handles both RGB and BGR")
0069     {
0070         const auto ALL_COMPONENTS = HistogramGenerator::Components::ComponentR |
0071             HistogramGenerator::Components::ComponentG |
0072             HistogramGenerator::Components::ComponentB;
0073 
0074         HistogramGenerator hist{};
0075         QImage rgbScope = hist.calculateHistogram(scopeSize, inputImage,
0076             ALL_COMPONENTS, ITURec::Rec_709, false, false, 3);
0077         QImage bgrScope = hist.calculateHistogram(scopeSize, bgrInputImage,
0078             ALL_COMPONENTS, ITURec::Rec_709, false, false, 3);
0079 
0080         CHECK(rgbScope == bgrScope);
0081     }
0082 }