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 }