/*
GanttProject is an opensource project management tool. License: GPL3
Copyright (C) 2005-2011 Dmitry Barashev
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 3
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/
package net.sourceforge.ganttproject.chart.export;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.DirectColorModel;
import java.awt.image.Raster;
import java.awt.image.SampleModel;
import net.sourceforge.ganttproject.chart.ChartModel;
import net.sourceforge.ganttproject.chart.SimpleRenderedImage;
public class RenderedChartImage extends SimpleRenderedImage {
private BufferedImage myTaskImage;
ColorModel myColorModel = new DirectColorModel(32, 0x00ff0000, // Red
0x0000ff00, // Green
0x000000ff, // Blue
0x0 // Alpha
);
SampleModel mySampleModel;
// private final List myVisibleTasks;
private int myCurrentTile = -1;
private Raster myCurrentRaster;
private final ChartModel myChartModel;
private final int headerYOffset;
public RenderedChartImage(ChartModel chartModel, BufferedImage taskImage, int chartWidth, int chartHeight,
int headerYOffset) {
myChartModel = chartModel;
myTaskImage = taskImage;
sampleModel = myColorModel.createCompatibleSampleModel(chartWidth, chartHeight);
colorModel = myColorModel;
minX = 0;
minY = 0;
width = chartWidth + taskImage.getWidth();
height = chartHeight;
tileWidth = width;
tileHeight = 32;
this.headerYOffset = headerYOffset;
}
public BufferedImage getWholeImage() {
BufferedImage chartImage = getChart(0, 0, getWidth(), getHeight(), getWidth(), getHeight());
BufferedImage result = new BufferedImage(chartImage.getWidth() + myTaskImage.getWidth(), getHeight(),
BufferedImage.TYPE_INT_RGB);
Graphics g = result.getGraphics();
g.drawImage(myTaskImage, 0, 0, null);
g.translate(myTaskImage.getWidth(), 0);
g.drawImage(chartImage, 0, 0, null);
return result;
}
@Override
public Raster getTile(int tileX, int tileY) {
if (myCurrentTile != tileY) {
int offsety = tileY * getTileHeight() - headerYOffset;
BufferedImage tile = getChart(myTaskImage.getWidth(), offsety, getTileWidth(), getTileHeight(), getWidth(),
getHeight());
Graphics g = tile.getGraphics();
g.translate(0, -offsety);
g.drawImage(myTaskImage, 0, 0, null);
myCurrentRaster = tile.getRaster().createTranslatedChild(0, tileY * getTileHeight());
myCurrentTile = tileY;
}
return myCurrentRaster;
}
protected void paintChart(Graphics g) {
myChartModel.paint(g);
}
private BufferedImage getChart(int offsetx, int offsety, int width, int height, int chartWidth, int chartHeight) {
BufferedImage result = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics g2 = result.getGraphics();
g2.setColor(Color.white);
g2.fillRect(0, 0, width, height);
g2.translate(offsetx, -offsety);
g2.clipRect(0, offsety, width, height);
myChartModel.setBounds(new Dimension(chartWidth, chartHeight));
paintChart(g2);
// myChartModel.setTuningOptions(ChartModelImpl.TuningOptions.DEFAULT);
return result;
}
}