package com.kreative.paint.material; import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; import java.util.Map; import java.util.TreeMap; import javax.imageio.ImageIO; import com.kreative.paint.material.frame.FRNXParser; import com.kreative.paint.material.frame.Frame; import com.kreative.paint.material.frame.FrameReader; public class FrameLoader { private final MaterialLoader loader; private final MaterialList<Frame> frames; public FrameLoader(MaterialLoader loader) { this.loader = loader; this.frames = new MaterialList<Frame>(); } public MaterialList<Frame> getFrames() { if (frames.isEmpty()) loadResources(); if (frames.isEmpty()) createFrames(); return frames; } private void loadResources() { for (MaterialResource r : loader.listResources()) { if (r.isFormat("png", false)) { if (r.getBranchName().toLowerCase().contains("frames")) { try { InputStream in = r.getInputStream(); BufferedImage image = ImageIO.read(in); in.close(); in = r.getInputStream(); Frame frame = FrameReader.readFrame(r.getResourceName(), in, image); in.close(); String name = (frame.name != null) ? frame.name : r.getResourceName(); frames.add(name, frame); } catch (IOException e) { System.err.println("Warning: Ignoring invalid image: " + r.getResourceName()); e.printStackTrace(); } } } else if (r.isFormat("frnd", true)) { Map<String,MaterialResource> pngs = new TreeMap<String,MaterialResource>(); Map<String,MaterialResource> frnxs = new TreeMap<String,MaterialResource>(); for (MaterialResource child : r.listChildren()) { String name = child.getResourceName().replaceFirst("\\.[a-zA-Z0-9]+$", "").trim(); if (child.isFormat("png", false)) pngs.put(name, child); if (child.isFormat("frnx", false)) frnxs.put(name, child); } for (Map.Entry<String,MaterialResource> e : pngs.entrySet()) { MaterialResource png = e.getValue(); MaterialResource frnx = frnxs.get(e.getKey()); try { InputStream in = png.getInputStream(); BufferedImage image = ImageIO.read(in); in.close(); Frame frame; if (frnx == null) { frame = new Frame(image, r.getResourceName()); } else { in = frnx.getInputStream(); frame = FRNXParser.parse(e.getKey(), in, image); in.close(); } String name = (frame.name != null) ? frame.name : r.getResourceName(); frames.add(name, frame); } catch (IOException ex) { System.err.println("Warning: Ignoring invalid frame: " + e.getKey()); ex.printStackTrace(); } } } } } private void createFrames() { System.err.println("Notice: No frames found. Generating generic frames."); BufferedImage i1 = new BufferedImage(4, 4, BufferedImage.TYPE_INT_ARGB); BufferedImage i2 = new BufferedImage(4, 4, BufferedImage.TYPE_INT_ARGB); BufferedImage i3 = new BufferedImage(4, 4, BufferedImage.TYPE_INT_ARGB); for (int j = 0; j < 4; j++) { i1.setRGB(0, j, 0xFF000000); i1.setRGB(3, j, 0xFF000000); i1.setRGB(j, 0, 0xFF000000); i1.setRGB(j, 3, 0xFF000000); i2.setRGB(0, j, 0xFF808080); i2.setRGB(3, j, 0xFF808080); i2.setRGB(j, 0, 0xFF808080); i2.setRGB(j, 3, 0xFF808080); i3.setRGB(0, j, 0xFFFFFFFF); i3.setRGB(3, j, 0xFFFFFFFF); i3.setRGB(j, 0, 0xFFFFFFFF); i3.setRGB(j, 3, 0xFFFFFFFF); } frames.add("Simple Black", new Frame(i1, "Simple Black")); frames.add("Simple Gray", new Frame(i2, "Simple Gray")); frames.add("Simple White", new Frame(i3, "Simple White")); } }