/* * JAME 6.2.1 * http://jame.sourceforge.net * * Copyright 2001, 2016 Andrea Medeghini * * This file is part of JAME. * * JAME is an application for creating fractals and other graphics artifacts. * * JAME is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * JAME is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with JAME. If not, see <http://www.gnu.org/licenses/>. * */ package net.sf.jame.twister.renderer; import java.awt.Graphics2D; import java.util.HashMap; import java.util.Map; import net.sf.jame.core.util.Surface; import net.sf.jame.core.util.Tile; import net.sf.jame.twister.TwisterRuntime; import net.sf.jame.twister.frame.FrameRuntimeElement; import net.sf.jame.twister.image.ImageRuntimeElement; import net.sf.jame.twister.layer.GroupLayerRuntimeElement; import net.sf.jame.twister.layer.ImageLayerRuntimeElement; /** * @author Andrea Medeghini */ public class OverlayTwisterRenderer implements TwisterRenderer { private Map<Object, Object> hints = new HashMap<Object, Object>(); private TwisterRuntime runtime; private Tile tile; /** * @param runtime */ public OverlayTwisterRenderer(final TwisterRuntime runtime) { this.runtime = runtime; } /** * @see java.lang.Object#finalize() */ @Override protected void finalize() throws Throwable { dispose(); super.finalize(); } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#drawImage(java.awt.Graphics2D) */ public void drawImage(final Graphics2D g) { if (runtime.getFrameElement() != null) { g.setClip(tile.getTileOffset().getX(), tile.getTileOffset().getY(), tile.getTileSize().getX() + 1, tile.getTileSize().getY() + 1); final FrameRuntimeElement frame = runtime.getFrameElement(); final int layerCount = frame.getLayerCount(); for (int i = 0; i < layerCount; i++) { final GroupLayerRuntimeElement layer = frame.getLayer(i); if (layer.isVisible()) { final int sublayerCount = layer.getLayerCount(); for (int j = 0; j < sublayerCount; j++) { final ImageLayerRuntimeElement sublayer = layer.getLayer(j); if (sublayer.isVisible()) { final ImageRuntimeElement image = sublayer.getImage(); if ((image != null) && (image.getImageRuntime() != null)) { image.getImageRuntime().setRenderingHints(hints); image.getImageRuntime().setTile(tile); if (tile != null) { image.getImageRuntime().drawImage(g); } } } } } } g.setClip(null); } } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#drawImage(java.awt.Graphics2D, int, int) */ public void drawImage(final Graphics2D g, final int x, final int y) { if (runtime.getFrameElement() != null) { g.setClip(x + tile.getTileOffset().getX(), y + tile.getTileOffset().getY(), tile.getTileSize().getX() + 1, tile.getTileSize().getY() + 1); final FrameRuntimeElement frame = runtime.getFrameElement(); final int layerCount = frame.getLayerCount(); for (int i = 0; i < layerCount; i++) { final GroupLayerRuntimeElement layer = frame.getLayer(i); if (layer.isVisible()) { final int sublayerCount = layer.getLayerCount(); for (int j = 0; j < sublayerCount; j++) { final ImageLayerRuntimeElement sublayer = layer.getLayer(j); if (sublayer.isVisible()) { final ImageRuntimeElement image = sublayer.getImage(); if ((image != null) && (image.getImageRuntime() != null)) { image.getImageRuntime().setRenderingHints(hints); image.getImageRuntime().setTile(tile); if (tile != null) { image.getImageRuntime().drawImage(g, x, y); } } } } } } g.setClip(null); } } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#drawImage(java.awt.Graphics2D, int, int, int, int) */ public void drawImage(final Graphics2D g, final int x, final int y, final int w, final int h) { if (runtime.getFrameElement() != null) { g.setClip(x, y, w, h); final FrameRuntimeElement frame = runtime.getFrameElement(); final int layerCount = frame.getLayerCount(); for (int i = 0; i < layerCount; i++) { final GroupLayerRuntimeElement layer = frame.getLayer(i); if (layer.isVisible()) { final int sublayerCount = layer.getLayerCount(); for (int j = 0; j < sublayerCount; j++) { final ImageLayerRuntimeElement sublayer = layer.getLayer(j); if (sublayer.isVisible()) { final ImageRuntimeElement image = sublayer.getImage(); if ((image != null) && (image.getImageRuntime() != null)) { image.getImageRuntime().setRenderingHints(hints); image.getImageRuntime().setTile(tile); if (tile != null) { image.getImageRuntime().drawImage(g, x, y, w, h); } } } } } } g.setClip(null); } } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#drawImage(java.awt.Graphics2D, int, int, int, int, int, int) */ public void drawImage(final Graphics2D g, final int x, final int y, final int w, final int h, final int bx, final int by) { if (runtime.getFrameElement() != null) { g.setClip(x + bx, y + by, w - 2 * bx, h - 2 * by); final FrameRuntimeElement frame = runtime.getFrameElement(); final int layerCount = frame.getLayerCount(); for (int i = 0; i < layerCount; i++) { final GroupLayerRuntimeElement layer = frame.getLayer(i); if (layer.isVisible()) { final int sublayerCount = layer.getLayerCount(); for (int j = 0; j < sublayerCount; j++) { final ImageLayerRuntimeElement sublayer = layer.getLayer(j); if (sublayer.isVisible()) { final ImageRuntimeElement image = sublayer.getImage(); if ((image != null) && (image.getImageRuntime() != null)) { image.getImageRuntime().setRenderingHints(hints); image.getImageRuntime().setTile(tile); if (tile != null) { image.getImageRuntime().drawImage(g, x, y, w, h); } } } } } } g.setClip(null); } } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#startRenderer() */ public void startRenderer() { startLayers(runtime.getFrameElement()); } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#stopRenderer() */ public void stopRenderer() { try { abortLayers(runtime.getFrameElement()); joinLayers(runtime.getFrameElement()); } catch (final InterruptedException e) { Thread.currentThread().interrupt(); } } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#abortRenderer() */ public void abortRenderer() { abortLayers(runtime.getFrameElement()); } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#joinRenderer() */ public void joinRenderer() { try { joinLayers(runtime.getFrameElement()); } catch (final InterruptedException e) { Thread.currentThread().interrupt(); } } private void startLayers(final FrameRuntimeElement frame) { final int layerCount = frame.getLayerCount(); for (int i = 0; i < layerCount; i++) { this.startLayer(frame.getLayer(i)); } } private void startLayer(final ImageLayerRuntimeElement layer) { if ((layer.getImage() != null) && (layer.getImage().getImageRuntime() != null)) { layer.getImage().getImageRuntime().setRenderingHints(hints); layer.getImage().getImageRuntime().setTile(tile); try { layer.getImage().getImageRuntime().startRenderer(); } catch (final Exception e) { e.printStackTrace(); } } } private void startLayer(final GroupLayerRuntimeElement layer) { final int sublayerCount = layer.getLayerCount(); for (int j = 0; j < sublayerCount; j++) { this.startLayer(layer.getLayer(j)); } } private void abortLayers(final FrameRuntimeElement frame) { final int layerCount = frame.getLayerCount(); for (int i = 0; i < layerCount; i++) { this.abortLayer(frame.getLayer(i)); } } private void abortLayer(final ImageLayerRuntimeElement layer) { if ((layer.getImage() != null) && (layer.getImage().getImageRuntime() != null)) { layer.getImage().getImageRuntime().abortRenderer(); } } private void abortLayer(final GroupLayerRuntimeElement layer) { final int sublayerCount = layer.getLayerCount(); for (int j = 0; j < sublayerCount; j++) { this.abortLayer(layer.getLayer(j)); } } private void joinLayers(final FrameRuntimeElement frame) throws InterruptedException { final int layerCount = frame.getLayerCount(); for (int i = 0; i < layerCount; i++) { this.joinLayer(frame.getLayer(i)); } } private void joinLayer(final ImageLayerRuntimeElement layer) throws InterruptedException { if ((layer.getImage() != null) && (layer.getImage().getImageRuntime() != null)) { layer.getImage().getImageRuntime().joinRenderer(); } } private void joinLayer(final GroupLayerRuntimeElement layer) throws InterruptedException { final int sublayerCount = layer.getLayerCount(); for (int j = 0; j < sublayerCount; j++) { this.joinLayer(layer.getLayer(j)); } } private void prepareLayers(final FrameRuntimeElement frame, final boolean isDynamicRequired) { final int layerCount = frame.getLayerCount(); for (int i = 0; i < layerCount; i++) { this.prepareLayer(frame.getLayer(i), isDynamicRequired); } } private void prepareLayer(final ImageLayerRuntimeElement layer, final boolean isDynamicRequired) { if ((layer.getImage() != null) && (layer.getImage().getImageRuntime() != null)) { layer.getImage().getImageRuntime().setRenderingHints(hints); layer.getImage().getImageRuntime().setTile(tile); layer.getImage().getImageRuntime().prepareImage(isDynamicRequired); } } private void prepareLayer(final GroupLayerRuntimeElement layer, final boolean isDynamicRequired) { final int sublayerCount = layer.getLayerCount(); for (int j = 0; j < sublayerCount; j++) { this.prepareLayer(layer.getLayer(j), isDynamicRequired); } } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#getRuntime() */ public TwisterRuntime getRuntime() { return runtime; } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#setRenderingHints(java.util.Map) */ public void setRenderingHints(final Map<Object, Object> hints) { this.hints = hints; } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#getTile() */ public Tile getTile() { return tile; } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#setTile(net.sf.jame.core.util.Tile) */ public void setTile(final Tile tile) { this.tile = tile; } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#render() */ public void render() throws InterruptedException { if (runtime.getFrameElement() != null) { // abortLayers(runtime.getFrameElement()); // joinLayers(runtime.getFrameElement()); startLayers(runtime.getFrameElement()); joinLayers(runtime.getFrameElement()); } } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#prepareImage(boolean) */ public void prepareImage(final boolean isDynamicRequired) { if (runtime.getFrameElement() != null) { prepareLayers(runtime.getFrameElement(), isDynamicRequired); } } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#dispose() */ public void dispose() { stopRenderer(); runtime.dispose(); runtime = null; tile = null; hints.clear(); hints = null; } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#drawSurface(java.awt.Graphics2D) */ public void drawSurface(final Graphics2D g) { drawSurface(g, 0, 0); } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#drawSurface(java.awt.Graphics2D, int, int) */ public void drawSurface(Graphics2D g, int x, int y) { drawImage(g, x, y, getTile().getTileSize().getX() + getTile().getTileBorder().getX() * 2, getTile().getTileSize().getY() + getTile().getTileBorder().getY() * 2); } /** * @see net.sf.jame.twister.renderer.TwisterRenderer#loadSurface(net.sf.jame.core.util.Surface) */ public void loadSurface(final Surface surface) { } }