- /*
 - * @(#)ImagePainter.java 1.5 03/01/23
 - *
 - * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
 - * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 - */
 - package com.sun.java.swing.plaf.gtk;
 - import java.awt.*;
 - import javax.swing.*;
 - /**
 - * ImagePainter fills in the specified region using an Image. The Image
 - * is split into 9 segments: north, north east, east, south east, south,
 - * south west, west, north west and the center. The corners are defined
 - * by way of an insets, and the remaining regions are either tiled or
 - * scaled to fit.
 - *
 - * @version 1.5, 01/23/03
 - * @author Scott Violet
 - */
 - class ImagePainter extends SynthPainter {
 - private Image image;
 - private Insets sInsets;
 - private Insets dInsets;
 - private String path;
 - private boolean tiles;
 - private boolean paintCenter;
 - private Object renderingHint;
 - ImagePainter(boolean tiles, boolean paintCenter, Object renderingHint,
 - Insets sourceInsets, Insets destinationInsets) {
 - this.sInsets = (Insets)sourceInsets.clone();
 - if (destinationInsets == null) {
 - dInsets = sInsets;
 - }
 - else {
 - this.dInsets = (Insets)destinationInsets.clone();
 - }
 - this.tiles = tiles;
 - this.paintCenter = paintCenter;
 - this.renderingHint = renderingHint;
 - }
 - public ImagePainter(boolean tiles, boolean paintCenter,
 - Object renderingHint, Insets sourceInsets,
 - Insets destinationInsets, Image image) {
 - this(tiles, paintCenter, renderingHint, sourceInsets,
 - destinationInsets);
 - this.image = image;
 - }
 - public ImagePainter(boolean tiles, boolean paintCenter,
 - Object renderingHint, Insets sourceInsets,
 - Insets destinationInsets, String path) {
 - this(tiles, paintCenter, renderingHint, sourceInsets,
 - destinationInsets);
 - this.path = path;
 - }
 - public boolean getTiles() {
 - return tiles;
 - }
 - public boolean getPaintsCenter() {
 - return paintCenter;
 - }
 - public Object getRenderingHint() {
 - return renderingHint;
 - }
 - public Insets getInsets(Insets insets) {
 - if (insets == null) {
 - return (Insets)this.dInsets.clone();
 - }
 - insets.left = this.dInsets.left;
 - insets.right = this.dInsets.right;
 - insets.top = this.dInsets.top;
 - insets.bottom = this.dInsets.bottom;
 - return insets;
 - }
 - public Image getImage() {
 - if (image == null) {
 - image = new ImageIcon(path).getImage();
 - }
 - return image;
 - }
 - public void paint(SynthContext state, Object paintKey,
 - Graphics g, int x, int y, int w, int h) {
 - Image image;
 - Object lastHint;
 - Object renderingHint = getRenderingHint();
 - if (renderingHint != null) {
 - Graphics2D g2 = (Graphics2D)g;
 - lastHint = g2.getRenderingHint(RenderingHints.KEY_INTERPOLATION);
 - if (lastHint == null) {
 - lastHint = RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR;
 - }
 - g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
 - renderingHint);
 - }
 - else {
 - lastHint = null;
 - }
 - if ((image = getImage()) != null) {
 - Insets sInsets = this.sInsets;
 - Insets dInsets = this.dInsets;
 - int iw = image.getWidth(null);
 - int ih = image.getHeight(null);
 - boolean stretch = !getTiles();
 - // top left
 - g.drawImage(image, x, y, x + dInsets.left, y + dInsets.top,
 - 0, 0, sInsets.left, sInsets.right, null);
 - // top
 - drawChunk(image, g, stretch, x + dInsets.left, y,
 - x + w - dInsets.right, y + dInsets.top, sInsets.left, 0,
 - iw - sInsets.right, sInsets.top, true);
 - // top right
 - g.drawImage(image, x + w - dInsets.right, y, x + w,
 - y + dInsets.top, iw - sInsets.right, 0, iw,
 - sInsets.top, null);
 - // right
 - drawChunk(image, g, stretch, x + w - dInsets.right,
 - y + dInsets.top, x + w, y + h - dInsets.bottom,
 - iw - sInsets.right, sInsets.top, iw,
 - ih - sInsets.bottom, false);
 - // bottom right
 - g.drawImage(image, x + w - dInsets.right,
 - y + h - dInsets.bottom, x + w, y + h,
 - iw - sInsets.right, ih - sInsets.bottom, iw, ih,
 - null);
 - // bottom
 - drawChunk(image, g, stretch, x + dInsets.left,
 - y + h - dInsets.bottom, x + w - dInsets.right,
 - y + h, sInsets.left, ih - sInsets.bottom,
 - iw - sInsets.right, ih, true);
 - // bottom left
 - g.drawImage(image, x, y + h - dInsets.bottom, x + dInsets.left,
 - y + h, 0, ih - sInsets.bottom, sInsets.left, ih,
 - null);
 - // left
 - drawChunk(image, g, stretch, x, y + dInsets.top,
 - x + dInsets.left, y + h - dInsets.bottom,
 - 0, sInsets.top, sInsets.left, ih - sInsets.bottom,
 - false);
 - // center
 - if (getPaintsCenter()) {
 - g.drawImage(image, x + dInsets.left, y + dInsets.top,
 - x + w - dInsets.right, y + h - dInsets.bottom,
 - sInsets.left, sInsets.top, iw - sInsets.right,
 - ih - sInsets.bottom, null);
 - }
 - }
 - if (renderingHint != null) {
 - ((Graphics2D)g).setRenderingHint(RenderingHints.KEY_INTERPOLATION,
 - lastHint);
 - }
 - }
 - private void drawChunk(Image image, Graphics g, boolean stretch,
 - int dx1, int dy1, int dx2, int dy2, int sx1,
 - int sy1, int sx2, int sy2,
 - boolean xDirection) {
 - if (stretch) {
 - g.drawImage(image, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2, null);
 - }
 - else {
 - int xSize = sx2 - sx1;
 - int ySize = sy2 - sy1;
 - int deltaX;
 - int deltaY;
 - if (xDirection) {
 - deltaX = xSize;
 - deltaY = 0;
 - }
 - else {
 - deltaX = 0;
 - deltaY = ySize;
 - }
 - while (dx1 < dx2 && dy1 < dy2) {
 - int newDX2 = Math.min(dx2, dx1 + xSize);
 - int newDY2 = Math.min(dy2, dy1 + ySize);
 - g.drawImage(image, dx1, dy1, newDX2, newDY2,
 - sx1, sy1, sx1 + newDX2 - dx1,
 - sy1 + newDY2 - dy1, null);
 - dx1 += deltaX;
 - dy1 += deltaY;
 - }
 - }
 - }
 - }