| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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. |
| */ |
| /* |
| * Caricature.java |
| * |
| * Created on April 8, 2006, 4:09 PM |
| * |
| * To change this template, choose Tools | Template Manager |
| * and open the template in the editor. |
| */ |
| |
| package swing.binding.caricature; |
| |
| import java.awt.Dimension; |
| import java.awt.Graphics; |
| import java.awt.Graphics2D; |
| import java.awt.Image; |
| import java.net.URL; |
| import java.util.HashMap; |
| import java.util.Map; |
| import javax.swing.ImageIcon; |
| import javax.swing.JPanel; |
| |
| /** |
| * |
| * @author sky |
| */ |
| public class JCaricature extends JPanel { |
| private Map/*<String,Image>*/ imageMap; |
| |
| private boolean empty; |
| private int mouthStyle; |
| private int faceStyle; |
| private int hairStyle; |
| private int eyeStyle; |
| private int noseStyle; |
| private int rotation; |
| private float scale = 1.0f; |
| |
| public JCaricature() { |
| if (imageMap == null) { |
| imageMap = new HashMap/*<String,Image>*/(1); |
| for (int i = 0; i < 5; i++) { |
| getImage("face", i); |
| getImage("hair", i); |
| getImage("eyes", i); |
| getImage("nose", i); |
| getImage("mouth", i); |
| } |
| } |
| } |
| |
| public void setEmpty(boolean empty) { |
| if (this.empty != empty) { |
| this.empty = empty; |
| firePropertyChange("empty", !empty, empty); |
| repaint(); |
| } |
| } |
| |
| public boolean isEmpty() { |
| return empty; |
| } |
| |
| public void setRotation(int rotation) { |
| int oldRotation = this.rotation; |
| this.rotation = rotation; |
| repaint(); |
| firePropertyChange("rotation", oldRotation, rotation); |
| } |
| |
| public int getRotation() { |
| return rotation; |
| } |
| |
| public void setScale(float scale) { |
| float oldScale = this.scale; |
| this.scale = scale; |
| repaint(); |
| firePropertyChange("scale", oldScale, scale); |
| } |
| |
| public float getScale() { |
| return scale; |
| } |
| |
| public void setMouthStyle(int style) { |
| int oldStyle = mouthStyle; |
| mouthStyle = style; |
| firePropertyChange("mouthStyle", oldStyle, style); |
| repaint(); |
| } |
| |
| public int getMouthStyle() { |
| return mouthStyle; |
| } |
| |
| public void setFaceStyle(int style) { |
| int oldStyle = faceStyle; |
| faceStyle = style; |
| firePropertyChange("faceStyle", oldStyle, style); |
| repaint(); |
| } |
| |
| public int getFaceStyle() { |
| return faceStyle; |
| } |
| |
| public void setHairStyle(int style) { |
| int oldStyle = hairStyle; |
| hairStyle = style; |
| firePropertyChange("hairStyle", oldStyle, style); |
| repaint(); |
| } |
| |
| public int getHairStyle() { |
| return hairStyle; |
| } |
| |
| public void setEyeStyle(int style) { |
| int oldStyle = eyeStyle; |
| eyeStyle = style; |
| firePropertyChange("eyeStyle", oldStyle, style); |
| repaint(); |
| } |
| |
| public int getEyeStyle() { |
| return eyeStyle; |
| } |
| |
| public void setNoseStyle(int style) { |
| int oldStyle = noseStyle; |
| noseStyle = style; |
| firePropertyChange("noseStyle", oldStyle, style); |
| repaint(); |
| } |
| |
| public int getNoseStyle() { |
| return noseStyle; |
| } |
| |
| public Dimension getPreferredSize() { |
| if (!isPreferredSizeSet()) { |
| Image image = getImage("mouth", 0); |
| return new Dimension(image.getWidth(null), image.getHeight(null)); |
| } |
| return super.getPreferredSize(); |
| } |
| |
| public Dimension getMaximumSize() { |
| if (!isMaximumSizeSet()) { |
| return getPreferredSize(); |
| } |
| return super.getMaximumSize(); |
| } |
| |
| protected void paintComponent(Graphics g) { |
| super.paintComponent(g); |
| if (empty) { |
| return; |
| } |
| Graphics2D g2 = (Graphics2D)g.create(); |
| Image image = getImage("face", getFaceStyle()); |
| int iw = image.getWidth(null); |
| int ih = image.getHeight(null); |
| // g2.translate(iw / 2, ih / 2); |
| g2.translate(getWidth() / 2, getHeight() / 2); |
| if (iw != getWidth()) { |
| float forcedScale = (float)getWidth() / (float)iw; |
| g2.scale(forcedScale, forcedScale); |
| } |
| float scale = getScale(); |
| if (scale != 1) { |
| g2.scale((double)scale, (double)scale); |
| } |
| int rotation = getRotation(); |
| if (rotation != 0) { |
| g2.rotate(Math.toRadians(rotation)); |
| } |
| drawImage(g2, "face", getFaceStyle()); |
| drawImage(g2, "hair", getHairStyle()); |
| drawImage(g2, "eyes", getEyeStyle()); |
| drawImage(g2, "nose", getNoseStyle()); |
| drawImage(g2, "mouth", getMouthStyle()); |
| g2.dispose(); |
| } |
| |
| private void drawImage(Graphics g, String string, int i) { |
| Image image = getImage(string, i); |
| g.drawImage(image, -image.getWidth(null) / 2, -image.getHeight(null) / 2, null); |
| } |
| |
| private Image getImage(String key, int style) { |
| String imageName = key + (style + 1) + ".gif"; |
| Image image = (Image) imageMap.get(imageName); |
| if (image == null) { |
| System.err.println("name=" + imageName); |
| URL imageLoc = getClass().getResource("resources/" + imageName); |
| image = new ImageIcon(imageLoc).getImage(); |
| imageMap.put(imageName, image); |
| } |
| return image; |
| } |
| } |