Support custom image renderers

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@664491 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Yegor Kozlov 2008-06-08 12:31:19 +00:00
parent ab0486268d
commit 796075ff52
4 changed files with 224 additions and 7 deletions

View File

@ -0,0 +1,51 @@
package org.apache.poi.hslf.blip;
import org.apache.poi.hslf.usermodel.PictureData;
import org.apache.poi.hslf.model.Picture;
import org.apache.poi.util.POILogger;
import org.apache.poi.util.POILogFactory;
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
/**
* Creates BufferedImage using javax.imageio.ImageIO and draws it in the specified graphics.
*
* @author Yegor Kozlov.
*/
public class BitmapPainter implements ImagePainter {
protected POILogger logger = POILogFactory.getLogger(this.getClass());
public void paint(Graphics2D graphics, PictureData pict, Picture parent) {
BufferedImage img;
try {
img = ImageIO.read(new ByteArrayInputStream(pict.getData()));
}
catch (Exception e){
logger.log(POILogger.WARN, "ImageIO failed to create image. image.type: " + pict.getType());
return;
}
Rectangle anchor = parent.getAnchor();
Image scaledImg = img.getScaledInstance(anchor.width, anchor.height, Image.SCALE_SMOOTH);
graphics.drawImage(scaledImg, anchor.x, anchor.y, null);
}
}

View File

@ -0,0 +1,71 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.hslf.blip;
import org.apache.poi.hslf.model.Picture;
import org.apache.poi.hslf.usermodel.PictureData;
import java.awt.*;
/**
* A common interface for objects that can render ppt picture data.
* <p>
* Subclasses can redefine it and use third-party libraries for actual rendering,
* for example, Bitmaps can be rendered using javax.imageio.* , WMF can be rendered using Apache Batik,
* PICT can be rendered using Apple QuickTime API for Java, etc.
* </p>
*
* A typical usage is as follows:
* <code>
* public WMFPaiter implements ImagePainter{
* public void paint(Graphics2D graphics, PictureData pict, Picture parent){
* DataInputStream is = new DataInputStream(new ByteArrayInputStream(pict.getData()));
* org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore wmfStore =
* new org.apache.batik.transcoder.wmf.tosvg.WMFRecordStore();
* try {
* wmfStore.read(is);
* } catch (IOException e){
* return;
* }
*
* Rectangle anchor = parent.getAnchor();
* float scale = (float)anchor.width/wmfStore.getWidthPixels();
*
* org.apache.batik.transcoder.wmf.tosvg.WMFPainter painter =
* new org.apache.batik.transcoder.wmf.tosvg.WMFPainter(wmfStore, 0, 0, scale);
* graphics.translate(anchor.x, anchor.y);
* painter.paint(graphics);
* }
* }
* PictureData.setImagePainter(Picture.WMF, new WMFPaiter());
* ...
* </code>
* Subsequenet calls of Slide.draw(Graphics gr) will use WMFPaiter for WMF images.
*
* @author Yegor Kozlov.
*/
public interface ImagePainter {
/**
* Paints the specified picture data
*
* @param graphics the graphics to paintb into
* @param pict the data to paint
* @param parent the shapes that owns the picture data
*/
public void paint(Graphics2D graphics, PictureData pict, Picture parent);
}

View File

@ -17,6 +17,8 @@
package org.apache.poi.hslf.usermodel; package org.apache.poi.hslf.usermodel;
import org.apache.poi.util.LittleEndian; import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.POILogger;
import org.apache.poi.util.POILogFactory;
import org.apache.poi.hslf.model.Picture; import org.apache.poi.hslf.model.Picture;
import org.apache.poi.hslf.blip.*; import org.apache.poi.hslf.blip.*;
import org.apache.poi.hslf.exceptions.HSLFException; import org.apache.poi.hslf.exceptions.HSLFException;
@ -25,6 +27,7 @@ import java.io.OutputStream;
import java.io.IOException; import java.io.IOException;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; import java.security.NoSuchAlgorithmException;
import java.awt.*;
/** /**
* A class that represents image data contained in a slide show. * A class that represents image data contained in a slide show.
@ -33,19 +36,21 @@ import java.security.NoSuchAlgorithmException;
*/ */
public abstract class PictureData { public abstract class PictureData {
protected POILogger logger = POILogFactory.getLogger(this.getClass());
/** /**
* Size of the image checksum calculated using MD5 algorithm. * Size of the image checksum calculated using MD5 algorithm.
*/ */
protected static final int CHECKSUM_SIZE = 16; protected static final int CHECKSUM_SIZE = 16;
/** /**
* Binary data of the picture * Binary data of the picture
*/ */
private byte[] rawdata; private byte[] rawdata;
/** /**
* The offset to the picture in the stream * The offset to the picture in the stream
*/ */
protected int offset; protected int offset;
/** /**
* Returns type of this picture. * Returns type of this picture.
@ -71,6 +76,13 @@ public abstract class PictureData {
*/ */
protected abstract int getSignature(); protected abstract int getSignature();
protected static ImagePainter[] painters = new ImagePainter[8];
static {
PictureData.setImagePainter(Picture.PNG, new BitmapPainter());
PictureData.setImagePainter(Picture.JPEG, new BitmapPainter());
PictureData.setImagePainter(Picture.DIB, new BitmapPainter());
}
/** /**
* Returns the raw binary data of this Picture excluding the first 8 bytes * Returns the raw binary data of this Picture excluding the first 8 bytes
* which hold image signature and size of the image data. * which hold image signature and size of the image data.
@ -212,4 +224,30 @@ public abstract class PictureData {
return getData().length; return getData().length;
} }
public void draw(Graphics2D graphics, Picture parent){
ImagePainter painter = painters[getType()];
if(painter != null) painter.paint(graphics, this, parent);
else logger.log(POILogger.WARN, "Rendering is not supported: " + getClass().getName());
}
/**
* Register ImagePainter for the specified image type
*
* @param type image type, must be one of the static constants defined in the <code>Picture<code> class.
* @param painter
*/
public static void setImagePainter(int type, ImagePainter painter){
painters[type] = painter;
}
/**
* Return ImagePainter for the specified image type
*
* @param type blip type, must be one of the static constants defined in the <code>Picture<code> class.
* @return ImagePainter for the specified image type
*/
public static ImagePainter getImagePainter(int type){
return painters[type];
}
} }

View File

@ -0,0 +1,57 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.hslf.model;
import junit.framework.*;
import java.io.FileOutputStream;
import java.io.File;
import java.awt.*;
import org.apache.poi.hslf.usermodel.SlideShow;
import org.apache.poi.hslf.usermodel.PictureData;
import org.apache.poi.hslf.HSLFSlideShow;
import org.apache.poi.hslf.blip.ImagePainter;
import org.apache.poi.hslf.blip.BitmapPainter;
import org.apache.poi.ddf.EscherBSERecord;
/**
* Test Picture shape.
*
* @author Yegor Kozlov
*/
public class TestImagePainter extends TestCase {
private static class CustomImagePainer implements ImagePainter{
public void paint(Graphics2D graphics, PictureData pict, Picture parent){
//do noting
}
}
public void testImagePainter() throws Exception {
ImagePainter pntr = PictureData.getImagePainter(Picture.PNG);
assertTrue(PictureData.getImagePainter(Picture.PNG) instanceof BitmapPainter);
assertTrue(PictureData.getImagePainter(Picture.JPEG) instanceof BitmapPainter);
assertTrue(PictureData.getImagePainter(Picture.DIB) instanceof BitmapPainter);
PictureData.setImagePainter(Picture.WMF, new CustomImagePainer());
assertTrue(PictureData.getImagePainter(Picture.WMF) instanceof CustomImagePainer);
}
}