/* * Copyright (c) 2010-2012 Célio Cidral Junior. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.tomighty.ui.util; import static java.awt.RenderingHints.KEY_TEXT_ANTIALIASING; import static java.awt.RenderingHints.VALUE_TEXT_ANTIALIAS_ON; import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.GradientPaint; import java.awt.Graphics2D; import java.awt.Image; import java.awt.RenderingHints; import java.awt.font.FontRenderContext; import java.awt.font.TextLayout; import java.awt.geom.Ellipse2D; import java.awt.image.BufferedImage; import java.awt.image.BufferedImageOp; import javax.swing.UIManager; public class Canvas { private BufferedImage image; private int width; private int height; private Font font; public Canvas(Dimension size) { image = new BufferedImage(size.width, size.height, BufferedImage.TYPE_INT_ARGB); this.width = size.width; this.height = size.height; this.font = defaultFont(); } public static Font defaultFont() { return UIManager.getDefaults().getFont("Label.font"); } public Image image() { return image; } public void fontSize(float size) { font = font.deriveFont(size); } public int width() { return width; } public int height() { return height; } public void paintShinyBackground(Color bright, Color dark) { paintGradient(dark, bright); double ellipseWidth = (double)width * 1.5; double ellipseHeight = (double)height * 1.1; double x = (double)width / 2.0 - ellipseWidth / 2.0; double y = ellipseHeight * -0.55; Ellipse2D shape = new Ellipse2D.Double(x, y, ellipseWidth, ellipseHeight); Graphics2D graphics = image.createGraphics(); try { graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graphics.setPaint(new GradientPaint(0f, 0f, bright.brighter(), 0f, (float)shape.getHeight(), dark.brighter())); graphics.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.6f)); graphics.fill(shape); } finally { graphics.dispose(); } } public void paintGradient(Color color) { Color start = color.brighter().brighter(); Color end = color.darker().darker(); paintGradient(start, end); } private void paintGradient(Color start, Color end) { paintGradient(start, end, 0, height); } private void paintGradient(Color start, Color end, int y1, int y2) { Graphics2D graphics = image.createGraphics(); try { graphics.setPaint(new GradientPaint(0, y1, start, 0, y2, end)); graphics.fillRect(0, y1, width, y2); } finally { graphics.dispose(); } } public void drawBorder(Color color) { Graphics2D graphics = image.createGraphics(); try { graphics.setColor(color); graphics.drawRect(0, 0, width - 1, height - 1); } finally { graphics.dispose(); } } public void drawCentralizedText(String text) { Graphics2D graphics = image.createGraphics(); try { graphics.setFont(font); graphics.setRenderingHint(KEY_TEXT_ANTIALIASING, VALUE_TEXT_ANTIALIAS_ON); FontRenderContext context = graphics.getFontRenderContext(); TextLayout layout = new TextLayout(text, font, context); int x = width / 2 - (int) (layout.getAdvance() / 2f); int y = height / 2 + (int) (layout.getAscent() / 2f) - 1; graphics.setColor(Color.DARK_GRAY.darker()); graphics.drawString(text, x-1, y-1); graphics.setColor(Color.WHITE); graphics.drawString(text, x, y); } finally { graphics.dispose(); } } public void applyFilter(BufferedImageOp filter) { image = filter.filter(image, image); } public void paint(Image image) { Graphics2D graphics = this.image.createGraphics(); try { graphics.drawImage(image, 0, 0, null); } finally { graphics.dispose(); } } }