Revision: 6387
          http://sourceforge.net/p/jump-pilot/code/6387
Author:   ma15569
Date:     2020-08-26 09:34:24 +0000 (Wed, 26 Aug 2020)
Log Message:
-----------
Workaround to solve Error: * Could not find mediaLib accelerator wrapper class 
This seems also to speed up the rendering of the image

Modified Paths:
--------------
    core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java

Modified: core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java
===================================================================
--- core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java  
2020-08-23 18:38:21 UTC (rev 6386)
+++ core/trunk/src/org/openjump/core/rasterimage/RasterImageLayer.java  
2020-08-26 09:34:24 UTC (rev 6387)
@@ -14,18 +14,20 @@
 import java.awt.Image;
 import java.awt.Point;
 import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
 import java.awt.geom.NoninvertibleTransformException;
 import java.awt.geom.Point2D;
+import java.awt.image.AffineTransformOp;
 import java.awt.image.BufferedImage;
 import java.awt.image.ColorModel;
 import java.awt.image.IndexColorModel;
 import java.awt.image.Raster;
-import java.awt.image.renderable.ParameterBlock;
+//import java.awt.image.renderable.ParameterBlock;
 import java.io.FileNotFoundException;
 import java.io.IOException;
 import java.util.UUID;
 
-import javax.media.jai.JAI;
+//import javax.media.jai.JAI;
 
 import org.openjump.core.ccordsys.utils.SRSInfo;
 import org.openjump.util.metaData.MetaDataMap;
@@ -61,1686 +63,1746 @@
  * modified: [sstein]: 16.Feb.2009 changed logger-entries to comments, used 
frame.warnUser
  */
 public final class RasterImageLayer extends AbstractLayerable implements 
ObjectContainingMetaInformation {
-    
-    protected static Blackboard blackboard = null;
-    
-    protected final static String BLACKBOARD_KEY_PLUGINCONTEXT = 
PlugInContext.class.getName();
-    protected final static String BLACKBOARD_KEY_WORKBENCHCONTEXT = 
PlugInContext.class.getName();
-    
-    protected int lastImgProcessingMode = 0;
-    
-    protected final static int MODE_NONE = 0;
-    protected final static int MODE_SCALINGFIRST = 1;
-    protected final static int MODE_CLIPPINGFIRST = 2;
-    protected final static int MODE_FASTDISPLAY = 3;
-    
-    protected Rectangle imagePart, visibleRect = null;
-    
-    protected double oldScaleXImg2Canvas;
-    
-    protected int xOffset, yOffset;
-    
-    //protected static PersonalLogger logger = new 
PersonalLogger(DebugUserIds.OLE);
-    
-    protected double transparencyLevel = .0f;
 
-    
-    protected static long availRAM = Runtime.getRuntime().maxMemory();
-    protected static double freeRamFactor = 0.5;
-    protected static double minRamToKeepFree = availRAM * freeRamFactor;
-    //[sstein 9.Aug.2010]
-    // The value below is set dynamically based on available memory
-    //       now its 200x200px as min (originally it was 500x500)
-    //protected static int maxPixelsForFastDisplayMode = 40000;
-    protected static int maxPixelsForFastDisplayMode = 250000;
+       protected static Blackboard blackboard = null;
 
-    protected String imageFileName = null;
-    protected int origImageWidth, origImageHeight;
-    protected boolean imageSet = false;
-    protected BufferedImage image = null;
-    protected int numBands = 0;
-    
-    //-- [sstein 2nd Aug 2010] new, since we scale the image now for display
-    protected Raster actualRasterData = null;
-    protected boolean rasterDataChanged = false; //may be needed for rescaling 
the image values
-    protected boolean wasScaledForDisplay = false;
-    //-- end
-    
-    protected BufferedImage imageProcessingStep1 = null, imageProcessingStep2 
= null;
+       protected final static String BLACKBOARD_KEY_PLUGINCONTEXT = 
PlugInContext.class.getName();
+       protected final static String BLACKBOARD_KEY_WORKBENCHCONTEXT = 
PlugInContext.class.getName();
 
-    
-    protected Envelope actualImageEnvelope = null, visibleEnv = null, 
oldVisibleEnv;
-    protected Envelope originalImageEnvelope = null;
-    
-    /**
-     * Flag to decide, if events are fired automatically, if the appearance 
(imageEnvelope, etc.) changes.<br>
-     * default: true
-     */
-    protected boolean firingAppearanceEvents = true;
-    
-    /**
-     * Flag to control if the image should be deleted from RAM as soon as 
possible to save RAM or if it should be keeped e.g. because it was generated
-     * dynamically and can not be loaded from a file again, once it was 
deleted.
-     */
-    protected boolean needToKeepImage = false;
-    
-    protected static final Point nullpunkt = new Point(0,0);
-    
-    protected Color transparentColor = null;
-    protected boolean transparencyColorNeedsToBeApplied = false;
+       protected int lastImgProcessingMode = 0;
 
-    //-- [sstein 26 June 2013] new as with ASCII grid imports nodata values 
can be defined
-    protected double noDataValue = Double.NaN;
-    protected double originalCellSize;
-    protected double actualCellSize;
-    //-- end
+       protected final static int MODE_NONE = 0;
+       protected final static int MODE_SCALINGFIRST = 1;
+       protected final static int MODE_CLIPPINGFIRST = 2;
+       protected final static int MODE_FASTDISPLAY = 3;
 
-    private Metadata metadata;
-    
-    private Stats stats;
-    
-    private RasterSymbology symbology = null;
-    private boolean symbologyChanged = false;
-    private final UUID uuid = java.util.UUID.randomUUID();
-    
-    /**
-     * for java2xml
-     */
-    public RasterImageLayer() {
-        super();
-        
-        getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, true);
-        
-    }
-    
-    /**
-     * for java2xml
-     *@return the Envelope as string
-     */
-    public String getXmlEnvelope(){
-        return this.originalImageEnvelope.toString();
-    }
+       protected Rectangle imagePart, visibleRect = null;
 
-    /**
-     * for java2xml
-     *@param envStr the Envelope as string
-     */
-    public void setXmlEnvelope(String envStr){
-        String coords = envStr.substring(envStr.indexOf("[")+1, 
envStr.indexOf("]"));
-        
-        String[] coordArray = coords.split(",");
-        
-        String[] xCoords = coordArray[0].split(":");
-        String[] yCoords = coordArray[1].split(":");
-        
-        double minX = java.lang.Double.parseDouble(xCoords[0]);
-        double maxX = java.lang.Double.parseDouble(xCoords[1]);
-        
-        double minY = java.lang.Double.parseDouble(yCoords[0]);
-        double maxY = java.lang.Double.parseDouble(yCoords[1]);
-        
-        this.setWholeImageEnvelope( new Envelope( minX, maxX, minY, maxY ) );
-    }    
+       protected double oldScaleXImg2Canvas;
 
-    /**
-     *@param name name of the layer
-     *@param layerManager
-     * @param imageFileName
-     *@param imageToDisplay the image (if already loaded) or null
-     * @param wholeImageEnvelope
-     */
-    public RasterImageLayer(String name, LayerManager layerManager, String 
imageFileName, BufferedImage imageToDisplay, Envelope wholeImageEnvelope) {
-        super(name, layerManager);
-        
-        getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, true);
-        
-        this.imageFileName = imageFileName;
-        this.originalImageEnvelope = wholeImageEnvelope;
-        
-        if (imageToDisplay != null)
-            this.setImage(imageToDisplay);
-//        if (newRaster != null)
-//             this.setRasterData(newRaster);
-        //[sstein 9.Aug.2010]       
-        long avram = getAvailRAM();
-        if(avram > 256000000){
-               maxPixelsForFastDisplayMode = 250000; //500x500 px
-        }
-        if(avram > 750000000){
-               maxPixelsForFastDisplayMode = 4000000; //2000x2000 px
-        }
-        //[sstein end]
-    }
-    
-    
-    /**
-     * Constructor to be used in case the image was not loaded from a file, so 
there is
-     * no file name, but an image
-     * 
-     *@param name name of the layer
-     *@param layerManager
-     *@param imageToDisplay the image (if already loaded) or null
-     *@param newRaster the raster (if already loaded) or null
-     *@param envelope real-world coordinates of the image
-     */
-    public RasterImageLayer(String name, LayerManager layerManager, 
BufferedImage imageToDisplay, Raster newRaster, Envelope wholeImageEnvelope) {
-        super(name, layerManager);
-        
-        getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, true);
-        
-        this.setNeedToKeepImage(true);
-        this.originalImageEnvelope = wholeImageEnvelope;
-        
-        if (imageToDisplay != null)
-            this.setImage(imageToDisplay);
-        else{
-            //logger.printError("given image is NULL");
-        }
-        if (newRaster != null) {
-//             this.setRasterData(newRaster);
-        }else{
-            //logger.printError("given raster is NULL");
-        }
-        //[sstein 9.Aug.2010]
-        long avram = getAvailRAM();
-        if(avram > 256000000){
-               maxPixelsForFastDisplayMode = 250000; //500x500 px
-        }
-        if(avram > 750000000){
-               maxPixelsForFastDisplayMode = 563500; //750x750 px
-        }
-        //[sstein end]
-    }
+       protected int xOffset, yOffset;
 
-    @Override
-    public Blackboard getBlackboard() {
-        if (RasterImageLayer.blackboard == null)
-            RasterImageLayer.blackboard = new Blackboard();
-        
-        return RasterImageLayer.blackboard;
-    }
+       //protected static PersonalLogger logger = new 
PersonalLogger(DebugUserIds.OLE);
 
-    @Override
-    public Object clone() throws CloneNotSupportedException {
-        super.clone();
-        RasterImageLayer raster = null;
-        if (this.isNeedToKeepImage()) {
-            try {
-                raster = new RasterImageLayer(getName(), getLayerManager(), 
getImageForDisplay(), getRasterData(null), new 
Envelope(getWholeImageEnvelope()));
-            } catch (IOException ex) {
-                Logger.error(ex);
-            } catch (NoninvertibleTransformException ex) {
-                Logger.error(ex);
-            } catch (Exception ex) {
-                Logger.error(ex);
-            }
-        } else {
-            try {
-                raster = new RasterImageLayer(getName(), getLayerManager(), 
getImageFileName(), getImageForDisplay(), new 
Envelope(getWholeImageEnvelope()));
-            } catch (IOException ex) {
-                Logger.error(ex);
-            } catch (NoninvertibleTransformException ex) {
-                Logger.error(ex);
-            } catch (Exception ex) {
-                Logger.error(ex);
-            }
-        }
-        // clone must produce a layerable with the same name (as for Layer) 
not a unique name
-        if (raster != null) {
-            raster.getLayerManager().setFiringEvents(false);
-            raster.setName(getName());
-            raster.getLayerManager().setFiringEvents(true);
-        }
-        return raster;
-    }
-    
-    /**
-     * apply a scale operation to the image and return the
-     * new image.
-     */
-    protected BufferedImage scaleImage(BufferedImage im, float xScale, float 
yScale) {
+       protected double transparencyLevel = .0f;
+
+
+       protected static long availRAM = Runtime.getRuntime().maxMemory();
+       protected static double freeRamFactor = 0.5;
+       protected static double minRamToKeepFree = availRAM * freeRamFactor;
+       //[sstein 9.Aug.2010]
+       // The value below is set dynamically based on available memory
+       //       now its 200x200px as min (originally it was 500x500)
+       //protected static int maxPixelsForFastDisplayMode = 40000;
+       protected static int maxPixelsForFastDisplayMode = 250000;
+
+       protected String imageFileName = null;
+       protected int origImageWidth, origImageHeight;
+       protected boolean imageSet = false;
+       protected BufferedImage image = null;
+       protected int numBands = 0;
+
+       //-- [sstein 2nd Aug 2010] new, since we scale the image now for display
+       protected Raster actualRasterData = null;
+       protected boolean rasterDataChanged = false; //may be needed for 
rescaling the image values
+       protected boolean wasScaledForDisplay = false;
+       //-- end
+
+       protected BufferedImage imageProcessingStep1 = null, 
imageProcessingStep2 = null;
+
+
+       protected Envelope actualImageEnvelope = null, visibleEnv = null, 
oldVisibleEnv;
+       protected Envelope originalImageEnvelope = null;
+
+       /**
+        * Flag to decide, if events are fired automatically, if the appearance 
(imageEnvelope, etc.) changes.<br>
+        * default: true
+        */
+       protected boolean firingAppearanceEvents = true;
+
+       /**
+        * Flag to control if the image should be deleted from RAM as soon as 
possible to save RAM or if it should be keeped e.g. because it was generated
+        * dynamically and can not be loaded from a file again, once it was 
deleted.
+        */
+       protected boolean needToKeepImage = false;
+
+       protected static final Point nullpunkt = new Point(0,0);
+
+       protected Color transparentColor = null;
+       protected boolean transparencyColorNeedsToBeApplied = false;
+
+       //-- [sstein 26 June 2013] new as with ASCII grid imports nodata values 
can be defined
+       protected double noDataValue = Double.NaN;
+       protected double originalCellSize;
+       protected double actualCellSize;
+       //-- end
+
+       private Metadata metadata;
+
+       private Stats stats;
+
+       private RasterSymbology symbology = null;
+       private boolean symbologyChanged = false;
+       private final UUID uuid = java.util.UUID.randomUUID();
+
+       /**
+        * for java2xml
+        */
+       public RasterImageLayer() {
+               super();
+
+               getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, 
true);
+
+       }
+
+       /**
+        * for java2xml
+        *@return the Envelope as string
+        */
+       public String getXmlEnvelope(){
+               return this.originalImageEnvelope.toString();
+       }
+
+       /**
+        * for java2xml
+        *@param envStr the Envelope as string
+        */
+       public void setXmlEnvelope(String envStr){
+               String coords = envStr.substring(envStr.indexOf("[")+1, 
envStr.indexOf("]"));
+
+               String[] coordArray = coords.split(",");
+
+               String[] xCoords = coordArray[0].split(":");
+               String[] yCoords = coordArray[1].split(":");
+
+               double minX = java.lang.Double.parseDouble(xCoords[0]);
+               double maxX = java.lang.Double.parseDouble(xCoords[1]);
+
+               double minY = java.lang.Double.parseDouble(yCoords[0]);
+               double maxY = java.lang.Double.parseDouble(yCoords[1]);
+
+               this.setWholeImageEnvelope( new Envelope( minX, maxX, minY, 
maxY ) );
+       }    
+
+       /**
+        *@param name name of the layer
+        *@param layerManager
+        * @param imageFileName
+        *@param imageToDisplay the image (if already loaded) or null
+        * @param wholeImageEnvelope
+        */
+       public RasterImageLayer(String name, LayerManager layerManager, String 
imageFileName, BufferedImage imageToDisplay, Envelope wholeImageEnvelope) {
+               super(name, layerManager);
+
+               getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, 
true);
+
+               this.imageFileName = imageFileName;
+               this.originalImageEnvelope = wholeImageEnvelope;
+
+               if (imageToDisplay != null)
+                       this.setImage(imageToDisplay);
+               //        if (newRaster != null)
+               //              this.setRasterData(newRaster);
+               //[sstein 9.Aug.2010]       
+               long avram = getAvailRAM();
+               if(avram > 256000000){
+                       maxPixelsForFastDisplayMode = 250000; //500x500 px
+               }
+               if(avram > 750000000){
+                       maxPixelsForFastDisplayMode = 4000000; //2000x2000 px
+               }
+               //[sstein end]
+       }
+
+
+       /**
+        * Constructor to be used in case the image was not loaded from a file, 
so there is
+        * no file name, but an image
+        * 
+        *@param name name of the layer
+        *@param layerManager
+        *@param imageToDisplay the image (if already loaded) or null
+        *@param newRaster the raster (if already loaded) or null
+        *@param envelope real-world coordinates of the image
+        */
+       public RasterImageLayer(String name, LayerManager layerManager, 
BufferedImage imageToDisplay, Raster newRaster, Envelope wholeImageEnvelope) {
+               super(name, layerManager);
+
+               getBlackboard().put(LayerNameRenderer.USE_CLOCK_ANIMATION_KEY, 
true);
+
+               this.setNeedToKeepImage(true);
+               this.originalImageEnvelope = wholeImageEnvelope;
+
+               if (imageToDisplay != null)
+                       this.setImage(imageToDisplay);
+               else{
+                       //logger.printError("given image is NULL");
+               }
+               if (newRaster != null) {
+                       //              this.setRasterData(newRaster);
+               }else{
+                       //logger.printError("given raster is NULL");
+               }
+               //[sstein 9.Aug.2010]
+               long avram = getAvailRAM();
+               if(avram > 256000000){
+                       maxPixelsForFastDisplayMode = 250000; //500x500 px
+               }
+               if(avram > 750000000){
+                       maxPixelsForFastDisplayMode = 563500; //750x750 px
+               }
+               //[sstein end]
+       }
+
+       @Override
+       public Blackboard getBlackboard() {
+               if (RasterImageLayer.blackboard == null)
+                       RasterImageLayer.blackboard = new Blackboard();
+
+               return RasterImageLayer.blackboard;
+       }
+
+       @Override
+       public Object clone() throws CloneNotSupportedException {
+               super.clone();
+               RasterImageLayer raster = null;
+               if (this.isNeedToKeepImage()) {
+                       try {
+                               raster = new RasterImageLayer(getName(), 
getLayerManager(), getImageForDisplay(), getRasterData(null), new 
Envelope(getWholeImageEnvelope()));
+                       } catch (IOException ex) {
+                               Logger.error(ex);
+                       } catch (NoninvertibleTransformException ex) {
+                               Logger.error(ex);
+                       } catch (Exception ex) {
+                               Logger.error(ex);
+                       }
+               } else {
+                       try {
+                               raster = new RasterImageLayer(getName(), 
getLayerManager(), getImageFileName(), getImageForDisplay(), new 
Envelope(getWholeImageEnvelope()));
+                       } catch (IOException ex) {
+                               Logger.error(ex);
+                       } catch (NoninvertibleTransformException ex) {
+                               Logger.error(ex);
+                       } catch (Exception ex) {
+                               Logger.error(ex);
+                       }
+               }
+               // clone must produce a layerable with the same name (as for 
Layer) not a unique name
+               if (raster != null) {
+                       raster.getLayerManager().setFiringEvents(false);
+                       raster.setName(getName());
+                       raster.getLayerManager().setFiringEvents(true);
+               }
+               return raster;
+       }
+
+
+
+       /**
+        * apply a scale operation to the image and return the
+        * new image.
+        * Giuseppe Aruta [2020-8-26]-  Workaround to solve Error: 
+        * Could not find mediaLib accelerator wrapper class 
+        * This seems also to speed up the rendering of the image
+        * @param before
+        * @param xScale
+        * @param yScale
+        * @return
+        */
+
+       private static BufferedImage scaleImage(BufferedImage im, float xScale, 
float yScale) {
+
+               /*   protected BufferedImage scaleImage(BufferedImage im, float 
xScale, float yScale) {
         ParameterBlock pb = new ParameterBlock();
         pb.addSource(im);
         pb.add(xScale);
         pb.add(yScale);
 
-        return JAI.create("Scale", pb, null).getAsBufferedImage();
-    }
-    
-    
-    
-    protected BufferedImage createOneColorImage(double scaleXImg2Canvas, 
double scaleYImg2Canvas){
-        //logger.printDebug("fixing 1px scale: scaleXImg2Canvas = " + 
scaleXImg2Canvas + ", scaleYImg2Canvas = " + scaleYImg2Canvas);
-        //logger.printDebug("this.imageProcessingStep1: " + 
this.imageProcessingStep1 .getWidth() + ", " + 
this.imageProcessingStep1.getHeight());
-        
-        scaleXImg2Canvas = Math.min( Math.abs(scaleXImg2Canvas), 
Math.abs(visibleRect.width) );
-        scaleYImg2Canvas = Math.min( Math.abs(scaleYImg2Canvas), 
Math.abs(visibleRect.height) );
-        
-        //logger.printDebug("fixed 1px scale: scaleXImg2Canvas = " + 
scaleXImg2Canvas + ", scaleYImg2Canvas = " + scaleYImg2Canvas);
-        
-        BufferedImage bim = new BufferedImage(visibleRect.width, 
visibleRect.height, BufferedImage.TYPE_INT_ARGB);
-        
-        Graphics2D grfcs = bim.createGraphics();
-        
-        grfcs.setColor(new Color(this.imageProcessingStep1.getRGB(0,0)));
-        
-        //logger.printDebug("color: " + new 
Color(this.imageProcessingStep1.getAsBufferedImage().getRGB(0,0)).toString());
-        
-        grfcs.fillRect( 0, 0, bim.getWidth(), bim.getHeight() );
-        
-        grfcs.dispose();
-        
-        return bim;
-        
-        //return PlanarImage.wrapRenderedImage(bim);
-    }
-    
-    /**
-     * Creates the image to draw
-     * @param layerViewPanel
-     * @return 
-     */
-    public BufferedImage createImage(LayerViewPanel layerViewPanel) {
-        
-        Viewport viewport = layerViewPanel.getViewport();
-        
-        if (!this.isVisible() || this.transparencyLevel >= 1.0){
-            this.setImageProcessingMode(RasterImageLayer.MODE_NONE);
-            this.clearImageAndRaster(true);
-            //logger.printDebug("!visible");
-            return null;
-        }
-        
-        BufferedImage imageToDraw = null;
+        return JAI.create("Scale", pb, null).getAsBufferedImage();*/
+               int w = im.getWidth();
+               int h = im.getHeight();
+               int w2 = (int) (w * xScale);
+               int h2 = (int) (h * yScale);
+               BufferedImage newBuff = new BufferedImage(w2, h2, 
BufferedImage.TYPE_INT_ARGB);
+               AffineTransform scaleInstance = 
AffineTransform.getScaleInstance(xScale, yScale);
+               AffineTransformOp scaleOp 
+               = new AffineTransformOp(scaleInstance, 
AffineTransformOp.TYPE_BILINEAR);
+               scaleOp.filter(im, newBuff);
+               return newBuff;
+       }
 
-        try {
-            
-            //GeoTIFFRaster grr = new GeoTIFFRaster((new 
File(imageFileName)).toURI().toString());
-            
-            java.awt.Point imageDims = 
RasterImageIO.getImageDimensions(imageFileName);
-            
-            origImageWidth = imageDims.x;
-            origImageHeight = imageDims.y;            
-            visibleRect = viewport.getPanel().getVisibleRect();
-            
-            int visibleX1 = visibleRect.x;
-            int visibleY1 = visibleRect.y;
-            int visibleX2 = visibleX1 + visibleRect.width;
-            int visibleY2 = visibleY1 + visibleRect.height;
-            
-            Coordinate upperLeftVisible = 
viewport.toModelCoordinate(nullpunkt);
-            Coordinate lowerRightVisible = viewport.toModelCoordinate(new 
Point(visibleX2, visibleY2));
-            
-            Envelope newVisibleEnv = new Envelope(upperLeftVisible.x, 
lowerRightVisible.x, upperLeftVisible.y, lowerRightVisible.y);
-            
-            setImageSet(false);
-            
-            if (visibleEnv == null || visibleEnv.getMinX() != 
newVisibleEnv.getMinX() || visibleEnv.getMaxX() != newVisibleEnv.getMaxX() || 
-                    visibleEnv.getMinY() != newVisibleEnv.getMinY() || 
visibleEnv.getMaxY() != newVisibleEnv.getMaxY() || symbologyChanged){
-                visibleEnv = newVisibleEnv;
-                    
-                symbologyChanged = false;
-                
-                reLoadImage();
-                if(image == null) {
-                    return null;
-                }                    
-                
-                Point2D upperLeftCornerOfImage = viewport.toViewPoint(new 
Coordinate(getActualImageEnvelope().getMinX(), 
getActualImageEnvelope().getMaxY()));
-                Point2D lowerRightCornerOfImage = viewport.toViewPoint(new 
Coordinate(getActualImageEnvelope().getMaxX(), 
getActualImageEnvelope().getMinY()));
 
-                double scaledWidth = lowerRightCornerOfImage.getX() - 
upperLeftCornerOfImage.getX();
-                double scaledHeight = upperLeftCornerOfImage.getY() - 
lowerRightCornerOfImage.getY();
 
-                long totalMem = Runtime.getRuntime().totalMemory();
-                long freeMem = Runtime.getRuntime().freeMemory();
-                long committedMemory = totalMem - freeMem;
-                double maxMemoryToCommit = availRAM - minRamToKeepFree;
-                boolean needFreeRAM = (committedMemory > maxMemoryToCommit);
-                if(needFreeRAM == false){
+       protected BufferedImage createOneColorImage(double scaleXImg2Canvas, 
double scaleYImg2Canvas){
+               //logger.printDebug("fixing 1px scale: scaleXImg2Canvas = " + 
scaleXImg2Canvas + ", scaleYImg2Canvas = " + scaleYImg2Canvas);
+               //logger.printDebug("this.imageProcessingStep1: " + 
this.imageProcessingStep1 .getWidth() + ", " + 
this.imageProcessingStep1.getHeight());
 
-                    setImage(stretchImageValuesForDisplay());
-                    wasScaledForDisplay = true;
+               scaleXImg2Canvas = Math.min( Math.abs(scaleXImg2Canvas), 
Math.abs(visibleRect.width) );
+               scaleYImg2Canvas = Math.min( Math.abs(scaleYImg2Canvas), 
Math.abs(visibleRect.height) );
 
-                    setNeedToKeepImage(true); //so small images are not 
reloaded every time
-                }
+               //logger.printDebug("fixed 1px scale: scaleXImg2Canvas = " + 
scaleXImg2Canvas + ", scaleYImg2Canvas = " + scaleYImg2Canvas);
 
-                //[sstein end]                    
-                imagePart = getVisibleImageCoordinatesOfImage( 
image.getWidth(), image.getHeight(), visibleEnv, getActualImageEnvelope() );
+               BufferedImage bim = new BufferedImage(visibleRect.width, 
visibleRect.height, BufferedImage.TYPE_INT_ARGB);
 
-                double scaleXImg2Canvas = scaledWidth / image.getWidth();
-                double scaleYImg2Canvas = scaledHeight / image.getHeight();
+               Graphics2D grfcs = bim.createGraphics();
 
-                if (imageProcessingStep2 == null || scaleXImg2Canvas != 
oldScaleXImg2Canvas ||
-                        !RasterImageLayer.tilesAreNotNullAndCongruent( 
visibleEnv, oldVisibleEnv)){
+               grfcs.setColor(new 
Color(this.imageProcessingStep1.getRGB(0,0)));
 
-                    imageProcessingStep1 = getVisiblePartOfTheImage( 
getImageForDisplay(), imagePart );
+               //logger.printDebug("color: " + new 
Color(this.imageProcessingStep1.getAsBufferedImage().getRGB(0,0)).toString());
 
-                    if ( imageProcessingStep1 != null) {
-                        // avoid an 1 pixel by 1 pixel image to get scaled to 
thousands by thousands pixels causing an out of memory error
-                        if (imagePart.width == 1 || imagePart.height == 1){
-                            xOffset = 0;
-                            yOffset = 0;
-                            imageProcessingStep2 = 
createOneColorImage(scaleXImg2Canvas, scaleYImg2Canvas);
-                        } else {
-                            imageProcessingStep2 = 
getScaledImageMatchingVisible( imageProcessingStep1, scaleXImg2Canvas, 
scaleYImg2Canvas );
-                        }
+               grfcs.fillRect( 0, 0, bim.getWidth(), bim.getHeight() );
 
-                    } else {
-                        return null;
-                    }
+               grfcs.dispose();
 
-                    if (transparentColor!=null) 
transparencyColorNeedsToBeApplied = true;
+               return bim;
 
-                    imageProcessingStep1 = null;
+               //return PlanarImage.wrapRenderedImage(bim);
+       }
 
-                    xOffset = (int)(xOffset *scaleXImg2Canvas);
-                    yOffset = (int)(yOffset *(-scaleYImg2Canvas));
+       /**
+        * Creates the image to draw
+        * @param layerViewPanel
+        * @return 
+        */
+       public BufferedImage createImage(LayerViewPanel layerViewPanel) {
 
-                    oldScaleXImg2Canvas = scaleXImg2Canvas;
+               Viewport viewport = layerViewPanel.getViewport();
 
-                    oldVisibleEnv = visibleEnv;
-                }
-    
-                               
-            }
-            
-            if (imageProcessingStep2 != null && 
transparencyColorNeedsToBeApplied ){
-                imageToDraw = setupTransparency(imageProcessingStep2);
-            } else if (imageProcessingStep2 != null) {
-                imageToDraw = imageProcessingStep2;
-            }
-            
+               if (!this.isVisible() || this.transparencyLevel >= 1.0){
+                       this.setImageProcessingMode(RasterImageLayer.MODE_NONE);
+                       this.clearImageAndRaster(true);
+                       //logger.printDebug("!visible");
+                       return null;
+               }
 
-        } catch (Exception e){
-            //logger.printError(e.getMessage());
-            e.printStackTrace();
-        }
+               BufferedImage imageToDraw = null;
 
-        if (Runtime.getRuntime().freeMemory() < 
RasterImageLayer.getMinRamToKeepFree()){
-            clearImageAndRaster(true);
-        }
-        
-        if (imageToDraw != null) {
-            return imageToDraw;
-        } else if (imageProcessingStep2!=null) {
-            return imageProcessingStep2;
-        }
-        
-        
-        return null;
-    }
-    
-    /**
-     * deletes image from RAM (if it is not to be kept and if the RAM 
consumption is high)
-     * and calls the garbage collector, if the <code>garbageCollect</code> is 
true.
-     *@param garbageCollect if true the garbage collector will be called (this 
parameter may be overridden, if there is not enough RAM available...)
-     */
-    public boolean clearImageAndRaster(boolean garbageCollect){
-       //TODO: [sstein 9.Aug.2010] not sure if below condition is correct, 
since it 
-       //       does not account for Xmx (max memory), only for the actual 
memory
-       //       Hence we should work with committed memory as I did above??? 
-        boolean reallyNeedToFreeRAM = (Runtime.getRuntime().freeMemory() < 
minRamToKeepFree);
-        if (!needToKeepImage && reallyNeedToFreeRAM ){
-            //this.image = null;
-            //rasterData = null; //[sstein 2Aug2010] line added
-            wasScaledForDisplay = false; //[sstein 20Aug2010] line added
-        }
-        if (garbageCollect){
-            Runtime.getRuntime().gc();
-        }
-        return reallyNeedToFreeRAM;
-    }
-    
-    /**
-     * flushes all images from the RAM.
-     *@param garbageCollect if true the garbage collector will be called (this 
parameter may be overridden, if there is not enough RAM available...)
-     */
-    public void flushImages(boolean garbageCollect){
-        if (image!=null)
-            image.flush();
-        image = null;
-        
-        if (imageProcessingStep1!=null)
-            imageProcessingStep1.flush();
-        imageProcessingStep1 = null;
-        
-        if (imageProcessingStep2!=null)
-            imageProcessingStep2.flush();
-        imageProcessingStep2 = null;
-    
-        if (garbageCollect){
-            Runtime.getRuntime().gc();
-        }
-    }
-    
-    public void reLoadImage() throws IOException, 
NoninvertibleTransformException, FileNotFoundException, 
TiffTags.TiffReadingException, Exception{
-        
-        //if (image == null && !needToKeepImage){
-        
-        RasterImageIO rasterImageIO = new RasterImageIO();
+               try {
 
-        Viewport viewport = 
getWorkbenchContext().getLayerViewPanel().getViewport();
-        
if(!viewport.getEnvelopeInModelCoordinates().intersects(originalImageEnvelope) 
&&
-                
getWorkbenchContext().getLayerManager().getLayerables(Layerable.class).isEmpty())
 {
-            viewport.zoom(originalImageEnvelope);
-        }
-        
-//        Rectangle visibleRect = viewport.getPanel().getVisibleRect();
-            
-        Resolution requestedRes = 
RasterImageIO.calcRequestedResolution(viewport);
-        
-        ImageAndMetadata imageAndMetadata = 
rasterImageIO.loadImage(getWorkbenchContext(), imageFileName, stats, 
viewport.getEnvelopeInModelCoordinates(), requestedRes);
-        metadata = imageAndMetadata.getMetadata();
-        image = imageAndMetadata.getImage();
-        numBands = metadata.getStats().getBandCount();
-        noDataValue = imageAndMetadata.getMetadata().getNoDataValue();
-        stats = imageAndMetadata.getMetadata().getStats();
-        originalImageEnvelope = 
imageAndMetadata.getMetadata().getOriginalImageEnvelope();
-        actualImageEnvelope = 
imageAndMetadata.getMetadata().getActualEnvelope();
-        originalCellSize = 
imageAndMetadata.getMetadata().getOriginalCellSize();        
-        actualCellSize = imageAndMetadata.getMetadata().getActualCellSize();
-        
-        if(image != null) {
-            setImage(image);
-        }
-        wasScaledForDisplay = false;
-        
-        if(image != null) {
-            actualRasterData = image.copyData(null);      
-        } else {
-            actualRasterData = null;
-        }
-    }
-    
-    /**
-     * use this to assign the raster data again
-     * the method is called from  getRasterData();
-     */
-    public void reLoadImageButKeepImageForDisplay() throws IOException,
-            NoninvertibleTransformException, FileNotFoundException, 
TiffTags.TiffReadingException, Exception{
-       WorkbenchContext context = getWorkbenchContext();
-       BufferedImage pi = getImageForDisplay();
-       //[sstein 24.Sept.2010] commented out:
-       //PlanarImage dontNeedThisImage = RasterImageLayer.loadImage( context, 
imageFileName); //causes error for .clone()
-       this.setImage(pi);
-    }
-    
-    protected BufferedImage stretchImageValuesForDisplay() throws 
NoninvertibleTransformException{
-        
-        int width = actualRasterData.getWidth();
-        int height = actualRasterData.getHeight();  
-        
-        // Need to change image type to support transparency and apply 
symbology
-        if(image.getColorModel() instanceof IndexColorModel) {
-            return image;  
-        }
-        
-        BufferedImage newImage = new BufferedImage(width, height, 
BufferedImage.TYPE_4BYTE_ABGR);
-        for (int row = 0; row < height; row++) {
-            for (int col = 0; col < width; col++) {
+                       //GeoTIFFRaster grr = new GeoTIFFRaster((new 
File(imageFileName)).toURI().toString());
 
-                if(symbology == null) {
-                    if(stats.getBandCount() < 3) {
-                        
-                        final RasterSymbology rasterSymbology;
-                        if (metadata.getStats().getMin(0) == metadata
-                                .getStats().getMax(0)) {
-                            rasterSymbology = new 
RasterSymbology(RasterSymbology.TYPE_SINGLE);
-                        } else {
-                            rasterSymbology = new 
RasterSymbology(RasterSymbology.TYPE_RAMP);
-                        }
-                        
rasterSymbology.addColorMapEntry(metadata.getNoDataValue(), transparentColor);
-                        
rasterSymbology.addColorMapEntry(metadata.getStats().getMin(0), Color.WHITE);
-                        
rasterSymbology.addColorMapEntry(metadata.getStats().getMax(0), Color.BLACK);
-                        setSymbology(rasterSymbology);
-                        
-                    } else {
-                        double valueR = actualRasterData.getSampleDouble(col, 
row, 0);
-                        double valueG = actualRasterData.getSampleDouble(col, 
row, 1);
-                        double valueB = actualRasterData.getSampleDouble(col, 
row, 2);
-                        double valueAlpha = 255;
-                        if(stats.getBandCount() > 3) {
-                            valueAlpha = actualRasterData.getSampleDouble(col, 
row, 3);
-                        }
-                        if(Double.isNaN(valueR) || Double.isInfinite(valueR) 
|| valueR == noDataValue
-                                || Double.isNaN(valueG) || 
Double.isInfinite(valueG) || valueG == noDataValue
-                                || Double.isNaN(valueB) || 
Double.isInfinite(valueB) || valueB == noDataValue
-                                || valueAlpha <= 0) {
-                            newImage.setRGB(col, row, Color.TRANSLUCENT);
-                            continue;
-                        }
-                        
-                        int r = (int) ((valueR - stats.getMin(0)) * 
255./(stats.getMax(0) - stats.getMin(0)));
-                        if(r > 255) r = 255;
-                        if(r < 0) r = 0;
-                        int g = (int) ((valueG - stats.getMin(1)) * 
255./(stats.getMax(1) - stats.getMin(0)));
-                        if(g > 255) g = 255;
-                        if(g < 0) g = 0;
-                        int b = (int) ((valueB - stats.getMin(2)) * 
255./(stats.getMax(2) - stats.getMin(0)));
-                        if(b > 255) b = 255;
-                        if(b < 0) b = 0;
+                       java.awt.Point imageDims = 
RasterImageIO.getImageDimensions(imageFileName);
 
-                        int alpha = (int) valueAlpha;
-                        
-                        newImage.setRGB(col, row, new Color(r, g, b, 
alpha).getRGB());
-                    }
-                } else {
-                    // Symbology exists
-                    double value = actualRasterData.getSampleDouble(col, row, 
0);
-                    
-                    /**
-                     * If symbology min value is higher than raster min value
-                     * the value becomes equal to the symbology min value
-                     */
-                    
-                    Double[] symbologyClassLimits =  
symbology.getColorMapEntries_tm().keySet().toArray(new 
Double[symbology.getColorMapEntries_tm().keySet().size()]);
-                    double symbMinValue = symbologyClassLimits[0];
-                    double symbFirstValue = symbologyClassLimits[0];
-                    if(this.isNoData(symbFirstValue)) {
-                        symbMinValue = symbologyClassLimits[1];
-                    }
-                    
-                    if(!this.isNoData(value) && value < symbMinValue) {
-                        value = symbMinValue;
-                    }
-                    
-                    Color color = symbology.getColor(value);
-                    
-                    if((Double.isNaN(value) || Double.isInfinite(value) || 
this.isNoData(value))
-                            && color == null) {
-                        newImage.setRGB(col, row, Color.TRANSLUCENT);
-                        continue;
-                    }
-                    
-                    // Transparency is a combination of total layer 
transparency
-                    // and single cell transparency
-                    int transparency = 
-                            (int)(((1 - symbology.getTransparency()) * 
-                            (color.getAlpha() / 255d)) * 255);
-                    newImage.setRGB(col, row, new Color(
-                            color.getRed(),
-                            color.getGreen(),
-                            color.getBlue(),
-                            transparency).getRGB());
-                }  
-            }
-        }
+                       origImageWidth = imageDims.x;
+                       origImageHeight = imageDims.y;            
+                       visibleRect = viewport.getPanel().getVisibleRect();
 
-        return newImage;
-    }
-    
-    /**
-     * @return Envelope with the real world coordinates of the image
-     */
-    public Envelope getWholeImageEnvelope() {
-        return originalImageEnvelope;
-    }
-    
-    public Envelope getActualImageEnvelope() {
-        return actualImageEnvelope;
-    }
-    
-    /**
-     * Sets the Envelope object containing the real world coordinates (e.g. 
WGS84) of the image - this needs to be set (if it wasn't given to the 
constructor)!
-     *@param envelope the Envelope
-     */
-    private void setWholeImageEnvelope(Envelope envelope) {
-        originalImageEnvelope = envelope;
-        
-        forceTotalRepaint();
-        
-        if (this.isFiringAppearanceEvents())
-            this.fireAppearanceChanged();
-    }
-    
-    private void setActualImageEnvelope(Envelope envelope) {
-        actualImageEnvelope = envelope;
-        
-        forceTotalRepaint();
-        
-        if (isFiringAppearanceEvents())
-            fireAppearanceChanged();
-    }
-    
-    /**
-     * for java2xml
-     *@return the Envelope as string
-     */
-    public String getXmlWholeImageEnvelope(){
-        return this.originalImageEnvelope.toString();
-    }
-    
-    public String getXmlActualImageEnvelope() {
-        return this.actualImageEnvelope.toString();
-    }
-    
-    /**
-     * for java2xml
-     *@param envStr the Envelope as string
-     */
-    public void setXmlWholeImageEnvelope(String envStr){
-        String coords = envStr.substring(envStr.indexOf("[")+1, 
envStr.indexOf("]"));
-        
-        String[] coordArray = coords.split(",");
-        
-        String[] xCoords = coordArray[0].split(":");
-        String[] yCoords = coordArray[1].split(":");
-        
-        double minX = java.lang.Double.parseDouble(xCoords[0]);
-        double maxX = java.lang.Double.parseDouble(xCoords[1]);
-        
-        double minY = java.lang.Double.parseDouble(yCoords[0]);
-        double maxY = java.lang.Double.parseDouble(yCoords[1]);
-        
-        this.setWholeImageEnvelope( new Envelope( minX, maxX, minY, maxY ) );
-    }
-    
-    public void setXmlActualImageEnvelope(String envStr){
-        String coords = envStr.substring(envStr.indexOf("[")+1, 
envStr.indexOf("]"));
-        
-        String[] coordArray = coords.split(",");
-        
-        String[] xCoords = coordArray[0].split(":");
-        String[] yCoords = coordArray[1].split(":");
-        
-        double minX = java.lang.Double.parseDouble(xCoords[0]);
-        double maxX = java.lang.Double.parseDouble(xCoords[1]);
-        
-        double minY = java.lang.Double.parseDouble(yCoords[0]);
-        double maxY = java.lang.Double.parseDouble(yCoords[1]);
-        
-        this.setActualImageEnvelope( new Envelope( minX, maxX, minY, maxY ) );
-    }
-    
-    /**
-     * Method to change the coordinates of the image and later apply the
-     * changes to the RasterImageLayer by using {@link 
RasterImageLayer#setGeometryAsEnvelope(Geometry)}.
-     *@return return the imageEnvelope (= bounding box) as a geometry, 
-     */
-    public Polygon getWholeImageEnvelopeAsGeometry(){
-        Coordinate[] coordinates = new Coordinate[5];
-        
-        coordinates[0] = new Coordinate(originalImageEnvelope.getMinX(), 
originalImageEnvelope.getMaxY());
-        coordinates[1] = new Coordinate(originalImageEnvelope.getMaxX(), 
originalImageEnvelope.getMaxY());
-        coordinates[2] = new Coordinate(originalImageEnvelope.getMaxX(), 
originalImageEnvelope.getMinY());
-        coordinates[3] = new Coordinate(originalImageEnvelope.getMinX(), 
originalImageEnvelope.getMinY());
-        coordinates[4] = new Coordinate(originalImageEnvelope.getMinX(), 
originalImageEnvelope.getMaxY());
-        
-        GeometryFactory gf = new GeometryFactory();
-        
-        return gf.createPolygon(gf.createLinearRing(coordinates), null);
-    }
-    
-    public Polygon getActualImageEnvelopeAsGeometry(){
-        Coordinate[] coordinates = new Coordinate[5];
-        
-        coordinates[0] = new Coordinate(actualImageEnvelope.getMinX(), 
actualImageEnvelope.getMaxY());
-        coordinates[1] = new Coordinate(actualImageEnvelope.getMaxX(), 
actualImageEnvelope.getMaxY());
-        coordinates[2] = new Coordinate(actualImageEnvelope.getMaxX(), 
actualImageEnvelope.getMinY());
-        coordinates[3] = new Coordinate(actualImageEnvelope.getMinX(), 
actualImageEnvelope.getMinY());
-        coordinates[4] = new Coordinate(actualImageEnvelope.getMinX(), 
actualImageEnvelope.getMaxY());
-        
-        GeometryFactory gf = new GeometryFactory();
-        
-        return gf.createPolygon(gf.createLinearRing(coordinates), null);
-    }
-    
-    /**
-     * Method to set the coordinates of the image, e.g. after changing them 
after using {@link RasterImageLayer#getEnvelopeAsGeometry()}.
-     */
-    public void setGeometryAsWholeImageEnvelope(Geometry geometry){
-        setWholeImageEnvelope(geometry.getEnvelopeInternal());
-    }
-    
-    public void setGeometryAsActualImageEnvelope(Geometry geometry){
-        setActualImageEnvelope(geometry.getEnvelopeInternal());
-    }
-    
-    /**
-     * Add transparency to the image (more exactly: to each pixel which a 
color == this.transparentColor)
-     *@param pImage the image
-     */
-    private BufferedImage setupTransparency(BufferedImage bim){
-        //BufferedImage bim = pImage.getAsBufferedImage();
-        
-        ColorModel cm = bim.getColorModel();
-        int fullTransparencyAlpha = 255;
-        
-        if (this.getTransparentColor()==null){
-            return null;
-        }
-        
-        int transparentColor = this.getTransparentColor().getRGB();
-        
-        int currentColor = -1;
-        int[] argb = new int[4];
-        
-        if (!cm.hasAlpha()){
-            bim = RasterImageLayer.makeBufferedImage(bim);
-            cm = bim.getColorModel();
-           
-        }
-        
-        for( int w=0; w<bim.getWidth(); w++){
-            for (int h=0; h<bim.getHeight(); h++){
-                
-                currentColor = bim.getRGB(w,h);
-                
-                if (currentColor==transparentColor){
-                    Color color = new Color(bim.getRGB(w, h));
-                    
-                    argb[0] = fullTransparencyAlpha;
-                    argb[1] = color.getRed();
-                    argb[2] = color.getGreen();
-                    argb[3] = color.getBlue();
-                    
-                    bim.setRGB(w,h,1,1,argb,0,1);
-                }
-            }
-        }
-        
-        return bim;
-    }
-    
-    private void setImageProcessingMode( int nr ){
-        if (lastImgProcessingMode != nr){
-            if (imageProcessingStep1!=null)
-                imageProcessingStep1.flush();
-            imageProcessingStep1 = null;
-            
-            if (imageProcessingStep2!=null)
-                imageProcessingStep2.flush();
-            imageProcessingStep2 = null;
+                       int visibleX1 = visibleRect.x;
+                       int visibleY1 = visibleRect.y;
+                       int visibleX2 = visibleX1 + visibleRect.width;
+                       int visibleY2 = visibleY1 + visibleRect.height;
 
-            imagePart = null;
-            
-            oldScaleXImg2Canvas = -1;
-            
-            if (Runtime.getRuntime().freeMemory() < 
RasterImageLayer.getMinRamToKeepFree()){
-                Runtime.getRuntime().gc();
-            }
-            
-            lastImgProcessingMode = nr;
-        }
-    }
-    
+                       Coordinate upperLeftVisible = 
viewport.toModelCoordinate(nullpunkt);
+                       Coordinate lowerRightVisible = 
viewport.toModelCoordinate(new Point(visibleX2, visibleY2));
 
-    private static boolean tilesAreNotNullAndCongruent( Envelope 
oldVisibleEnv, Envelope newVisibleEnv ){
+                       Envelope newVisibleEnv = new 
Envelope(upperLeftVisible.x, lowerRightVisible.x, upperLeftVisible.y, 
lowerRightVisible.y);
 
-        if (oldVisibleEnv == null || newVisibleEnv == null) return true;
-        return (oldVisibleEnv.getMinX() == newVisibleEnv.getMinX() &&
-                oldVisibleEnv.getMaxX() == newVisibleEnv.getMaxX() &&
-                oldVisibleEnv.getMinY() == newVisibleEnv.getMinY() &&
-                oldVisibleEnv.getMaxY() == newVisibleEnv.getMaxY());
-        
-    }
-    
-    /**
-     * creates a BufferedImage out of an Image
-     *@param im the Image
-     *@return the BufferedImage
-     */
-    public static final BufferedImage makeBufferedImage(Image im) { 
-        BufferedImage copy = new BufferedImage(im.getWidth(null), 
im.getHeight(null), BufferedImage.TYPE_INT_ARGB); 
-        // create a graphics context 
-        Graphics2D g2d = copy.createGraphics(); 
-        // copy image 
-        g2d.drawImage(im,0,0,null); 
-        g2d.dispose(); 
-        return copy; 
-    }
-    
-    protected BufferedImage getScaledImageMatchingVisible( BufferedImage 
toBeScaled, double XscaleImg2Canvas, double YscaleImg2Canvas ){
+                       setImageSet(false);
 
-        if (toBeScaled==null) return null;
-        
-        int scaledWidth = (int)(toBeScaled.getWidth() * XscaleImg2Canvas);
-        int scaledHeight = (int)(toBeScaled.getHeight() * 
Math.abs(YscaleImg2Canvas) );
-        
-        if (scaledWidth<=0 || scaledHeight<=0) return null;
-        
-        return scaleImage(toBeScaled, (float)XscaleImg2Canvas, 
(float)Math.abs(YscaleImg2Canvas) );
+                       if (visibleEnv == null || visibleEnv.getMinX() != 
newVisibleEnv.getMinX() || visibleEnv.getMaxX() != newVisibleEnv.getMaxX() || 
+                                       visibleEnv.getMinY() != 
newVisibleEnv.getMinY() || visibleEnv.getMaxY() != newVisibleEnv.getMaxY() || 
symbologyChanged){
+                               visibleEnv = newVisibleEnv;
 
-    }
-    
-    public BufferedImage getTileAsImage( Envelope wantedEnvelope ) throws 
IOException, NoninvertibleTransformException, FileNotFoundException, 
TiffTags.TiffReadingException, Exception{
-        double imgWidth = image.getWidth();
-        double imgHeight = image.getHeight();
-        Envelope imageEnv = getActualImageEnvelope();
-        
-        double minVisibleX = Math.max(wantedEnvelope.getMinX(), 
imageEnv.getMinX());
-        double minVisibleY = Math.max(wantedEnvelope.getMinY(), 
imageEnv.getMinY());
-        
-        double maxVisibleX = Math.min(wantedEnvelope.getMaxX(), 
imageEnv.getMaxX());
-        double maxVisibleY = Math.min(wantedEnvelope.getMaxY(), 
imageEnv.getMaxY());
-        
-        double offset2VisibleX = imageEnv.getMinX() - wantedEnvelope.getMinX();
-        double offset2VisibleY = wantedEnvelope.getMaxY() - imageEnv.getMaxY();
-        
-        double scaleX = imgWidth / imageEnv.getWidth();
-        double scaleY = imgHeight / imageEnv.getHeight();
-        
-        // use local variables!
-        int xOffset, yOffset, width, height;
-        
-        if (offset2VisibleX >= 0){
-            xOffset = 0;
-        } else {
-            xOffset = (int)(-offset2VisibleX * scaleX);
-        }
-        
-        if (offset2VisibleY >= 0){
-            yOffset = 0;
-        } else {
-            yOffset = (int)(-offset2VisibleY * scaleY);
-        }
-        
-        width = (int)((maxVisibleX-minVisibleX) * scaleX);
-        height =  (int)((maxVisibleY-minVisibleY) * scaleY);
-        
-        if (width < imgWidth && height < imgHeight){ 
-            width += 1;
-            height += 1;
-        }
-        
-        
-        if (width <= 0 || height <= 0) return null;
-        
-        int wantedWidth = (int)(wantedEnvelope.getWidth() * scaleX);
-        int wantedHeight = (int)(wantedEnvelope.getHeight() * scaleY);
-        
-        if (image==null){
-            reLoadImage();
-        }
-        
-        BufferedImage imgTile = this.image.getSubimage(xOffset, yOffset, 
width, height);
-        
-        BufferedImage result = new BufferedImage( wantedWidth, wantedHeight, 
BufferedImage.TYPE_INT_ARGB);
-        
-        Graphics2D graf = result.createGraphics();
-        
-        Color backgroundColor = 
(this.transparentColor!=null)?this.transparentColor:Color.white;
-        
-        graf.fillRect(0,0,wantedWidth, wantedHeight);
-        
-        int xTileOffset,yTileOffset;
-        
-        if (xOffset > 0){
-            xTileOffset = 0;
-        } else {
-            xTileOffset = (int)(offset2VisibleX * scaleX);
-        }
-        
-        if (yOffset > 0){
-            yTileOffset = 0;
-        } else {
-            yTileOffset = (int)(offset2VisibleY * scaleY);
-        }
-        
-        graf.drawImage(imgTile, xTileOffset, yTileOffset, imgTile.getWidth(), 
imgTile.getHeight(), backgroundColor, null);
-        graf.dispose();
-        
-        this.clearImageAndRaster(false);
-        
-        return result;
-    }
-    
-//    public Raster getTileAsRaster( Envelope wantedEnvelope ) throws 
IOException{
-//
-//        double imgWidth = origImageWidth;
-//        double imgHeight = origImageHeight;
-//        Envelope imageEnv = originalImageEnvelope;
-//        
-//        double minVisibleX = Math.max(wantedEnvelope.getMinX(), 
imageEnv.getMinX());
-//        double minVisibleY = Math.max(wantedEnvelope.getMinY(), 
imageEnv.getMinY());
-//        
-//        double maxVisibleX = Math.min(wantedEnvelope.getMaxX(), 
imageEnv.getMaxX());
-//        double maxVisibleY = Math.min(wantedEnvelope.getMaxY(), 
imageEnv.getMaxY());
-//        
-//        double offset2VisibleX = imageEnv.getMinX() - 
wantedEnvelope.getMinX();
-//        double offset2VisibleY = wantedEnvelope.getMaxY() - 
imageEnv.getMaxY();
-//        
-//        double scaleX = imgWidth / imageEnv.getWidth();
-//        double scaleY = imgHeight / imageEnv.getHeight();
-//        
-//        // use local variables!
-//        int xOffset, yOffset, width, height;
-//        
-//        if (offset2VisibleX >= 0){
-//            xOffset = 0;
-//        } else {
-//            xOffset = (int)(-offset2VisibleX * scaleX);
-//        }
-//        
-//        if (offset2VisibleY >= 0){
-//            yOffset = 0;
-//        } else {
-//            yOffset = (int)(-offset2VisibleY * scaleY);
-//        }
-//        
-//        width = (int)((maxVisibleX-minVisibleX) * scaleX);
-//        height =  (int)((maxVisibleY-minVisibleY) * scaleY);
-//        
-//        if (width < imgWidth && height < imgHeight){ 
-//            width += 1;
-//            height += 1;
-//        }
-//        
-//        
-//        if (width <= 0 || height <= 0) return null;
-//        
-//        int wantedWidth = (int)(wantedEnvelope.getWidth() * scaleX);
-//        int wantedHeight = (int)(wantedEnvelope.getHeight() * scaleY);
-//        
-//        Rectangle subset = new Rectangle(xOffset, yOffset, wantedWidth, 
wantedHeight);
-//        Raster rasterData = RasterImageIO.loadRasterData(imageFileName, 
subset);
-//        return rasterData;
-//        
-//        
-////        ColorModel colorModel = 
PlanarImage.createColorModel(rasterData.getSampleModel());
-////        BufferedImage bufimg = new BufferedImage(colorModel, 
(WritableRaster) rasterData, false, null);
-////        PlanarImage pimage = PlanarImage.wrapRenderedImage(bufimg);
-////        
-////        BufferedImage imgTile = pimage.getAsBufferedImage( new 
Rectangle(xOffset, yOffset, width, height), pimage.getColorModel());
-////        
-////        BufferedImage result = new BufferedImage( wantedWidth, 
wantedHeight, BufferedImage.TYPE_INT_ARGB);
-////        
-////        Graphics2D graf = result.createGraphics();
-////        
-////        Color backgroundColor = 
(this.transparentColor!=null)?this.transparentColor:Color.white;
-////        
-////        graf.fillRect(0,0,wantedWidth, wantedHeight);
-////        
-////        int xTileOffset,yTileOffset;
-////        
-////        if (xOffset > 0){
-////            xTileOffset = 0;
-////        } else {
-////            xTileOffset = (int)(offset2VisibleX * scaleX);
-////        }
-////        
-////        if (yOffset > 0){
-////            yTileOffset = 0;
-////        } else {
-////            yTileOffset = (int)(offset2VisibleY * scaleY);
-////        }
-////        
-////        graf.drawImage(imgTile, xTileOffset, yTileOffset, 
imgTile.getWidth(), imgTile.getHeight(), backgroundColor, null);
-////        graf.dispose();
-////        
-////        this.clearImageAndRaster(false);
-////        
-////        return result.getData();
-//    }
-    
-    protected WorkbenchContext getWorkbenchContext(){
-        return 
(WorkbenchContext)this.getBlackboard().get(BLACKBOARD_KEY_WORKBENCHCONTEXT);
-    }
-    
-    public static void setWorkbenchContext(WorkbenchContext wContext){
-        if (blackboard==null)
-            blackboard = new Blackboard();
-        
-        blackboard.put(BLACKBOARD_KEY_WORKBENCHCONTEXT, wContext);
-    }
-    
-    public Rectangle getDrawingRectangle( double imgWidth, double imgHeight, 
Envelope imageEnv, Viewport viewport ) throws NoninvertibleTransformException{
-        
-        Rectangle visible = viewport.getPanel().getVisibleRect();
-        
-        Point2D upperLeftCorner = null;
-        Point2D lowerRightCorner = null;
-        
-        try {
-            upperLeftCorner = viewport.toViewPoint(new 
Coordinate(imageEnv.getMinX(), imageEnv.getMaxY()));
-            lowerRightCorner = viewport.toViewPoint(new 
Coordinate(imageEnv.getMaxX(), imageEnv.getMinY()));
-        } catch(java.awt.geom.NoninvertibleTransformException ne) {
-            //logger.printError(ne.getLocalizedMessage());
-            ne.printStackTrace();
-            return null;
-        }
-        
-        int visibleX1 = visible.x;
-        int visibleY1 = visible.y;
-        int visibleX2 = visibleX1 + visible.width;
-        int visibleY2 = visibleY1 + visible.height;
-        
-        Coordinate upperLeftVisible = viewport.toModelCoordinate(nullpunkt);
-        Coordinate lowerRightVisible = viewport.toModelCoordinate(new 
Point(visibleX2, visibleY2));
-        
-        Envelope newVisibleEnv = new Envelope(upperLeftVisible.x, 
lowerRightVisible.x, upperLeftVisible.y, lowerRightVisible.y);
-        
-        Rectangle rect = getVisibleImageCoordinatesOfImage(imgWidth, 
imgHeight, newVisibleEnv, imageEnv);
-        
-        if (rect==null) return null;
-        
-        double scaledWidth = lowerRightCorner.getX() - upperLeftCorner.getX();
-        double scaledHeight = upperLeftCorner.getY() - lowerRightCorner.getY();
-        
-        
-        double scaleXImg2Canvas = scaledWidth / imgWidth;
-        double scaleYImg2Canvas = scaledHeight / imgHeight;
-        
-        rect.width *= scaleXImg2Canvas;
-        rect.height *= scaleYImg2Canvas;
-        
-        return rect;
-    }
-    
-    protected Rectangle getVisibleImageCoordinatesOfImage( double imgWidth, 
double imgHeight, Envelope visible, Envelope imageEnv ){
-        
-        double minVisibleX = Math.max(visible.getMinX(), imageEnv.getMinX());
-        double minVisibleY = Math.max(visible.getMinY(), imageEnv.getMinY());
-        
-        double maxVisibleX = Math.min(visible.getMaxX(), imageEnv.getMaxX());
-        double maxVisibleY = Math.min(visible.getMaxY(), imageEnv.getMaxY());
-        
-        double offset2VisibleX = imageEnv.getMinX() - visible.getMinX();
-        double offset2VisibleY = visible.getMaxY() - imageEnv.getMaxY();
-        
-        double scaleX = imgWidth / imageEnv.getWidth();
-        double scaleY = imgHeight / imageEnv.getHeight();
-        
-        if (offset2VisibleX >= 0){
-            xOffset = 0;
-        } else {
-            xOffset = (int)(-offset2VisibleX * scaleX);
-        }
-        
-        if (offset2VisibleY >= 0){
-            yOffset = 0;
-        } else {
-            yOffset = (int)(-offset2VisibleY * scaleY);
-        }
-        
-        int width = (int)((maxVisibleX-minVisibleX) * scaleX);
-        int height =  (int)((maxVisibleY-minVisibleY) * scaleY);
-        
-        if (width < imgWidth && height < imgHeight){ 
-            width += 1;
-            height += 1;
-        }
-        
-        
-        if (width <= 0 || height <= 0){
-            return null;
-        }
-        
-        return new Rectangle(xOffset, yOffset, width, height);
-    }
-    
-   
-    protected Rectangle getVisibleImageCoordinatesOfImage( BufferedImage img, 
Envelope visible, Envelope imageEnv ){
-        return this.getVisibleImageCoordinatesOfImage( img.getWidth(), 
img.getHeight(), visible, imageEnv );
-    }
-    
-    protected BufferedImage getVisiblePartOfTheImage( BufferedImage img, 
Rectangle desiredImageArea ){
-        if (desiredImageArea==null){
-            return null;
-        }
-        if ( desiredImageArea.width > 0 && desiredImageArea.height > 0 ){
-            if (desiredImageArea.width + desiredImageArea.x <= img.getWidth() 
&&
-                    desiredImageArea.height + desiredImageArea.y <= 
img.getHeight() ) {
-                
-                ParameterBlock pb = new ParameterBlock();
-                pb.addSource(img);
-                pb.add((float) desiredImageArea.x);
-                pb.add((float) desiredImageArea.y);
-                pb.add((float) desiredImageArea.width);
-                pb.add((float) desiredImageArea.height);
-                
-                return JAI.create("crop", pb).getAsBufferedImage();
-                
-            }
+                               symbologyChanged = false;
 
-            //return PlanarImage.wrapRenderedImage( img.getAsBufferedImage( 
new Rectangle(desiredImageArea.x, desiredImageArea.y, desiredImageArea.width, 
desiredImageArea.height), img.getColorModel() ));
-            //logger.printWarning("desired area invalid: " + 
(desiredImageArea.width + desiredImageArea.x) + ", " + (desiredImageArea.height 
+ desiredImageArea.y) + "; image dimensions: " + img.getWidth() + ", " + 
img.getHeight());
-        } 
-        return null;
-    }
+                               reLoadImage();
+                               if(image == null) {
+                                       return null;
+                               }                    
 
-    public BufferedImage getImage() {
-        return image;
-    }
-    
-    
-    /**
-     * Sets the image that will be shown in the map (also sets some interally 
used flags)
-     *@param image image that will be shown in the map
-     */
-    public void setImage(BufferedImage image) {
-        this.image = image;
-        //origImageWidth = image.getWidth();
-        //origImageHeight = image.getHeight();
-        imageSet = true;
-    }
-    
-    
-    
-    public void setImageSet(boolean imageSet) {
-        this.imageSet = imageSet;
-    }
+                               Point2D upperLeftCornerOfImage = 
viewport.toViewPoint(new Coordinate(getActualImageEnvelope().getMinX(), 
getActualImageEnvelope().getMaxY()));
+                               Point2D lowerRightCornerOfImage = 
viewport.toViewPoint(new Coordinate(getActualImageEnvelope().getMaxX(), 
getActualImageEnvelope().getMinY()));
 
-    public boolean isImageNull(){
-        return this.image == null;
-    }
-    
-    /**
-     * returns the image, this can be modified - i.e. is just a 
representation. 
-     *@return the image
-     */
-    public BufferedImage getImageForDisplay() throws IOException, 
NoninvertibleTransformException, FileNotFoundException, 
TiffTags.TiffReadingException, Exception{
-        if (image == null)
-            reLoadImage();
-        return image;
-    }
-    
-    /**
-     *@return true, if the image object was set at least once, else false
-     */
-    public boolean isImageSet() {
-        return imageSet;
-    }
-    
-    /**
-     * Returns the transparency level of the image. The transparencyLevel 
controlls the transparency level of the whole image (all pixels). It
-     * is independent of the transparency color, that replaces a certain color 
in the image. 
-     * The transparencyLevel is expressed as a float within a range from 0.0 
(no transparency) to 1.0 (full transparency).
-     *@return the transparency level of the image
-     */
-    public double getTransparencyLevel() {
-        return transparencyLevel;
-    }
-    
-  
-    /**
-     * Sets the transparency level of the image. This controlls the 
transparency level of the whole image (all pixels). It
-     * is independent of the transparency color, that replaces a certain color 
in the image. 
-     * The transparencyLevel is expressed as a float within a range from 0.0 
(no transparency) to 1.0 (full transparency).
-     *@param transparencyLevel the transparency level of the image
-     */
-    public void setTransparencyLevel(double transparencyLevel) {
-        if (transparencyLevel != this.transparencyLevel){
-            this.transparencyLevel = transparencyLevel;
-            
-            if (this.isFiringAppearanceEvents()) 
-                this.fireAppearanceChanged();
-        }
-    }
-    /**
-     * Sets the transparency level of the image. This controlls the 
transparency level of the whole image (all pixels). It
-     * is independent of the transparency color, that replaces a certain color 
in the image. 
-     * The transparencyLevel is expressed as a percentage within a range from 
0 (no transparency) to 100 (full transparency).
-     *@param transparencyInPercent the transparency level of the image
-     */
-    public void setTransparencyLevelInPercent(int transparencyInPercent) {
-        double tLevel = transparencyInPercent/100.0;
-        if (tLevel != this.transparencyLevel){
-            this.transparencyLevel = tLevel;
-            if (this.isFiringAppearanceEvents()) 
-                this.fireAppearanceChanged();
-        }
-    }
-    
-    /**
-     * Gets the color which will be drawn with a zero opacity in the Jump map
-     *@return color that will be replaced with transparent pixels
-     */
-    public Color getTransparentColor() {
-        return transparentColor;
-    }
-    
-    /**
-     * for java2xml
-     */
-    public String getTransparentColorAsString() {
-       if (this.getTransparentColor()==null)
-               return "null";
-       
-        String hexColor = 
Integer.toHexString(this.getTransparentColor().getRGB());
-        if (hexColor.length()>6){
-               hexColor = hexColor.substring(2);
-        }
-        return hexColor;
-    }
-    
-    /**
-     * for java2xml
-     */
-    public void setTransparentColorAsString(String hexColorString) {
-       if (hexColorString==null || hexColorString.equals("null")){
-               return;
-       }
-       
-       int rgb = Integer.parseInt(hexColorString.toUpperCase(), 16);
-       
-       Color tColor = new Color(rgb);
+                               double scaledWidth = 
lowerRightCornerOfImage.getX() - upperLeftCornerOfImage.getX();
+                               double scaledHeight = 
upperLeftCornerOfImage.getY() - lowerRightCornerOfImage.getY();
 
-       this.setTransparentColor(tColor);
-    }
-    
-    /**
-     * Sets the color which will be drawn with a zero opacity in the Jump map
-     *@param transparentColor the color for transparency
-     */
-    public void setTransparentColor(Color transparentColor) {
-        if (this.transparentColor != transparentColor && 
(this.transparentColor==null || 
!this.transparentColor.equals(transparentColor))){
-         
-            this.transparentColor = transparentColor;
-            
-            this.forceTotalRepaint();
-            
-            if (this.isFiringAppearanceEvents()) 
-                this.fireAppearanceChanged();
-        }
-    }
-    
-    /**
-     * After this method was invoked, the image will be
-     * completely re-rendered (not using caches) the next time.
-     */
-    protected void forceTotalRepaint(){
-        this.visibleEnv = null;
-        this.setImageProcessingMode(RasterImageLayer.MODE_NONE);
-    }
+                               long totalMem = 
Runtime.getRuntime().totalMemory();
+                               long freeMem = 
Runtime.getRuntime().freeMemory();
+                               long committedMemory = totalMem - freeMem;
+                               double maxMemoryToCommit = availRAM - 
minRamToKeepFree;
+                               boolean needFreeRAM = (committedMemory > 
maxMemoryToCommit);
+                               if(needFreeRAM == false){
 
-    /**
-     *@return the current offset (to the viewport's <code>(0,0)</code>) in x 
direction 
-     */
-    public int getXOffset() {
-        return xOffset;
-    }
+                                       
setImage(stretchImageValuesForDisplay());
+                                       wasScaledForDisplay = true;
 
-    /**
-     *@return the current offset (to the viewport's <code>(0,0)</code>) in y 
direction 
-     */
-    public int getYOffset() {
-        return yOffset;
-    }
-    
-    public static double getFreeRamFactor() {
-        return freeRamFactor;
-    }
+                                       setNeedToKeepImage(true); //so small 
images are not reloaded every time
+                               }
 
-    public static void setFreeRamFactor(double freeRamFactor) {
-        //logger.printDebug("setting freeRamFactor to " + freeRamFactor);
-        RasterImageLayer.freeRamFactor = freeRamFactor;
-        RasterImageLayer.minRamToKeepFree = RasterImageLayer.availRAM * 
RasterImageLayer.freeRamFactor;
-        RasterImageLayer.maxPixelsForFastDisplayMode = 
(int)((RasterImageLayer.availRAM - 
RasterImageLayer.minRamToKeepFree)/(1024*1024) * 3000);
-        //logger.printDebug("maxPixelsForFastDisplayMode: " + 
maxPixelsForFastDisplayMode);
-    }
+                               //[sstein end]                    
+                               imagePart = getVisibleImageCoordinatesOfImage( 
image.getWidth(), image.getHeight(), visibleEnv, getActualImageEnvelope() );
 
+                               double scaleXImg2Canvas = scaledWidth / 
image.getWidth();
+                               double scaleYImg2Canvas = scaledHeight / 
image.getHeight();
 
-    public static long getAvailRAM() {
-        return availRAM;
-    }
+                               if (imageProcessingStep2 == null || 
scaleXImg2Canvas != oldScaleXImg2Canvas ||
+                                               
!RasterImageLayer.tilesAreNotNullAndCongruent( visibleEnv, oldVisibleEnv)){
 
-    public static int getMaxPixelsForFastDisplayMode() {
-        return maxPixelsForFastDisplayMode;
-    }
+                                       imageProcessingStep1 = 
getVisiblePartOfTheImage( getImageForDisplay(), imagePart );
 
-    public static double getMinRamToKeepFree() {
-        return minRamToKeepFree;
-    }
+                                       if ( imageProcessingStep1 != null) {
+                                               // avoid an 1 pixel by 1 pixel 
image to get scaled to thousands by thousands pixels causing an out of memory 
error
+                                               if (imagePart.width == 1 || 
imagePart.height == 1){
+                                                       xOffset = 0;
+                                                       yOffset = 0;
+                                                       imageProcessingStep2 = 
createOneColorImage(scaleXImg2Canvas, scaleYImg2Canvas);
+                                               } else {
+                                                       imageProcessingStep2 = 
getScaledImageMatchingVisible( imageProcessingStep1, scaleXImg2Canvas, 
scaleYImg2Canvas );
+                                               }
 
-    /**
-     * Sets the image's files name (if image is not to be keeped) - this needs 
to be set!
-     *@param imageFileName the file name of the image
-     */
-    public void setImageFileName(String imageFileName) {
-        this.imageFileName = imageFileName;
-        this.setNeedToKeepImage(false);
-    }
-    
-    
-    /**
-     * 
-     *@return the file name of the image represented by this instance of the 
<code>RasterImageLayer</code>
-     */
-    public String getImageFileName() {
-        return imageFileName;
-    }
+                                       } else {
+                                               return null;
+                                       }
 
-    /**
-     * check, if image will be keeped in RAM or if it will be reloaded from a 
file
-     * if needed
-     *@return true if image will be keeped in RAM, else false
-     */
-    public boolean isNeedToKeepImage() {
-        return needToKeepImage;
-    }
-    /**
-     * toogle, if image will be keeped in RAM or if it will be reloaded from a 
file
-     * if needed
-     *@param needToKeepImage true if image is supposed be keeped in RAM, else 
false
-     */
-    public void setNeedToKeepImage(boolean needToKeepImage) {
-        this.needToKeepImage = needToKeepImage;
-    }
+                                       if (transparentColor!=null) 
transparencyColorNeedsToBeApplied = true;
 
-    protected void finalize() throws Throwable {
-        super.finalize();
-        this.flushImages(true);
-    }
+                                       imageProcessingStep1 = null;
 
-    /**
-     *@return the height of the source image
-     */
-    public int getOrigImageHeight() {
-        return origImageHeight;
-    }
+                                       xOffset = (int)(xOffset 
*scaleXImg2Canvas);
+                                       yOffset = (int)(yOffset 
*(-scaleYImg2Canvas));
 
-    /**
-     *@return the width of the source image
-     */
-    public int getOrigImageWidth() {
-        return origImageWidth;
-    }
+                                       oldScaleXImg2Canvas = scaleXImg2Canvas;
 
-    
-    /**
-     * for java2xml
-     *@param origImageHeight
-     */
-    public void setOrigImageHeight(int origImageHeight) {
-        this.origImageHeight = origImageHeight;
-    }
+                                       oldVisibleEnv = visibleEnv;
+                               }
 
-    /**
-     * for java2xml
-     *@param origImageWidth
-     */
-    public void setOrigImageWidth(int origImageWidth) {
-        this.origImageWidth = origImageWidth;
-    }
 
-    /**
-     * shows or hides the image in the Jump map
-     *@param visible
-     */
-    public void setVisible(boolean visible) {
-        super.setVisible(visible);
-        
-        if (!visible)
-            this.clearImageAndRaster(true);
-        
-        if (this.isFiringAppearanceEvents())
-            this.fireAppearanceChanged();
-    }
-    
+                       }
 
-    /**
-     * @see #firingAppearanceEvents
-     *@return true if appearance events are fired automatically, false if not
-     */
-    public boolean isFiringAppearanceEvents() {
-        return firingAppearanceEvents;
-    }
+                       if (imageProcessingStep2 != null && 
transparencyColorNeedsToBeApplied ){
+                               imageToDraw = 
setupTransparency(imageProcessingStep2);
+                       } else if (imageProcessingStep2 != null) {
+                               imageToDraw = imageProcessingStep2;
+                       }
 
-    /**
-     * @see #firingAppearanceEvents
-     *@param firingAppearanceEvents true if appearance events are to be fired 
automatically, false if not
-     */
-    public void setFiringAppearanceEvents(boolean firingAppearanceEvents) {
-        this.firingAppearanceEvents = firingAppearanceEvents;
-    }    
-    
-    // Metainformation stuff
-    
-    protected MetaDataMap metaInformation = null;
-    
-    @Override
-    public MetaDataMap getMetaInformation() {
-        return metaInformation;
-    }
 
-    @Override
-    public void setMetaInformation(MetaDataMap metaInformation) {
-        this.metaInformation = metaInformation;
-    }
+               } catch (Exception e){
+                       //logger.printError(e.getMessage());
+                       e.printStackTrace();
+               }
 
-    public Raster getRasterData(Rectangle subset) throws IOException {
-        
-        Raster raster = RasterImageIO.loadRasterData(imageFileName, subset);   
     
-        return raster;
-        
-    }
-    
-    public Rectangle getRectangleFromEnvelope(Envelope envelope) throws 
IOException {
-        
-        double imgWidth = origImageWidth;
-        double imgHeight = origImageHeight;
-        Envelope imageEnv = originalImageEnvelope;
-        
-        double minVisibleX = Math.max(envelope.getMinX(), imageEnv.getMinX());
-        double minVisibleY = Math.max(envelope.getMinY(), imageEnv.getMinY());
-        
-        double maxVisibleX = Math.min(envelope.getMaxX(), imageEnv.getMaxX());
-        double maxVisibleY = Math.min(envelope.getMaxY(), imageEnv.getMaxY());
-        
-        double offset2VisibleX = imageEnv.getMinX() - envelope.getMinX();
-        double offset2VisibleY = envelope.getMaxY() - imageEnv.getMaxY();
-        
-        double scaleX = imgWidth / imageEnv.getWidth();
-        double scaleY = imgHeight / imageEnv.getHeight();
-        
-        // use local variables!
-        int xOffset, yOffset, width, height;
-        
-        if (offset2VisibleX >= 0){
-            xOffset = 0;
-        } else {
-            xOffset = (int)(-offset2VisibleX * scaleX);
-        }
-        
-        if (offset2VisibleY >= 0){
-            yOffset = 0;
-        } else {
-            yOffset = (int)(-offset2VisibleY * scaleY);
-        }
-        
-        width = (int)((maxVisibleX-minVisibleX) * scaleX);
-        height =  (int)((maxVisibleY-minVisibleY) * scaleY);
-        
-        if (width < imgWidth && height < imgHeight){ 
-            width += 1;
-            height += 1;
-        }
-        
-        
-        if (width <= 0 || height <= 0) return null;
-        
-        int wantedWidth = (int)(envelope.getWidth() * scaleX);
-        int wantedHeight = (int)(envelope.getHeight() * scaleY);
-        
-        Rectangle subset = new Rectangle(xOffset, yOffset, wantedWidth, 
wantedHeight);
-        return subset;
-        
-    }
-    
-//    /**
-//     * to set the Raster data, use also setImage()
-//     * @param newRaster
-//     */
-//    public void setRasterData(Raster newRaster) {
-//            rasterData = newRaster;
-//            setRasterDataChanged(true);
-//    }
+               if (Runtime.getRuntime().freeMemory() < 
RasterImageLayer.getMinRamToKeepFree()){
+                       clearImageAndRaster(true);
+               }
 
-       
-    /**
-     * @return the rasterDataChanged
-     */
-    public boolean isRasterDataChanged() {
-            return rasterDataChanged;
-    }
+               if (imageToDraw != null) {
+                       return imageToDraw;
+               } else if (imageProcessingStep2!=null) {
+                       return imageProcessingStep2;
+               }
 
-    /**
-     * @param rasterDataChanged the rasterDataChanged to set
-     */
-    public void setRasterDataChanged(boolean rasterDataChanged) {
-            this.rasterDataChanged = rasterDataChanged;
-    }
-       
-    /**
-     * Default value is NaN. The value can be different when data have been 
read, 
-     * for example, from (ESRI) ASCII grid images
-     * @return value that is written when a cell does not contain data
-     */
-    public double getNoDataValue() {
-        return noDataValue;
-    }    
-    
-    /**
-     * TODO: sstein test - 25.Sept.2013
-     * @return
-     */
-    public int getNumBands(){
-       return numBands;
-    }
-    
-    public void dispose() {
-    // TODO: probably a good idea to remove resources when the layer is closed 
up
-    // dunno what is needed to clean up Sextante though, hence leave it for now
-    }
-           
-    public Double getCellValue(Coordinate coordinate, int band) throws 
RasterDataNotFoundException, IOException {
-        
-        return getCellValue(coordinate.x, coordinate.y, band);
-        
-    }
-    
-    public Double getCellValue(int col, int row, int band) throws 
RasterDataNotFoundException, IOException {
 
-        int pos = row * origImageWidth + col;
-        if(pos <0 || pos > origImageWidth * origImageHeight) return null;
-                       
-        return RasterImageIO.readCellValue(imageFileName, col, row, band);
-        
-    }
+               return null;
+       }
 
-    public Double getCellValue(double coordX, double coordY, int band) throws 
RasterDataNotFoundException, IOException {
-        
-        double cellSizeX = (originalImageEnvelope.getMaxX() - 
originalImageEnvelope.getMinX()) / origImageWidth;
-        double cellSizeY = (originalImageEnvelope.getMaxY() - 
originalImageEnvelope.getMinY()) / origImageHeight;
-        
-        int col = (int) Math.floor((coordX - originalImageEnvelope.getMinX()) 
/ cellSizeX);
-        int row = origImageHeight - (int) Math.floor((coordY - 
originalImageEnvelope.getMinY()) / cellSizeY) - 1;
-        
-        if(col <0 || col >= origImageWidth || row <0 || row >= 
origImageHeight) return null;
-        
-        int pos = row * origImageWidth + col;
-        
-        return RasterImageIO.readCellValue(imageFileName, col, row, band);
-        
-    }   
-    
-    public boolean isNoData(double value) {
-        if(Double.isInfinite(noDataValue) && Double.isInfinite(value)) {
-            return true;
-        }
-        if(Double.isNaN(noDataValue) && Double.isNaN(value)) {
-            return true;
-        }
-        return(value == noDataValue || (float)value == (float)noDataValue);
-    }
+       /**
+        * deletes image from RAM (if it is not to be kept and if the RAM 
consumption is high)
+        * and calls the garbage collector, if the <code>garbageCollect</code> 
is true.
+        *@param garbageCollect if true the garbage collector will be called 
(this parameter may be overridden, if there is not enough RAM available...)
+        */
+       public boolean clearImageAndRaster(boolean garbageCollect){
+               //TODO: [sstein 9.Aug.2010] not sure if below condition is 
correct, since it 
+               //       does not account for Xmx (max memory), only for the 
actual memory
+               //       Hence we should work with committed memory as I did 
above??? 
+               boolean reallyNeedToFreeRAM = 
(Runtime.getRuntime().freeMemory() < minRamToKeepFree);
+               if (!needToKeepImage && reallyNeedToFreeRAM ){
+                       //this.image = null;
+                       //rasterData = null; //[sstein 2Aug2010] line added
+                       wasScaledForDisplay = false; //[sstein 20Aug2010] line 
added
+               }
+               if (garbageCollect){
+                       Runtime.getRuntime().gc();
+               }
+               return reallyNeedToFreeRAM;
+       }
 
-    public Metadata getMetadata() {
-        return metadata;
-    }
-    
-    public class RasterDataNotFoundException extends Exception {
-    
-    }
-    
-    public static Rectangle getViewportRectangle(WorkbenchContext 
workbenchContext) {
-        
-        Rectangle viewportRectangle = new Rectangle(
-                0,
-                0,
-                workbenchContext.getLayerViewPanel().getVisibleRect().width,
-                workbenchContext.getLayerViewPanel().getVisibleRect().height);
-        return viewportRectangle;
-                
-    }
-    
-    public RasterSymbology getSymbology() {
-        return symbology;
-    }
-    
-    public void setSymbology(RasterSymbology symbology) throws 
NoninvertibleTransformException {
-        this.symbology = symbology;
-        symbologyChanged = true;
-//        setImage(stretchImageValuesForDisplay());
-        
-//        forceTotalRepaint();
-//        if (isFiringAppearanceEvents()) {
-//            fireAppearanceChanged();
-//        }
-        imageProcessingStep2 = null;
-        LayerViewPanel layerViewPanel = 
getWorkbenchContext().getLayerViewPanel();
-        if(layerViewPanel != null) {
-            layerViewPanel.getViewport().update();
-        }
-    }
+       /**
+        * flushes all images from the RAM.
+        *@param garbageCollect if true the garbage collector will be called 
(this parameter may be overridden, if there is not enough RAM available...)
+        */
+       public void flushImages(boolean garbageCollect){
+               if (image!=null)
+                       image.flush();
+               image = null;
 
-    public Raster getActualRasterData() {
-        return actualRasterData;
-    }
-    
-    public UUID getUUID() {
-        return uuid;
-    }
-    
-  
-    /*
-     *  Giuseppe Aruta 26/01/2015
-     *  Some experimental boolean methods 
-     */
-    
-    /**
-     * Check if selected sextante raster layer is Temporary layer
-     * Both layers in memory and layes stored into TEMP folder are considered
-     * as "Temporary layers"
-     */
-    public boolean isTemporaryLayer() {
-         if (imageFileName.contains(System.getProperty("java.io.tmpdir"))) {
-                 return true;
-             } else{
-                 return false;
-             }
-         } 
-   
- 
-   
-    private final static String NODATASOURCELAYER= I18N
-            
.get("org.openjump.core.ui.plugin.layer.LayerPropertiesPlugIn.nodatasourcelayer.message");
+               if (imageProcessingStep1!=null)
+                       imageProcessingStep1.flush();
+               imageProcessingStep1 = null;
+
+               if (imageProcessingStep2!=null)
+                       imageProcessingStep2.flush();
+               imageProcessingStep2 = null;
+
+               if (garbageCollect){
+                       Runtime.getRuntime().gc();
+               }
+       }
+
+       public void reLoadImage() throws IOException, 
NoninvertibleTransformException, FileNotFoundException, 
TiffTags.TiffReadingException, Exception{
+
+               //if (image == null && !needToKeepImage){
+
+               RasterImageIO rasterImageIO = new RasterImageIO();
+
+               Viewport viewport = 
getWorkbenchContext().getLayerViewPanel().getViewport();
+               
if(!viewport.getEnvelopeInModelCoordinates().intersects(originalImageEnvelope) 
&&
+                               
getWorkbenchContext().getLayerManager().getLayerables(Layerable.class).isEmpty())
 {
+                       viewport.zoom(originalImageEnvelope);
+               }
+
+               //        Rectangle visibleRect = 
viewport.getPanel().getVisibleRect();
+
+               Resolution requestedRes = 
RasterImageIO.calcRequestedResolution(viewport);
+
+               ImageAndMetadata imageAndMetadata = 
rasterImageIO.loadImage(getWorkbenchContext(), imageFileName, stats, 
viewport.getEnvelopeInModelCoordinates(), requestedRes);
+               metadata = imageAndMetadata.getMetadata();
+               image = imageAndMetadata.getImage();
+               numBands = metadata.getStats().getBandCount();
+               noDataValue = imageAndMetadata.getMetadata().getNoDataValue();
+               stats = imageAndMetadata.getMetadata().getStats();
+               originalImageEnvelope = 
imageAndMetadata.getMetadata().getOriginalImageEnvelope();
+               actualImageEnvelope = 
imageAndMetadata.getMetadata().getActualEnvelope();
+               originalCellSize = 
imageAndMetadata.getMetadata().getOriginalCellSize();        
+               actualCellSize = 
imageAndMetadata.getMetadata().getActualCellSize();
+
+               if(image != null) {
+                       setImage(image);
+               }
+               wasScaledForDisplay = false;
+
+               if(image != null) {
+                       actualRasterData = image.copyData(null);      
+               } else {
+                       actualRasterData = null;
+               }
+       }
+
        /**
-     *@return the file path of a RasterImageLayer.class
-     *eg. C/File/imagename.tif. If the file path is a TEMP folder
-     * it returns that the layer has no datasource
-     */
-    public String getFilePath() {
-       String fileName = null;
-       if (!imageFileName.contains(System.getProperty("java.io.tmpdir"))) {
-               fileName = getImageFileName();
-         } else{
-                fileName = NODATASOURCELAYER;
-         }
-       return fileName;
-       }
-   
-    //[Giuseppe Aruta 04/01/2017] SRS info for RasterImageLayer.class
-    private SRSInfo srsInfo;
+        * use this to assign the raster data again
+        * the method is called from  getRasterData();
+        */
+       public void reLoadImageButKeepImageForDisplay() throws IOException,
+       NoninvertibleTransformException, FileNotFoundException, 
TiffTags.TiffReadingException, Exception{
+               WorkbenchContext context = getWorkbenchContext();
+               BufferedImage pi = getImageForDisplay();
+               //[sstein 24.Sept.2010] commented out:
+               //PlanarImage dontNeedThisImage = RasterImageLayer.loadImage( 
context, imageFileName); //causes error for .clone()
+               this.setImage(pi);
+       }
 
-    public SRSInfo getSRSInfo() {
-        return srsInfo;
-    }
+       protected BufferedImage stretchImageValuesForDisplay() throws 
NoninvertibleTransformException{
 
-    public void setSRSInfo(SRSInfo srs) {
-        this.srsInfo = srs;
-    }
-    
-    
+               int width = actualRasterData.getWidth();
+               int height = actualRasterData.getHeight();  
+
+               // Need to change image type to support transparency and apply 
symbology
+               if(image.getColorModel() instanceof IndexColorModel) {
+                       return image;  
+               }
+
+               BufferedImage newImage = new BufferedImage(width, height, 
BufferedImage.TYPE_4BYTE_ABGR);
+               for (int row = 0; row < height; row++) {
+                       for (int col = 0; col < width; col++) {
+
+                               if(symbology == null) {
+                                       if(stats.getBandCount() < 3) {
+
+                                               final RasterSymbology 
rasterSymbology;
+                                               if 
(metadata.getStats().getMin(0) == metadata
+                                                               
.getStats().getMax(0)) {
+                                                       rasterSymbology = new 
RasterSymbology(RasterSymbology.TYPE_SINGLE);
+                                               } else {
+                                                       rasterSymbology = new 
RasterSymbology(RasterSymbology.TYPE_RAMP);
+                                               }
+                                               
rasterSymbology.addColorMapEntry(metadata.getNoDataValue(), transparentColor);
+                                               
rasterSymbology.addColorMapEntry(metadata.getStats().getMin(0), Color.WHITE);
+                                               
rasterSymbology.addColorMapEntry(metadata.getStats().getMax(0), Color.BLACK);
+                                               setSymbology(rasterSymbology);
+
+                                       } else {
+                                               double valueR = 
actualRasterData.getSampleDouble(col, row, 0);
+                                               double valueG = 
actualRasterData.getSampleDouble(col, row, 1);
+                                               double valueB = 
actualRasterData.getSampleDouble(col, row, 2);
+                                               double valueAlpha = 255;
+                                               if(stats.getBandCount() > 3) {
+                                                       valueAlpha = 
actualRasterData.getSampleDouble(col, row, 3);
+                                               }
+                                               if(Double.isNaN(valueR) || 
Double.isInfinite(valueR) || valueR == noDataValue
+                                                               || 
Double.isNaN(valueG) || Double.isInfinite(valueG) || valueG == noDataValue
+                                                               || 
Double.isNaN(valueB) || Double.isInfinite(valueB) || valueB == noDataValue
+                                                               || valueAlpha 
<= 0) {
+                                                       newImage.setRGB(col, 
row, Color.TRANSLUCENT);
+                                                       continue;
+                                               }
+
+                                               int r = (int) ((valueR - 
stats.getMin(0)) * 255./(stats.getMax(0) - stats.getMin(0)));
+                                               if(r > 255) r = 255;
+                                               if(r < 0) r = 0;
+                                               int g = (int) ((valueG - 
stats.getMin(1)) * 255./(stats.getMax(1) - stats.getMin(0)));
+                                               if(g > 255) g = 255;
+                                               if(g < 0) g = 0;
+                                               int b = (int) ((valueB - 
stats.getMin(2)) * 255./(stats.getMax(2) - stats.getMin(0)));
+                                               if(b > 255) b = 255;
+                                               if(b < 0) b = 0;
+
+                                               int alpha = (int) valueAlpha;
+
+                                               newImage.setRGB(col, row, new 
Color(r, g, b, alpha).getRGB());
+                                       }
+                               } else {
+                                       // Symbology exists
+                                       double value = 
actualRasterData.getSampleDouble(col, row, 0);
+
+                                       /**
+                                        * If symbology min value is higher 
than raster min value
+                                        * the value becomes equal to the 
symbology min value
+                                        */
+
+                                       Double[] symbologyClassLimits =  
symbology.getColorMapEntries_tm().keySet().toArray(new 
Double[symbology.getColorMapEntries_tm().keySet().size()]);
+                                       double symbMinValue = 
symbologyClassLimits[0];
+                                       double symbFirstValue = 
symbologyClassLimits[0];
+                                       if(this.isNoData(symbFirstValue)) {
+                                               symbMinValue = 
symbologyClassLimits[1];
+                                       }
+
+                                       if(!this.isNoData(value) && value < 
symbMinValue) {
+                                               value = symbMinValue;
+                                       }
+
+                                       Color color = symbology.getColor(value);
+
+                                       if((Double.isNaN(value) || 
Double.isInfinite(value) || this.isNoData(value))
+                                                       && color == null) {
+                                               newImage.setRGB(col, row, 
Color.TRANSLUCENT);
+                                               continue;
+                                       }
+
+                                       // Transparency is a combination of 
total layer transparency
+                                       // and single cell transparency
+                                       int transparency = 
+                                                       (int)(((1 - 
symbology.getTransparency()) * 
+                                                                       
(color.getAlpha() / 255d)) * 255);
+                                       newImage.setRGB(col, row, new Color(
+                                                       color.getRed(),
+                                                       color.getGreen(),
+                                                       color.getBlue(),
+                                                       transparency).getRGB());
+                               }  
+                       }
+               }
+
+               return newImage;
+       }
+
+       /**
+        * @return Envelope with the real world coordinates of the image
+        */
+       public Envelope getWholeImageEnvelope() {
+               return originalImageEnvelope;
+       }
+
+       public Envelope getActualImageEnvelope() {
+               return actualImageEnvelope;
+       }
+
+       /**
+        * Sets the Envelope object containing the real world coordinates (e.g. 
WGS84) of the image - this needs to be set (if it wasn't given to the 
constructor)!
+        *@param envelope the Envelope
+        */
+       private void setWholeImageEnvelope(Envelope envelope) {
+               originalImageEnvelope = envelope;
+
+               forceTotalRepaint();
+
+               if (this.isFiringAppearanceEvents())
+                       this.fireAppearanceChanged();
+       }
+
+       private void setActualImageEnvelope(Envelope envelope) {
+               actualImageEnvelope = envelope;
+
+               forceTotalRepaint();
+
+               if (isFiringAppearanceEvents())
+                       fireAppearanceChanged();
+       }
+
+       /**
+        * for java2xml
+        *@return the Envelope as string
+        */
+       public String getXmlWholeImageEnvelope(){
+               return this.originalImageEnvelope.toString();
+       }
+
+       public String getXmlActualImageEnvelope() {
+               return this.actualImageEnvelope.toString();
+       }
+
+       /**
+        * for java2xml
+        *@param envStr the Envelope as string
+        */
+       public void setXmlWholeImageEnvelope(String envStr){
+               String coords = envStr.substring(envStr.indexOf("[")+1, 
envStr.indexOf("]"));
+
+               String[] coordArray = coords.split(",");
+
+               String[] xCoords = coordArray[0].split(":");
+               String[] yCoords = coordArray[1].split(":");
+
+               double minX = java.lang.Double.parseDouble(xCoords[0]);
+               double maxX = java.lang.Double.parseDouble(xCoords[1]);
+
+               double minY = java.lang.Double.parseDouble(yCoords[0]);
+               double maxY = java.lang.Double.parseDouble(yCoords[1]);
+
+               this.setWholeImageEnvelope( new Envelope( minX, maxX, minY, 
maxY ) );
+       }
+
+       public void setXmlActualImageEnvelope(String envStr){
+               String coords = envStr.substring(envStr.indexOf("[")+1, 
envStr.indexOf("]"));
+
+               String[] coordArray = coords.split(",");
+
+               String[] xCoords = coordArray[0].split(":");
+               String[] yCoords = coordArray[1].split(":");
+
+               double minX = java.lang.Double.parseDouble(xCoords[0]);
+               double maxX = java.lang.Double.parseDouble(xCoords[1]);
+
+               double minY = java.lang.Double.parseDouble(yCoords[0]);
+               double maxY = java.lang.Double.parseDouble(yCoords[1]);
+
+               this.setActualImageEnvelope( new Envelope( minX, maxX, minY, 
maxY ) );
+       }
+
+       /**
+        * Method to change the coordinates of the image and later apply the
+        * changes to the RasterImageLayer by using {@link 
RasterImageLayer#setGeometryAsEnvelope(Geometry)}.
+        *@return return the imageEnvelope (= bounding box) as a geometry, 
+        */
+       public Polygon getWholeImageEnvelopeAsGeometry(){
+               Coordinate[] coordinates = new Coordinate[5];
+
+               coordinates[0] = new 
Coordinate(originalImageEnvelope.getMinX(), originalImageEnvelope.getMaxY());
+               coordinates[1] = new 
Coordinate(originalImageEnvelope.getMaxX(), originalImageEnvelope.getMaxY());
+               coordinates[2] = new 
Coordinate(originalImageEnvelope.getMaxX(), originalImageEnvelope.getMinY());
+               coordinates[3] = new 
Coordinate(originalImageEnvelope.getMinX(), originalImageEnvelope.getMinY());
+               coordinates[4] = new 
Coordinate(originalImageEnvelope.getMinX(), originalImageEnvelope.getMaxY());
+
+               GeometryFactory gf = new GeometryFactory();
+
+               return gf.createPolygon(gf.createLinearRing(coordinates), null);
+       }
+
+       public Polygon getActualImageEnvelopeAsGeometry(){
+               Coordinate[] coordinates = new Coordinate[5];
+
+               coordinates[0] = new Coordinate(actualImageEnvelope.getMinX(), 
actualImageEnvelope.getMaxY());
+               coordinates[1] = new Coordinate(actualImageEnvelope.getMaxX(), 
actualImageEnvelope.getMaxY());
+               coordinates[2] = new Coordinate(actualImageEnvelope.getMaxX(), 
actualImageEnvelope.getMinY());
+               coordinates[3] = new Coordinate(actualImageEnvelope.getMinX(), 
actualImageEnvelope.getMinY());
+               coordinates[4] = new Coordinate(actualImageEnvelope.getMinX(), 
actualImageEnvelope.getMaxY());
+
+               GeometryFactory gf = new GeometryFactory();
+
+               return gf.createPolygon(gf.createLinearRing(coordinates), null);
+       }
+
+       /**
+        * Method to set the coordinates of the image, e.g. after changing them 
after using {@link RasterImageLayer#getEnvelopeAsGeometry()}.
+        */
+       public void setGeometryAsWholeImageEnvelope(Geometry geometry){
+               setWholeImageEnvelope(geometry.getEnvelopeInternal());
+       }
+
+       public void setGeometryAsActualImageEnvelope(Geometry geometry){
+               setActualImageEnvelope(geometry.getEnvelopeInternal());
+       }
+
+       /**
+        * Add transparency to the image (more exactly: to each pixel which a 
color == this.transparentColor)
+        *@param pImage the image
+        */
+       private BufferedImage setupTransparency(BufferedImage bim){
+               //BufferedImage bim = pImage.getAsBufferedImage();
+
+               ColorModel cm = bim.getColorModel();
+               int fullTransparencyAlpha = 255;
+
+               if (this.getTransparentColor()==null){
+                       return null;
+               }
+
+               int transparentColor = this.getTransparentColor().getRGB();
+
+               int currentColor = -1;
+               int[] argb = new int[4];
+
+               if (!cm.hasAlpha()){
+                       bim = RasterImageLayer.makeBufferedImage(bim);
+                       cm = bim.getColorModel();
+
+               }
+
+               for( int w=0; w<bim.getWidth(); w++){
+                       for (int h=0; h<bim.getHeight(); h++){
+
+                               currentColor = bim.getRGB(w,h);
+
+                               if (currentColor==transparentColor){
+                                       Color color = new Color(bim.getRGB(w, 
h));
+
+                                       argb[0] = fullTransparencyAlpha;
+                                       argb[1] = color.getRed();
+                                       argb[2] = color.getGreen();
+                                       argb[3] = color.getBlue();
+
+                                       bim.setRGB(w,h,1,1,argb,0,1);
+                               }
+                       }
+               }
+
+               return bim;
+       }
+
+       private void setImageProcessingMode( int nr ){
+               if (lastImgProcessingMode != nr){
+                       if (imageProcessingStep1!=null)
+                               imageProcessingStep1.flush();
+                       imageProcessingStep1 = null;
+
+                       if (imageProcessingStep2!=null)
+                               imageProcessingStep2.flush();
+                       imageProcessingStep2 = null;
+
+                       imagePart = null;
+
+                       oldScaleXImg2Canvas = -1;
+
+                       if (Runtime.getRuntime().freeMemory() < 
RasterImageLayer.getMinRamToKeepFree()){
+                               Runtime.getRuntime().gc();
+                       }
+
+                       lastImgProcessingMode = nr;
+               }
+       }
+
+
+       private static boolean tilesAreNotNullAndCongruent( Envelope 
oldVisibleEnv, Envelope newVisibleEnv ){
+
+               if (oldVisibleEnv == null || newVisibleEnv == null) return true;
+               return (oldVisibleEnv.getMinX() == newVisibleEnv.getMinX() &&
+                               oldVisibleEnv.getMaxX() == 
newVisibleEnv.getMaxX() &&
+                               oldVisibleEnv.getMinY() == 
newVisibleEnv.getMinY() &&
+                               oldVisibleEnv.getMaxY() == 
newVisibleEnv.getMaxY());
+
+       }
+
+       /**
+        * creates a BufferedImage out of an Image
+        *@param im the Image
+        *@return the BufferedImage
+        */
+       public static final BufferedImage makeBufferedImage(Image im) { 
+               BufferedImage copy = new BufferedImage(im.getWidth(null), 
im.getHeight(null), BufferedImage.TYPE_INT_ARGB); 
+               // create a graphics context 
+               Graphics2D g2d = copy.createGraphics(); 
+               // copy image 
+               g2d.drawImage(im,0,0,null); 
+               g2d.dispose(); 
+               return copy; 
+       }
+
+       protected BufferedImage getScaledImageMatchingVisible( BufferedImage 
toBeScaled, double XscaleImg2Canvas, double YscaleImg2Canvas ){
+
+               if (toBeScaled==null) return null;
+
+               int scaledWidth = (int)(toBeScaled.getWidth() * 
XscaleImg2Canvas);
+               int scaledHeight = (int)(toBeScaled.getHeight() * 
Math.abs(YscaleImg2Canvas) );
+
+               if (scaledWidth<=0 || scaledHeight<=0) return null;
+
+               return scaleImage(toBeScaled, (float)XscaleImg2Canvas, 
(float)Math.abs(YscaleImg2Canvas) );
+
+       }
+
+       public BufferedImage getTileAsImage( Envelope wantedEnvelope ) throws 
IOException, NoninvertibleTransformException, FileNotFoundException, 
TiffTags.TiffReadingException, Exception{
+               double imgWidth = image.getWidth();
+               double imgHeight = image.getHeight();
+               Envelope imageEnv = getActualImageEnvelope();
+
+               double minVisibleX = Math.max(wantedEnvelope.getMinX(), 
imageEnv.getMinX());
+               double minVisibleY = Math.max(wantedEnvelope.getMinY(), 
imageEnv.getMinY());
+
+               double maxVisibleX = Math.min(wantedEnvelope.getMaxX(), 
imageEnv.getMaxX());
+               double maxVisibleY = Math.min(wantedEnvelope.getMaxY(), 
imageEnv.getMaxY());
+
+               double offset2VisibleX = imageEnv.getMinX() - 
wantedEnvelope.getMinX();
+               double offset2VisibleY = wantedEnvelope.getMaxY() - 
imageEnv.getMaxY();
+
+               double scaleX = imgWidth / imageEnv.getWidth();
+               double scaleY = imgHeight / imageEnv.getHeight();
+
+               // use local variables!
+               int xOffset, yOffset, width, height;
+
+               if (offset2VisibleX >= 0){
+                       xOffset = 0;
+               } else {
+                       xOffset = (int)(-offset2VisibleX * scaleX);
+               }
+
+               if (offset2VisibleY >= 0){
+                       yOffset = 0;
+               } else {
+                       yOffset = (int)(-offset2VisibleY * scaleY);
+               }
+
+               width = (int)((maxVisibleX-minVisibleX) * scaleX);
+               height =  (int)((maxVisibleY-minVisibleY) * scaleY);
+
+               if (width < imgWidth && height < imgHeight){ 
+                       width += 1;
+                       height += 1;
+               }
+
+
+               if (width <= 0 || height <= 0) return null;
+
+               int wantedWidth = (int)(wantedEnvelope.getWidth() * scaleX);
+               int wantedHeight = (int)(wantedEnvelope.getHeight() * scaleY);
+
+               if (image==null){
+                       reLoadImage();
+               }
+
+               BufferedImage imgTile = this.image.getSubimage(xOffset, 
yOffset, width, height);
+
+               BufferedImage result = new BufferedImage( wantedWidth, 
wantedHeight, BufferedImage.TYPE_INT_ARGB);
+
+               Graphics2D graf = result.createGraphics();
+
+               Color backgroundColor = 
(this.transparentColor!=null)?this.transparentColor:Color.white;
+
+               graf.fillRect(0,0,wantedWidth, wantedHeight);
+
+               int xTileOffset,yTileOffset;
+
+               if (xOffset > 0){
+                       xTileOffset = 0;
+               } else {
+                       xTileOffset = (int)(offset2VisibleX * scaleX);
+               }
+
+               if (yOffset > 0){
+                       yTileOffset = 0;
+               } else {
+                       yTileOffset = (int)(offset2VisibleY * scaleY);
+               }
+
+               graf.drawImage(imgTile, xTileOffset, yTileOffset, 
imgTile.getWidth(), imgTile.getHeight(), backgroundColor, null);
+               graf.dispose();
+
+               this.clearImageAndRaster(false);
+
+               return result;
+       }
+
+       //    public Raster getTileAsRaster( Envelope wantedEnvelope ) throws 
IOException{
+       //
+       //        double imgWidth = origImageWidth;
+       //        double imgHeight = origImageHeight;
+       //        Envelope imageEnv = originalImageEnvelope;
+       //        
+       //        double minVisibleX = Math.max(wantedEnvelope.getMinX(), 
imageEnv.getMinX());
+       //        double minVisibleY = Math.max(wantedEnvelope.getMinY(), 
imageEnv.getMinY());
+       //        
+       //        double maxVisibleX = Math.min(wantedEnvelope.getMaxX(), 
imageEnv.getMaxX());
+       //        double maxVisibleY = Math.min(wantedEnvelope.getMaxY(), 
imageEnv.getMaxY());
+       //        
+       //        double offset2VisibleX = imageEnv.getMinX() - 
wantedEnvelope.getMinX();
+       //        double offset2VisibleY = wantedEnvelope.getMaxY() - 
imageEnv.getMaxY();
+       //        
+       //        double scaleX = imgWidth / imageEnv.getWidth();
+       //        double scaleY = imgHeight / imageEnv.getHeight();
+       //        
+       //        // use local variables!
+       //        int xOffset, yOffset, width, height;
+       //        
+       //        if (offset2VisibleX >= 0){
+       //            xOffset = 0;
+       //        } else {
+       //            xOffset = (int)(-offset2VisibleX * scaleX);
+       //        }
+       //        
+       //        if (offset2VisibleY >= 0){
+       //            yOffset = 0;
+       //        } else {
+       //            yOffset = (int)(-offset2VisibleY * scaleY);
+       //        }
+       //        
+       //        width = (int)((maxVisibleX-minVisibleX) * scaleX);
+       //        height =  (int)((maxVisibleY-minVisibleY) * scaleY);
+       //        
+       //        if (width < imgWidth && height < imgHeight){ 
+       //            width += 1;
+       //            height += 1;
+       //        }
+       //        
+       //        
+       //        if (width <= 0 || height <= 0) return null;
+       //        
+       //        int wantedWidth = (int)(wantedEnvelope.getWidth() * scaleX);
+       //        int wantedHeight = (int)(wantedEnvelope.getHeight() * scaleY);
+       //        
+       //        Rectangle subset = new Rectangle(xOffset, yOffset, 
wantedWidth, wantedHeight);
+       //        Raster rasterData = 
RasterImageIO.loadRasterData(imageFileName, subset);
+       //        return rasterData;
+       //        
+       //        
+       ////        ColorModel colorModel = 
PlanarImage.createColorModel(rasterData.getSampleModel());
+       ////        BufferedImage bufimg = new BufferedImage(colorModel, 
(WritableRaster) rasterData, false, null);
+       ////        PlanarImage pimage = PlanarImage.wrapRenderedImage(bufimg);
+       ////        
+       ////        BufferedImage imgTile = pimage.getAsBufferedImage( new 
Rectangle(xOffset, yOffset, width, height), pimage.getColorModel());
+       ////        
+       ////        BufferedImage result = new BufferedImage( wantedWidth, 
wantedHeight, BufferedImage.TYPE_INT_ARGB);
+       ////        
+       ////        Graphics2D graf = result.createGraphics();
+       ////        
+       ////        Color backgroundColor = 
(this.transparentColor!=null)?this.transparentColor:Color.white;
+       ////        
+       ////        graf.fillRect(0,0,wantedWidth, wantedHeight);
+       ////        
+       ////        int xTileOffset,yTileOffset;
+       ////        
+       ////        if (xOffset > 0){
+       ////            xTileOffset = 0;
+       ////        } else {
+       ////            xTileOffset = (int)(offset2VisibleX * scaleX);
+       ////        }
+       ////        
+       ////        if (yOffset > 0){
+       ////            yTileOffset = 0;
+       ////        } else {
+       ////            yTileOffset = (int)(offset2VisibleY * scaleY);
+       ////        }
+       ////        
+       ////        graf.drawImage(imgTile, xTileOffset, yTileOffset, 
imgTile.getWidth(), imgTile.getHeight(), backgroundColor, null);
+       ////        graf.dispose();
+       ////        
+       ////        this.clearImageAndRaster(false);
+       ////        
+       ////        return result.getData();
+       //    }
+
+       protected WorkbenchContext getWorkbenchContext(){
+               return 
(WorkbenchContext)this.getBlackboard().get(BLACKBOARD_KEY_WORKBENCHCONTEXT);
+       }
+
+       public static void setWorkbenchContext(WorkbenchContext wContext){
+               if (blackboard==null)
+                       blackboard = new Blackboard();
+
+               blackboard.put(BLACKBOARD_KEY_WORKBENCHCONTEXT, wContext);
+       }
+
+       public Rectangle getDrawingRectangle( double imgWidth, double 
imgHeight, Envelope imageEnv, Viewport viewport ) throws 
NoninvertibleTransformException{
+
+               Rectangle visible = viewport.getPanel().getVisibleRect();
+
+               Point2D upperLeftCorner = null;
+               Point2D lowerRightCorner = null;
+
+               try {
+                       upperLeftCorner = viewport.toViewPoint(new 
Coordinate(imageEnv.getMinX(), imageEnv.getMaxY()));
+                       lowerRightCorner = viewport.toViewPoint(new 
Coordinate(imageEnv.getMaxX(), imageEnv.getMinY()));

@@ Diff output truncated at 100000 characters. @@


_______________________________________________
Jump-pilot-devel mailing list
Jump-pilot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/jump-pilot-devel

Reply via email to