File indexing completed on 2024-04-28 04:21:32

0001 /*
0002  *  SPDX-FileCopyrightText: 2016 Eugene Ingerman geneing at gmail dot com
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_thumbnail_benchmark.h"
0008 #include "kis_benchmark_values.h"
0009 
0010 #include <simpletest.h>
0011 #include <QImage>
0012 #include "kis_iterator_ng.h"
0013 
0014 #include "kis_paint_device.h"
0015 #include "KoColorSpace.h"
0016 #include "KoColorSpaceRegistry.h"
0017 #include "KoCompositeOpRegistry.h"
0018 #include "KoColor.h"
0019 
0020 #include "kis_image.h"
0021 #include "kis_painter.h"
0022 #include "kis_types.h"
0023 #include "kis_sequential_iterator.h"
0024 #include "kis_transform_worker.h"
0025 
0026 
0027 
0028 #include <cmath>
0029 
0030 #define SAVE_OUTPUT
0031 
0032 const int THUMBNAIL_WIDTH = 64;
0033 const int THUMBNAIL_HEIGHT = 64;
0034 const int IMAGE_WIDTH = 8000;
0035 const int IMAGE_HEIGHT = 6000;
0036 const int OVERSAMPLE = 4;
0037 
0038 void KisThumbnailBenchmark::initTestCase()
0039 {
0040     m_colorSpace = KoColorSpaceRegistry::instance()->rgb8();
0041 
0042     m_dev = new KisPaintDevice(m_colorSpace);
0043     KoColor color(m_colorSpace);
0044     color.fromQColor(Qt::white);
0045 
0046     m_dev->clear();
0047     m_dev->fill(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT, color.data());
0048 
0049     color.fromQColor(Qt::black);
0050 
0051     KisPainter painter(m_dev);
0052     painter.setPaintColor(color);
0053     float radius = std::min(IMAGE_WIDTH, IMAGE_HEIGHT);
0054     const float angle = 2 * 3.1415926 / 360.;
0055     const float endWidth = 30;
0056 
0057     for (int i = 0; i < 90; i += 5) {
0058         painter.drawThickLine(QPointF(0, 0), QPointF(radius * std::sin(angle * i), radius * std::cos(angle * i)), 1, endWidth);
0059         painter.drawThickLine(QPointF(IMAGE_WIDTH, IMAGE_HEIGHT),
0060                               QPointF(IMAGE_WIDTH - radius * std::sin(angle * i), IMAGE_HEIGHT - radius * std::cos(angle * i)), 1, endWidth);
0061     }
0062 #ifdef SAVE_OUTPUT
0063     m_dev->convertToQImage(m_colorSpace->profile()).save("ThumbFullImage.png");
0064 #endif
0065 }
0066 
0067 void KisThumbnailBenchmark::cleanupTestCase()
0068 {
0069 }
0070 
0071 void KisThumbnailBenchmark::benchmarkCreateThumbnail()
0072 {
0073     QImage image;
0074 
0075     QBENCHMARK{
0076         image = m_dev->createThumbnail(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, QRect() );
0077         //m_dev->setDirty();
0078     }
0079 
0080     image.save("createThumbnail.png");
0081 }
0082 
0083 void KisThumbnailBenchmark::benchmarkCreateThumbnailCached()
0084 {
0085     QImage image;
0086 
0087     QBENCHMARK{
0088         image = m_dev->createThumbnail(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, 2. );
0089     }
0090 }
0091 
0092 
0093 void KisThumbnailBenchmark::benchmarkCreateThumbnailHiQ()
0094 {
0095     QImage image;
0096 
0097     QBENCHMARK{
0098         image = m_dev->createThumbnail(OVERSAMPLE * THUMBNAIL_WIDTH, OVERSAMPLE * THUMBNAIL_HEIGHT);
0099         image = image.scaled(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, Qt::KeepAspectRatio, Qt::SmoothTransformation);
0100         m_dev->setDirty();
0101     }
0102 
0103     image.save("createThumbnailHiQ.png");
0104 }
0105 
0106 void KisThumbnailBenchmark::benchmarkCreateThumbnailHiQcreateThumbOversample2x()
0107 {
0108     QImage image;
0109 
0110     QBENCHMARK{
0111         image = m_dev->createThumbnail(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, QRect(), 2,
0112                                        KoColorConversionTransformation::internalRenderingIntent(),
0113                                        KoColorConversionTransformation::internalConversionFlags());
0114         m_dev->setDirty();
0115     }
0116 
0117     image.save("createThumbnailHiQcreateThumbOversample2x.png");
0118 }
0119 
0120 void KisThumbnailBenchmark::benchmarkCreateThumbnailHiQcreateThumbOversample3x()
0121 {
0122     QImage image;
0123 
0124     QBENCHMARK{
0125         image = m_dev->createThumbnail(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, QRect(), 3,
0126                                        KoColorConversionTransformation::internalRenderingIntent(),
0127                                        KoColorConversionTransformation::internalConversionFlags());
0128         m_dev->setDirty();
0129     }
0130 
0131     image.save("createThumbnailHiQcreateThumbOversample3x.png");
0132 }
0133 
0134 void KisThumbnailBenchmark::benchmarkCreateThumbnailHiQcreateThumbOversample4x()
0135 {
0136     QImage image;
0137 
0138     QBENCHMARK{
0139         image = m_dev->createThumbnail(THUMBNAIL_WIDTH, THUMBNAIL_HEIGHT, QRect(), 4,
0140                                        KoColorConversionTransformation::internalRenderingIntent(),
0141                                        KoColorConversionTransformation::internalConversionFlags());
0142         m_dev->setDirty();
0143     }
0144 
0145     image.save("createThumbnailHiQcreateThumbOversample4x.png");
0146 }
0147 
0148 
0149 SIMPLE_TEST_MAIN(KisThumbnailBenchmark)