/*
* Copyright 2016 Laszlo Balazs-Csiki
*
* This file is part of Pixelitor. Pixelitor is free software: you
* can redistribute it and/or modify it under the terms of the GNU
* General Public License, version 3 as published by the Free
* Software Foundation.
*
* Pixelitor is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with Pixelitor. If not, see <http://www.gnu.org/licenses/>.
*/
package pixelitor.layers;
import com.jhlabs.composite.*;
import java.awt.AlphaComposite;
import java.awt.Composite;
/**
* The blending modes
*/
public enum BlendingMode {
NORMAL("Normal", "svg:src-over") {
@Override
public Composite getComposite(float opacity) {
return AlphaComposite.SrcOver.derive(opacity);
}
}, DARKEN("Darken", "svg:darken") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Darken;
return new DarkenComposite(opacity);
}
},
MULTIPLY("Multiply", "svg:multiply") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Multiply;
return new MultiplyComposite(opacity);
}
}, COLOR_BURN("Color Burn", "svg:color-burn") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.ColorBurn;
return new ColorBurnComposite(opacity);
}
}, LIGHTEN("Lighten", "svg:lighten") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Lighten;
return new LightenComposite(opacity);
}
}, SCREEN("Screen", "svg:screen") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Screen;
return new ScreenComposite(opacity);
}
}, COLOR_DODGE("Color Dodge", "svg:color-dodge") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.ColorDodge;
return new ColorDodgeComposite(opacity);
}
}, LINEAR_DODGE("Linear Dodge (Add)", "svg:plus") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Add;
return new AddComposite(opacity);
}
}, OVERLAY("Overlay", "svg:overlay") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Overlay;
return new OverlayComposite(opacity);
}
}, SOFT_LIGHT("Soft Light", "svg:soft-light") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.SoftLight;
return new SoftLightComposite(opacity);
}
}, HARD_LIGHT("Hard Light", "svg:hard-light") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.HardLight;
return new HardLightComposite(opacity);
}
}, DIFFERENCE("Difference", "svg:difference") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Difference;
return new DifferenceComposite(opacity);
}
}, EXCLUSION("Exclusion", "svg:exclusion") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Exclusion;
return new ExclusionComposite(opacity);
}
}, HUE("Hue", "svg:hue") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Hue;
return new HueComposite(opacity);
}
}, SATURATION("Saturation", "svg:saturation") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Saturation;
return new SaturationComposite(opacity);
}
}, COLOR("Color", "svg:color") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Color;
return new ColorComposite(opacity);
}
}, LUMINOSITY("Value", "svg:luminosity") {
@Override
public Composite getComposite(float opacity) {
// return BlendComposite.Luminosity;
return new ValueComposite(opacity);
}
};
private final String guiName;
private final String svgName;
BlendingMode(String guiName, String svgName) {
this.guiName = guiName;
this.svgName = svgName;
}
public abstract Composite getComposite(float opacity);
public String toSVGName() {
return svgName;
}
@Override
public String toString() {
return guiName;
}
public static BlendingMode fromSVGName(String svgName) {
BlendingMode[] values = values();
for (BlendingMode mode : values) {
String modeSVGName = mode.toSVGName();
if(modeSVGName.equals(svgName)) {
return mode;
}
}
return NORMAL;
}
}