teichmann@5863: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5863: * Software engineering by Intevation GmbH teichmann@5863: * teichmann@5994: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5863: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5994: * documentation coming with Dive4Elements River for details. teichmann@5863: */ teichmann@5863: teichmann@5831: package org.dive4elements.river.java2d; sascha@3162: gernotbelger@9496: import java.awt.Color; sascha@3162: import java.awt.Shape; gernotbelger@9360: import java.awt.geom.Area; sascha@3162: import java.awt.geom.Ellipse2D; sascha@3162: import java.awt.geom.GeneralPath; sascha@3162: import java.awt.geom.Rectangle2D; sascha@3162: import java.util.HashMap; sascha@3162: import java.util.Map; sascha@3162: gernotbelger@9360: public class ShapeUtils { sascha@3162: gernotbelger@9360: public static enum ShapeType { gernotbelger@9360: measured, digitized, interpolated, outlier gernotbelger@9360: } sascha@3162: gernotbelger@9360: private static Map scaledShapesCache = new HashMap<>(); gernotbelger@9360: gernotbelger@9496: private static final Shape createCross(final float size) { gernotbelger@9360: gernotbelger@9360: final GeneralPath p = new GeneralPath(); gernotbelger@9360: gernotbelger@9360: p.moveTo(-size, -size); gernotbelger@9360: p.lineTo(size, size); sascha@3162: p.closePath(); gernotbelger@9360: p.moveTo(-size, size); gernotbelger@9360: p.lineTo(size, -size); sascha@3162: p.closePath(); gernotbelger@9360: sascha@3162: return p; sascha@3162: } sascha@3162: gernotbelger@9496: private static Shape createBox(final float size) { gernotbelger@9360: return new Rectangle2D.Double(-size, -size, size * 2, size * 2); sascha@3162: } sascha@3162: gernotbelger@9496: private static Shape createCircle(final float size) { gernotbelger@9360: return new Ellipse2D.Float(-size, -size, size * 2, size * 2); gernotbelger@9360: } sascha@3162: gernotbelger@9496: private static final Shape createTriangle(final float size) { gernotbelger@9360: final GeneralPath p = new GeneralPath(); gernotbelger@9360: gernotbelger@9360: p.moveTo(-size, size); gernotbelger@9360: p.lineTo(size, size); gernotbelger@9360: p.lineTo(0, -size); gernotbelger@9360: p.closePath(); gernotbelger@9360: gernotbelger@9360: return new Area(p); gernotbelger@9360: } gernotbelger@9360: gernotbelger@9496: public static synchronized Shape getScaledShape(final ShapeType type, final float size) { gernotbelger@9360: gernotbelger@9360: final Long hash = Long.valueOf((((long) type.ordinal()) << 32) | Float.floatToIntBits(size)); gernotbelger@9360: gernotbelger@9360: final Shape shape = scaledShapesCache.get(hash); gernotbelger@9360: if (shape != null) gernotbelger@9360: return shape; gernotbelger@9360: gernotbelger@9360: final Shape newShape = createScaledShape(type, size); gernotbelger@9360: scaledShapesCache.put(hash, newShape); gernotbelger@9360: return newShape; gernotbelger@9360: } gernotbelger@9360: gernotbelger@9496: private static Shape createScaledShape(final ShapeType type, final float size) { gernotbelger@9360: switch (type) { gernotbelger@9360: case measured: gernotbelger@9360: return createBox(size); gernotbelger@9360: gernotbelger@9360: case digitized: gernotbelger@9360: return createCross(size); gernotbelger@9360: gernotbelger@9360: case outlier: gernotbelger@9360: return createTriangle(size); gernotbelger@9360: gernotbelger@9360: case interpolated: gernotbelger@9360: default: gernotbelger@9360: return createCircle(size); sascha@3162: } sascha@3162: } gernotbelger@9496: gernotbelger@9496: public static Color withAlpha(final Color color, final int transparencyPercent) { gernotbelger@9496: gernotbelger@9496: if (transparencyPercent <= 0 || transparencyPercent > 100 || color == null) gernotbelger@9496: return color; gernotbelger@9496: gernotbelger@9496: return new Color(color.getRed(), color.getGreen(), color.getBlue(), (int) ((100 - transparencyPercent) * 2.55f)); gernotbelger@9496: } gernotbelger@9360: }