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;
+
import com.kitfox.svg.SVGDiagram;
/**
*/
public class MipMapVRamBufferedImage extends MipMapBufferedImage {
+ private static final Logger LOGGER = LoggerFactory.getLogger(MipMapVRamBufferedImage.class);
/**
* @param original
* @param imageBounds
* @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());
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();
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);
// Couldn't get image? This is not supposed to happen but happened anyway.
if (image == null) {
- System.err.println("BUG: VolatileImageProvider.get returned null!");
+ LOGGER.error("BUG: VolatileImageProvider.get returned null!");
return null;
}
// }
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);
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