TextureSync/testdata/src/creation/Creator.java

185 lines
5.5 KiB
Java

package creation;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.file.Files;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import java.util.UUID;
import javax.imageio.ImageIO;
public class Creator {
public static void main(String[] args) {
Random r = new Random(1);
String basedir = "outputdir/data";
String[] names = NameCreator.generateNames(r);
try {
FileOutputStream collectionOutput = new FileOutputStream(basedir + "/collection.json");
PrintWriter collectionWriter = new PrintWriter(collectionOutput);
collectionWriter.write("{\n \"textures\": [\n ");
boolean first = true;
int i=1;
for (String name : names) {
if (first) {
first = false;
} else {
collectionWriter.write(",\n ");
}
System.out.println("Creating " + name + " (texture " + i + " of " + names.length + ")");
storeImage(name, basedir, r, collectionWriter);
i++;
}
collectionWriter.write("\n ]\n}\n");
collectionWriter.close();
collectionOutput.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static boolean randBool(Random r, double probability) {
return r.nextDouble() < probability;
}
private static void storeImage(String name, String outputdir, Random r, PrintWriter collectionWriter)
throws IOException {
int size = 256 * (1 << r.nextInt(6));
NamedColor[] shuffling = Dictionary.colors.clone();
NamedColor[] mycolors = new NamedColor[3];
for (int i = 0; i < 3; i++) {
int otherPos = r.nextInt(7 - i) + i;
mycolors[i] = shuffling[otherPos];
shuffling[otherPos] = shuffling[i];
}
MyDate date = randomDate(r);
boolean grey = randBool(r, 0.01);
boolean border = randBool(r, 0.1);
boolean bold = randBool(r, 0.03);
boolean italic = randBool(r, 0.07);
BufferedImage img = createImage(size, name, mycolors, date, grey, border, bold, italic);
File tmpLocation = new File(outputdir + "/tempimage");
ImageIO.write(img, name.substring(name.length() - 3), tmpLocation);
String hash = hashFile(tmpLocation);
String ending = name.substring(name.length() - 3);
if (ending.equals("jpg")) {
ending = "jpeg";
}
tmpLocation.renameTo(new File(outputdir + "/textures/" + hash));
String tags = mycolors[0].name + "\", \"" + mycolors[1].name + "\", \"" + mycolors[2].name;
if (grey) {
tags += "\", \"grey";
}
if (border) {
tags += "\", \"border";
}
if (bold) {
tags += "\", \"bold";
}
if (italic) {
tags += "\", \"italic";
}
collectionWriter.write("{\n");
collectionWriter.write(" \"id\": \"" + UUID.randomUUID() + "\",\n");
collectionWriter.write(" \"name\": \"" + name + "\",\n");
collectionWriter.write(" \"tags\": [\"" + tags + "\"],\n");
collectionWriter.write(" \"format\": \"" + ending + "\",\n");
collectionWriter.write(" \"resolution\": [" + size + ", " + size + "],\n");
collectionWriter.write(" \"added_on\": " + date.asJsonArray() + ",\n");
collectionWriter.write(" \"texture_hash\": \"" + hash + "\"\n");
collectionWriter.write(" }");
}
private static MyDate randomDate(Random r) {
int back = (int) (-300 * Math.log(r.nextDouble()));
return new MyDate(3, 6, 2019).ago(back);
}
private final static char[] hexArray = "0123456789ABCDEF".toCharArray();
public static String bytesToHex(byte[] bytes) {
char[] hexChars = new char[bytes.length * 2];
for (int j = 0; j < bytes.length; j++) {
int v = bytes[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
private static String hashFile(File f) throws IOException {
byte[] data = Files.readAllBytes(f.toPath());
try {
MessageDigest hash = MessageDigest.getInstance("SHA-256");
byte[] hashval = hash.digest(data);
return bytesToHex(hashval);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
private static BufferedImage createImage(int size, String name, NamedColor[] colors, MyDate date, boolean grey,
boolean border, boolean bold, boolean italic) {
BufferedImage img = new BufferedImage(size, size, BufferedImage.TYPE_INT_RGB);
Graphics g = img.getGraphics();
// background
if (grey) {
g.setColor(Color.LIGHT_GRAY);
} else {
g.setColor(Color.WHITE);
}
g.fillRect(0, 0, size, size);
// border
if (border) {
int w = size / 40;
int l = size - 2*w;
g.setColor(Color.BLACK);
g.fillRect(w, w, l, w);
g.fillRect(w, w, w, l);
g.fillRect(w, l, l, w);
g.fillRect(l, w, w, l);
}
// text
int fontstyle = Font.PLAIN;
if (bold) {
fontstyle |= Font.BOLD;
}
if (italic) {
fontstyle |= Font.ITALIC;
}
Font f = new Font("Arial", fontstyle, size / 10);
g.setFont(f);
g.setColor(Color.BLACK);
int width = g.getFontMetrics().stringWidth(name);
int basey = size / 2 + g.getFontMetrics().getAscent();
int textheight = g.getFontMetrics().getHeight();
g.drawString(name, (size - width) / 2, basey);
g.drawString(size + " x " + size, (size - width) / 2, basey + textheight);
g.drawString(date.asReadableString(), (size - width) / 2, basey + 2 * textheight);
// color dots
for (int i = 0; i < 3; i++) {
NamedColor current = colors[i];
g.setColor(current.color);
g.fillOval((1 + 3 * i) * size / 10, size * 3 / 10, size / 5, size / 5);
}
return img;
}
}