File indexing completed on 2024-06-16 04:12:12

0001 /*
0002  *  SPDX-FileCopyrightText: 2015 Dmitry Kazakov <dimula73@gmail.com>
0003  *
0004  *  SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef __KIS_LS_UTILS_H
0008 #define __KIS_LS_UTILS_H
0009 
0010 #include "kis_types.h"
0011 #include "kritaimage_export.h"
0012 
0013 #include "kis_lod_transform.h"
0014 #include <KoPattern.h>
0015 
0016 struct psd_layer_effects_context;
0017 class psd_layer_effects_shadow_base;
0018 struct psd_layer_effects_overlay_base;
0019 class KisLayerStyleFilterEnvironment;
0020 
0021 class KisMultipleProjection;
0022 class KisCachedSelection;
0023 
0024 
0025 namespace KisLsUtils
0026 {
0027 
0028     QRect growSelectionUniform(KisPixelSelectionSP selection, int growSize, const QRect &applyRect);
0029 
0030     KRITAIMAGE_EXPORT void selectionFromAlphaChannel(KisPaintDeviceSP srcDevice,
0031                                                         KisSelectionSP dstSelection,
0032                                                         const QRect &srcRect);
0033 
0034     void findEdge(KisPixelSelectionSP selection, const QRect &applyRect, const bool edgeHidden);
0035     QRect growRectFromRadius(const QRect &rc, int radius);
0036     void applyGaussianWithTransaction(KisPixelSelectionSP selection,
0037                                       const QRect &applyRect,
0038                                       qreal radius);
0039 
0040     static const int FULL_PERCENT_RANGE = 100;
0041     void adjustRange(KisPixelSelectionSP selection, const QRect &applyRect, const int range);
0042 
0043     void applyContourCorrection(KisPixelSelectionSP selection,
0044                                 const QRect &applyRect,
0045                                 const quint8 *lookup_table,
0046                                 bool antiAliased,
0047                                 bool edgeHidden);
0048 
0049     extern const int noiseNeedBorder;
0050 
0051     void applyNoise(KisPixelSelectionSP selection,
0052                     const QRect &applyRect,
0053                     int noise,
0054                     const psd_layer_effects_context *context,
0055                     KisLayerStyleFilterEnvironment *env);
0056 
0057     void knockOutSelection(KisPixelSelectionSP selection,
0058                            KisPixelSelectionSP knockOutSelection,
0059                            const QRect &srcRect,
0060                            const QRect &dstRect,
0061                            const QRect &totalNeedRect,
0062                            const bool knockOutInverted);
0063 
0064     void fillPattern(KisPaintDeviceSP fillDevice,
0065                      const QRect &applyRect,
0066                      KisLayerStyleFilterEnvironment *env,
0067                      int scale,
0068                      KoPatternSP pattern,
0069                      int horizontalPhase,
0070                      int verticalPhase,
0071                      bool alignWithLayer);
0072 
0073     void fillOverlayDevice(KisPaintDeviceSP fillDevice,
0074                            const QRect &applyRect,
0075                            const psd_layer_effects_overlay_base *config,
0076                            KisResourcesInterfaceSP resourcesInterface,
0077                            KisLayerStyleFilterEnvironment *env);
0078 
0079     void applyFinalSelection(const QString &projectionId,
0080                              KisSelectionSP baseSelection,
0081                              KisPaintDeviceSP srcDevice,
0082                              KisMultipleProjection *dst,
0083                              const QRect &srcRect,
0084                              const QRect &dstRect,
0085                              const psd_layer_effects_context *context,
0086                              const psd_layer_effects_shadow_base *config, KisResourcesInterfaceSP resourcesInterface,
0087                              const KisLayerStyleFilterEnvironment *env);
0088 
0089     bool checkEffectEnabled(const psd_layer_effects_shadow_base *config, KisMultipleProjection *dst);
0090 
0091     template<class ConfigStruct>
0092     struct LodWrapper
0093     {
0094         LodWrapper(int lod,
0095                    const ConfigStruct *srcStruct)
0096 
0097             {
0098                 if (lod > 0) {
0099                     storage.reset(new ConfigStruct(*srcStruct));
0100 
0101                     const qreal lodScale = KisLodTransform::lodToScale(lod);
0102                     storage->scaleLinearSizes(lodScale);
0103 
0104                     config = storage.data();
0105                 } else {
0106                     config = srcStruct;
0107                 }
0108             }
0109 
0110         const ConfigStruct *config;
0111 
0112     private:
0113         QScopedPointer<ConfigStruct> storage;
0114     };
0115 
0116 }
0117 
0118 #endif /* __KIS_LS_UTILS_H */