/* * 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(); } }