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