]> 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 7e5f09949ad0e44af5151e3889814d36daadf650..b249275540a39979be3370080cc6c7d22e36794b 100644 (file)
@@ -22,7 +22,11 @@ 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;
 
@@ -166,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.
@@ -192,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.
@@ -271,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);
@@ -282,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),
@@ -303,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
@@ -320,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