]> gerrit.simantics Code Review - simantics/platform.git/blobdiff - bundles/org.simantics.scenegraph/src/org/simantics/scenegraph/utils/BufferedImage.java
Render elements using custom color filters
[simantics/platform.git] / bundles / org.simantics.scenegraph / src / org / simantics / scenegraph / utils / BufferedImage.java
index 5401fa757411f5248694647d6a536032c2121c7d..7904c3f4ab9cf8905aecb374ebf788c14a645ac0 100644 (file)
@@ -17,6 +17,11 @@ import java.awt.Point;
 import java.awt.RenderingHints;
 import java.awt.geom.AffineTransform;
 import java.awt.geom.Rectangle2D;
+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 com.kitfox.svg.SVGDiagram;
 import com.kitfox.svg.SVGException;
@@ -31,6 +36,7 @@ public class BufferedImage  {
 
     java.awt.image.BufferedImage   buffer = null;
     AffineTransform previousTransform = null;
+    ColorFilter previousColorFilter = null;
 
     /**
      * @param original
@@ -70,7 +76,7 @@ public class BufferedImage  {
         }
     }
 
-    public void paintToBuffer(AffineTransform transform, float margin) throws SVGException {
+    public void paintToBuffer(AffineTransform transform, ColorFilter colorFilter, float margin) throws SVGException {
 
         int w = (int)((imageBounds.getWidth()+margin*2) * transform.getScaleX());
         int h = (int)((imageBounds.getHeight()+margin*2) * transform.getScaleY());
@@ -90,18 +96,24 @@ public class BufferedImage  {
         b2g.translate(margin, margin);
         b2g.scale(transform.getScaleX(), transform.getScaleY());
         b2g.translate(-imageBounds.getMinX(), -imageBounds.getMinY());
-        source.render(b2g);
+        if (colorFilter != null) {
+            source.render(new Graphics2DWithColorFilter(b2g, colorFilter));
+        } else {
+            source.render(b2g);
+        }
 
     }
     
     public void paint(Graphics2D g) {
         float margin = 5;
 
-        if(previousTransform == null || previousTransform.getScaleX() != g.getTransform().getScaleX() || previousTransform.getScaleY() != g.getTransform().getScaleY()) {
+        ColorFilter colorFilter = (ColorFilter) g.getRenderingHint(G2DRenderingHints.KEY_COLOR_FILTER);
+        if(previousTransform == null || previousTransform.getScaleX() != g.getTransform().getScaleX() || previousTransform.getScaleY() != g.getTransform().getScaleY() || !Objects.equals(colorFilter, previousColorFilter)) {
 //             setupSourceRender(g);
             try {
+                previousColorFilter = colorFilter;
                 previousTransform = (AffineTransform)g.getTransform().clone();
-               paintToBuffer(previousTransform, margin);
+                paintToBuffer(previousTransform, previousColorFilter, margin);
             } catch (SVGException e) {
                 // TODO Auto-generated catch block
                 e.printStackTrace();