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

0001 /*
0002  *  SPDX-FileCopyrightText: 2010 Lukáš Tvrdý lukast.dev @gmail.com
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #include "kis_hline_iterator_benchmark.h"
0008 #include "kis_benchmark_values.h"
0009 
0010 #include "kis_paint_device.h"
0011 
0012 #include <KoColorSpace.h>
0013 #include <KoColorSpaceRegistry.h>
0014 #include <KoColor.h>
0015 
0016 #include <simpletest.h>
0017 
0018 #include "kis_iterator_ng.h"
0019 
0020 void KisHLineIteratorBenchmark::initTestCase()
0021 {
0022     m_colorSpace = KoColorSpaceRegistry::instance()->rgb8();
0023     m_device = new KisPaintDevice(m_colorSpace);
0024     m_color = new KoColor(m_colorSpace);
0025     // some random color
0026     m_color->fromQColor(QColor(0,0,250));
0027     m_device->fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT,m_color->data());
0028 }
0029 
0030 void KisHLineIteratorBenchmark::cleanupTestCase()
0031 {
0032     delete m_color;
0033     delete m_device;
0034 }
0035 
0036 
0037 void KisHLineIteratorBenchmark::benchmarkCreation()
0038 {
0039     QBENCHMARK{
0040         KisHLineIteratorSP it = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH);
0041     }
0042 }
0043 
0044 void KisHLineIteratorBenchmark::benchmarkWriteBytes()
0045 {
0046     KisHLineIteratorSP it = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH);
0047 
0048     QBENCHMARK{
0049         for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) {
0050             do {
0051                 memcpy(it->rawData(), m_color->data(), m_colorSpace->pixelSize());
0052             } while (it->nextPixel());
0053             it->nextRow();
0054         }
0055     }
0056 }
0057 
0058 void KisHLineIteratorBenchmark::benchmarkReadBytes()
0059 {
0060     KisHLineIteratorSP it = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH);
0061 
0062     QBENCHMARK{
0063         for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) {
0064             do {
0065                 memcpy(m_color->data(), it->rawData(), m_colorSpace->pixelSize());
0066             } while (it->nextPixel());
0067             it->nextRow();
0068         }
0069     }
0070 }
0071 
0072 
0073 void KisHLineIteratorBenchmark::benchmarkConstReadBytes()
0074 {
0075     KisHLineConstIteratorSP cit = m_device->createHLineConstIteratorNG(0, 0, TEST_IMAGE_WIDTH);
0076 
0077     QBENCHMARK{
0078         for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) {
0079             do {
0080                 memcpy(m_color->data(), cit->oldRawData(), m_colorSpace->pixelSize());
0081             } while (cit->nextPixel());
0082             cit->nextRow();
0083         }
0084     }
0085 }
0086 
0087 void KisHLineIteratorBenchmark::benchmarkReadWriteBytes(){
0088     KoColor c(m_colorSpace);
0089     c.fromQColor(QColor(250,120,0));
0090     KisPaintDevice dab(m_colorSpace);
0091     dab.fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT, c.data());
0092     
0093     KisHLineIteratorSP writeIterator = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH);
0094     KisHLineConstIteratorSP constReadIterator = dab.createHLineConstIteratorNG(0, 0, TEST_IMAGE_WIDTH);
0095 
0096     QBENCHMARK{
0097         for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) {
0098             do {
0099                 memcpy(writeIterator->rawData(), constReadIterator->oldRawData(), m_colorSpace->pixelSize());
0100             } while (constReadIterator->nextPixel() && writeIterator->nextPixel());
0101             constReadIterator->nextRow();
0102             writeIterator->nextRow();
0103         }
0104     }
0105 }
0106 
0107 
0108 
0109 void KisHLineIteratorBenchmark::benchmarkReadWriteBytes2()
0110 {
0111     KoColor c(m_colorSpace);
0112     c.fromQColor(QColor(255,0,0));
0113     KisPaintDevice dab(m_colorSpace);
0114     dab.fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT, c.data());
0115 
0116     KisHLineIteratorSP writeIterator = m_device->createHLineIteratorNG(0,0,TEST_IMAGE_WIDTH);
0117     KisHLineIteratorSP readIterator = dab.createHLineIteratorNG(0,0,TEST_IMAGE_WIDTH);
0118     
0119     QBENCHMARK{
0120         for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) {
0121             do {
0122                 memcpy(writeIterator->rawData(), readIterator->rawData(), m_colorSpace->pixelSize());
0123                 writeIterator->nextPixel();
0124             } while (readIterator->nextPixel());
0125             readIterator->nextRow();
0126             writeIterator->nextRow();
0127         }
0128     }
0129 
0130     ///QImage img = m_device->convertToQImage(m_device->colorSpace()->profile(),0,0,TEST_IMAGE_WIDTH, TEST_IMAGE_HEIGHT);
0131     //img.save("write.png");
0132     
0133 }
0134 
0135 
0136 void KisHLineIteratorBenchmark::benchmarkNoMemCpy()
0137 {
0138     KisHLineIteratorSP it = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH);
0139 
0140     QBENCHMARK{
0141         for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) {
0142             do {} while (it->nextPixel());
0143             it->nextRow();
0144         }
0145     }
0146 }
0147 
0148 
0149 void KisHLineIteratorBenchmark::benchmarkConstNoMemCpy()
0150 {
0151     KisHLineConstIteratorSP cit = m_device->createHLineConstIteratorNG(0, 0, TEST_IMAGE_WIDTH);
0152 
0153     QBENCHMARK{
0154         for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) {
0155             do {} while (cit->nextPixel());
0156             cit->nextRow();
0157         }
0158     }
0159 }
0160 
0161 void KisHLineIteratorBenchmark::benchmarkTwoIteratorsNoMemCpy(){
0162     KoColor c(m_colorSpace);
0163     c.fromQColor(QColor(250,120,0));
0164     KisPaintDevice dab(m_colorSpace);
0165     dab.fill(0,0,TEST_IMAGE_WIDTH,TEST_IMAGE_HEIGHT, c.data());
0166     
0167     KisHLineIteratorSP writeIterator = m_device->createHLineIteratorNG(0, 0, TEST_IMAGE_WIDTH);
0168     KisHLineConstIteratorSP constReadIterator = dab.createHLineConstIteratorNG(0, 0, TEST_IMAGE_WIDTH);
0169 
0170     QBENCHMARK{
0171         for (int j = 0; j < TEST_IMAGE_HEIGHT; j++) {
0172             do {} while (writeIterator->nextPixel() && constReadIterator->nextPixel());
0173             constReadIterator->nextRow();
0174             writeIterator->nextRow();
0175         }
0176     }
0177     
0178 }
0179 
0180 
0181 
0182 SIMPLE_TEST_MAIN(KisHLineIteratorBenchmark)