package br.com.etyllica.loader.image; import java.awt.image.BufferedImage; import java.io.IOException; import java.net.MalformedURLException; import java.net.URL; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; import br.com.etyllica.layer.StaticLayer; import br.com.etyllica.loader.LoaderImpl; import br.com.etyllica.util.StringUtils; import br.com.etyllica.util.io.IOHelper; /** * * @author yuripourre * @license LGPLv3 * */ public class ImageLoader extends LoaderImpl { private static ImageLoader instance = null; private Map<String, ImageReader> loaders = new HashMap<String, ImageReader>(); private Map<String, BufferedImage> images = new HashMap<String, BufferedImage>(); private Map<String, List<ImageFrame>> animations = new HashMap<String, List<ImageFrame>>(); private final static String BMP = "bmp"; private final static String GIF = "gif"; private final static String ICO = "ico"; private final static String JPG = "jpg"; private final static String JPEG = "jpeg"; private final static String PCX = "pcx"; private final static String PNG = "png"; private final static String TIF = "tif"; private final static String TIFF = "tiff"; private final static String TGA = "tga"; private ImageLoader() { super(); folder = "assets/images/"; AWTReader awtReader = new AWTReader(); loaders.put(BMP, awtReader); loaders.put(JPG, awtReader); loaders.put(JPEG, awtReader); loaders.put(PNG, awtReader); loaders.put(TIF, awtReader); loaders.put(TIFF, awtReader); loaders.put(ICO, new ICOReader()); loaders.put(GIF, new GIFReader()); loaders.put(TGA, new TGAReader()); loaders.put(PCX, new PCXReader()); } public static ImageLoader getInstance() { if(instance==null) { instance = new ImageLoader(); } return instance; } public StaticLayer loadImage(String path) { return loadImage(path, false); } public StaticLayer loadImage(String path, boolean absolute) { BufferedImage img = getImage(path, absolute); StaticLayer cam = new StaticLayer(); cam.setSize(img.getWidth(), img.getHeight()); if(absolute) { cam.cloneLayer(IOHelper.FILE_PREFIX+path); } else { cam.cloneLayer(path); } return cam; } public BufferedImage getImage(String path) { boolean absolute = false; if(path.startsWith(IOHelper.FILE_PREFIX)) { absolute = true; } return getImage(path, absolute); } public BufferedImage getImage(String path, boolean absolute) { String fullPath = fullPath(path, absolute); if (images.containsKey(fullPath)) { return images.get(fullPath); } else { URL dir = null; if (!absolute) { try { dir = new URL(url, fullPath); } catch (MalformedURLException e1) { e1.printStackTrace(); } } else { if (!fullPath.startsWith(IOHelper.FILE_PREFIX)) { fullPath = IOHelper.FILE_PREFIX + fullPath; } try { dir = new URL(fullPath); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } String ext = StringUtils.fileExtension(fullPath); ImageReader reader = loaders.get(ext); BufferedImage img = null; if(reader == null) { System.out.println("Etyllica can't load "+ext+" files."); } else { try { img = reader.loadImage(dir); images.put(fullPath, img); if (img == null) { System.err.println("Image "+fullPath+" not found."); } } catch (IOException e) { System.err.println("Image "+fullPath+" not found."); } } return img; } } public List<ImageFrame> getAnimation(String path) { return getAnimation(path, false); } public List<ImageFrame> getAnimation(String path, boolean absolute) { String fullPath = fullPath(path, absolute); if(animations.containsKey(fullPath)) { return animations.get(fullPath); }else{ List<ImageFrame> list = null; URL dir = null; try { dir = new URL(url, fullPath); } catch (MalformedURLException e1) { e1.printStackTrace(); } String ext = StringUtils.fileExtension(fullPath); if(ext.equals("gif")) { try { list = GIFReader.getInstance().loadAnimation(dir); animations.put(fullPath, list); } catch (IOException e) { System.err.println("Image "+fullPath+" not found."); e.printStackTrace(); } } return list; } } public Set<String> supportedExtensions() { return loaders.keySet(); } public void addLoader(String extension, ImageReader loader) { loaders.put(extension, loader); } public void disposeImage(String path) { images.remove(path); } }