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