001 package org.bukkit.map;
002
003 /**
004 * Represents the built-in Minecraft font.
005 */
006 public class MinecraftFont extends MapFont {
007
008 private static final int spaceSize = 2;
009
010 private static final String fontChars =
011 " !\"#$%&'()*+,-./0123456789:;<=>?" +
012 "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" +
013 "'abcdefghijklmnopqrstuvwxyz{|}~\u007F" +
014 "\u00C7\u00FC\u00E9\u00E2\u00E4\u00E0\u00E5\u00E7" + // Çüéâäàåç
015 "\u00EA\u00EB\u00E8\u00EF\u00EE\u00EC\u00C4\u00C5" + // êëèïîìÄÅ
016 "\u00C9\u00E6\u00C6\u00F4\u00F6\u00F2\u00FB\u00F9" + // ÉæÆôöòûù
017 "\u00FF\u00D6\u00DC\u00F8\u00A3\u00D8\u00D7\u0191" + // ÿÖÜø£Ø×?
018 "\u00E1\u00ED\u00F3\u00FA\u00F1\u00D1\u00AA\u00BA" + // áíóúñѪº
019 "\u00BF\u00AE\u00AC\u00BD\u00BC\u00A1\u00AB\u00BB"; // ¿®¬½¼¡«»
020
021 private static final int[][] fontData = new int[][] {
022 /* null */ {0,0,0,0,0,0,0,0},
023 /* 1 */ {126,129,165,129,189,153,129,126},
024 /* 2 */ {126,255,219,255,195,231,255,126},
025 /* 3 */ {54,127,127,127,62,28,8,0},
026 /* 4 */ {8,28,62,127,62,28,8,0},
027 /* 5 */ {28,62,28,127,127,62,28,62},
028 /* 6 */ {8,8,28,62,127,62,28,62},
029 /* 7 */ {0,0,24,60,60,24,0,0},
030 /* 8 */ {255,255,231,195,195,231,255,255},
031 /* 9 */ {0,60,102,66,66,102,60,0},
032 /* 10 */ {255,195,153,189,189,153,195,255},
033 /* 11 */ {240,224,240,190,51,51,51,30},
034 /* 12 */ {60,102,102,102,60,24,126,24},
035 /* 13 */ {252,204,252,12,12,14,15,7},
036 /* 14 */ {254,198,254,198,198,230,103,3},
037 /* 15 */ {153,90,60,231,231,60,90,153},
038 /* 16 */ {1,7,31,127,31,7,1,0},
039 /* 17 */ {64,112,124,127,124,112,64,0},
040 /* 18 */ {24,60,126,24,24,126,60,24},
041 /* 19 */ {102,102,102,102,102,0,102,0},
042 /* 20 */ {254,219,219,222,216,216,216,0},
043 /* 21 */ {124,198,28,54,54,28,51,30},
044 /* 22 */ {0,0,0,0,126,126,126,0},
045 /* 23 */ {24,60,126,24,126,60,24,255},
046 /* 24 */ {24,60,126,24,24,24,24,0},
047 /* 25 */ {24,24,24,24,126,60,24,0},
048 /* 26 */ {0,24,48,127,48,24,0,0},
049 /* 27 */ {0,12,6,127,6,12,0,0},
050 /* 28 */ {0,0,3,3,3,127,0,0},
051 /* 29 */ {0,36,102,255,102,36,0,0},
052 /* 30 */ {0,24,60,126,255,255,0,0},
053 /* 31 */ {0,255,255,126,60,24,0,0},
054 /* */ {0,0,0,0,0,0,0,0},
055 /* ! */ {1,1,1,1,1,0,1,0},
056 /* " */ {10,10,5,0,0,0,0,0},
057 /* # */ {10,10,31,10,31,10,10,0},
058 /* $ */ {4,30,1,14,16,15,4,0},
059 /* % */ {17,9,8,4,2,18,17,0},
060 /* & */ {4,10,4,22,13,9,22,0},
061 /* ' */ {2,2,1,0,0,0,0,0},
062 /* ( */ {12,2,1,1,1,2,12,0},
063 /* ) */ {3,4,8,8,8,4,3,0},
064 /* * */ {0,0,9,6,9,0,0,0},
065 /* + */ {0,4,4,31,4,4,0,0},
066 /* , */ {0,0,0,0,0,1,1,1},
067 /* - */ {0,0,0,31,0,0,0,0},
068 /* . */ {0,0,0,0,0,1,1,0},
069 /* / */ {16,8,8,4,2,2,1,0},
070 /* 0 */ {14,17,25,21,19,17,14,0},
071 /* 1 */ {4,6,4,4,4,4,31,0},
072 /* 2 */ {14,17,16,12,2,17,31,0},
073 /* 3 */ {14,17,16,12,16,17,14,0},
074 /* 4 */ {24,20,18,17,31,16,16,0},
075 /* 5 */ {31,1,15,16,16,17,14,0},
076 /* 6 */ {12,2,1,15,17,17,14,0},
077 /* 7 */ {31,17,16,8,4,4,4,0},
078 /* 8 */ {14,17,17,14,17,17,14,0},
079 /* 9 */ {14,17,17,30,16,8,6,0},
080 /* : */ {0,1,1,0,0,1,1,0},
081 /* ; */ {0,1,1,0,0,1,1,1},
082 /* < */ {8,4,2,1,2,4,8,0},
083 /* = */ {0,0,31,0,0,31,0,0},
084 /* > */ {1,2,4,8,4,2,1,0},
085 /* ? */ {14,17,16,8,4,0,4,0},
086 /* @ */ {30,33,45,45,61,1,30,0},
087 /* A */ {14,17,31,17,17,17,17,0},
088 /* B */ {15,17,15,17,17,17,15,0},
089 /* C */ {14,17,1,1,1,17,14,0},
090 /* D */ {15,17,17,17,17,17,15,0},
091 /* E */ {31,1,7,1,1,1,31,0},
092 /* F */ {31,1,7,1,1,1,1,0},
093 /* G */ {30,1,25,17,17,17,14,0},
094 /* H */ {17,17,31,17,17,17,17,0},
095 /* I */ {7,2,2,2,2,2,7,0},
096 /* J */ {16,16,16,16,16,17,14,0},
097 /* K */ {17,9,7,9,17,17,17,0},
098 /* L */ {1,1,1,1,1,1,31,0},
099 /* M */ {17,27,21,17,17,17,17,0},
100 /* N */ {17,19,21,25,17,17,17,0},
101 /* O */ {14,17,17,17,17,17,14,0},
102 /* P */ {15,17,15,1,1,1,1,0},
103 /* Q */ {14,17,17,17,17,9,22,0},
104 /* R */ {15,17,15,17,17,17,17,0},
105 /* S */ {30,1,14,16,16,17,14,0},
106 /* T */ {31,4,4,4,4,4,4,0},
107 /* U */ {17,17,17,17,17,17,14,0},
108 /* V */ {17,17,17,17,10,10,4,0},
109 /* W */ {17,17,17,17,21,27,17,0},
110 /* X */ {17,10,4,10,17,17,17,0},
111 /* Y */ {17,10,4,4,4,4,4,0},
112 /* Z */ {31,16,8,4,2,1,31,0},
113 /* [ */ {7,1,1,1,1,1,7,0},
114 /* \ */ {1,2,2,4,8,8,16,0},
115 /* ] */ {7,4,4,4,4,4,7,0},
116 /* ^ */ {4,10,17,0,0,0,0,0},
117 /* _ */ {0,0,0,0,0,0,0,31},
118 /* ` */ {1,1,2,0,0,0,0,0},
119 /* a */ {0,0,14,16,30,17,30,0},
120 /* b */ {1,1,13,19,17,17,15,0},
121 /* c */ {0,0,14,17,1,17,14,0},
122 /* d */ {16,16,22,25,17,17,30,0},
123 /* e */ {0,0,14,17,31,1,30,0},
124 /* f */ {12,2,15,2,2,2,2,0},
125 /* g */ {0,0,30,17,17,30,16,15},
126 /* h */ {1,1,13,19,17,17,17,0},
127 /* i */ {1,0,1,1,1,1,1,0},
128 /* j */ {16,0,16,16,16,17,17,14},
129 /* k */ {1,1,9,5,3,5,9,0},
130 /* l */ {1,1,1,1,1,1,2,0},
131 /* m */ {0,0,11,21,21,17,17,0},
132 /* n */ {0,0,15,17,17,17,17,0},
133 /* o */ {0,0,14,17,17,17,14,0},
134 /* p */ {0,0,13,19,17,15,1,1},
135 /* q */ {0,0,22,25,17,30,16,16},
136 /* r */ {0,0,13,19,1,1,1,0},
137 /* s */ {0,0,30,1,14,16,15,0},
138 /* t */ {2,2,7,2,2,2,4,0},
139 /* u */ {0,0,17,17,17,17,30,0},
140 /* v */ {0,0,17,17,17,10,4,0},
141 /* w */ {0,0,17,17,21,21,30,0},
142 /* x */ {0,0,17,10,4,10,17,0},
143 /* y */ {0,0,17,17,17,30,16,15},
144 /* z */ {0,0,31,8,4,2,31,0},
145 /* { */ {12,2,2,1,2,2,12,0},
146 /* | */ {1,1,1,0,1,1,1,0},
147 /* } */ {3,4,4,8,4,4,3,0},
148 /* ~ */ {38,25,0,0,0,0,0,0},
149 /* ? */ {0,0,4,10,17,17,31,0},
150 /* Ç */ {14,17,1,1,17,14,16,12},
151 /* ü */ {10,0,17,17,17,17,30,0},
152 /* é */ {24,0,14,17,31,1,30,0},
153 /* â */ {14,17,14,16,30,17,30,0},
154 /* ä */ {10,0,14,16,30,17,30,0},
155 /* à */ {3,0,14,16,30,17,30,0},
156 /* å */ {4,0,14,16,30,17,30,0},
157 /* ç */ {0,14,17,1,17,14,16,12},
158 /* ê */ {14,17,14,17,31,1,30,0},
159 /* ë */ {10,0,14,17,31,1,30,0},
160 /* è */ {3,0,14,17,31,1,30,0},
161 /* ï */ {5,0,2,2,2,2,2,0},
162 /* î */ {14,17,4,4,4,4,4,0},
163 /* ì */ {3,0,2,2,2,2,2,0},
164 /* Ä */ {17,14,17,31,17,17,17,0},
165 /* Å */ {4,0,14,17,31,17,17,0},
166 /* É */ {24,0,31,1,7,1,31,0},
167 /* æ */ {0,0,10,20,30,5,30,0},
168 /* Æ */ {30,5,15,5,5,5,29,0},
169 /* ô */ {14,17,14,17,17,17,14,0},
170 /* ö */ {10,0,14,17,17,17,14,0},
171 /* ò */ {3,0,14,17,17,17,14,0},
172 /* û */ {14,17,0,17,17,17,30,0},
173 /* ù */ {3,0,17,17,17,17,30,0},
174 /* ÿ */ {10,0,17,17,17,30,16,15},
175 /* Ö */ {17,14,17,17,17,17,14,0},
176 /* Ü */ {17,0,17,17,17,17,14,0},
177 /* ø */ {0,0,14,25,21,19,14,4},
178 /* £ */ {12,18,2,15,2,2,31,0},
179 /* Ø */ {14,17,25,21,19,17,14,0},
180 /* × */ {0,0,5,2,5,0,0,0},
181 /* ? */ {8,20,4,14,4,4,5,2},
182 /* á */ {24,0,14,16,30,17,30,0},
183 /* í */ {3,0,1,1,1,1,1,0},
184 /* ó */ {24,0,14,17,17,17,14,0},
185 /* ú */ {24,0,17,17,17,17,30,0},
186 /* ñ */ {31,0,15,17,17,17,17,0},
187 /* Ñ */ {31,0,17,19,21,25,17,0},
188 /* ª */ {14,16,31,30,0,31,0,0},
189 /* º */ {14,17,17,14,0,31,0,0},
190 /* ¿ */ {4,0,4,2,1,17,14,0},
191 /* ® */ {0,30,45,37,43,30,0,0},
192 /* ¬ */ {0,0,0,31,16,16,0,0},
193 /* ½ */ {17,9,8,4,18,10,25,0},
194 /* ¼ */ {17,9,8,4,26,26,17,0},
195 /* ¡ */ {0,1,0,1,1,1,1,0},
196 /* « */ {0,20,10,5,10,20,0,0},
197 /* » */ {0,5,10,20,10,5,0,0},
198 /* 176 */ {68,17,68,17,68,17,68,17},
199 /* 177 */ {170,85,170,85,170,85,170,85},
200 /* 178 */ {219,238,219,119,219,238,219,119},
201 /* 179 */ {24,24,24,24,24,24,24,24},
202 /* 180 */ {24,24,24,24,31,24,24,24},
203 /* 181 */ {24,24,31,24,31,24,24,24},
204 /* 182 */ {108,108,108,108,111,108,108,108},
205 /* 183 */ {0,0,0,0,127,108,108,108},
206 /* 184 */ {0,0,31,24,31,24,24,24},
207 /* 185 */ {108,108,111,96,111,108,108,108},
208 /* 186 */ {108,108,108,108,108,108,108,108},
209 /* 187 */ {0,0,127,96,111,108,108,108},
210 /* 188 */ {108,108,111,96,127,0,0,0},
211 /* 189 */ {108,108,108,108,127,0,0,0},
212 /* 190 */ {24,24,31,24,31,0,0,0},
213 /* 191 */ {0,0,0,0,31,24,24,24},
214 /* 192 */ {24,24,24,24,248,0,0,0},
215 /* 193 */ {24,24,24,24,255,0,0,0},
216 /* 194 */ {0,0,0,0,255,24,24,24},
217 /* 195 */ {24,24,24,24,248,24,24,24},
218 /* 196 */ {0,0,0,0,255,0,0,0},
219 /* 197 */ {24,24,24,24,255,24,24,24},
220 /* 198 */ {24,24,248,24,248,24,24,24},
221 /* 199 */ {108,108,108,108,236,108,108,108},
222 /* 200 */ {108,108,236,12,252,0,0,0},
223 /* 201 */ {0,0,252,12,236,108,108,108},
224 /* 202 */ {108,108,239,0,255,0,0,0},
225 /* 203 */ {0,0,255,0,239,108,108,108},
226 /* 204 */ {108,108,236,12,236,108,108,108},
227 /* 205 */ {0,0,255,0,255,0,0,0},
228 /* 206 */ {108,108,239,0,239,108,108,108},
229 /* 207 */ {24,24,255,0,255,0,0,0},
230 /* 208 */ {108,108,108,108,255,0,0,0},
231 /* 209 */ {0,0,255,0,255,24,24,24},
232 /* 210 */ {0,0,0,0,255,108,108,108},
233 /* 211 */ {108,108,108,108,252,0,0,0},
234 /* 212 */ {24,24,248,24,248,0,0,0},
235 /* 213 */ {0,0,248,24,248,24,24,24},
236 /* 214 */ {0,0,0,0,252,108,108,108},
237 /* 215 */ {108,108,108,108,255,108,108,108},
238 /* 216 */ {24,24,255,24,255,24,24,24},
239 /* 217 */ {24,24,24,24,31,0,0,0},
240 /* 218 */ {0,0,0,0,248,24,24,24},
241 /* 219 */ {255,255,255,255,255,255,255,255},
242 /* 220 */ {0,0,0,0,255,255,255,255},
243 /* 221 */ {15,15,15,15,15,15,15,15},
244 /* 222 */ {240,240,240,240,240,240,240,240},
245 /* 223 */ {255,255,255,255,0,0,0,0},
246 /* 224 */ {0,0,110,59,19,59,110,0},
247 /* 225 */ {0,30,51,31,51,31,3,3},
248 /* 226 */ {0,63,51,3,3,3,3,0},
249 /* 227 */ {0,127,54,54,54,54,54,0},
250 /* 228 */ {63,51,6,12,6,51,63,0},
251 /* 229 */ {0,0,126,27,27,27,14,0},
252 /* 230 */ {0,102,102,102,102,62,6,3},
253 /* 231 */ {0,110,59,24,24,24,24,0},
254 /* 232 */ {63,12,30,51,51,30,12,63},
255 /* 233 */ {28,54,99,127,99,54,28,0},
256 /* 234 */ {28,54,99,99,54,54,119,0},
257 /* 235 */ {56,12,24,62,51,51,30,0},
258 /* 236 */ {0,0,126,219,219,126,0,0},
259 /* 237 */ {96,48,126,219,219,126,6,3},
260 /* 238 */ {28,6,3,31,3,6,28,0},
261 /* 239 */ {30,51,51,51,51,51,51,0},
262 /* 240 */ {0,63,0,63,0,63,0,0},
263 /* 241 */ {12,12,63,12,12,0,63,0},
264 /* 242 */ {6,12,24,12,6,0,63,0},
265 /* 243 */ {24,12,6,12,24,0,63,0},
266 /* 244 */ {112,216,216,24,24,24,24,24},
267 /* 245 */ {24,24,24,24,24,27,27,14},
268 /* 246 */ {12,12,0,63,0,12,12,0},
269 /* 247 */ {0,110,59,0,110,59,0,0},
270 /* 248 */ {28,54,54,28,0,0,0,0},
271 /* 249 */ {0,0,0,24,24,0,0,0},
272 /* 250 */ {0,0,0,0,24,0,0,0},
273 /* 251 */ {240,48,48,48,55,54,60,56},
274 /* 252 */ {30,54,54,54,54,0,0,0},
275 /* 253 */ {14,24,12,6,30,0,0,0},
276 /* 254 */ {0,0,60,60,60,60,0,0},
277 /* 255 */ {0,0,0,0,0,0,0,0},
278 };
279
280 /**
281 * A static non-malleable MinecraftFont.
282 */
283 public static final MinecraftFont Font = new MinecraftFont(false);
284
285 /**
286 * Initialize a new MinecraftFont.
287 */
288 public MinecraftFont() {
289 this(true);
290 }
291
292 private MinecraftFont(boolean malleable) {
293 for (int i = 1; i < fontData.length; ++i) {
294 char ch = (char) i;
295 if (i >= 32 && i < 32 + fontChars.length()) {
296 ch = fontChars.charAt(i - 32);
297 }
298
299 if (ch == ' ') {
300 setChar(ch, new CharacterSprite(spaceSize, 8, new boolean[spaceSize * 8]));
301 continue;
302 }
303
304 int[] rows = fontData[i];
305 int width = 0;
306 for (int r = 0; r < 8; ++r) {
307 for (int c = 0; c < 8; ++c) {
308 if ((rows[r] & (1 << c)) != 0 && c > width) {
309 width = c;
310 }
311 }
312 }
313 ++width;
314
315 boolean[] data = new boolean[width * 8];
316 for (int r = 0; r < 8; ++r) {
317 for (int c = 0; c < width; ++c) {
318 data[r * width + c] = (rows[r] & (1 << c)) != 0;
319 }
320 }
321
322 setChar(ch, new CharacterSprite(width, 8, data));
323 }
324
325 this.malleable = malleable;
326 }
327
328 }