/*
* This program is free software; you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License, version 2.1 as published by the Free Software
* Foundation.
*
* You should have received a copy of the GNU Lesser General Public License along with this
* program; if not, you can obtain a copy at http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html
* or from the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* 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 Lesser General Public License for more details.
*
* Copyright (c) 2001 - 2013 Object Refinery Ltd, Pentaho Corporation and Contributors.. All rights reserved.
*/
package org.pentaho.reporting.libraries.pixie.wmf;
import java.awt.image.BufferedImage;
import java.awt.image.ColorModel;
import java.awt.image.ImageConsumer;
import java.awt.image.ImageProducer;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
/**
* Implements the ImageProducer interface for the MetaFiles
*/
public class WmfImageProducer implements ImageProducer
{
private WmfFile metafile;
private ArrayList consumers;
public WmfImageProducer(final String inName, final int width, final int height)
throws IOException
{
consumers = new ArrayList();
metafile = new WmfFile(inName, width, height);
// metafile.replay ();
}
public WmfImageProducer(final URL inName, final int width, final int height)
throws IOException
{
consumers = new ArrayList();
metafile = new WmfFile(inName, width, height);
// metafile.replay ();
}
public WmfImageProducer(final URL inName)
throws IOException
{
consumers = new ArrayList();
metafile = new WmfFile(inName);
// metafile.replay ();
}
public synchronized void addConsumer(final ImageConsumer ic)
{
if (isConsumer(ic))
{
return;
}
consumers.add(ic);
}
public synchronized boolean isConsumer(final ImageConsumer ic)
{
return consumers.contains(ic);
}
public synchronized void removeConsumer(final ImageConsumer ic)
{
consumers.remove(ic);
}
public synchronized void requestTopDownLeftRightResend(final ImageConsumer ic)
{
startProduction(ic);
}
public synchronized void startProduction(final ImageConsumer pic)
{
if (pic != null)
{
addConsumer(pic);
}
final ImageConsumer[] cons = (ImageConsumer[]) consumers.toArray(new ImageConsumer[consumers.size()]);
final BufferedImage image = metafile.replay();
final int w = image.getWidth();
final int h = image.getHeight();
final ColorModel model = image.getColorModel();
for (int i = 0; i < cons.length; i++)
{
final ImageConsumer ic = cons[i];
ic.setHints(ImageConsumer.TOPDOWNLEFTRIGHT);
ic.setHints(ImageConsumer.SINGLEFRAME);
ic.setHints(ImageConsumer.SINGLEPASS);
ic.setHints(ImageConsumer.COMPLETESCANLINES);
ic.setDimensions(w, h);
ic.setColorModel(model);
}
final int LINES = 10;
int[] pixels = new int[w * LINES];
for (int i = 0; i < h; i += LINES)
{
final int rows;
if ((i + LINES) > h)
{
rows = h - i;
}
else
{
rows = LINES;
}
pixels = image.getRGB(0, i, w, rows, pixels, 0, w);
for (int j = 0; j < cons.length; j++)
{
final ImageConsumer ic = cons[j];
ic.setPixels(0, i, w, rows, model, pixels, 0, w);
}
}
for (int i = 0; i < cons.length; i++)
{
final ImageConsumer ic = cons[i];
ic.imageComplete(ImageConsumer.STATICIMAGEDONE);
}
if (pic != null)
{
removeConsumer(pic);
}
}
}