Krita Source Code Documentation
Loading...
Searching...
No Matches
imagesize.cc
Go to the documentation of this file.
1/*
2 * imagesize.cc -- Part of Krita
3 *
4 * SPDX-FileCopyrightText: 2004 Boudewijn Rempt (boud@valdyas.org)
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8
9#include "imagesize.h"
10
11#include <klocalizedstring.h>
12#include <kis_debug.h>
13#include <kpluginfactory.h>
14
15#include <kis_image.h>
16#include <kis_layer.h>
17#include <kis_global.h>
18#include <kis_types.h>
19#include <KisViewManager.h>
20
21#include <kis_image_manager.h>
22#include <kis_node_manager.h>
23#include <kis_group_layer.h>
24#include <kis_selection_mask.h>
25#include <kis_selection.h>
26
27#include "dlg_imagesize.h"
28#include "dlg_canvassize.h"
29#include "dlg_layersize.h"
30#include "kis_filter_strategy.h"
31#include "kis_action.h"
32#include "kis_action_manager.h"
33
34ImageSize::ImageSize(QObject *parent)
35 : KisActionPlugin(parent)
36{
37
38 KisAction *action = createAction("imagesize");
39 connect(action, SIGNAL(triggered()), this, SLOT(slotImageSize()));
40
41 action = createAction("canvassize");
42 connect(action, SIGNAL(triggered()), this, SLOT(slotCanvasSize()));
43
44 action = createAction("layersize");
45 connect(action, SIGNAL(triggered()), this, SLOT(slotLayerSize()));
46
47 action = createAction("scaleAllLayers");
48 connect(action, SIGNAL(triggered()), this, SLOT(slotScaleAllLayers()));
49
50 action = createAction("selectionscale");
51 connect(action, SIGNAL(triggered()), this, SLOT(slotSelectionScale()));
52}
53
57
59{
60 KisImageSP image = viewManager()->image().toStrongRef();
61 if (!image) return;
62
63 if (!viewManager()->blockUntilOperationsFinished(image)) return;
64
65 DlgImageSize * dlgImageSize = new DlgImageSize(viewManager()->mainWindowAsQWidget(), image->width(), image->height(), image->yRes());
66 Q_CHECK_PTR(dlgImageSize);
67 dlgImageSize->setObjectName("ImageSize");
68
69 if (dlgImageSize->exec() == QDialog::Accepted) {
70 const QSize desiredSize(dlgImageSize->desiredWidth(), dlgImageSize->desiredHeight());
71 double res = dlgImageSize->desiredResolution();
72 viewManager()->imageManager()->scaleCurrentImage(desiredSize, res, res, dlgImageSize->filterType());
73 }
74
75 delete dlgImageSize;
76}
77
79{
80 KisImageWSP image = viewManager()->image();
81 if (!image) return;
82
83 if(!viewManager()->blockUntilOperationsFinished(image)) return;
84
85 DlgCanvasSize * dlgCanvasSize = new DlgCanvasSize(viewManager()->mainWindowAsQWidget(), image->width(), image->height(), image->yRes());
86 Q_CHECK_PTR(dlgCanvasSize);
87
88 if (dlgCanvasSize->exec() == QDialog::Accepted) {
89 qint32 width = dlgCanvasSize->width();
90 qint32 height = dlgCanvasSize->height();
91 qint32 xOffset = dlgCanvasSize->xOffset();
92 qint32 yOffset = dlgCanvasSize->yOffset();
93
94 viewManager()->imageManager()->resizeCurrentImage(width, height, xOffset, yOffset);
95 }
96 delete dlgCanvasSize;
97}
98
100{
101 scaleLayersImpl(KisNodeList{rootNode});
102}
104{
105 KisImageWSP image = viewManager()->image();
106 if (!image) return;
107
108 if(!viewManager()->blockUntilOperationsFinished(image)) return;
109
110 QRect bounds;
111 KisSelectionSP selection = viewManager()->selection();
112
113 if (selection) {
114 bounds = selection->selectedExactRect();
115 }
116 else {
117 Q_FOREACH(KisNodeSP node, nodes) {
118 KisPaintDeviceSP dev = node->projection();
120 bounds = bounds.united(dev->exactBounds());
121 }
122 }
123
124 DlgLayerSize * dlgLayerSize = new DlgLayerSize(viewManager()->mainWindowAsQWidget(), "LayerSize", bounds.width(), bounds.height(), image->yRes());
125 Q_CHECK_PTR(dlgLayerSize);
126 dlgLayerSize->setCaption(i18np("Resize Layer", "Resize %1 Layers", nodes.size()));
127
128 if (dlgLayerSize->exec() == QDialog::Accepted) {
129 const QSize desiredSize(dlgLayerSize->desiredWidth(), dlgLayerSize->desiredHeight());
130
131 viewManager()->image()->scaleNodes(nodes,
132 QRectF(bounds).center(),
133 qreal(desiredSize.width()) / bounds.width(),
134 qreal(desiredSize.height()) / bounds.height(),
135 dlgLayerSize->filterType(),
136 selection);
137 }
138 delete dlgLayerSize;
139}
140
142{
143 scaleLayersImpl(viewManager()->nodeManager()->selectedNodes());
144}
145
147{
148 KisImageWSP image = viewManager()->image();
149 if (!image) return;
150
151 scaleLayerImpl(image->root());
152}
153
155{
156 KisImageSP image = viewManager()->image();
157 if (!image) return;
158
159 if(!viewManager()->blockUntilOperationsFinished(image)) return;
160
161 KisLayerSP layer = viewManager()->activeLayer();
162
163 KIS_ASSERT_RECOVER_RETURN(image && layer);
164
165 KisSelectionMaskSP selectionMask = layer->selectionMask();
166 if (!selectionMask) {
167 selectionMask = image->rootLayer()->selectionMask();
168 }
169
170 KIS_ASSERT_RECOVER_RETURN(selectionMask);
171
172 QRect rc = selectionMask->selection()->selectedExactRect();
173 DlgLayerSize * dlgSize = new DlgLayerSize(viewManager()->mainWindowAsQWidget(), "SelectionScale", rc.width(), rc.height(), image->yRes());
174 dlgSize->setCaption(i18n("Scale Selection"));
175
176 if (dlgSize->exec() == QDialog::Accepted) {
177 qint32 w = dlgSize->desiredWidth();
178 qint32 h = dlgSize->desiredHeight();
179
180 image->scaleNode(selectionMask,
181 QRectF(rc).center(),
182 qreal(w) / rc.width(),
183 qreal(h) / rc.height(),
184 dlgSize->filterType(), 0);
185 }
186 delete dlgSize;
187}
connect(this, SIGNAL(optionsChanged()), this, SLOT(saveOptions()))
KisFilterStrategy * filterType()
qint32 desiredWidth()
double desiredResolution()
qint32 desiredHeight()
qint32 desiredHeight()
KisFilterStrategy * filterType()
qint32 desiredWidth()
ImageSize(QObject *parent)
Definition imagesize.cc:34
void slotLayerSize()
Definition imagesize.cc:141
void slotSelectionScale()
Definition imagesize.cc:154
void scaleLayersImpl(KisNodeList nodes)
Definition imagesize.cc:103
void slotCanvasSize()
Definition imagesize.cc:78
void slotScaleAllLayers()
Definition imagesize.cc:146
void slotImageSize()
Definition imagesize.cc:58
void scaleLayerImpl(KisNodeSP rootNode)
Definition imagesize.cc:99
~ImageSize() override
Definition imagesize.cc:54
QPointer< KisViewManager > viewManager() const
KisAction * createAction(const QString &name)
void scaleNode(KisNodeSP node, const QPointF &center, qreal scaleX, qreal scaleY, KisFilterStrategy *filterStrategy, KisSelectionSP selection)
start asynchronous operation on scaling a subtree of nodes starting at node
KisGroupLayerSP rootLayer() const
qint32 width() const
double yRes() const
qint32 height() const
QRect exactBounds() const
virtual void setCaption(const QString &caption)
Definition KoDialog.cpp:498
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:128
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
#define bounds(x, a, b)
virtual KisPaintDeviceSP projection() const =0
virtual KisSelectionMaskSP selectionMask() const
Definition kis_layer.cc:498
KisSelectionSP selection
Definition kis_mask.cc:44
QRect selectedExactRect() const
Slow, but exact way of determining the rectangle that encloses the selection.