/*
 * 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.
 */

/* $Id: BufferedImageCachableRed.java 1732018 2016-02-24 04:51:06Z gadams $ */

package org.apache.xmlgraphics.image.rendered;

import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.awt.image.Raster;
import java.awt.image.WritableRaster;

import org.apache.xmlgraphics.image.GraphicsUtil;

// CSOFF: NeedBraces
// CSOFF: WhitespaceAfter
// CSOFF: WhitespaceAround

This implements CachableRed based on a BufferedImage. You can use this to wrap a BufferedImage that you want to appear as a CachableRed. It essentially ignores the dependency and dirty region methods. Originally authored by Thomas DeWeese.
Version:$Id: BufferedImageCachableRed.java 1732018 2016-02-24 04:51:06Z gadams $
/** * This implements CachableRed based on a BufferedImage. * You can use this to wrap a BufferedImage that you want to * appear as a CachableRed. * It essentially ignores the dependency and dirty region methods. * * Originally authored by Thomas DeWeese. * @version $Id: BufferedImageCachableRed.java 1732018 2016-02-24 04:51:06Z gadams $ */
public class BufferedImageCachableRed extends AbstractRed { // The bufferedImage that we wrap... BufferedImage bi;
Construct an instance of CachableRed around a BufferedImage.
/** * Construct an instance of CachableRed around a BufferedImage. */
public BufferedImageCachableRed(BufferedImage bi) { super((CachableRed)null, new Rectangle(bi.getMinX(), bi.getMinY(), bi.getWidth(), bi.getHeight()), bi.getColorModel(), bi.getSampleModel(), bi.getMinX(), bi.getMinY(), null); this.bi = bi; } public BufferedImageCachableRed(BufferedImage bi, int xloc, int yloc) { super((CachableRed)null, new Rectangle(xloc, yloc, bi.getWidth(), bi.getHeight()), bi.getColorModel(), bi.getSampleModel(), xloc, yloc, null); this.bi = bi; } public Rectangle getBounds() { return new Rectangle(getMinX(), getMinY(), getWidth(), getHeight()); }
fetch the bufferedImage from this node.
/** * fetch the bufferedImage from this node. */
public BufferedImage getBufferedImage() { return bi; } public Object getProperty(String name) { return bi.getProperty(name); } public String [] getPropertyNames() { return bi.getPropertyNames(); } public Raster getTile(int tileX, int tileY) { return bi.getTile(tileX, tileY); } public Raster getData() { Raster r = bi.getData(); return r.createTranslatedChild(getMinX(), getMinY()); } public Raster getData(Rectangle rect) { Rectangle r = (Rectangle)rect.clone(); if (!r.intersects(getBounds())) { return null; } r = r.intersection(getBounds()); r.translate(-getMinX(), -getMinY()); Raster ret = bi.getData(r); return ret.createTranslatedChild(ret.getMinX() + getMinX(), ret.getMinY() + getMinY()); } public WritableRaster copyData(WritableRaster wr) { WritableRaster wr2 = wr.createWritableTranslatedChild( wr.getMinX() - getMinX(), wr.getMinY() - getMinY()); GraphicsUtil.copyData(bi.getRaster(), wr2); /* This was the original code. This is _bad_ since it causes a * multiply and divide of the alpha channel to do the draw * operation. I believe that at some point I switched to * drawImage in order to avoid some issues with * BufferedImage's copyData implementation but I can't * reproduce them now. Anyway I'm now using GraphicsUtil which * should generally be as fast if not faster... */ /* BufferedImage dest; dest = new BufferedImage(bi.getColorModel(), wr.createWritableTranslatedChild(0,0), bi.getColorModel().isAlphaPremultiplied(), null); java.awt.Graphics2D g2d = dest.createGraphics(); g2d.drawImage(bi, null, getMinX()-wr.getMinX(), getMinY()-wr.getMinY()); g2d.dispose(); */ return wr; } }