Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_filter.cc
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2004, 2006-2007 Cyrille Berger <cberger@cberger.net>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#include "filter/kis_filter.h"
8
9#include <QString>
10
15#include "kis_transaction.h"
16#include "kis_paint_device.h"
17#include "kis_selection.h"
18#include "kis_types.h"
19#include <kis_painter.h>
20#include <KoUpdater.h>
21
22KisFilter::KisFilter(const KoID& _id, const KoID & category, const QString & entry)
23 : KisBaseProcessor(_id, category, entry),
24 m_supportsLevelOfDetail(false)
25{
26 init(id() + "_filter_bookmarks");
27}
28
32
34 const QRect& applyRect,
35 const KisFilterConfigurationSP config,
36 KoUpdater* progressUpdater) const
37{
38 process(device, device, KisSelectionSP(), applyRect, config, progressUpdater);
39}
40
43 KisSelectionSP selection,
44 const QRect& applyRect,
45 const KisFilterConfigurationSP config,
46 KoUpdater* progressUpdater ) const
47{
48 KIS_SAFE_ASSERT_RECOVER_NOOP(config->hasLocalResourcesSnapshot());
49
50 if (applyRect.isEmpty()) return;
51 QRect needRect = neededRect(applyRect, config, src->defaultBounds()->currentLevelOfDetail());
52
53 KisPaintDeviceSP temporary;
54 KisTransaction *transaction = 0;
55
56 bool weirdDstColorSpace =
57 dst->colorSpace() != dst->compositionSourceColorSpace() &&
58 *dst->colorSpace() != *dst->compositionSourceColorSpace();
59
60 if(src == dst && !selection && !weirdDstColorSpace) {
61 temporary = src;
62 }
63 else {
64 temporary = dst->createCompositionSourceDevice(src, needRect);
65 transaction = new KisTransaction(temporary);
66 }
67
68 try {
69 QScopedPointer<KoDummyUpdaterHolder> updaterHolder;
70
71 if (!progressUpdater) {
72 // TODO: remove dependency on KoUpdater, depend on KoProgressProxy,
73 // it is more lightweight
74 updaterHolder.reset(new KoDummyUpdaterHolder());
75 progressUpdater = updaterHolder->updater();
76 }
77
78 processImpl(temporary, applyRect, config, progressUpdater);
79 }
80 catch (const std::bad_alloc&) {
81 warnKrita << "Filter" << name() << "failed to allocate enough memory to run.";
82 }
83
84
85 if(transaction) {
86 delete transaction;
87 KisPainter::copyAreaOptimized(applyRect.topLeft(), temporary, dst, applyRect, selection);
88 }
89}
90
91QRect KisFilter::neededRect(const QRect & rect, const KisFilterConfigurationSP c, int lod) const
92{
93 Q_UNUSED(c);
94 Q_UNUSED(lod);
95 return rect;
96}
97
98QRect KisFilter::changedRect(const QRect & rect, const KisFilterConfigurationSP c, int lod) const
99{
100 Q_UNUSED(c);
101 Q_UNUSED(lod);
102 return rect;
103}
104
106{
107 Q_UNUSED(config);
108 Q_UNUSED(lod);
110}
111
116
118{
119 Q_UNUSED(config);
120 Q_UNUSED(cs);
121
122 return false;
123}
124
126{
127 Q_UNUSED(config);
129}
130
132{
133 Q_UNUSED(config);
134}
float value(const T *src, size_t ch)
virtual void processImpl(KisPaintDeviceSP device, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater=0) const =0
void setSupportsLevelOfDetail(bool value)
virtual bool configurationAllowedForMask(KisFilterConfigurationSP config) const
void process(const KisPaintDeviceSP src, KisPaintDeviceSP dst, KisSelectionSP selection, const QRect &applyRect, const KisFilterConfigurationSP config, KoUpdater *progressUpdater=0) const
Definition kis_filter.cc:41
virtual bool needsTransparentPixels(const KisFilterConfigurationSP config, const KoColorSpace *cs) const
virtual void fixLoadedFilterConfigurationForMasks(KisFilterConfigurationSP config) const
~KisFilter() override
Definition kis_filter.cc:29
virtual QRect neededRect(const QRect &rect, const KisFilterConfigurationSP config, int lod) const
Definition kis_filter.cc:91
virtual QRect changedRect(const QRect &rect, const KisFilterConfigurationSP config, int lod) const
Definition kis_filter.cc:98
bool m_supportsLevelOfDetail
Definition kis_filter.h:113
KisFilter(const KoID &id, const KoID &category, const QString &entry)
Definition kis_filter.cc:22
virtual bool supportsLevelOfDetail(const KisFilterConfigurationSP config, int lod) const
KisPaintDeviceSP createCompositionSourceDevice() const
virtual const KoColorSpace * compositionSourceColorSpace() const
const KoColorSpace * colorSpace() const
static void copyAreaOptimized(const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)
A holder for an updater that does nothing.
Definition KoUpdater.h:116
Definition KoID.h:30
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
Definition kis_assert.h:130
#define warnKrita
Definition kis_debug.h:87
KisSharedPtr< KisSelection > KisSelectionSP
Definition kis_types.h:149
void init(const QString &configEntryGroup)