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 <simpletest.h>
0008 
0009 #include <kundo2command.h>
0010 #include "kis_benchmark_values.h"
0011 
0012 #include "kis_random_accessor_ng.h"
0013 
0014 #include <KoColorSpace.h>
0015 #include <KoColorSpaceRegistry.h>
0016 #include <KoColor.h>
0017 #include <KoCompositeOpRegistry.h>
0018 
0019 #include <kis_image.h>
0020 
0021 #include "kis_floodfill_benchmark.h"
0022 
0023 #include <kis_fill_painter.h>
0024 
0025 void KisFloodFillBenchmark::initTestCase()
0026 {
0027     m_colorSpace = KoColorSpaceRegistry::instance()->rgb8();
0028     m_deviceStandardFloodFill = new KisPaintDevice(m_colorSpace);
0029     m_color = KoColor(m_colorSpace);
0030 
0031     QColor qcolor(Qt::red);
0032     srand(31524744);
0033 
0034     int tilew = 38;
0035     int tileh = 56;
0036 
0037     m_color.fromQColor(QColor(0,0,0,0)); // default pixel
0038     m_deviceStandardFloodFill->fill( 0,0,GMP_IMAGE_WIDTH, GMP_IMAGE_HEIGHT,m_color.data() );
0039 
0040     // fill the image with red ellipses (like some random dabs)
0041     m_color.fromQColor(Qt::red);
0042     KisPainter painter(m_deviceStandardFloodFill);
0043     painter.setFillStyle(KisPainter::FillStyleForegroundColor);
0044     painter.setPaintColor(m_color);
0045 
0046     int x = 0;
0047     int y = 0;
0048     for (int i = 0; i < 100;i++){
0049         x = rand() % GMP_IMAGE_WIDTH;
0050         y = rand() % GMP_IMAGE_HEIGHT;
0051         // plus 10 so that we don't fill the ellipse
0052         painter.paintEllipse(x+ 10, y+ 10, tilew, tileh);
0053     }
0054 
0055     // copy to other tests
0056     m_deviceWithoutSelectionAsBoundary = new KisPaintDevice(m_colorSpace);
0057     m_deviceWithSelectionAsBoundary = new KisPaintDevice(m_colorSpace);
0058 
0059 
0060     KisPainter::copyAreaOptimized(QPoint(), m_deviceStandardFloodFill,
0061                                   m_deviceWithoutSelectionAsBoundary, m_deviceWithoutSelectionAsBoundary->exactBounds());
0062     KisPainter::copyAreaOptimized(QPoint(), m_deviceStandardFloodFill,
0063                                   m_deviceWithSelectionAsBoundary, m_deviceWithSelectionAsBoundary->exactBounds());
0064 
0065     //m_deviceWithoutSelectionAsBoundary = m_deviceStandardFloodFill->
0066 
0067     const KoColorSpace* alphacs = KoColorSpaceRegistry::instance()->alpha8();
0068     KoColor defaultSelected = KoColor(alphacs);
0069     defaultSelected.fromQColor(QColor(255, 255, 255));
0070     m_existingSelection = new KisPaintDevice(alphacs);
0071     m_existingSelection->fill(0, 0, GMP_IMAGE_WIDTH, GMP_IMAGE_HEIGHT, defaultSelected.data());
0072 
0073 }
0074 
0075 void KisFloodFillBenchmark::benchmarkFlood()
0076 {
0077     KoColor fg(m_colorSpace);
0078     KoColor bg(m_colorSpace);
0079     fg.fromQColor(Qt::blue);
0080     bg.fromQColor(Qt::black);
0081 
0082     QBENCHMARK
0083     {
0084         KisFillPainter fillPainter(m_deviceStandardFloodFill);
0085         //setupPainter(&fillPainter);
0086         fillPainter.setPaintColor( fg );
0087         fillPainter.setBackgroundColor( bg );
0088 
0089         fillPainter.beginTransaction(kundo2_noi18n("Flood Fill"));
0090 
0091         //fillPainter.setProgress(updater->startSubtask());
0092         fillPainter.setOpacity(OPACITY_OPAQUE_U8);
0093         // default
0094         fillPainter.setFillThreshold(15);
0095         fillPainter.setCompositeOpId(COMPOSITE_OVER);
0096         fillPainter.setCareForSelection(true);
0097         fillPainter.setWidth(GMP_IMAGE_WIDTH);
0098         fillPainter.setHeight(GMP_IMAGE_HEIGHT);
0099 
0100         // fill twice
0101         fillPainter.fillColor(1, 1, m_deviceStandardFloodFill);
0102 
0103         fillPainter.deleteTransaction();
0104     }
0105 
0106     // uncomment this to see the output
0107     //QImage out = m_device->convertToQImage(m_colorSpace->profile(),0,0,GMP_IMAGE_WIDTH,GMP_IMAGE_HEIGHT);
0108     //out.save("fill_output.png");
0109 }
0110 
0111 void KisFloodFillBenchmark::benchmarkFloodWithoutSelectionAsBoundary()
0112 {
0113     KoColor fg(m_colorSpace);
0114     KoColor bg(m_colorSpace);
0115     fg.fromQColor(Qt::blue);
0116     bg.fromQColor(Qt::black);
0117 
0118     QBENCHMARK
0119     {
0120         KisFillPainter fillPainter(m_deviceWithoutSelectionAsBoundary);
0121         fillPainter.setPaintColor( fg );
0122         fillPainter.setBackgroundColor( bg );
0123 
0124         fillPainter.beginTransaction(kundo2_noi18n("Flood Fill"));
0125 
0126         fillPainter.setOpacity(OPACITY_OPAQUE_U8);
0127         // default
0128         fillPainter.setFillThreshold(15);
0129         fillPainter.setCompositeOpId(COMPOSITE_OVER);
0130         fillPainter.setCareForSelection(true);
0131         fillPainter.setWidth(GMP_IMAGE_WIDTH);
0132         fillPainter.setHeight(GMP_IMAGE_HEIGHT);
0133         fillPainter.setUseSelectionAsBoundary(false);
0134         fillPainter.setUseCompositing(true);
0135 
0136         fillPainter.createFloodSelection(1, 1, m_deviceWithoutSelectionAsBoundary, m_existingSelection);
0137 
0138         fillPainter.deleteTransaction();
0139     }
0140 }
0141 
0142 void KisFloodFillBenchmark::benchmarkFloodWithSelectionAsBoundary()
0143 {
0144     KoColor fg(m_colorSpace);
0145     KoColor bg(m_colorSpace);
0146     fg.fromQColor(Qt::blue);
0147     bg.fromQColor(Qt::black);
0148 
0149     QBENCHMARK
0150     {
0151         KisFillPainter fillPainter(m_deviceWithSelectionAsBoundary);
0152         fillPainter.setPaintColor( fg );
0153         fillPainter.setBackgroundColor( bg );
0154 
0155         fillPainter.beginTransaction(kundo2_noi18n("Flood Fill"));
0156 
0157         fillPainter.setOpacity(OPACITY_OPAQUE_U8);
0158         // default
0159         fillPainter.setFillThreshold(15);
0160         fillPainter.setCompositeOpId(COMPOSITE_OVER);
0161         fillPainter.setCareForSelection(true);
0162         fillPainter.setWidth(GMP_IMAGE_WIDTH);
0163         fillPainter.setHeight(GMP_IMAGE_HEIGHT);
0164         fillPainter.setUseSelectionAsBoundary(true);
0165         fillPainter.setUseCompositing(true);
0166 
0167         fillPainter.createFloodSelection(1, 1, m_deviceWithSelectionAsBoundary, m_existingSelection);
0168 
0169         fillPainter.deleteTransaction();
0170     }
0171 }
0172 
0173 
0174 void KisFloodFillBenchmark::cleanupTestCase()
0175 {
0176 
0177 }
0178 
0179 SIMPLE_TEST_MAIN(KisFloodFillBenchmark)