| /* |
| * Copyright (C) 2012 The Android Open Source Project |
| * |
| * Licensed under the Eclipse Public License, Version 1.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.eclipse.org/org/documents/epl-v10.php |
| * |
| * 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 com.android.ide.eclipse.adt.internal.assetstudio; |
| |
| import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.DEFAULT_LAUNCHER_ICON; |
| |
| import com.android.annotations.NonNull; |
| import com.android.assetstudiolib.GraphicGenerator; |
| import com.android.assetstudiolib.GraphicGenerator.Shape; |
| import com.android.assetstudiolib.GraphicGeneratorContext; |
| import com.android.ide.eclipse.adt.AdtPlugin; |
| import com.android.ide.eclipse.adt.internal.wizards.templates.TemplateManager; |
| |
| import org.eclipse.core.resources.IProject; |
| import org.eclipse.swt.graphics.RGB; |
| |
| import java.awt.Font; |
| import java.awt.GraphicsEnvironment; |
| import java.awt.image.BufferedImage; |
| import java.io.File; |
| import java.io.IOException; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import javax.imageio.ImageIO; |
| |
| /** |
| * Value object for the AssetStudio wizard. These values are both set by the |
| * wizard as well as read by the wizard initially, so passing in a configured |
| * {@link CreateAssetSetWizardState} to the icon generator is possible. |
| */ |
| public class CreateAssetSetWizardState implements GraphicGeneratorContext { |
| /** |
| * The type of asset being created. This field is static such that when you |
| * bring up the wizard repeatedly (for example to create multiple |
| * notification icons) you don't have to keep selecting the same type over |
| * and over. |
| */ |
| public static AssetType sLastType = AssetType.LAUNCHER; |
| |
| /** The type of asset to be created */ |
| public AssetType type = sLastType; |
| |
| /** The base name to use for the created icons */ |
| public String outputName; |
| |
| /** The minimum SDK being targeted */ |
| public int minSdk = -1; |
| |
| /** The project to create the icons into */ |
| public IProject project; |
| |
| /** Whether empty space around the source image should be trimmed */ |
| public boolean trim = true; |
| |
| /** The type of source the icon is being created from */ |
| public SourceType sourceType = SourceType.TEXT; |
| |
| /** If {@link #sourceType} is a {@link SourceType#CLIPART}, the name of the clipart image */ |
| public String clipartName; |
| |
| /** If {@link #sourceType} is a {@link SourceType#IMAGE}, the path to the input image */ |
| public File imagePath; |
| |
| /** If {@link #sourceType} is a {@link SourceType#TEXT}, the text to render */ |
| public String text = "aA"; |
| |
| /** The amount of padding to add around the source image */ |
| public int padding = 15; |
| |
| /** The background shape */ |
| public Shape shape = Shape.SQUARE; |
| |
| /** Whether the image should be cropped */ |
| public boolean crop; |
| |
| /** Whether to use Holo Dark for action bar icons */ |
| public boolean holoDark; |
| |
| /** The background color to use for the shape (unless the shape is {@link Shape#NONE} */ |
| public RGB background = new RGB(0xff, 0x00, 0x00); |
| |
| /** The background color to use for the text or clipart (unless shape is {@link Shape#NONE} */ |
| public RGB foreground = new RGB(0x00, 0x00, 0x00); |
| |
| /** If {@link #sourceType} is a {@link SourceType#TEXT}, the font of the text to render */ |
| private Font mTextFont; |
| |
| private Map<String, BufferedImage> mImageCache = null; |
| |
| /** |
| * Gets the text font to be used for text rendering if the |
| * {@link #sourceType} is a {@link SourceType#TEXT} |
| * |
| * @return the text font |
| */ |
| @NonNull |
| public Font getTextFont() { |
| if (mTextFont == null) { |
| GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment(); |
| String[] fontNames = env.getAvailableFontFamilyNames(); |
| for (String familyName : fontNames) { |
| if (familyName.equals("Helvetica")) { |
| mTextFont = new java.awt.Font(familyName, java.awt.Font.BOLD, 512); |
| break; |
| } |
| } |
| if (mTextFont == null) { |
| for (String familyName : fontNames) { |
| if (familyName.equals("Arial")) { |
| mTextFont = new java.awt.Font(familyName, java.awt.Font.BOLD, 512); |
| break; |
| } |
| } |
| |
| if (mTextFont == null) { |
| mTextFont = new java.awt.Font("SansSerif", java.awt.Font.BOLD, 512); |
| } |
| } |
| } |
| |
| return mTextFont; |
| } |
| |
| /** |
| * Sets the text font to be used for text rendering if the |
| * {@link #sourceType} is a {@link SourceType#TEXT} |
| * |
| * @param textFont the font to use |
| */ |
| public void setTextFont(@NonNull Font textFont) { |
| mTextFont = textFont; |
| } |
| |
| /** Types of sources that the asset studio can use to generate icons from */ |
| public enum SourceType { |
| /** Generate the icon using the image pointed to by {@link #imagePath} */ |
| IMAGE, |
| |
| /** Generate the icon using the clipart named by {@link #clipartName} */ |
| CLIPART, |
| |
| /** Generate the icon using the text in {@link #text} */ |
| TEXT |
| } |
| |
| // ---- Implements GraphicGeneratorContext ---- |
| |
| @Override |
| public BufferedImage loadImageResource(String relativeName) { |
| try { |
| return getCachedImage(relativeName, true); |
| } catch (IOException e) { |
| AdtPlugin.log(e, null); |
| return null; |
| } |
| } |
| |
| BufferedImage getCachedImage(String path, boolean isPluginRelative) |
| throws IOException { |
| BufferedImage image = mImageCache != null ? mImageCache.get(path) : null; |
| if (image == null) { |
| image = getImage(path, isPluginRelative); |
| if (mImageCache == null) { |
| mImageCache = new HashMap<String, BufferedImage>(); |
| } |
| mImageCache.put(path, image); |
| } |
| |
| return image; |
| } |
| |
| @NonNull |
| static BufferedImage getImage(@NonNull String path, boolean isPluginRelative) |
| throws IOException { |
| BufferedImage image = null; |
| if (isPluginRelative) { |
| image = GraphicGenerator.getStencilImage(path); |
| } else { |
| if (path.equals(DEFAULT_LAUNCHER_ICON)) { |
| File file = TemplateManager.getTemplateLocation( |
| "projects/NewAndroidApplication/root/res/drawable-xhdpi/ic_launcher.png"); //$NON-NLS-1$ |
| if (file != null) { |
| path = file.getPath(); |
| } else { |
| image = GraphicGenerator.getStencilImage("user.png"); |
| } |
| } |
| |
| File file = new File(path); |
| |
| // Requires Batik |
| //if (file.getName().endsWith(DOT_SVG)) { |
| // image = loadSvgImage(file); |
| //} |
| |
| if (image == null) { |
| image = ImageIO.read(file); |
| } |
| } |
| |
| if (image == null) { |
| image = new BufferedImage(1,1, BufferedImage.TYPE_INT_ARGB); |
| } |
| |
| return image; |
| } |
| |
| // This requires Batik for SVG rendering |
| // |
| //public static BufferedImage loadSvgImage(File file) { |
| // BufferedImageTranscoder transcoder = new BufferedImageTranscoder(); |
| // |
| // String svgURI = file.toURI().toString(); |
| // TranscoderInput input = new TranscoderInput(svgURI); |
| // |
| // try { |
| // transcoder.transcode(input, null); |
| // } catch (TranscoderException e) { |
| // e.printStackTrace(); |
| // return null; |
| // } |
| // |
| // return transcoder.decodedImage; |
| //} |
| // |
| ///** |
| // * A dummy implementation of an {@link ImageTranscoder} that simply stores the {@link |
| // * BufferedImage} generated by the SVG library. |
| // */ |
| //private static class BufferedImageTranscoder extends ImageTranscoder { |
| // public BufferedImage decodedImage; |
| // |
| // @Override |
| // public BufferedImage createImage(int w, int h) { |
| // return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); |
| // } |
| // |
| // @Override |
| // public void writeImage(BufferedImage image, TranscoderOutput output) |
| // throws TranscoderException { |
| // this.decodedImage = image; |
| // } |
| //} |
| } |