123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148 |
- /*
- * $Id$
- * Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
- * For details on use and redistribution please refer to the
- * LICENSE file included with these sources.
- */
-
- package org.apache.fop.image;
-
- // Java
- import java.net.URL;
- import java.awt.image.ImageProducer;
- import java.awt.image.ColorModel;
- import java.awt.image.IndexColorModel;
-
- // Jimi
- import com.sun.jimi.core.*;
-
- // FOP
- import org.apache.fop.datatypes.ColorSpace;
- import org.apache.fop.pdf.PDFColor;
- import org.apache.fop.image.analyser.ImageReader;
-
- /**
- * FopImage object for several images types, using Jimi.
- * See Jimi documentation for supported image types.
- * @author Eric SCHAEFFER
- * @see AbstractFopImage
- * @see FopImage
- */
- public class JimiImage extends AbstractFopImage {
- public JimiImage(URL href, ImageReader imgReader) {
- super(href, imgReader);
- try {
- Class c = Class.forName("com.sun.jimi.core.Jimi");
- } catch (ClassNotFoundException e) {
- //throw new FopImageException("Jimi image library not available");
- }
- }
-
- protected void loadImage() {
- int[] tmpMap = null;
- try {
- ImageProducer ip =
- Jimi.getImageProducer(this.m_href.openStream(),
- Jimi.SYNCHRONOUS | Jimi.IN_MEMORY);
- FopImageConsumer consumer = new FopImageConsumer(ip);
- ip.startProduction(consumer);
-
- while (!consumer.isImageReady()) {
- Thread.sleep(500);
- }
- this.m_height = consumer.getHeight();
- this.m_width = consumer.getWidth();
-
- try {
- tmpMap = consumer.getImage();
- } catch (Exception ex) {
- /*throw new FopImageException("Image grabbing interrupted : "
- + ex.getMessage());
- */}
-
- ColorModel cm = consumer.getColorModel();
- this.m_bitsPerPixel = 8;
- // this.m_bitsPerPixel = cm.getPixelSize();
- this.m_colorSpace = new ColorSpace(ColorSpace.DEVICE_RGB);
- if (cm.hasAlpha()) {
- int transparencyType = cm.getTransparency(); // java.awt.Transparency. BITMASK or OPAQUE or TRANSLUCENT
- if (transparencyType == java.awt.Transparency.OPAQUE) {
- this.m_isTransparent = false;
- } else if (transparencyType ==
- java.awt.Transparency.BITMASK) {
- if (cm instanceof IndexColorModel) {
- this.m_isTransparent = false;
- byte[] alphas = new byte[
- ((IndexColorModel) cm).getMapSize()];
- byte[] reds = new byte[
- ((IndexColorModel) cm).getMapSize()];
- byte[] greens = new byte[
- ((IndexColorModel) cm).getMapSize()];
- byte[] blues = new byte[
- ((IndexColorModel) cm).getMapSize()];
- ((IndexColorModel) cm).getAlphas(alphas);
- ((IndexColorModel) cm).getReds(reds);
- ((IndexColorModel) cm).getGreens(greens);
- ((IndexColorModel) cm).getBlues(blues);
- for (int i = 0;
- i < ((IndexColorModel) cm).getMapSize();
- i++) {
- if ((alphas[i] & 0xFF) == 0) {
- this.m_isTransparent = true;
- this.m_transparentColor = new PDFColor(
- (int)(reds[i] & 0xFF),
- (int)(greens[i] & 0xFF),
- (int)(blues[i] & 0xFF));
- break;
- }
- }
- } else {
- // TRANSLUCENT
- /*
- * this.m_isTransparent = false;
- * for (int i = 0; i < this.m_width * this.m_height; i++) {
- * if (cm.getAlpha(tmpMap[i]) == 0) {
- * this.m_isTransparent = true;
- * this.m_transparentColor = new PDFColor(cm.getRed(tmpMap[i]), cm.getGreen(tmpMap[i]), cm.getBlue(tmpMap[i]));
- * break;
- * }
- * }
- */
- // use special API...
- this.m_isTransparent = false;
- }
- } else {
- this.m_isTransparent = false;
- }
- } else {
- this.m_isTransparent = false;
- }
- } catch (Exception ex) {
- /*throw new FopImageException("Error while loading image "
- + this.m_href.toString() + " : "
- + ex.getClass() + " - "
- + ex.getMessage());
- */}
-
-
- // Should take care of the ColorSpace and bitsPerPixel
- this.m_bitmapsSize = this.m_width * this.m_height * 3;
- this.m_bitmaps = new byte[this.m_bitmapsSize];
- for (int i = 0; i < this.m_height; i++) {
- for (int j = 0; j < this.m_width; j++) {
- int p = tmpMap[i * this.m_width + j];
- int r = (p > > 16) & 0xFF;
- int g = (p > > 8) & 0xFF;
- int b = (p) & 0xFF;
- this.m_bitmaps[3 * (i * this.m_width + j)] =
- (byte)(r & 0xFF);
- this.m_bitmaps[3 * (i * this.m_width + j) + 1] =
- (byte)(g & 0xFF);
- this.m_bitmaps[3 * (i * this.m_width + j) + 2] =
- (byte)(b & 0xFF);
- }
- }
- }
-
- }
|