001: /*
002:
003: Licensed to the Apache Software Foundation (ASF) under one or more
004: contributor license agreements. See the NOTICE file distributed with
005: this work for additional information regarding copyright ownership.
006: The ASF licenses this file to You under the Apache License, Version 2.0
007: (the "License"); you may not use this file except in compliance with
008: the License. You may obtain a copy of the License at
009:
010: http://www.apache.org/licenses/LICENSE-2.0
011:
012: Unless required by applicable law or agreed to in writing, software
013: distributed under the License is distributed on an "AS IS" BASIS,
014: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
015: See the License for the specific language governing permissions and
016: limitations under the License.
017:
018: */
019: package org.apache.batik.ext.awt.image.rendered;
020:
021: import java.awt.Rectangle;
022: import java.awt.image.BufferedImage;
023: import java.awt.image.Raster;
024: import java.awt.image.WritableRaster;
025:
026: import org.apache.batik.ext.awt.image.GraphicsUtil;
027:
028: /**
029: * This implements CachableRed based on a BufferedImage.
030: * You can use this to wrap a BufferedImage that you want to
031: * appear as a CachableRed.
032: * It essentially ignores the dependency and dirty region methods.
033: *
034: * @author <a href="mailto:Thomas.DeWeeese@Kodak.com">Thomas DeWeese</a>
035: * @version $Id: BufferedImageCachableRed.java 478276 2006-11-22 18:33:37Z dvholten $ */
036: public class BufferedImageCachableRed extends AbstractRed {
037: // The bufferedImage that we wrap...
038: BufferedImage bi;
039:
040: /**
041: * Construct an instance of CachableRed around a BufferedImage.
042: */
043: public BufferedImageCachableRed(BufferedImage bi) {
044: super ((CachableRed) null, new Rectangle(bi.getMinX(), bi
045: .getMinY(), bi.getWidth(), bi.getHeight()), bi
046: .getColorModel(), bi.getSampleModel(), bi.getMinX(), bi
047: .getMinY(), null);
048:
049: this .bi = bi;
050: }
051:
052: public BufferedImageCachableRed(BufferedImage bi, int xloc, int yloc) {
053: super ((CachableRed) null, new Rectangle(xloc, yloc, bi
054: .getWidth(), bi.getHeight()), bi.getColorModel(), bi
055: .getSampleModel(), xloc, yloc, null);
056:
057: this .bi = bi;
058: }
059:
060: public Rectangle getBounds() {
061: return new Rectangle(getMinX(), getMinY(), getWidth(),
062: getHeight());
063: }
064:
065: /**
066: * fetch the bufferedImage from this node.
067: */
068: public BufferedImage getBufferedImage() {
069: return bi;
070: }
071:
072: public Object getProperty(String name) {
073: return bi.getProperty(name);
074: }
075:
076: public String[] getPropertyNames() {
077: return bi.getPropertyNames();
078: }
079:
080: public Raster getTile(int tileX, int tileY) {
081: return bi.getTile(tileX, tileY);
082: }
083:
084: public Raster getData() {
085: Raster r = bi.getData();
086: return r.createTranslatedChild(getMinX(), getMinY());
087: }
088:
089: public Raster getData(Rectangle rect) {
090: Rectangle r = (Rectangle) rect.clone();
091:
092: if (!r.intersects(getBounds()))
093: return null;
094: r = r.intersection(getBounds());
095: r.translate(-getMinX(), -getMinY());
096:
097: Raster ret = bi.getData(r);
098: return ret.createTranslatedChild(ret.getMinX() + getMinX(), ret
099: .getMinY()
100: + getMinY());
101: }
102:
103: public WritableRaster copyData(WritableRaster wr) {
104: WritableRaster wr2 = wr.createWritableTranslatedChild(wr
105: .getMinX()
106: - getMinX(), wr.getMinY() - getMinY());
107:
108: GraphicsUtil.copyData(bi.getRaster(), wr2);
109:
110: /* This was the original code. This is _bad_ since it causes a
111: * multiply and divide of the alpha channel to do the draw
112: * operation. I believe that at some point I switched to
113: * drawImage in order to avoid some issues with
114: * BufferedImage's copyData implementation but I can't
115: * reproduce them now. Anyway I'm now using GraphicsUtil which
116: * should generally be as fast if not faster...
117: */
118: /*
119: BufferedImage dest;
120: dest = new BufferedImage(bi.getColorModel(),
121: wr.createWritableTranslatedChild(0,0),
122: bi.getColorModel().isAlphaPremultiplied(),
123: null);
124: java.awt.Graphics2D g2d = dest.createGraphics();
125: g2d.drawImage(bi, null, getMinX()-wr.getMinX(),
126: getMinY()-wr.getMinY());
127: g2d.dispose();
128: */
129: return wr;
130: }
131: }
|