| /* | |
| * Copyright (c) 1997, 2008, Oracle and/or its affiliates. All rights reserved. | |
| * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. | |
| * | |
| * This code is free software; you can redistribute it and/or modify it | |
| * under the terms of the GNU General Public License version 2 only, as | |
| * published by the Free Software Foundation. Oracle designates this | |
| * particular file as subject to the "Classpath" exception as provided | |
| * by Oracle in the LICENSE file that accompanied this code. | |
| * | |
| * This code is distributed in the hope that it will be useful, but WITHOUT | |
| * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or | |
| * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License | |
| * version 2 for more details (a copy is included in the LICENSE file that | |
| * accompanied this code). | |
| * | |
| * You should have received a copy of the GNU General Public License version | |
| * 2 along with this work; if not, write to the Free Software Foundation, | |
| * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. | |
| * | |
| * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA | |
| * or visit www.oracle.com if you need additional information or have any | |
| * questions. | |
| */ | |
| package java.awt; | |
| import java.awt.geom.Rectangle2D; | |
| import java.awt.geom.AffineTransform; | |
| import java.awt.image.BufferedImage; | |
| import java.awt.image.ColorModel; | |
| /** | |
| * The {@code TexturePaint} class provides a way to fill a | |
| * {@link Shape} with a texture that is specified as | |
| * a {@link BufferedImage}. The size of the {@code BufferedImage} | |
| * object should be small because the {@code BufferedImage} data | |
| * is copied by the {@code TexturePaint} object. | |
| * At construction time, the texture is anchored to the upper | |
| * left corner of a {@link Rectangle2D} that is | |
| * specified in user space. Texture is computed for | |
| * locations in the device space by conceptually replicating the | |
| * specified {@code Rectangle2D} infinitely in all directions | |
| * in user space and mapping the {@code BufferedImage} to each | |
| * replicated {@code Rectangle2D}. | |
| * @see Paint | |
| * @see Graphics2D#setPaint | |
| * @version 1.48, 06/05/07 | |
| */ | |
| public class TexturePaint implements Paint { | |
| BufferedImage bufImg; | |
| double tx; | |
| double ty; | |
| double sx; | |
| double sy; | |
| /** | |
| * Constructs a {@code TexturePaint} object. | |
| * @param txtr the {@code BufferedImage} object with the texture | |
| * used for painting | |
| * @param anchor the {@code Rectangle2D} in user space used to | |
| * anchor and replicate the texture | |
| */ | |
| public TexturePaint(BufferedImage txtr, | |
| Rectangle2D anchor) { | |
| this.bufImg = txtr; | |
| this.tx = anchor.getX(); | |
| this.ty = anchor.getY(); | |
| this.sx = anchor.getWidth() / bufImg.getWidth(); | |
| this.sy = anchor.getHeight() / bufImg.getHeight(); | |
| } | |
| /** | |
| * Returns the {@code BufferedImage} texture used to | |
| * fill the shapes. | |
| * @return a {@code BufferedImage}. | |
| */ | |
| public BufferedImage getImage() { | |
| return bufImg; | |
| } | |
| /** | |
| * Returns a copy of the anchor rectangle which positions and | |
| * sizes the textured image. | |
| * @return the {@code Rectangle2D} used to anchor and | |
| * size this {@code TexturePaint}. | |
| */ | |
| public Rectangle2D getAnchorRect() { | |
| return new Rectangle2D.Double(tx, ty, | |
| sx * bufImg.getWidth(), | |
| sy * bufImg.getHeight()); | |
| } | |
| /** | |
| * Creates and returns a {@link PaintContext} used to | |
| * generate a tiled image pattern. | |
| * See the {@link Paint#createContext specification} of the | |
| * method in the {@link Paint} interface for information | |
| * on null parameter handling. | |
| * | |
| * @param cm the preferred {@link ColorModel} which represents the most convenient | |
| * format for the caller to receive the pixel data, or {@code null} | |
| * if there is no preference. | |
| * @param deviceBounds the device space bounding box | |
| * of the graphics primitive being rendered. | |
| * @param userBounds the user space bounding box | |
| * of the graphics primitive being rendered. | |
| * @param xform the {@link AffineTransform} from user | |
| * space into device space. | |
| * @param hints the set of hints that the context object can use to | |
| * choose between rendering alternatives. | |
| * @return the {@code PaintContext} for | |
| * generating color patterns. | |
| * @see Paint | |
| * @see PaintContext | |
| * @see ColorModel | |
| * @see Rectangle | |
| * @see Rectangle2D | |
| * @see AffineTransform | |
| * @see RenderingHints | |
| */ | |
| public PaintContext createContext(ColorModel cm, | |
| Rectangle deviceBounds, | |
| Rectangle2D userBounds, | |
| AffineTransform xform, | |
| RenderingHints hints) { | |
| if (xform == null) { | |
| xform = new AffineTransform(); | |
| } else { | |
| xform = (AffineTransform) xform.clone(); | |
| } | |
| xform.translate(tx, ty); | |
| xform.scale(sx, sy); | |
| return TexturePaintContext.getContext(bufImg, xform, hints, | |
| deviceBounds); | |
| } | |
| /** | |
| * Returns the transparency mode for this {@code TexturePaint}. | |
| * @return the transparency mode for this {@code TexturePaint} | |
| * as an integer value. | |
| * @see Transparency | |
| */ | |
| public int getTransparency() { | |
| return (bufImg.getColorModel()).getTransparency(); | |
| } | |
| } |