gernotbelger@8910: /** Copyright (C) 2017 by Bundesanstalt für Gewässerkunde gernotbelger@8910: * Software engineering by gernotbelger@8910: * Björnsen Beratende Ingenieure GmbH gernotbelger@8910: * Dr. Schumacher Ingenieurbüro für Wasser und Umwelt gernotbelger@8910: * gernotbelger@8910: * This file is Free Software under the GNU AGPL (>=v3) gernotbelger@8910: * and comes with ABSOLUTELY NO WARRANTY! Check out the gernotbelger@8910: * documentation coming with Dive4Elements River for details. gernotbelger@8910: */ gernotbelger@8910: package org.dive4elements.river.jfree; gernotbelger@8910: gernotbelger@8910: import java.awt.Color; gernotbelger@8910: import java.awt.image.BufferedImage; gernotbelger@8910: import java.awt.image.BufferedImageOp; gernotbelger@8910: import java.awt.image.LookupOp; gernotbelger@8910: import java.io.IOException; gernotbelger@8910: gernotbelger@8910: import javax.imageio.ImageIO; gernotbelger@8910: gernotbelger@8910: import org.apache.log4j.Logger; gernotbelger@8910: gernotbelger@8910: /** gernotbelger@8910: * Fill patterns for area styles. gernotbelger@8910: * REMARK: if this enum is changed, probably the ui in StyleEditorWindow must be changed too gernotbelger@8910: * gernotbelger@8910: * @author Gernot Belger gernotbelger@8910: */ gernotbelger@8910: public enum AreaFillPattern { gernotbelger@8910: gernotbelger@8910: pattern1("/images/areapatterns/pattern1.png"); gernotbelger@8910: gernotbelger@8910: private static Logger log = Logger.getLogger(AreaFillPattern.class); gernotbelger@8910: gernotbelger@8910: private static final BufferedImage MISSING_IMAGE = new BufferedImage(16, 16, BufferedImage.TYPE_INT_RGB); gernotbelger@8910: gernotbelger@8910: private final String imagePath; gernotbelger@8910: gernotbelger@8910: private BufferedImage image = null; gernotbelger@8910: gernotbelger@8910: AreaFillPattern(final String imagePath) { gernotbelger@8910: this.imagePath = imagePath; gernotbelger@8910: } gernotbelger@8910: gernotbelger@8910: public BufferedImage getImage(final Color color) { gernotbelger@8910: gernotbelger@8910: if (this.image == null) gernotbelger@8910: this.image = loadImage(); gernotbelger@8910: gernotbelger@8910: if (color == null) gernotbelger@8910: return this.image; gernotbelger@8910: gernotbelger@8910: /* gernotbelger@8910: * apply color and transparency, the .png must be encoded as 32bit images (rgba), with only black as non transparent gernotbelger@8910: * color gernotbelger@8910: */ gernotbelger@8910: final int numComponents = this.image.getColorModel().getNumComponents(); gernotbelger@8910: if (numComponents != 4) { gernotbelger@8910: log.warn(String.format("Pattern image must be a 32bit image (rgba): %s", this.imagePath)); gernotbelger@8910: return this.image; gernotbelger@8910: } gernotbelger@8910: gernotbelger@8910: final BufferedImageOp lookup = new LookupOp(new ColorMapper(Color.black, color), null); gernotbelger@8910: return lookup.filter(this.image, null); gernotbelger@8910: } gernotbelger@8910: gernotbelger@8910: private BufferedImage loadImage() { gernotbelger@8910: try { gernotbelger@8910: return ImageIO.read(getClass().getResource(this.imagePath)); gernotbelger@8910: } gernotbelger@8910: catch (final IOException e) { gernotbelger@8910: log.error(String.format("failed ot load pattern: %s", this.imagePath), e); gernotbelger@8910: return MISSING_IMAGE; gernotbelger@8910: } gernotbelger@8910: } gernotbelger@8910: }