Krita Source Code Documentation
Loading...
Searching...
No Matches
KisImageThumbnailStrokeStrategy.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2016 Eugene Ingerman geneing at gmail dot com
3 * SPDX-FileCopyrightText: 2020 Dmitry Kazakov <dimula73@gmail.com>
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 */
7
9
10#include <kis_paint_device.h>
11#include <kis_painter.h>
12#include "krita_utils.h"
14#include "kis_filter_strategy.h"
16#include <KoUpdater.h>
19
20const qreal oversample = 2.;
21const int thumbnailTileDim = 128;
22
23
26 const QRect& rect,
27 const QSize& thumbnailSize,
28 bool isPixelArt,
29 const KoColorProfile *profile,
31 KoColorConversionTransformation::ConversionFlags conversionFlags)
32 : KisIdleTaskStrokeStrategy(QLatin1String("OverviewThumbnail"), kundo2_i18n("Update overview thumbnail")),
33 m_device(device),
34 m_rect(rect),
35 m_thumbnailSize(thumbnailSize),
36 m_isPixelArt(isPixelArt),
37 m_profile(profile),
38 m_renderingIntent(renderingIntent),
39 m_conversionFlags(conversionFlags)
40{
41}
42
46
48{
52
53 const QRect imageRect = m_device->defaultBounds()->bounds();
54
56
57 if ((m_thumbnailOversampledSize.width() > imageRect.width()) || (m_thumbnailOversampledSize.height() > imageRect.height())) {
58 m_thumbnailOversampledSize.scale(imageRect.size(), Qt::KeepAspectRatio);
59 }
60
62
64
66 Q_FOREACH (const QRect &rc, tileRects) {
67 addJobConcurrent(jobs, [this, tileRect = rc] () {
68 //we aren't going to use oversample capability of createThumbnailDevice because it recomputes exact bounds for each small patch, which is
69 //slow. We'll handle scaling separately.
71 KisPainter::copyAreaOptimized(tileRect.topLeft(), thumbnailTile, m_thumbnailDevice, tileRect);
72 });
73 }
74
75 addJobSequential(jobs, [this] () {
76 KoDummyUpdaterHolder updaterHolder;
77 qreal xscale = m_thumbnailSize.width() / (qreal)m_thumbnailOversampledSize.width();
78 qreal yscale = m_thumbnailSize.height() / (qreal)m_thumbnailOversampledSize.height();
79 QString algorithm = m_isPixelArt ? "Box" : "Bilinear";
80 KisTransformWorker worker(m_thumbnailDevice, xscale, yscale, 0.0, 0.0, 0.0, 0.0, 0.0,
81 updaterHolder.updater(), KisFilterStrategyRegistry::instance()->value(algorithm));
82 worker.run();
83
85 });
86
88}
89
91{
92 QImage overviewImage;
93 overviewImage = device->convertToQImage(m_profile,
94 rect,
97 Q_EMIT thumbnailUpdated(overviewImage);
98}
const qreal oversample
const int thumbnailTileDim
virtual QRect bounds() const =0
static KisFilterStrategyRegistry * instance()
KoColorConversionTransformation::ConversionFlags m_conversionFlags
virtual void reportThumbnailGenerationCompleted(KisPaintDeviceSP device, const QRect &rect)=0
KoColorConversionTransformation::Intent m_renderingIntent
KisImageThumbnailStrokeStrategyBase(KisPaintDeviceSP device, const QRect &rect, const QSize &thumbnailSize, bool isPixelArt, const KoColorProfile *profile, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
void thumbnailUpdated(QImage pixmap)
virtual void reportThumbnailGenerationCompleted(KisPaintDeviceSP device, const QRect &rect)
const KoColorSpace * colorSpace() const
KisPaintDeviceSP createThumbnailDeviceOversampled(qint32 w, qint32 h, qreal oversample, QRect rect=QRect(), QRect outputRect=QRect()) const
QImage convertToQImage(const KoColorProfile *dstProfile, qint32 x, qint32 y, qint32 w, qint32 h, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) const
KisDefaultBoundsBaseSP defaultBounds() const
static void copyAreaOptimized(const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)
KisRunnableStrokeJobsInterface * runnableJobsInterface() const
virtual void addRunnableJobs(const QVector< KisRunnableStrokeJobDataBase * > &list)=0
A holder for an updater that does nothing.
Definition KoUpdater.h:116
KoUpdater * updater()
const T value(const QString &id) const
KUndo2MagicString kundo2_i18n(const char *text)
QVector< QRect > splitRectIntoPatches(const QRect &rc, const QSize &patchSize)
void addJobConcurrent(QVector< Job * > &jobs, Func func)
void addJobSequential(QVector< Job * > &jobs, Func func)