1 /*
2  * Copyright (C) 2012 The Android Open Source Project
3  *
4  * Licensed under the Eclipse Public License, Version 1.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.eclipse.org/org/documents/epl-v10.php
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 package com.android.ide.eclipse.adt.internal.assetstudio;
17 
18 import static com.android.ide.eclipse.adt.internal.wizards.templates.NewProjectWizard.DEFAULT_LAUNCHER_ICON;
19 
20 import com.android.annotations.NonNull;
21 import com.android.assetstudiolib.GraphicGenerator;
22 import com.android.assetstudiolib.GraphicGenerator.Shape;
23 import com.android.assetstudiolib.GraphicGeneratorContext;
24 import com.android.ide.eclipse.adt.AdtPlugin;
25 import com.android.ide.eclipse.adt.internal.wizards.templates.TemplateManager;
26 
27 import org.eclipse.core.resources.IProject;
28 import org.eclipse.swt.graphics.RGB;
29 
30 import java.awt.Font;
31 import java.awt.GraphicsEnvironment;
32 import java.awt.image.BufferedImage;
33 import java.io.File;
34 import java.io.IOException;
35 import java.util.HashMap;
36 import java.util.Map;
37 
38 import javax.imageio.ImageIO;
39 
40 /**
41  * Value object for the AssetStudio wizard. These values are both set by the
42  * wizard as well as read by the wizard initially, so passing in a configured
43  * {@link CreateAssetSetWizardState} to the icon generator is possible.
44  */
45 public class CreateAssetSetWizardState implements GraphicGeneratorContext {
46     /**
47      * The type of asset being created. This field is static such that when you
48      * bring up the wizard repeatedly (for example to create multiple
49      * notification icons) you don't have to keep selecting the same type over
50      * and over.
51      */
52     public static AssetType sLastType = AssetType.LAUNCHER;
53 
54     /** The type of asset to be created */
55     public AssetType type = sLastType;
56 
57     /** The base name to use for the created icons */
58     public String outputName;
59 
60     /** The minimum SDK being targeted */
61     public int minSdk = -1;
62 
63     /** The project to create the icons into */
64     public IProject project;
65 
66     /** Whether empty space around the source image should be trimmed */
67     public boolean trim = true;
68 
69     /** The type of source the icon is being created from */
70     public SourceType sourceType = SourceType.TEXT;
71 
72     /** If {@link #sourceType} is a {@link SourceType#CLIPART}, the name of the clipart image */
73     public String clipartName;
74 
75     /** If {@link #sourceType} is a {@link SourceType#IMAGE}, the path to the input image */
76     public File imagePath;
77 
78     /** If {@link #sourceType} is a {@link SourceType#TEXT}, the text to render */
79     public String text = "aA";
80 
81     /** The amount of padding to add around the source image */
82     public int padding = 15;
83 
84     /** The background shape */
85     public Shape shape = Shape.SQUARE;
86 
87     /** Whether the image should be cropped */
88     public boolean crop;
89 
90     /** Whether to use Holo Dark for action bar icons */
91     public boolean holoDark;
92 
93     /** The background color to use for the shape (unless the shape is {@link Shape#NONE} */
94     public RGB background = new RGB(0xff, 0x00, 0x00);
95 
96     /** The background color to use for the text or clipart (unless shape is {@link Shape#NONE} */
97     public RGB foreground = new RGB(0x00, 0x00, 0x00);
98 
99     /** If {@link #sourceType} is a {@link SourceType#TEXT}, the font of the text to render */
100     private Font mTextFont;
101 
102     private Map<String, BufferedImage> mImageCache = null;
103 
104     /**
105      * Gets the text font to be used for text rendering if the
106      * {@link #sourceType} is a {@link SourceType#TEXT}
107      *
108      * @return the text font
109      */
110     @NonNull
getTextFont()111     public Font getTextFont() {
112         if (mTextFont == null) {
113             GraphicsEnvironment env = GraphicsEnvironment.getLocalGraphicsEnvironment();
114             String[] fontNames = env.getAvailableFontFamilyNames();
115             for (String familyName : fontNames) {
116                 if (familyName.equals("Helvetica")) {
117                     mTextFont = new java.awt.Font(familyName, java.awt.Font.BOLD, 512);
118                     break;
119                 }
120             }
121             if (mTextFont == null) {
122                 for (String familyName : fontNames) {
123                     if (familyName.equals("Arial")) {
124                         mTextFont = new java.awt.Font(familyName, java.awt.Font.BOLD, 512);
125                         break;
126                     }
127                 }
128 
129                 if (mTextFont == null) {
130                     mTextFont = new java.awt.Font("SansSerif", java.awt.Font.BOLD, 512);
131                 }
132             }
133         }
134 
135         return mTextFont;
136     }
137 
138     /**
139      * Sets the text font to be used for text rendering if the
140      * {@link #sourceType} is a {@link SourceType#TEXT}
141      *
142      * @param textFont the font to use
143      */
setTextFont(@onNull Font textFont)144     public void setTextFont(@NonNull Font textFont) {
145         mTextFont = textFont;
146     }
147 
148     /** Types of sources that the asset studio can use to generate icons from */
149     public enum SourceType {
150         /** Generate the icon using the image pointed to by {@link #imagePath} */
151         IMAGE,
152 
153         /** Generate the icon using the clipart named by {@link #clipartName} */
154         CLIPART,
155 
156         /** Generate the icon using the text in {@link #text} */
157         TEXT
158     }
159 
160     // ---- Implements GraphicGeneratorContext ----
161 
162     @Override
loadImageResource(String relativeName)163     public BufferedImage loadImageResource(String relativeName) {
164         try {
165             return getCachedImage(relativeName, true);
166         } catch (IOException e) {
167             AdtPlugin.log(e, null);
168             return null;
169         }
170     }
171 
getCachedImage(String path, boolean isPluginRelative)172     BufferedImage getCachedImage(String path, boolean isPluginRelative)
173             throws IOException {
174         BufferedImage image = mImageCache != null ? mImageCache.get(path) : null;
175         if (image == null) {
176             image = getImage(path, isPluginRelative);
177             if (mImageCache == null) {
178                 mImageCache = new HashMap<String, BufferedImage>();
179             }
180             mImageCache.put(path, image);
181         }
182 
183         return image;
184     }
185 
186     @NonNull
getImage(@onNull String path, boolean isPluginRelative)187     static BufferedImage getImage(@NonNull String path, boolean isPluginRelative)
188             throws IOException {
189         BufferedImage image = null;
190         if (isPluginRelative) {
191             image = GraphicGenerator.getStencilImage(path);
192         } else {
193             if (path.equals(DEFAULT_LAUNCHER_ICON)) {
194                 File file = TemplateManager.getTemplateLocation(
195                   "projects/NewAndroidApplication/root/res/drawable-xhdpi/ic_launcher.png"); //$NON-NLS-1$
196                 if (file != null) {
197                     path = file.getPath();
198                 } else {
199                     image = GraphicGenerator.getStencilImage("user.png");
200                 }
201             }
202 
203             File file = new File(path);
204 
205             // Requires Batik
206             //if (file.getName().endsWith(DOT_SVG)) {
207             //    image = loadSvgImage(file);
208             //}
209 
210             if (image == null) {
211                 image = ImageIO.read(file);
212             }
213         }
214 
215         if (image == null) {
216             image = new BufferedImage(1,1, BufferedImage.TYPE_INT_ARGB);
217         }
218 
219         return image;
220     }
221 
222     // This requires Batik for SVG rendering
223     //
224     //public static BufferedImage loadSvgImage(File file) {
225     //    BufferedImageTranscoder transcoder = new BufferedImageTranscoder();
226     //
227     //    String svgURI = file.toURI().toString();
228     //    TranscoderInput input = new TranscoderInput(svgURI);
229     //
230     //    try {
231     //        transcoder.transcode(input, null);
232     //    } catch (TranscoderException e) {
233     //        e.printStackTrace();
234     //        return null;
235     //    }
236     //
237     //    return transcoder.decodedImage;
238     //}
239     //
240     ///**
241     // * A dummy implementation of an {@link ImageTranscoder} that simply stores the {@link
242     // * BufferedImage} generated by the SVG library.
243     // */
244     //private static class BufferedImageTranscoder extends ImageTranscoder {
245     //    public BufferedImage decodedImage;
246     //
247     //    @Override
248     //    public BufferedImage createImage(int w, int h) {
249     //        return new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);
250     //    }
251     //
252     //    @Override
253     //    public void writeImage(BufferedImage image, TranscoderOutput output)
254     //            throws TranscoderException {
255     //        this.decodedImage = image;
256     //    }
257     //}
258 }
259