package com.kreative.paint.material.frame;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.io.PrintWriter;
public class FrameWriter {
public static final long PNG_MAGIC_NUMBER = 0x89504E470D0A1A0AL;
public static final int PNG_CHUNK_FRNF = 0x66724E46;
public static final int PNG_CHUNK_IEND = 0x49454E44;
public static void stripFRNF(DataInputStream in, DataOutputStream out) throws IOException {
long magic = in.readLong();
if (magic != PNG_MAGIC_NUMBER) throw new IOException("Not a PNG file.");
out.writeLong(magic);
while (in.available() > 0) {
int cl = in.readInt();
int ct = in.readInt();
byte[] cd = new byte[cl];
in.read(cd);
int cc = in.readInt();
if (ct != PNG_CHUNK_FRNF) {
out.writeInt(cl);
out.writeInt(ct);
out.write(cd);
out.writeInt(cc);
}
}
}
public static void injectFRNF(DataInputStream in, DataOutputStream out, Frame frame) throws IOException {
long magic = in.readLong();
if (magic != PNG_MAGIC_NUMBER) throw new IOException("Not a PNG file.");
out.writeLong(magic);
while (in.available() > 0) {
int cl = in.readInt();
int ct = in.readInt();
byte[] cd = new byte[cl];
in.read(cd);
int cc = in.readInt();
if (ct == PNG_CHUNK_IEND) {
ByteArrayOutputStream b = new ByteArrayOutputStream();
DataOutputStream d = new DataOutputStream(b);
d.writeInt(PNG_CHUNK_FRNF);
d.writeShort(frame.contentStartX);
d.writeShort(frame.contentStartY);
d.writeShort(frame.contentExtentX);
d.writeShort(frame.contentExtentY);
d.writeShort(frame.repeatStartX);
d.writeShort(frame.repeatStartY);
d.writeShort(frame.repeatExtentX);
d.writeShort(frame.repeatExtentY);
d.writeShort(frame.widthMultiplier);
d.writeShort(frame.widthBase);
d.writeShort(frame.heightMultiplier);
d.writeShort(frame.heightBase);
if (frame.name != null) d.writeUTF(frame.name);
d.close();
b.close();
byte[] frnf = b.toByteArray();
out.writeInt(frnf.length - 4);
out.write(frnf);
out.writeInt(new CRCCalculator().calculateCRC(frnf));
}
if (ct != PNG_CHUNK_FRNF) {
out.writeInt(cl);
out.writeInt(ct);
out.write(cd);
out.writeInt(cc);
}
}
}
public static void printFRNX(PrintStream out, Frame frame) {
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
out.println("<!DOCTYPE frame PUBLIC \"-//Kreative//DTD FrameInfo 1.0//EN\" \"http://www.kreativekorp.com/dtd/frnx.dtd\">");
out.println("<frame");
if (frame.name != null) {
out.println("\tname=\"" + xmls(frame.name) + "\"");
}
out.println("\tcontent-start-x=\"" + frame.contentStartX + "\"");
out.println("\tcontent-start-y=\"" + frame.contentStartY + "\"");
out.println("\tcontent-extent-x=\"" + frame.contentExtentX + "\"");
out.println("\tcontent-extent-y=\"" + frame.contentExtentY + "\"");
out.println("\trepeat-start-x=\"" + frame.repeatStartX + "\"");
out.println("\trepeat-start-y=\"" + frame.repeatStartY + "\"");
out.println("\trepeat-extent-x=\"" + frame.repeatExtentX + "\"");
out.println("\trepeat-extent-y=\"" + frame.repeatExtentY + "\"");
if (frame.widthMultiplier > 0) {
out.println("\trestrict-content-width-multiplier=\"" + frame.widthMultiplier + "\"");
out.println("\trestrict-content-width-base=\"" + frame.widthBase + "\"");
}
if (frame.heightMultiplier > 0) {
out.println("\trestrict-content-height-multiplier=\"" + frame.heightMultiplier + "\"");
out.println("\trestrict-content-height-base=\"" + frame.heightBase + "\"");
}
out.println("/>");
}
public static void printFRNX(PrintWriter out, Frame frame) {
out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
out.println("<!DOCTYPE frame PUBLIC \"-//Kreative//DTD FrameInfo 1.0//EN\" \"http://www.kreativekorp.com/dtd/frnx.dtd\">");
out.println("<frame");
if (frame.name != null) {
out.println("\tname=\"" + xmls(frame.name) + "\"");
}
out.println("\tcontent-start-x=\"" + frame.contentStartX + "\"");
out.println("\tcontent-start-y=\"" + frame.contentStartY + "\"");
out.println("\tcontent-extent-x=\"" + frame.contentExtentX + "\"");
out.println("\tcontent-extent-y=\"" + frame.contentExtentY + "\"");
out.println("\trepeat-start-x=\"" + frame.repeatStartX + "\"");
out.println("\trepeat-start-y=\"" + frame.repeatStartY + "\"");
out.println("\trepeat-extent-x=\"" + frame.repeatExtentX + "\"");
out.println("\trepeat-extent-y=\"" + frame.repeatExtentY + "\"");
if (frame.widthMultiplier > 0) {
out.println("\trestrict-content-width-multiplier=\"" + frame.widthMultiplier + "\"");
out.println("\trestrict-content-width-base=\"" + frame.widthBase + "\"");
}
if (frame.heightMultiplier > 0) {
out.println("\trestrict-content-height-multiplier=\"" + frame.heightMultiplier + "\"");
out.println("\trestrict-content-height-base=\"" + frame.heightBase + "\"");
}
out.println("/>");
}
private static String xmls(String s) {
return s.replaceAll("&", "&")
.replaceAll("<", "<")
.replaceAll(">", ">")
.replaceAll("\"", """);
}
}