2
* Copyright (c) 2005-2010 Flamingo Kirill Grouchnikov. All Rights Reserved.
4
* Redistribution and use in source and binary forms, with or without
5
* modification, are permitted provided that the following conditions are met:
7
* o Redistributions of source code must retain the above copyright notice,
8
* this list of conditions and the following disclaimer.
10
* o Redistributions in binary form must reproduce the above copyright notice,
11
* this list of conditions and the following disclaimer in the documentation
12
* and/or other materials provided with the distribution.
14
* o Neither the name of Flamingo Kirill Grouchnikov nor the names of
15
* its contributors may be used to endorse or promote products derived
16
* from this software without specific prior written permission.
18
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
20
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
21
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
22
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
27
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
28
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
package org.pushingpixels.flamingo.api.common.icon;
33
import java.awt.image.BufferedImage;
34
import java.awt.image.BufferedImageOp;
35
import java.util.LinkedHashMap;
38
import org.pushingpixels.flamingo.api.common.AsynchronousLoading;
39
import org.pushingpixels.flamingo.internal.utils.FlamingoUtilities;
42
* Implementation of {@link ResizableIcon} that allows applying a
43
* {@link BufferedImageOp} on another icon.
45
* @author Kirill Grouchnikov
47
public class FilteredResizableIcon implements ResizableIcon {
49
* Image cache to speed up rendering.
51
protected Map<String, BufferedImage> cachedImages;
54
* The main (pre-filtered) icon.
56
protected ResizableIcon delegate;
61
protected BufferedImageOp operation;
64
* Creates a new filtered icon.
67
* The main (pre-filtered) icon.
71
public FilteredResizableIcon(ResizableIcon delegate,
72
BufferedImageOp operation) {
74
this.delegate = delegate;
75
this.operation = operation;
76
this.cachedImages = new LinkedHashMap<String, BufferedImage>() {
78
protected boolean removeEldestEntry(
79
java.util.Map.Entry<String, BufferedImage> eldest) {
88
* @see javax.swing.Icon#getIconHeight()
91
public int getIconHeight() {
92
return delegate.getIconHeight();
98
* @see javax.swing.Icon#getIconWidth()
101
public int getIconWidth() {
102
return delegate.getIconWidth();
109
* org.jvnet.flamingo.common.icon.ResizableIcon#setDimension(java.awt.Dimension
113
public void setDimension(Dimension newDimension) {
114
delegate.setDimension(newDimension);
120
* @see javax.swing.Icon#paintIcon(java.awt.Component, java.awt.Graphics,
124
public void paintIcon(Component c, Graphics g, int x, int y) {
126
String key = this.getIconWidth() + ":" + this.getIconHeight();
127
if (!this.cachedImages.containsKey(key)) {
129
if (this.delegate instanceof AsynchronousLoading) {
130
AsynchronousLoading asyncDelegate = (AsynchronousLoading) this.delegate;
131
// if the delegate is still loading - do nothing
132
if (asyncDelegate.isLoading())
135
BufferedImage offscreen = FlamingoUtilities.getBlankImage(this
136
.getIconWidth(), this.getIconHeight());
137
Graphics2D g2d = offscreen.createGraphics();
138
this.delegate.paintIcon(c, g2d, 0, 0);
140
BufferedImage filtered = this.operation.filter(offscreen, null);
141
this.cachedImages.put(key, filtered);
143
g.drawImage(this.cachedImages.get(key), x, y, null);