File indexing completed on 2024-05-12 15:59:36

0001 /*
0002  * SPDX-FileCopyrightText: 2005 Adrian Page <adrian@pagenet.plus.com>
0003  * SPDX-FileCopyrightText: 2011 Silvio Heinrich <plassy@web.de>
0004  *
0005  * SPDX-License-Identifier: LGPL-2.1-or-later
0006 */
0007 #ifndef KOCOMPOSITEOPREGISTRY_H
0008 #define KOCOMPOSITEOPREGISTRY_H
0009 
0010 #include <QString>
0011 #include <QList>
0012 #include <QMultiMap>
0013 #include <QBitArray>
0014 
0015 #include "kritapigment_export.h"
0016 
0017 class KoColorSpace;
0018 #include <KoID.h>
0019 
0020 // TODO : convert this data blob into a modern design with an enum class.
0021 // This will reduce the need for runtime string comparisons.
0022 
0023 const QString COMPOSITE_OVER         = "normal";
0024 const QString COMPOSITE_ERASE        = "erase";
0025 const QString COMPOSITE_IN           = "in";
0026 const QString COMPOSITE_OUT          = "out";
0027 const QString COMPOSITE_ALPHA_DARKEN = "alphadarken";
0028 const QString COMPOSITE_DESTINATION_IN = "destination-in";
0029 const QString COMPOSITE_DESTINATION_ATOP = "destination-atop";
0030 
0031 const QString COMPOSITE_XOR                   = "xor";
0032 const QString COMPOSITE_OR                    = "or";
0033 const QString COMPOSITE_AND                   = "and";
0034 const QString COMPOSITE_NAND                  = "nand";
0035 const QString COMPOSITE_NOR                   = "nor";
0036 const QString COMPOSITE_XNOR                  = "xnor";
0037 const QString COMPOSITE_IMPLICATION           = "implication";
0038 const QString COMPOSITE_NOT_IMPLICATION       = "not_implication";
0039 const QString COMPOSITE_CONVERSE              = "converse";
0040 const QString COMPOSITE_NOT_CONVERSE          = "not_converse";
0041 
0042 const QString COMPOSITE_PLUS                  = "plus";
0043 const QString COMPOSITE_MINUS                 = "minus";
0044 const QString COMPOSITE_ADD                   = "add";
0045 const QString COMPOSITE_SUBTRACT              = "subtract";
0046 const QString COMPOSITE_INVERSE_SUBTRACT      = "inverse_subtract";
0047 const QString COMPOSITE_DIFF                  = "diff";
0048 const QString COMPOSITE_MULT                  = "multiply";
0049 const QString COMPOSITE_DIVIDE                = "divide";
0050 const QString COMPOSITE_ARC_TANGENT           = "arc_tangent";
0051 const QString COMPOSITE_GEOMETRIC_MEAN        = "geometric_mean";
0052 const QString COMPOSITE_ADDITIVE_SUBTRACTIVE  = "additive_subtractive";
0053 const QString COMPOSITE_NEGATION              = "negation";
0054 
0055 const QString COMPOSITE_MOD                = "modulo";
0056 const QString COMPOSITE_MOD_CON            = "modulo_continuous";
0057 const QString COMPOSITE_DIVISIVE_MOD       = "divisive_modulo";
0058 const QString COMPOSITE_DIVISIVE_MOD_CON   = "divisive_modulo_continuous";
0059 const QString COMPOSITE_MODULO_SHIFT       = "modulo_shift";
0060 const QString COMPOSITE_MODULO_SHIFT_CON   = "modulo_shift_continuous";
0061 
0062 const QString COMPOSITE_EQUIVALENCE   = "equivalence";
0063 const QString COMPOSITE_ALLANON       = "allanon";
0064 const QString COMPOSITE_PARALLEL      = "parallel";
0065 const QString COMPOSITE_GRAIN_MERGE   = "grain_merge";
0066 const QString COMPOSITE_GRAIN_EXTRACT = "grain_extract";
0067 const QString COMPOSITE_EXCLUSION     = "exclusion";
0068 const QString COMPOSITE_HARD_MIX      = "hard mix";
0069 const QString COMPOSITE_HARD_MIX_PHOTOSHOP = "hard_mix_photoshop";
0070 const QString COMPOSITE_HARD_MIX_SOFTER_PHOTOSHOP = "hard_mix_softer_photoshop";
0071 const QString COMPOSITE_OVERLAY       = "overlay";
0072 const QString COMPOSITE_BEHIND        = "behind";
0073 const QString COMPOSITE_GREATER       = "greater";
0074 const QString COMPOSITE_HARD_OVERLAY  = "hard overlay";
0075 const QString COMPOSITE_INTERPOLATION = "interpolation";
0076 const QString COMPOSITE_INTERPOLATIONB = "interpolation 2x";
0077 const QString COMPOSITE_PENUMBRAA     = "penumbra a";
0078 const QString COMPOSITE_PENUMBRAB     = "penumbra b";
0079 const QString COMPOSITE_PENUMBRAC     = "penumbra c";
0080 const QString COMPOSITE_PENUMBRAD     = "penumbra d";
0081 
0082 const QString COMPOSITE_DARKEN      = "darken";
0083 const QString COMPOSITE_BURN        = "burn";//this is also known as 'color burn'.
0084 const QString COMPOSITE_LINEAR_BURN = "linear_burn";
0085 const QString COMPOSITE_GAMMA_DARK  = "gamma_dark";
0086 const QString COMPOSITE_SHADE_IFS_ILLUSIONS = "shade_ifs_illusions";
0087 const QString COMPOSITE_FOG_DARKEN_IFS_ILLUSIONS = "fog_darken_ifs_illusions";
0088 const QString COMPOSITE_EASY_BURN        = "easy burn";
0089 
0090 const QString COMPOSITE_LIGHTEN      = "lighten";
0091 const QString COMPOSITE_DODGE        = "dodge";
0092 const QString COMPOSITE_LINEAR_DODGE = "linear_dodge";
0093 const QString COMPOSITE_SCREEN       = "screen";
0094 const QString COMPOSITE_HARD_LIGHT   = "hard_light";
0095 const QString COMPOSITE_SOFT_LIGHT_IFS_ILLUSIONS = "soft_light_ifs_illusions";
0096 const QString COMPOSITE_SOFT_LIGHT_PEGTOP_DELPHI = "soft_light_pegtop_delphi";
0097 const QString COMPOSITE_SOFT_LIGHT_PHOTOSHOP = "soft_light";
0098 const QString COMPOSITE_SOFT_LIGHT_SVG  = "soft_light_svg";
0099 const QString COMPOSITE_GAMMA_LIGHT  = "gamma_light";
0100 const QString COMPOSITE_GAMMA_ILLUMINATION  = "gamma_illumination";
0101 const QString COMPOSITE_VIVID_LIGHT  = "vivid_light";
0102 const QString COMPOSITE_FLAT_LIGHT   = "flat_light";
0103 const QString COMPOSITE_LINEAR_LIGHT = "linear light";
0104 const QString COMPOSITE_PIN_LIGHT    = "pin_light";
0105 const QString COMPOSITE_PNORM_A        = "pnorm_a";
0106 const QString COMPOSITE_PNORM_B        = "pnorm_b";
0107 const QString COMPOSITE_SUPER_LIGHT  = "super_light";
0108 const QString COMPOSITE_TINT_IFS_ILLUSIONS = "tint_ifs_illusions";
0109 const QString COMPOSITE_FOG_LIGHTEN_IFS_ILLUSIONS = "fog_lighten_ifs_illusions";
0110 const QString COMPOSITE_EASY_DODGE        = "easy dodge";
0111 const QString COMPOSITE_LUMINOSITY_SAI        = "luminosity_sai";
0112 
0113 
0114 const QString COMPOSITE_HUE            = "hue";
0115 const QString COMPOSITE_COLOR          = "color";
0116 const QString COMPOSITE_SATURATION     = "saturation";
0117 const QString COMPOSITE_INC_SATURATION = "inc_saturation";
0118 const QString COMPOSITE_DEC_SATURATION = "dec_saturation";
0119 const QString COMPOSITE_LUMINIZE       = "luminize";
0120 const QString COMPOSITE_INC_LUMINOSITY = "inc_luminosity";
0121 const QString COMPOSITE_DEC_LUMINOSITY = "dec_luminosity";
0122 
0123 const QString COMPOSITE_HUE_HSV            = "hue_hsv";
0124 const QString COMPOSITE_COLOR_HSV          = "color_hsv";
0125 const QString COMPOSITE_SATURATION_HSV     = "saturation_hsv";
0126 const QString COMPOSITE_INC_SATURATION_HSV = "inc_saturation_hsv";
0127 const QString COMPOSITE_DEC_SATURATION_HSV = "dec_saturation_hsv";
0128 const QString COMPOSITE_VALUE              = "value";
0129 const QString COMPOSITE_INC_VALUE          = "inc_value";
0130 const QString COMPOSITE_DEC_VALUE          = "dec_value";
0131 
0132 const QString COMPOSITE_HUE_HSL            = "hue_hsl";
0133 const QString COMPOSITE_COLOR_HSL          = "color_hsl";
0134 const QString COMPOSITE_SATURATION_HSL     = "saturation_hsl";
0135 const QString COMPOSITE_INC_SATURATION_HSL = "inc_saturation_hsl";
0136 const QString COMPOSITE_DEC_SATURATION_HSL = "dec_saturation_hsl";
0137 const QString COMPOSITE_LIGHTNESS          = "lightness";
0138 const QString COMPOSITE_INC_LIGHTNESS      = "inc_lightness";
0139 const QString COMPOSITE_DEC_LIGHTNESS      = "dec_lightness";
0140 
0141 const QString COMPOSITE_HUE_HSI            = "hue_hsi";
0142 const QString COMPOSITE_COLOR_HSI          = "color_hsi";
0143 const QString COMPOSITE_SATURATION_HSI     = "saturation_hsi";
0144 const QString COMPOSITE_INC_SATURATION_HSI = "inc_saturation_hsi";
0145 const QString COMPOSITE_DEC_SATURATION_HSI = "dec_saturation_hsi";
0146 const QString COMPOSITE_INTENSITY          = "intensity";
0147 const QString COMPOSITE_INC_INTENSITY      = "inc_intensity";
0148 const QString COMPOSITE_DEC_INTENSITY      = "dec_intensity";
0149 
0150 const QString COMPOSITE_COPY         = "copy";
0151 const QString COMPOSITE_COPY_RED     = "copy_red";
0152 const QString COMPOSITE_COPY_GREEN   = "copy_green";
0153 const QString COMPOSITE_COPY_BLUE    = "copy_blue";
0154 const QString COMPOSITE_TANGENT_NORMALMAP    = "tangent_normalmap";
0155 
0156 const QString COMPOSITE_COLORIZE     = "colorize";
0157 const QString COMPOSITE_BUMPMAP      = "bumpmap";
0158 const QString COMPOSITE_COMBINE_NORMAL = "combine_normal";
0159 const QString COMPOSITE_CLEAR        = "clear";
0160 const QString COMPOSITE_DISSOLVE     = "dissolve";
0161 const QString COMPOSITE_DISPLACE     = "displace";
0162 const QString COMPOSITE_NO           = "nocomposition";
0163 const QString COMPOSITE_PASS_THROUGH = "pass through"; // XXX: not implemented anywhere yet
0164 const QString COMPOSITE_DARKER_COLOR = "darker color";
0165 const QString COMPOSITE_LIGHTER_COLOR = "lighter color";
0166 const QString COMPOSITE_UNDEF        = "undefined";
0167 
0168 const QString COMPOSITE_REFLECT   = "reflect";
0169 const QString COMPOSITE_GLOW      = "glow";
0170 const QString COMPOSITE_FREEZE    = "freeze";
0171 const QString COMPOSITE_HEAT      = "heat";
0172 const QString COMPOSITE_GLEAT     = "glow_heat";
0173 const QString COMPOSITE_HELOW     = "heat_glow";
0174 const QString COMPOSITE_REEZE     = "reflect_freeze";
0175 const QString COMPOSITE_FRECT     = "freeze_reflect";
0176 const QString COMPOSITE_FHYRD     = "heat_glow_freeze_reflect_hybrid";
0177 
0178 
0179 
0180 class KRITAPIGMENT_EXPORT KoCompositeOpRegistry
0181 {
0182     typedef QMultiMap<KoID,KoID> KoIDMap;
0183     typedef QList<KoID>          KoIDList;
0184 
0185 public:
0186     KoCompositeOpRegistry();
0187     static const KoCompositeOpRegistry& instance();
0188 
0189     KoID     getDefaultCompositeOp() const;
0190     KoID     getKoID(const QString& compositeOpID) const;
0191     QString  getCompositeOpDisplayName(const QString& compositeOpID) const;
0192     KoIDMap  getCompositeOps() const;
0193     KoIDMap  getLayerStylesCompositeOps() const;
0194     KoIDList getCategories() const;
0195     QString  getCategoryDisplayName(const QString& categoryID) const;
0196     KoIDList getCompositeOps(const KoColorSpace* colorSpace) const;
0197     KoIDList getCompositeOps(const KoID& category, const KoColorSpace* colorSpace=0) const;
0198     bool     colorSpaceHasCompositeOp(const KoColorSpace* colorSpace, const KoID& compositeOp) const;
0199 
0200     template<class TKoIdIterator>
0201     KoIDList filterCompositeOps(TKoIdIterator begin, TKoIdIterator end, const KoColorSpace* colorSpace, bool removeInvaliOps=true) const {
0202         KoIDList list;
0203 
0204         for(; begin!=end; ++begin){
0205             if (colorSpaceHasCompositeOp(colorSpace, *begin) == removeInvaliOps) {
0206                 list.push_back(*begin);
0207             }
0208         }
0209 
0210         return list;
0211     }
0212 
0213 private:
0214     KoIDList m_categories;
0215     KoIDMap  m_map;
0216 };
0217 
0218 
0219 #endif // KOCOMPOSITEOPREGISTRY_H