File indexing completed on 2024-05-26 04:32:30

0001 /*
0002  *  SPDX-FileCopyrightText: 2023 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 
0008 #include "KisChannelsThumbnailsStrokeStrategy.h"
0009 
0010 #include "kis_sequential_iterator.h"
0011 #include "KoColorModelStandardIds.h"
0012 #include "KoColorSpace.h"
0013 #include <KisStaticInitializer.h>
0014 
0015 KIS_DECLARE_STATIC_INITIALIZER {
0016     qRegisterMetaType<QVector<QImage>>("QVector<QImage>");
0017     QMetaType::registerEqualsComparator<QVector<QImage>>();
0018 }
0019 
0020 void KisChannelsThumbnailsStrokeStrategy::reportThumbnailGenerationCompleted(KisPaintDeviceSP device, const QRect &rect)
0021 {
0022     const KoColorSpace* cs = device->colorSpace();
0023     const int channelCount = cs->channelCount();
0024     const QSize thumbnailSize = rect.size();
0025     const bool invert = (cs->colorModelId() == CMYKAColorModelID);
0026 
0027     QVector<QImage> thumbnails;
0028     thumbnails.reserve(channelCount);
0029     for (int i = 0; i < channelCount; i++) {
0030         thumbnails.push_back(QImage(thumbnailSize, QImage::Format_Grayscale8));
0031     }
0032 
0033     KisSequentialConstIterator it(device, QRect(0, 0, thumbnailSize.width(), thumbnailSize.height()));
0034 
0035     for (int y = 0; y < thumbnailSize.height(); y++) {
0036         for (int x = 0; x < thumbnailSize.width(); x++) {
0037             it.nextPixel();
0038             const quint8* pixel = it.rawDataConst();
0039             for (int chan = 0; chan < channelCount; ++chan) {
0040                 QImage &img = thumbnails[chan];
0041                 if (invert) {
0042                     *(img.scanLine(y) + x) = 255 - cs->scaleToU8(pixel, chan);
0043                 }
0044                 else {
0045                     *(img.scanLine(y) + x) = cs->scaleToU8(pixel, chan);
0046                 }
0047             }
0048         }
0049     }
0050 
0051     Q_EMIT thumbnailsUpdated(thumbnails, cs);
0052 }