package com.rocoo.magix; import java.io.*; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; public class ImageHandler { private Magix magix; private static Map<String, char[]> tokens = new HashMap<>(); private static Map<char[], byte[]> tokenToImageData = new HashMap<>(); public ImageHandler(Magix magix) throws IOException { this.magix = magix; byte[] data = loadDefaultImage(Magix.class.getResourceAsStream("/image.gnp"), false); tokenToImageData.put(tokens.get("default"), data); this.magix.setImageToken(tokens.get("default")); } private byte[] loadDefaultImage(final InputStream inputStream, boolean close) { try { DataInputStream stream = new DataInputStream(new BufferedInputStream(inputStream)); ByteArrayOutputStream baos = new ByteArrayOutputStream(); DataOutputStream outputStream = new DataOutputStream(baos); byte[] buffer; if (!stream.readUTF().equals("GNP")) throw new IllegalArgumentException("Illegal image format!"); outputStream.writeLong(0x89504E470D0A1A0AL); // write the default PNG signature int header1 = stream.readInt(); int header2 = stream.readInt(); outputStream.writeInt(header1); outputStream.writeInt(header2); buffer = new byte[17]; stream.read(buffer); outputStream.write(buffer); while (true) { int length = stream.readInt(); int type = stream.readInt(); outputStream.writeInt(length); outputStream.writeInt(type); if (type == 0x49454E44) { // End int code = stream.readInt(); outputStream.writeInt(code); break; } switch (type) { case 0x74455874: { // tEXT buffer = new byte[length]; for (int i = 0; i < buffer.length; i++) { buffer[i] = (byte) ~stream.readByte(); } outputStream.write(buffer); int keyLength = 0; while (buffer[keyLength] != 0) { keyLength++; } // String key = new String(buffer, 0, keyLength, StandardCharsets.UTF_8); // String value = new String(buffer, keyLength + 1, length - keyLength - 1, StandardCharsets.UTF_8); String rawToken = new String(buffer, keyLength + 1, length - keyLength - 1, StandardCharsets.UTF_8); tokens.put("default", rawToken.toCharArray()); buffer = new byte[4]; stream.read(buffer); outputStream.write(buffer); break; } default: { buffer = new byte[length + 4]; stream.read(buffer); outputStream.write(buffer); break; } } } outputStream.flush(); outputStream.close(); return baos.toByteArray(); } catch (IOException e) { e.printStackTrace(); } finally { try { if (close) { inputStream.close(); } } catch (IOException e) { e.printStackTrace(); } } return null; } public byte[] getImageByToken(char[] token) { return tokenToImageData.get(token); } }