/*
* Geotoolkit - An Open Source Java GIS Toolkit
* http://www.geotoolkit.org
*
* (C) 2009, Geomatys
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation;
* version 2.1 of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*/
package org.geotoolkit.display2d.ext.dimrange;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.LinearGradientPaint;
import java.awt.geom.Rectangle2D;
import java.awt.image.ColorModel;
import java.awt.image.IndexColorModel;
import java.awt.image.RenderedImage;
import java.util.concurrent.CancellationException;
import java.util.logging.Level;
import org.geotoolkit.coverage.GridSampleDimension;
import org.geotoolkit.coverage.grid.GridCoverage2D;
import org.geotoolkit.coverage.grid.ViewType;
import org.geotoolkit.coverage.io.CoverageStoreException;
import org.geotoolkit.coverage.io.GridCoverageReadParam;
import org.geotoolkit.coverage.io.GridCoverageReader;
import org.geotoolkit.coverage.processing.ColorMap;
import org.geotoolkit.display2d.canvas.RenderingContext2D;
import org.geotoolkit.display2d.style.renderer.AbstractSymbolizerRendererService;
import org.geotoolkit.display2d.style.renderer.SymbolizerRenderer;
import org.geotoolkit.map.CoverageMapLayer;
import org.geotoolkit.map.MapLayer;
import org.apache.sis.measure.MeasurementRange;
import org.apache.sis.measure.NumberRange;
import org.geotoolkit.storage.coverage.CoverageReference;
import org.apache.sis.util.logging.Logging;
/**
*
* @author Johann Sorel (Geomatys)
* @module
*/
public class DimRangeRendererService extends AbstractSymbolizerRendererService<DimRangeSymbolizer,CachedDimRangeSymbolizer>{
@Override
public boolean isGroupSymbolizer() {
return false;
}
@Override
public Class<DimRangeSymbolizer> getSymbolizerClass() {
return DimRangeSymbolizer.class;
}
@Override
public Class<CachedDimRangeSymbolizer> getCachedSymbolizerClass() {
return CachedDimRangeSymbolizer.class;
}
@Override
public CachedDimRangeSymbolizer createCachedSymbolizer(final DimRangeSymbolizer symbol) {
return new CachedDimRangeSymbolizer(symbol,this);
}
@Override
public SymbolizerRenderer createRenderer(final CachedDimRangeSymbolizer symbol, final RenderingContext2D context) {
return new DimRangeRenderer(this,symbol, context);
}
@Override
public Rectangle2D glyphPreferredSize(final CachedDimRangeSymbolizer symbol,final MapLayer layer) {
return new Rectangle2D.Double(0, 0, 120, 20);
}
@Override
public void glyph(final Graphics2D g, final Rectangle2D rect, final CachedDimRangeSymbolizer symbol, final MapLayer layer) {
int[] ARGB = new int[]{Color.RED.getRGB(),Color.GREEN.getRGB(),Color.BLUE.getRGB()};
if(layer instanceof CoverageMapLayer){
final CoverageMapLayer cml = (CoverageMapLayer) layer;
final CoverageReference ref = cml.getCoverageReference();
try {
final GridCoverageReader reader = ref.acquireReader();
final GridCoverageReadParam param = new GridCoverageReadParam();
param.setResolution(1,1);
GridCoverage2D cov = (GridCoverage2D) reader.read(0, param);
ref.recycle(reader);
cov = cov.view(ViewType.NATIVE);
RenderedImage img = cov.getRenderedImage();
ColorModel cm = img.getColorModel();
if(cm instanceof IndexColorModel){
final IndexColorModel icm = (IndexColorModel) cm;
final GridSampleDimension sampleDim = cov.getSampleDimension(0);
int size = icm.getMapSize();
ARGB = new int[size];
icm.getRGBs(ARGB);
final double minVal = sampleDim.getMinimumValue();
final double maxVal = sampleDim.getMaximumValue();
final ColorMap colorMap = new ColorMap();
colorMap.setGeophysicsRange(ColorMap.ANY_QUANTITATIVE_CATEGORY,
new MeasurementRange(NumberRange.create(minVal, true, maxVal, true),sampleDim.getUnits()));
GridSampleDimension ret = colorMap.recolor(sampleDim, ARGB);
}
} catch (CoverageStoreException | CancellationException ex) {
Logging.getLogger("org.geotoolkit.display2d.ext.dimrange").log(Level.WARNING, null, ex);
}
}
final float[] space = new float[ARGB.length];
final Color[] colors = new Color[ARGB.length];
for(int i=0;i<space.length;i++){
space[i] = (float)i/(space.length-1);
colors[i] = new Color(ARGB[i]);
}
final LinearGradientPaint paint = new LinearGradientPaint(
(float)rect.getMinX(), (float)rect.getMinY(),
(float)rect.getMaxX(), (float)rect.getMinY(),
space, colors);
g.setPaint(paint);
g.fill(rect);
}
}