1 /* 2 * Copyright (c) 2009-2010 jMonkeyEngine 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: 8 * 9 * * Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 12 * * Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 16 * * Neither the name of 'jMonkeyEngine' nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 21 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 22 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 23 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR 24 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 25 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 26 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 27 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 28 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 29 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 30 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31 */ 32 33 package com.jme3.font; 34 35 import com.jme3.export.*; 36 import com.jme3.util.IntMap; 37 import com.jme3.util.IntMap.Entry; 38 import java.io.IOException; 39 40 /** 41 * Represents a single bitmap character. 42 */ 43 public class BitmapCharacter implements Savable, Cloneable { 44 private char c; 45 private int x; 46 private int y; 47 private int width; 48 private int height; 49 private int xOffset; 50 private int yOffset; 51 private int xAdvance; 52 private IntMap<Integer> kerning = new IntMap<Integer>(); 53 private int page; 54 BitmapCharacter()55 public BitmapCharacter() {} 56 BitmapCharacter(char c)57 public BitmapCharacter(char c) { 58 this.c = c; 59 } 60 61 @Override clone()62 public BitmapCharacter clone() { 63 try { 64 BitmapCharacter result = (BitmapCharacter) super.clone(); 65 result.kerning = kerning.clone(); 66 return result; 67 } catch (CloneNotSupportedException ex) { 68 throw new AssertionError(); 69 } 70 } 71 getX()72 public int getX() { 73 return x; 74 } 75 setX(int x)76 public void setX(int x) { 77 this.x = x; 78 } 79 getY()80 public int getY() { 81 return y; 82 } 83 setY(int y)84 public void setY(int y) { 85 this.y = y; 86 } 87 getWidth()88 public int getWidth() { 89 return width; 90 } 91 setWidth(int width)92 public void setWidth(int width) { 93 this.width = width; 94 } 95 getHeight()96 public int getHeight() { 97 return height; 98 } 99 setHeight(int height)100 public void setHeight(int height) { 101 this.height = height; 102 } 103 getXOffset()104 public int getXOffset() { 105 return xOffset; 106 } 107 setXOffset(int offset)108 public void setXOffset(int offset) { 109 xOffset = offset; 110 } 111 getYOffset()112 public int getYOffset() { 113 return yOffset; 114 } 115 setYOffset(int offset)116 public void setYOffset(int offset) { 117 yOffset = offset; 118 } 119 getXAdvance()120 public int getXAdvance() { 121 return xAdvance; 122 } 123 setXAdvance(int advance)124 public void setXAdvance(int advance) { 125 xAdvance = advance; 126 } 127 setPage(int page)128 public void setPage(int page) { 129 this.page = page; 130 } 131 getPage()132 public int getPage() { 133 return page; 134 } 135 getChar()136 public char getChar() { 137 return c; 138 } 139 setChar(char c)140 public void setChar(char c) { 141 this.c = c; 142 } 143 addKerning(int second, int amount)144 public void addKerning(int second, int amount){ 145 kerning.put(second, amount); 146 } 147 getKerning(int second)148 public int getKerning(int second){ 149 Integer i = kerning.get(second); 150 if (i == null) 151 return 0; 152 else 153 return i.intValue(); 154 } 155 write(JmeExporter ex)156 public void write(JmeExporter ex) throws IOException { 157 OutputCapsule oc = ex.getCapsule(this); 158 oc.write(c, "c", 0); 159 oc.write(x, "x", 0); 160 oc.write(y, "y", 0); 161 oc.write(width, "width", 0); 162 oc.write(height, "height", 0); 163 oc.write(xOffset, "xOffset", 0); 164 oc.write(yOffset, "yOffset", 0); 165 oc.write(xAdvance, "xAdvance", 0); 166 167 int[] seconds = new int[kerning.size()]; 168 int[] amounts = new int[seconds.length]; 169 170 int i = 0; 171 for (Entry<Integer> entry : kerning){ 172 seconds[i] = entry.getKey(); 173 amounts[i] = entry.getValue(); 174 i++; 175 } 176 177 oc.write(seconds, "seconds", null); 178 oc.write(amounts, "amounts", null); 179 } 180 read(JmeImporter im)181 public void read(JmeImporter im) throws IOException { 182 InputCapsule ic = im.getCapsule(this); 183 c = (char) ic.readInt("c", 0); 184 x = ic.readInt("x", 0); 185 y = ic.readInt("y", 0); 186 width = ic.readInt("width", 0); 187 height = ic.readInt("height", 0); 188 xOffset = ic.readInt("xOffset", 0); 189 yOffset = ic.readInt("yOffset", 0); 190 xAdvance = ic.readInt("xAdvance", 0); 191 192 int[] seconds = ic.readIntArray("seconds", null); 193 int[] amounts = ic.readIntArray("amounts", null); 194 195 for (int i = 0; i < seconds.length; i++){ 196 kerning.put(seconds[i], amounts[i]); 197 } 198 } 199 }