/*
* Minecraft GUI mod
* Copyright (C) 2015 Samuel Marchildon-Lavoie
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package io.github.minecraftgui.models.repositories;
import io.github.minecraftgui.controllers.MainController;
import io.github.minecraftgui.controllers.Screen;
import io.github.minecraftgui.models.fonts.Font;
import io.github.minecraftgui.models.fonts.MinecraftNormalFont;
import io.github.minecraftgui.models.fonts.MinecraftShadowFont;
import io.github.minecraftgui.models.fonts.UnicodeFont;
import java.awt.*;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
/**
* Created by Samuel on 2015-11-04.
*/
public class FontRepository extends FileRepository {
private final HashMap<String, Font> fonts = new HashMap<String, Font>();
private final ArrayList<FontData> fontDatas;
private final MainController controller;
public FontRepository(MainController controller) {
super(new ArrayList<String>(Arrays.asList(new String[]{"application/zip", "application/x-zip"})));
this.controller = controller;
this.fontDatas = new ArrayList<>();
addFont("minecraft normal", new MinecraftNormalFont());
addFont("minecraft shadow", new MinecraftShadowFont());
}
public void generateFonts(Screen screen){
for(FontData fontData : fontDatas){
Font font = getFont(fontData.name);
if(font != null && font instanceof UnicodeFont)
((UnicodeFont) font).generate(fontData.size, fontData.color);
else{
UnicodeFont unicodeFont = new UnicodeFont(screen, java.awt.Font.decode(fontData.name));
unicodeFont.generate(fontData.size, fontData.color);
addFont(fontData.name, unicodeFont);
}
}
fontDatas.clear();
}
public void addFontToGenerate(String name, Color color, int size){
fontDatas.add(new FontData(name, color, size));
}
public void addFont(String name, Font font){
fonts.put(name.toLowerCase(), font);
}
public Font getFont(String name){
return fonts.get(name.toLowerCase());
}
public void downloadFont(final String fontUrl){
if(!urlLoaded.contains(fontUrl)) {
new Thread(new Runnable() {
@Override
public void run() {
try {
InputStream is = getFile(fontUrl);
ZipInputStream zis = new ZipInputStream(is);
ZipEntry entry;
while ((entry = zis.getNextEntry()) != null) {
String fileName = entry.getName().toLowerCase();
if (fileName.endsWith(".ttf") || fileName.endsWith(".otf")) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int i;
while ((i = zis.read()) != -1)
baos.write(i);
GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
java.awt.Font font = java.awt.Font.createFont(java.awt.Font.TRUETYPE_FONT, new ByteArrayInputStream(baos.toByteArray()));
ge.registerFont(font);
}
}
is.close();
} catch (Exception ex) {
ex.printStackTrace();
}
urlLoaded.add(fontUrl);
controller.fontDownloadFinished();
}
}).start();
}
else
controller.fontDownloadFinished();
}
private class FontData{
private String name;
private Color color;
private int size;
public FontData(String name, Color color, int size) {
this.name = name;
this.color = color;
this.size = size;
}
}
}