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

0001 /*
0002  *  SPDX-FileCopyrightText: 2005 Adrian Page <adrian@pagenet.plus.com>
0003  *
0004  * SPDX-License-Identifier: LGPL-2.1-or-later
0005 */
0006 
0007 #include "KoCompositeOpRegistry.h"
0008 
0009 #include <QGlobalStatic>
0010 #include <QList>
0011 
0012 #include <klocalizedstring.h>
0013 
0014 #include <KoID.h>
0015 #include "KoCompositeOp.h"
0016 #include "KoColorSpace.h"
0017 
0018 #include "kis_assert.h"
0019 #include "DebugPigment.h"
0020 
0021 Q_GLOBAL_STATIC(KoCompositeOpRegistry, registry)
0022 
0023 static KoID koidCompositeOverStatic() {
0024     static const KoID compositeOver(COMPOSITE_OVER, i18nc("Blending mode - Normal", "Normal"));
0025     return compositeOver;
0026 }
0027 
0028 KoCompositeOpRegistry::KoCompositeOpRegistry()
0029 {
0030     m_categories
0031         << KoID("arithmetic",  i18nc("Blending mode - category Arithmetic", "Arithmetic"))
0032         << KoID("binary"    ,  i18nc("Blending mode - category Binary", "Binary"))
0033         << KoID("dark"      ,  i18nc("Blending mode - category Darken", "Darken"))
0034         << KoID("light"     ,  i18nc("Blending mode - category Lighten", "Lighten"))
0035         << KoID("modulo"       ,  i18nc("Blending mode - category Modulo", "Modulo"))
0036         << KoID("negative"  ,  i18nc("Blending mode - category Negative", "Negative"))
0037         << KoID("mix"       ,  i18nc("Blending mode - category Mix", "Mix"))
0038         << KoID("misc"      ,  i18nc("Blending mode - category Misc", "Misc"))
0039         << KoID("hsy"       ,  i18nc("Blending mode - category HSY", "HSY"))
0040         << KoID("hsi"       ,  i18nc("Blending mode - category HSI", "HSI"))
0041         << KoID("hsl"       ,  i18nc("Blending mode - category HSL", "HSL"))
0042         << KoID("hsv"       ,  i18nc("Blending mode - category HSV", "HSV"))
0043         << KoID("quadratic" ,  i18nc("Blending mode - category Quadratic", "Quadratic"));
0044 
0045     m_map.insert(m_categories[0], KoID(COMPOSITE_ADD             ,  i18nc("Blending mode - Addition", "Addition")));
0046     m_map.insert(m_categories[0], KoID(COMPOSITE_SUBTRACT        ,  i18nc("Blending mode - Subtract", "Subtract")));
0047     m_map.insert(m_categories[0], KoID(COMPOSITE_MULT            ,  i18nc("Blending mode - Multiply", "Multiply")));
0048     m_map.insert(m_categories[0], KoID(COMPOSITE_DIVIDE          ,  i18nc("Blending mode - Divide", "Divide")));
0049     m_map.insert(m_categories[0], KoID(COMPOSITE_INVERSE_SUBTRACT,  i18nc("Blending mode - Inverse Subtract", "Inverse Subtract")));
0050     
0051     m_map.insert(m_categories[1], KoID(COMPOSITE_XOR             ,  i18nc("Blending mode - XOR", "XOR")));
0052     m_map.insert(m_categories[1], KoID(COMPOSITE_OR              ,  i18nc("Blending mode - OR", "OR")));
0053     m_map.insert(m_categories[1], KoID(COMPOSITE_AND             ,  i18nc("Blending mode - AND", "AND")));
0054     m_map.insert(m_categories[1], KoID(COMPOSITE_NAND            ,  i18nc("Blending mode - NAND", "NAND")));
0055     m_map.insert(m_categories[1], KoID(COMPOSITE_NOR             ,  i18nc("Blending mode - NOR", "NOR")));
0056     m_map.insert(m_categories[1], KoID(COMPOSITE_XNOR            ,  i18nc("Blending mode - XNOR", "XNOR")));
0057     m_map.insert(m_categories[1], KoID(COMPOSITE_IMPLICATION     ,  i18nc("Blending mode - IMPLICATION", "IMPLICATION")));
0058     m_map.insert(m_categories[1], KoID(COMPOSITE_NOT_IMPLICATION ,  i18nc("Blending mode - NOT IMPLICATION", "NOT IMPLICATION")));
0059     m_map.insert(m_categories[1], KoID(COMPOSITE_CONVERSE        ,  i18nc("Blending mode - CONVERSE", "CONVERSE")));
0060     m_map.insert(m_categories[1], KoID(COMPOSITE_NOT_CONVERSE    ,  i18nc("Blending mode - NOT CONVERSE", "NOT CONVERSE")));
0061 
0062     m_map.insert(m_categories[2], KoID(COMPOSITE_BURN       ,  i18nc("Blending mode - Burn", "Burn")));
0063     m_map.insert(m_categories[2], KoID(COMPOSITE_LINEAR_BURN,  i18nc("Blending mode - Linear Burn", "Linear Burn")));
0064     m_map.insert(m_categories[2], KoID(COMPOSITE_DARKEN     ,  i18nc("Blending mode - Darken", "Darken")));
0065     m_map.insert(m_categories[2], KoID(COMPOSITE_GAMMA_DARK ,  i18nc("Blending mode - Gamma Dark", "Gamma Dark")));
0066     m_map.insert(m_categories[2], KoID(COMPOSITE_DARKER_COLOR     ,  i18nc("Blending mode - Darker Color", "Darker Color")));
0067     m_map.insert(m_categories[2], KoID(COMPOSITE_SHADE_IFS_ILLUSIONS,  i18nc("Blending mode - Shade (IFS Illusions)", "Shade (IFS Illusions)")));
0068     m_map.insert(m_categories[2], KoID(COMPOSITE_FOG_DARKEN_IFS_ILLUSIONS,  i18nc("Blending mode - Fog Darken (IFS Illusions)", "Fog Darken (IFS Illusions)")));
0069     m_map.insert(m_categories[2], KoID(COMPOSITE_EASY_BURN       ,  i18nc("Blending mode - Easy Burn", "Easy Burn")));
0070 
0071     m_map.insert(m_categories[3], KoID(COMPOSITE_DODGE       ,  i18nc("Blending mode - Color Dodge", "Color Dodge")));
0072     m_map.insert(m_categories[3], KoID(COMPOSITE_LINEAR_DODGE,  i18nc("Blending mode - Linear Dodge", "Linear Dodge")));
0073     m_map.insert(m_categories[3], KoID(COMPOSITE_LIGHTEN     ,  i18nc("Blending mode - Lighten", "Lighten")));
0074     m_map.insert(m_categories[3], KoID(COMPOSITE_LINEAR_LIGHT,  i18nc("Blending mode - Linear Light", "Linear Light")));
0075     m_map.insert(m_categories[3], KoID(COMPOSITE_SCREEN      ,  i18nc("Blending mode - Screen", "Screen")));
0076     m_map.insert(m_categories[3], KoID(COMPOSITE_PIN_LIGHT   ,  i18nc("Blending mode - Pin Light", "Pin Light")));
0077     m_map.insert(m_categories[3], KoID(COMPOSITE_VIVID_LIGHT ,  i18nc("Blending mode - Vivid Light", "Vivid Light")));
0078     m_map.insert(m_categories[3], KoID(COMPOSITE_FLAT_LIGHT  ,  i18nc("Blending mode - Flat Light", "Flat Light")));
0079     m_map.insert(m_categories[3], KoID(COMPOSITE_HARD_LIGHT  ,  i18nc("Blending mode - Hard Light", "Hard Light")));
0080     m_map.insert(m_categories[3], KoID(COMPOSITE_SOFT_LIGHT_IFS_ILLUSIONS,  i18nc("Blending mode - Soft Light (IFS Illusions)", "Soft Light (IFS Illusions)")));
0081     m_map.insert(m_categories[3], KoID(COMPOSITE_SOFT_LIGHT_PEGTOP_DELPHI,  i18nc("Blending mode - Soft Light (Pegtop-Delphi)", "Soft Light (Pegtop-Delphi)")));
0082     m_map.insert(m_categories[3], KoID(COMPOSITE_SOFT_LIGHT_PHOTOSHOP,  i18nc("Blending mode - Soft Light (Photoshop)", "Soft Light (Photoshop)")));
0083     m_map.insert(m_categories[3], KoID(COMPOSITE_SOFT_LIGHT_SVG,  i18nc("Blending mode - Soft Light (SVG)", "Soft Light (SVG)")));
0084     m_map.insert(m_categories[3], KoID(COMPOSITE_GAMMA_LIGHT ,  i18nc("Blending mode - Gamma Light", "Gamma Light")));
0085     m_map.insert(m_categories[3], KoID(COMPOSITE_GAMMA_ILLUMINATION ,  i18nc("Blending mode - Gamma Illumination", "Gamma Illumination")));
0086     m_map.insert(m_categories[3], KoID(COMPOSITE_LIGHTER_COLOR     ,  i18nc("Blending mode - Lighter Color", "Lighter Color")));
0087     m_map.insert(m_categories[3], KoID(COMPOSITE_PNORM_A           ,  i18nc("Blending mode - P-Norm A", "P-Norm A")));
0088     m_map.insert(m_categories[3], KoID(COMPOSITE_PNORM_B           ,  i18nc("Blending mode - P-Norm B", "P-Norm B")));
0089     m_map.insert(m_categories[3], KoID(COMPOSITE_SUPER_LIGHT     ,  i18nc("Blending mode - Super Light", "Super Light")));
0090     m_map.insert(m_categories[3], KoID(COMPOSITE_TINT_IFS_ILLUSIONS,  i18nc("Blending mode - Tint (IFS Illusions)", "Tint (IFS Illusions)")));
0091     m_map.insert(m_categories[3], KoID(COMPOSITE_FOG_LIGHTEN_IFS_ILLUSIONS,  i18nc("Blending mode - Fog Lighten (IFS Illusions)", "Fog Lighten (IFS Illusions)")));
0092     m_map.insert(m_categories[3], KoID(COMPOSITE_EASY_DODGE       ,  i18nc("Blending mode - Easy Dodge", "Easy Dodge")));
0093     m_map.insert(m_categories[3], KoID(COMPOSITE_LUMINOSITY_SAI       ,  i18nc("Blending mode - Luminosity/Shine (SAI)", "Luminosity/Shine (SAI)")));
0094     
0095     m_map.insert(m_categories[4], KoID(COMPOSITE_MOD              ,  i18nc("Blending mode - Modulo", "Modulo")));
0096     m_map.insert(m_categories[4], KoID(COMPOSITE_MOD_CON          ,  i18nc("Blending mode - Modulo - Continuous", "Modulo - Continuous")));
0097     m_map.insert(m_categories[4], KoID(COMPOSITE_DIVISIVE_MOD     ,  i18nc("Blending mode - Divisive Modulo", "Divisive Modulo")));
0098     m_map.insert(m_categories[4], KoID(COMPOSITE_DIVISIVE_MOD_CON ,  i18nc("Blending mode - Divisive Modulo - Continuous", "Divisive Modulo - Continuous")));
0099     m_map.insert(m_categories[4], KoID(COMPOSITE_MODULO_SHIFT     ,  i18nc("Blending mode - Modulo Shift", "Modulo Shift")));
0100     m_map.insert(m_categories[4], KoID(COMPOSITE_MODULO_SHIFT_CON ,  i18nc("Blending mode - Modulo Shift - Continuous", "Modulo Shift - Continuous")));
0101 
0102     m_map.insert(m_categories[5], KoID(COMPOSITE_DIFF                 ,  i18nc("Blending mode - Difference", "Difference")));
0103     m_map.insert(m_categories[5], KoID(COMPOSITE_EQUIVALENCE          ,  i18nc("Blending mode - Equivalence", "Equivalence")));
0104     m_map.insert(m_categories[5], KoID(COMPOSITE_ADDITIVE_SUBTRACTIVE ,  i18nc("Blending mode - Additive Subtractive", "Additive Subtractive")));
0105     m_map.insert(m_categories[5], KoID(COMPOSITE_EXCLUSION            ,  i18nc("Blending mode - Exclusion", "Exclusion")));
0106     m_map.insert(m_categories[5], KoID(COMPOSITE_ARC_TANGENT          ,  i18nc("Blending mode - Arcus Tangent", "Arcus Tangent")));
0107     m_map.insert(m_categories[5], KoID(COMPOSITE_NEGATION             ,  i18nc("Blending mode - Negation", "Negation")));
0108 
0109     m_map.insert(m_categories[6], koidCompositeOverStatic());
0110     m_map.insert(m_categories[6], KoID(COMPOSITE_BEHIND          ,  i18nc("Blending mode - Behind", "Behind")));
0111     m_map.insert(m_categories[6], KoID(COMPOSITE_GREATER         ,  i18nc("Blending mode - Greater", "Greater")));
0112     m_map.insert(m_categories[6], KoID(COMPOSITE_OVERLAY         ,  i18nc("Blending mode - Overlay", "Overlay")));
0113     m_map.insert(m_categories[6], KoID(COMPOSITE_ERASE           ,  i18nc("Blending mode - Erase", "Erase")));
0114     m_map.insert(m_categories[6], KoID(COMPOSITE_ALPHA_DARKEN    ,  i18nc("Blending mode - Alpha Darken", "Alpha Darken")));
0115     m_map.insert(m_categories[6], KoID(COMPOSITE_HARD_MIX        ,  i18nc("Blending mode - Hard Mix", "Hard Mix")));
0116     m_map.insert(m_categories[6], KoID(COMPOSITE_HARD_MIX_PHOTOSHOP,  i18nc("Blending mode - Hard Mix (Photoshop)", "Hard Mix (Photoshop)")));
0117     m_map.insert(m_categories[6], KoID(COMPOSITE_HARD_MIX_SOFTER_PHOTOSHOP,  i18nc("Blending mode - Hard Mix Softer (Photoshop)", "Hard Mix Softer (Photoshop)")));
0118     m_map.insert(m_categories[6], KoID(COMPOSITE_GRAIN_MERGE     ,  i18nc("Blending mode - Grain Merge", "Grain Merge")));
0119     m_map.insert(m_categories[6], KoID(COMPOSITE_GRAIN_EXTRACT   ,  i18nc("Blending mode - Grain Extract", "Grain Extract")));
0120     m_map.insert(m_categories[6], KoID(COMPOSITE_PARALLEL        ,  i18nc("Blending mode - Parallel", "Parallel")));
0121     m_map.insert(m_categories[6], KoID(COMPOSITE_ALLANON         ,  i18nc("Blending mode - Allanon", "Allanon")));
0122     m_map.insert(m_categories[6], KoID(COMPOSITE_GEOMETRIC_MEAN  ,  i18nc("Blending mode - Geometric Mean", "Geometric Mean")));
0123     m_map.insert(m_categories[6], KoID(COMPOSITE_DESTINATION_ATOP,  i18nc("Blending mode - Destination Atop", "Destination Atop")));
0124     m_map.insert(m_categories[6], KoID(COMPOSITE_DESTINATION_IN  ,  i18nc("Blending mode - Destination In", "Destination In")));
0125     m_map.insert(m_categories[6], KoID(COMPOSITE_HARD_OVERLAY    ,  i18nc("Blending mode - Hard Overlay", "Hard Overlay")));
0126     m_map.insert(m_categories[6], KoID(COMPOSITE_INTERPOLATION   ,  i18nc("Blending mode - Interpolation", "Interpolation")));
0127     m_map.insert(m_categories[6], KoID(COMPOSITE_INTERPOLATIONB  ,  i18nc("Blending mode - Interpolation - 2X", "Interpolation - 2X")));
0128     m_map.insert(m_categories[6], KoID(COMPOSITE_PENUMBRAA       ,  i18nc("Blending mode - Penumbra A", "Penumbra A")));
0129     m_map.insert(m_categories[6], KoID(COMPOSITE_PENUMBRAB       ,  i18nc("Blending mode - Penumbra B", "Penumbra B")));
0130     m_map.insert(m_categories[6], KoID(COMPOSITE_PENUMBRAC       ,  i18nc("Blending mode - Penumbra C", "Penumbra C")));
0131     m_map.insert(m_categories[6], KoID(COMPOSITE_PENUMBRAD       ,  i18nc("Blending mode - Penumbra D", "Penumbra D")));
0132 
0133     m_map.insert(m_categories[7], KoID(COMPOSITE_BUMPMAP   ,  i18nc("Blending mode - Bumpmap", "Bumpmap")));
0134     m_map.insert(m_categories[7], KoID(COMPOSITE_COMBINE_NORMAL,  i18nc("Blending mode - Combine Normal Map", "Combine Normal Map")));
0135     m_map.insert(m_categories[7], KoID(COMPOSITE_DISSOLVE  ,  i18nc("Blending mode - Dissolve", "Dissolve")));
0136     m_map.insert(m_categories[7], KoID(COMPOSITE_COPY_RED  ,  i18nc("Blending mode - Copy Red", "Copy Red")));
0137     m_map.insert(m_categories[7], KoID(COMPOSITE_COPY_GREEN,  i18nc("Blending mode - Copy Green", "Copy Green")));
0138     m_map.insert(m_categories[7], KoID(COMPOSITE_COPY_BLUE ,  i18nc("Blending mode - Copy Blue", "Copy Blue")));
0139     m_map.insert(m_categories[7], KoID(COMPOSITE_COPY      ,  i18nc("Blending mode - Copy", "Copy")));
0140     m_map.insert(m_categories[7], KoID(COMPOSITE_TANGENT_NORMALMAP,  i18nc("Blending mode - Tangent Normalmap", "Tangent Normalmap")));
0141 
0142     m_map.insert(m_categories[8], KoID(COMPOSITE_COLOR         ,  i18nc("Blending mode - Color HSY", "Color")));
0143     m_map.insert(m_categories[8], KoID(COMPOSITE_HUE           ,  i18nc("Blending mode - Hue HSY", "Hue")));
0144     m_map.insert(m_categories[8], KoID(COMPOSITE_SATURATION    ,  i18nc("Blending mode - Saturation HSY", "Saturation")));
0145     m_map.insert(m_categories[8], KoID(COMPOSITE_LUMINIZE      ,  i18nc("Blending mode - Luminosity HSY", "Luminosity")));
0146     m_map.insert(m_categories[8], KoID(COMPOSITE_DEC_SATURATION,  i18nc("Blending mode - Decrease Saturation HSY", "Decrease Saturation")));
0147     m_map.insert(m_categories[8], KoID(COMPOSITE_INC_SATURATION,  i18nc("Blending mode - Increase Saturation HSY", "Increase Saturation")));
0148     m_map.insert(m_categories[8], KoID(COMPOSITE_DEC_LUMINOSITY,  i18nc("Blending mode - Decrease Luminosity HSY", "Decrease Luminosity")));
0149     m_map.insert(m_categories[8], KoID(COMPOSITE_INC_LUMINOSITY,  i18nc("Blending mode - Increase Luminosity HSY", "Increase Luminosity")));
0150 
0151     m_map.insert(m_categories[9], KoID(COMPOSITE_COLOR_HSI         ,  i18nc("Blending mode - Color HSI", "Color HSI")));
0152     m_map.insert(m_categories[9], KoID(COMPOSITE_HUE_HSI           ,  i18nc("Blending mode - Hue HSI", "Hue HSI")));
0153     m_map.insert(m_categories[9], KoID(COMPOSITE_SATURATION_HSI    ,  i18nc("Blending mode - Saturation HSI", "Saturation HSI")));
0154     m_map.insert(m_categories[9], KoID(COMPOSITE_INTENSITY         ,  i18nc("Blending mode - Intensity HSI", "Intensity")));
0155     m_map.insert(m_categories[9], KoID(COMPOSITE_DEC_SATURATION_HSI,  i18nc("Blending mode - Decrease Saturation HSI", "Decrease Saturation HSI")));
0156     m_map.insert(m_categories[9], KoID(COMPOSITE_INC_SATURATION_HSI,  i18nc("Blending mode - Increase Saturation HSI", "Increase Saturation HSI")));
0157     m_map.insert(m_categories[9], KoID(COMPOSITE_DEC_INTENSITY     ,  i18nc("Blending mode - Decrease Intensity", "Decrease Intensity")));
0158     m_map.insert(m_categories[9], KoID(COMPOSITE_INC_INTENSITY     ,  i18nc("Blending mode - Increase Intensity", "Increase Intensity")));
0159 
0160     m_map.insert(m_categories[10], KoID(COMPOSITE_COLOR_HSL         ,  i18nc("Blending mode - Color HSL", "Color HSL")));
0161     m_map.insert(m_categories[10], KoID(COMPOSITE_HUE_HSL           ,  i18nc("Blending mode - Hue HSL", "Hue HSL")));
0162     m_map.insert(m_categories[10], KoID(COMPOSITE_SATURATION_HSL    ,  i18nc("Blending mode - Saturation HSL", "Saturation HSL")));
0163     m_map.insert(m_categories[10], KoID(COMPOSITE_LIGHTNESS         ,  i18nc("Blending mode - Lightness HSI", "Lightness")));
0164     m_map.insert(m_categories[10], KoID(COMPOSITE_DEC_SATURATION_HSL,  i18nc("Blending mode - Decrease Saturation HSL", "Decrease Saturation HSL")));
0165     m_map.insert(m_categories[10], KoID(COMPOSITE_INC_SATURATION_HSL,  i18nc("Blending mode - Increase Saturation HSL", "Increase Saturation HSL")));
0166     m_map.insert(m_categories[10], KoID(COMPOSITE_DEC_LIGHTNESS     ,  i18nc("Blending mode - Decrease Lightness", "Decrease Lightness")));
0167     m_map.insert(m_categories[10], KoID(COMPOSITE_INC_LIGHTNESS     ,  i18nc("Blending mode - Increase Lightness", "Increase Lightness")));
0168 
0169     m_map.insert(m_categories[11], KoID(COMPOSITE_COLOR_HSV         ,  i18nc("Blending mode - Color HSV", "Color HSV")));
0170     m_map.insert(m_categories[11], KoID(COMPOSITE_HUE_HSV           ,  i18nc("Blending mode - Hue HSV", "Hue HSV")));
0171     m_map.insert(m_categories[11], KoID(COMPOSITE_SATURATION_HSV    ,  i18nc("Blending mode - Saturation HSV", "Saturation HSV")));
0172     m_map.insert(m_categories[11], KoID(COMPOSITE_VALUE             ,  i18nc("Blending mode - Value HSV", "Value")));
0173     m_map.insert(m_categories[11], KoID(COMPOSITE_DEC_SATURATION_HSV,  i18nc("Blending mode - Decrease Saturation HSV", "Decrease Saturation HSV")));
0174     m_map.insert(m_categories[11], KoID(COMPOSITE_INC_SATURATION_HSV,  i18nc("Blending mode - Increase Saturation HSV", "Increase Saturation HSV")));
0175     m_map.insert(m_categories[11], KoID(COMPOSITE_DEC_VALUE         ,  i18nc("Blending mode - Decrease Value HSV", "Decrease Value")));
0176     m_map.insert(m_categories[11], KoID(COMPOSITE_INC_VALUE         ,  i18nc("Blending mode - Increase Value HSV", "Increase Value")));
0177     
0178     m_map.insert(m_categories[12], KoID(COMPOSITE_REFLECT          ,  i18nc("Blending mode - Reflect", "Reflect")));
0179     m_map.insert(m_categories[12], KoID(COMPOSITE_GLOW             ,  i18nc("Blending mode - Glow", "Glow")));
0180     m_map.insert(m_categories[12], KoID(COMPOSITE_FREEZE           ,  i18nc("Blending mode - Freeze", "Freeze")));
0181     m_map.insert(m_categories[12], KoID(COMPOSITE_HEAT             ,  i18nc("Blending mode - Heat", "Heat")));
0182     m_map.insert(m_categories[12], KoID(COMPOSITE_GLEAT            ,  i18nc("Blending mode - Glow-Heat", "Glow-Heat")));
0183     m_map.insert(m_categories[12], KoID(COMPOSITE_HELOW            ,  i18nc("Blending mode - Heat-Glow", "Heat-Glow")));
0184     m_map.insert(m_categories[12], KoID(COMPOSITE_REEZE            ,  i18nc("Blending mode - Reflect-Freeze", "Reflect-Freeze")));
0185     m_map.insert(m_categories[12], KoID(COMPOSITE_FRECT            ,  i18nc("Blending mode - Freeze-Reflect", "Freeze-Reflect")));
0186     m_map.insert(m_categories[12], KoID(COMPOSITE_FHYRD            ,  i18nc("Blending mode - Heat-Glow & Freeze-Reflect Hybrid", "Heat-Glow & Freeze-Reflect Hybrid")));
0187 }
0188 
0189 const KoCompositeOpRegistry& KoCompositeOpRegistry::instance()
0190 {
0191     return *registry;
0192 }
0193 
0194 KoID KoCompositeOpRegistry::getDefaultCompositeOp() const
0195 {
0196     return koidCompositeOverStatic();
0197 }
0198 
0199 KoID KoCompositeOpRegistry::getKoID(const QString& compositeOpID) const
0200 {
0201     KoIDMap::const_iterator itr = std::find(m_map.begin(), m_map.end(), KoID(compositeOpID));
0202     return (itr != m_map.end()) ? *itr : KoID();
0203 }
0204 
0205 QString KoCompositeOpRegistry::getCompositeOpDisplayName(const QString& compositeOpID) const
0206 {
0207     // In and Out are created in lcms2engine but not registered in KoCompositeOpRegistry.
0208     // FIXME: Change these to use i18nc with context?
0209     if (compositeOpID == COMPOSITE_IN) {
0210         return i18n("In");
0211     } else if (compositeOpID == COMPOSITE_OUT) {
0212         return i18n("Out");
0213     }
0214 
0215     const QString name = getKoID(compositeOpID).name();
0216     if (name.isNull()) {
0217         warnPigment << "Got null display name for composite op" << compositeOpID;
0218         return compositeOpID;
0219     }
0220     return name;
0221 }
0222 
0223 KoCompositeOpRegistry::KoIDMap KoCompositeOpRegistry::getCompositeOps() const
0224 {
0225     return m_map;
0226 }
0227 
0228 KoCompositeOpRegistry::KoIDMap KoCompositeOpRegistry::getLayerStylesCompositeOps() const
0229 {
0230     QVector<QString> ids;
0231 
0232     // not available via the blending modes list in Krita
0233     // ids << COMPOSITE_PASS_THROUGH;
0234 
0235     ids << COMPOSITE_OVER;
0236     ids << COMPOSITE_DISSOLVE;
0237     ids << COMPOSITE_DARKEN;
0238     ids << COMPOSITE_MULT;
0239     ids << COMPOSITE_BURN;
0240     ids << COMPOSITE_LINEAR_BURN;
0241     ids << COMPOSITE_DARKER_COLOR;
0242     ids << COMPOSITE_LIGHTEN;
0243     ids << COMPOSITE_SCREEN;
0244     ids << COMPOSITE_DODGE;
0245     ids << COMPOSITE_LINEAR_DODGE;
0246     ids << COMPOSITE_LIGHTER_COLOR;
0247     ids << COMPOSITE_OVERLAY;
0248     ids << COMPOSITE_SOFT_LIGHT_PHOTOSHOP;
0249     ids << COMPOSITE_HARD_LIGHT;
0250     ids << COMPOSITE_VIVID_LIGHT;
0251     ids << COMPOSITE_LINEAR_LIGHT;
0252     ids << COMPOSITE_PIN_LIGHT;
0253     ids << COMPOSITE_HARD_MIX_PHOTOSHOP;
0254     ids << COMPOSITE_HARD_MIX_SOFTER_PHOTOSHOP;
0255     ids << COMPOSITE_DIFF;
0256     ids << COMPOSITE_EXCLUSION;
0257     ids << COMPOSITE_SUBTRACT;
0258     ids << COMPOSITE_DIVIDE;
0259     ids << COMPOSITE_HUE;
0260     ids << COMPOSITE_SATURATION;
0261     ids << COMPOSITE_COLOR;
0262     ids << COMPOSITE_LUMINIZE;
0263 
0264     KoIDMap result;
0265     Q_FOREACH (const QString &id, ids) {
0266         KoIDMap::const_iterator iter = std::find(m_map.begin(), m_map.end(), KoID(id));
0267         KIS_SAFE_ASSERT_RECOVER(iter != m_map.end()) { continue; }
0268 
0269         result.insert(iter.key(), iter.value());
0270     }
0271 
0272     return result;
0273 }
0274 
0275 KoCompositeOpRegistry::KoIDList KoCompositeOpRegistry::getCategories() const
0276 {
0277     return m_categories;
0278 }
0279 
0280 QString  KoCompositeOpRegistry::getCategoryDisplayName(const QString& categoryID) const
0281 {
0282     KoIDList::const_iterator itr = std::find(m_categories.begin(), m_categories.end(), KoID(categoryID));
0283     const QString name = (itr != m_categories.end()) ? itr->name() : QString();
0284     if (name.isNull()) {
0285         warnPigment << "Got null display name for composite op category" << categoryID;
0286         return categoryID;
0287     }
0288     return name;
0289 }
0290 
0291 KoCompositeOpRegistry::KoIDList KoCompositeOpRegistry::getCompositeOps(const KoID& category, const KoColorSpace* colorSpace) const
0292 {
0293     qint32                  num = m_map.count(category);
0294     KoIDMap::const_iterator beg = m_map.find(category);
0295     KoIDMap::const_iterator end = beg + num;
0296 
0297     KoIDList list;
0298     list.reserve(num);
0299 
0300     if(colorSpace) {
0301         for(; beg!=end; ++beg){
0302             if(colorSpace->hasCompositeOp(beg->id()))
0303                 list.push_back(*beg);
0304         }
0305     }
0306     else {
0307         for(; beg!=end; ++beg)
0308             list.push_back(*beg);
0309     }
0310 
0311     return list;
0312 }
0313 
0314 KoCompositeOpRegistry::KoIDList KoCompositeOpRegistry::getCompositeOps(const KoColorSpace* colorSpace) const
0315 {
0316     KoIDMap::const_iterator beg = m_map.begin();
0317     KoIDMap::const_iterator end = m_map.end();
0318 
0319     KoIDList list;
0320     list.reserve(m_map.size());
0321 
0322     if(colorSpace) {
0323         for(; beg!=end; ++beg){
0324             if(colorSpace->hasCompositeOp(beg->id()))
0325                 list.push_back(*beg);
0326         }
0327     }
0328     else {
0329         for(; beg!=end; ++beg)
0330             list.push_back(*beg);
0331     }
0332 
0333     return list;
0334 }
0335 
0336 bool KoCompositeOpRegistry::colorSpaceHasCompositeOp(const KoColorSpace* colorSpace, const KoID& compositeOp) const
0337 {
0338     return colorSpace ? colorSpace->hasCompositeOp(compositeOp.id()) : false;
0339 }