]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/utils/MipMapBufferedImage.java
Render elements using custom color filters
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / utils / MipMapBufferedImage.java
index d76b9ec05a1063c437dd1b2c26a1edd9ebb221db..b249275540a39979be3370080cc6c7d22e36794b 100644 (file)
@@ -22,6 +22,13 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
+
+import org.simantics.scenegraph.g2d.G2DRenderingHints;
+import org.simantics.scenegraph.g2d.color.ColorFilter;
+import org.simantics.scenegraph.g2d.color.Graphics2DWithColorFilter;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import com.kitfox.svg.SVGDiagram;
 
@@ -35,6 +42,8 @@ import com.kitfox.svg.SVGDiagram;
  */
 public class MipMapBufferedImage extends BufferedImage {
 
+    private static final Logger LOGGER = LoggerFactory.getLogger(MipMapBufferedImage.class);
+
     /** Extra margin to the bounds reported by batik */
     public static final double MARGIN_PERCENT = 3;
 
@@ -61,6 +70,8 @@ public class MipMapBufferedImage extends BufferedImage {
     }
 
     private void initializeRasters() {
+        if (LOGGER.isDebugEnabled())
+            LOGGER.debug("initializeRasters({}): diagram={}, referenceSize={}, imageBounds={}, maxres={}, minres={}", this.toString(), source, referenceSize, imageBounds, maxResolution(), minResolution());
         List<Double> resolutions = new ArrayList<Double>();
 
         if (referenceSize != null && !imageBounds.isEmpty()) {
@@ -94,6 +105,9 @@ public class MipMapBufferedImage extends BufferedImage {
             }
         }
 
+        if (LOGGER.isDebugEnabled())
+            LOGGER.debug("initializeRasters({}): resolutions={}", this.toString(), resolutions);
+
         // arraylist -> array
         this.resolutions = new double[resolutions.size()];
         for (int i=0; i<resolutions.size(); i++)
@@ -156,12 +170,18 @@ public class MipMapBufferedImage extends BufferedImage {
 
     @Override
     public void paint(Graphics2D g) {
+        ColorFilter colorFilter = (ColorFilter) g.getRenderingHint(G2DRenderingHints.KEY_COLOR_FILTER);
+
         // Quality rendering requested, do not render from cache
         //QualityHints.HIGH_QUALITY_HINTS.setQuality(g);
         if (g.getRenderingHint(RenderingHints.KEY_RENDERING) == RenderingHints.VALUE_RENDER_QUALITY)
         {
             try {
-                source.render(g);
+                if (colorFilter != null) {
+                    source.render(new Graphics2DWithColorFilter(g, colorFilter));
+                } else {
+                    source.render(g);
+                }
             } catch (Exception e) {
                 // NOTE: Catching Exception instead of SVGException due to an
                 // NPE when encountering invalid color SVG definitions (e.g.
@@ -182,7 +202,11 @@ public class MipMapBufferedImage extends BufferedImage {
             Graphics2D g2d = (Graphics2D) g.create();
             setupSourceRender(g2d);
             try {
-                source.render(g2d);
+                if (colorFilter != null) {
+                    source.render(new Graphics2DWithColorFilter(g, colorFilter));
+                } else {
+                    source.render(g);
+                }
             } catch (Exception e) {
                 // NOTE: Catching Exception instead of SVGException due to an
                 // NPE when encountering invalid color SVG definitions (e.g.
@@ -261,6 +285,7 @@ public class MipMapBufferedImage extends BufferedImage {
         java.awt.image.BufferedImage image;
         //int widMargin, heiMargin;
         int wid, hei;
+        private ColorFilter previousColorFilter = null;
 
         BufferedRaster(double resolution) {
             super(resolution);
@@ -272,8 +297,12 @@ public class MipMapBufferedImage extends BufferedImage {
 //            heiMargin = (int) (hei * resolution * (MARGIN_PERCENT/100)) +1;
         }
 
-        synchronized java.awt.image.BufferedImage getOrCreate()
+        synchronized java.awt.image.BufferedImage getOrCreate(ColorFilter colorFilter)
         {
+            if (!Objects.equals(colorFilter, previousColorFilter)) {
+                previousColorFilter = colorFilter;
+                image = null;
+            }
             if (image!=null) return image;
             image = new java.awt.image.BufferedImage(
                     (wid+0*2+1),
@@ -293,7 +322,11 @@ public class MipMapBufferedImage extends BufferedImage {
             target.scale(resolution, resolution);
             target.translate(-imageBounds.getMinX(), -imageBounds.getMinY());
             try {
-                source.render(target);
+                if (colorFilter != null) {
+                    source.render(new Graphics2DWithColorFilter(target, colorFilter));
+                } else {
+                    source.render(target);
+                }
             } catch (Exception e) {
                 // TODO Auto-generated catch block
                 // NOTE: Catching Exception instead of SVGException due to an
@@ -310,11 +343,12 @@ public class MipMapBufferedImage extends BufferedImage {
         }
 
         public void paint(Graphics2D g) {
-            java.awt.image.BufferedImage image = getOrCreate();
+            ColorFilter colorFilter = (ColorFilter) g.getRenderingHint(G2DRenderingHints.KEY_COLOR_FILTER); 
+            java.awt.image.BufferedImage image = getOrCreate(colorFilter);
             if (image==null)
             {
                 try {
-                    source.render(g);
+                    source.render(new Graphics2DWithColorFilter(g, colorFilter));
                 } catch (Exception e) {
                     // TODO Auto-generated catch block
                     // NOTE: Catching Exception instead of SVGException due to an