]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/utils/MipMapVRamBufferedImage.java
Render elements using custom color filters
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / utils / MipMapVRamBufferedImage.java
index 54323097badd9d77463d3dfe5497013e83ac93a9..69b4e337bf0e119207be52bfb2a356c2d5225650 100644 (file)
@@ -19,8 +19,12 @@ import java.awt.RenderingHints;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
 import java.awt.image.VolatileImage;
+import java.util.Objects;
 import java.util.concurrent.atomic.AtomicInteger;
 
+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;
 
@@ -99,7 +103,7 @@ public class MipMapVRamBufferedImage extends MipMapBufferedImage {
          * @param image
          * @return
          */
-        private VolatileImage sourceRender(VolatileImage image) {
+        private VolatileImage sourceRender(VolatileImage image, ColorFilter colorFilter) {
             Graphics2D target = image.createGraphics();
             target.setBackground(new Color(255,255,255,0));
             target.clearRect(0, 0, image.getWidth(), image.getHeight());
@@ -113,7 +117,11 @@ public class MipMapVRamBufferedImage extends MipMapBufferedImage {
             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) {
                 e.printStackTrace();
                 target.dispose();
@@ -125,7 +133,7 @@ public class MipMapVRamBufferedImage extends MipMapBufferedImage {
             return image;
         }
 
-        synchronized VolatileImage restore(GraphicsConfiguration gc2) {
+        synchronized VolatileImage restore(GraphicsConfiguration gc2, ColorFilter colorFilter) {
             //System.out.println("restoring provider " + imageProvider);
             VolatileImage image = imageProvider.get(gc2, this.validateResult);
 
@@ -144,12 +152,15 @@ public class MipMapVRamBufferedImage extends MipMapBufferedImage {
 //            }
 
             boolean contentsLost = validateResult != VolatileImage.IMAGE_OK || image.contentsLost();
-            return contentsLost ? sourceRender(image) : image;
+            boolean changed = !Objects.equals(colorFilter, previousColorFilter);
+            previousColorFilter = colorFilter;
+            return contentsLost || changed ? sourceRender(image, colorFilter) : image;
             //return contentsLost ? sourceRender(image) : sourceRender(image);
         }
 
         public void paint(Graphics2D g) {
-            VolatileImage image = restore(g.getDeviceConfiguration());
+            ColorFilter colorFilter = (ColorFilter) g.getRenderingHint(G2DRenderingHints.KEY_COLOR_FILTER);
+            VolatileImage image = restore(g.getDeviceConfiguration(), colorFilter);
             if (image==null)
             {
                 g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_SPEED);
@@ -158,7 +169,7 @@ public class MipMapVRamBufferedImage extends MipMapBufferedImage {
                 g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
 
                 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