/*
* Copyright 2013 MovingBlocks
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.terasology.rendering.assets.font;
import com.google.common.collect.Maps;
import gnu.trove.map.TIntObjectMap;
import gnu.trove.map.hash.TIntObjectHashMap;
import org.terasology.rendering.assets.material.Material;
import org.terasology.rendering.assets.texture.Texture;
import java.util.Map;
/**
*/
public class FontDataBuilder {
private int lineHeight;
private int baseHeight;
private TIntObjectMap<Texture> pages = new TIntObjectHashMap<>();
private TIntObjectMap<Material> pageMats = new TIntObjectHashMap<>();
private Map<Integer, FontCharacter> characters = Maps.newHashMap();
private int currentCharacterId;
private int characterX;
private int characterY;
private int characterWidth;
private int characterHeight;
private int characterXOffset;
private int characterYOffset;
private int characterXAdvance;
private int characterPage;
public FontDataBuilder() {
}
public FontData build() {
return new FontData(lineHeight, baseHeight, characters);
}
public void setLineHeight(int lineHeight) {
this.lineHeight = lineHeight;
}
public void setBaseHeight(int baseHeight) {
this.baseHeight = baseHeight;
}
public void addPage(int pageId, Texture texture, Material material) {
pages.put(pageId, texture);
pageMats.put(pageId, material);
}
public FontDataBuilder startCharacter(int characterId) {
this.currentCharacterId = characterId;
return this;
}
public FontDataBuilder setCharacterX(int value) {
this.characterX = value;
return this;
}
public FontDataBuilder setCharacterY(int value) {
this.characterY = value;
return this;
}
public FontDataBuilder setCharacterWidth(int value) {
this.characterWidth = value;
return this;
}
public FontDataBuilder setCharacterHeight(int value) {
this.characterHeight = value;
return this;
}
public FontDataBuilder setCharacterXOffset(int value) {
this.characterXOffset = value;
return this;
}
public FontDataBuilder setCharacterYOffset(int value) {
this.characterYOffset = value;
return this;
}
public FontDataBuilder setCharacterXAdvance(int value) {
this.characterXAdvance = value;
return this;
}
public FontDataBuilder setCharacterPage(int value) {
this.characterPage = value;
if (pages.get(value) == null) {
throw new IllegalArgumentException("Invalid font - character on missing page '" + value + "'");
}
return this;
}
public FontDataBuilder endCharacter() {
Texture page = pages.get(characterPage);
FontCharacter character = new FontCharacter(((float) characterX / page.getWidth()), ((float) characterY / page.getHeight()),
characterWidth, characterHeight, characterXOffset, characterYOffset, characterXAdvance, page, pageMats.get(characterPage));
characters.put(currentCharacterId, character);
return this;
}
}