File indexing completed on 2024-05-12 15:56:12

0001 /*
0002  *  SPDX-FileCopyrightText: 2013 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef __KIS_QIMAGE_PYRAMID_H
0008 #define __KIS_QIMAGE_PYRAMID_H
0009 
0010 #include <QImage>
0011 #include <QVector>
0012 #include <kis_dab_shape.h>
0013 #include <kritabrush_export.h>
0014 
0015 
0016 class BRUSH_EXPORT KisQImagePyramid
0017 {
0018 public:
0019     KisQImagePyramid() = default;
0020     KisQImagePyramid(const QImage &baseImage, bool useSmoothingForEnlarging = true);
0021     ~KisQImagePyramid();
0022 
0023     static QSize imageSize(const QSize &originalSize,
0024                            KisDabShape const&,
0025                            qreal subPixelX, qreal subPixelY);
0026 
0027     static QSizeF characteristicSize(const QSize &originalSize, KisDabShape const&);
0028 
0029     QImage createImage(KisDabShape const&,
0030                        qreal subPixelX, qreal subPixelY) const;
0031 
0032     QImage getClosest(QTransform transform, qreal *scale) const;
0033 
0034     QImage getClosestWithoutWorkaroundBorder(QTransform transform, qreal *scale) const;
0035 
0036 private:
0037     friend class KisGbrBrushTest;
0038     int findNearestLevel(qreal scale, qreal *baseScale) const;
0039     void appendPyramidLevel(const QImage &image);
0040 
0041     static void calculateParams(KisDabShape const& shape,
0042                                 qreal subPixelX, qreal subPixelY,
0043                                 const QSize &originalSize,
0044                                 QTransform *outputTransform, QSize *outputSize);
0045 
0046     static void calculateParams(KisDabShape shape,
0047                                 qreal subPixelX, qreal subPixelY,
0048                                 const QSize &originalSize,
0049                                 qreal baseScale, const QSize &baseSize,
0050                                 QTransform *outputTransform, QSize *outputSize);
0051 
0052 private:
0053     QSize m_originalSize;
0054     qreal m_baseScale {0.0};
0055 
0056     struct PyramidLevel {
0057         PyramidLevel() {}
0058         PyramidLevel(QImage _image, QSize _size) : image(_image), size(_size) {}
0059 
0060         QImage image;
0061         QSize size;
0062     };
0063 
0064     QVector<PyramidLevel> m_levels;
0065 };
0066 
0067 #endif /* __KIS_QIMAGE_PYRAMID_H */