001package squidpony.squidgrid.gui.gdx;
002
003import com.badlogic.gdx.Application;
004import com.badlogic.gdx.Gdx;
005import com.badlogic.gdx.LifecycleListener;
006import com.badlogic.gdx.graphics.Texture;
007import com.badlogic.gdx.graphics.g2d.BitmapFont;
008import com.badlogic.gdx.graphics.g2d.TextureAtlas;
009import com.badlogic.gdx.graphics.g2d.TextureRegion;
010import com.badlogic.gdx.graphics.glutils.ShaderProgram;
011import squidpony.squidmath.StatefulRNG;
012
013/**
014 * Default BitmapFonts, a sample image, "stretchable" fonts and icons, and a central RNG for use with LibGDX.
015 * All but one of the resources here need to be downloaded separately, to avoid bloating the size of the dependency jar
016 * with many fonts that a game probably won't use. You can download assets in a jar with a release of SquidLib, or
017 * individually from https://github.com/SquidPony/SquidLib/tree/master/assets . The assets you choose should go in the
018 * android/assets (core/assets if you don't have an Android project) subfolder of your game if you use the normal libGDX
019 * setup tool or SquidSetup, or the assets subfolder if you use czyzby's alternate setup tool,
020 * https://github.com/czyzby/gdx-setup . They should not be placed in subdirectories of assets, otherwise this won't be
021 * able to find them.
022 * <br>
023 * The fonts provided are mostly monospaced, with most looking rather similar (straight orthogonal lines and right-angle
024 * curves), but some that look... better than the rest. For monospaced fonts that could be used on a grid in SquidPanel
025 * or SquidLayers, it is recommended that you use a "stretchable" font (which use a signed distance field, or SDF,
026 * effect to stretch smoothly) or a "crisp" font (which use a multi-channel signed distance field, or MSDF, effect to
027 * stretch smoothly and remain sharp at very high zooms). For some usage you may want a TextFamily instead of a normal
028 * TextCellFactory or BitmapFont; these TextFamily fonts store regular, bold, italic, and bold-italic faces in one file,
029 * and {@link GDXMarkup} can produce text that will render in those faces. Some good choices for fonts here are
030 * Iosevka, which comes in a sans-serif version with {@link #getStretchableLeanFont()}, {@link #getCrispLeanFont()}, 
031 * {@link #getCrispLeanFamily()}, and more, as well as a slab-serif version with {@link #getStretchableSlabFont()},
032 * {@link #getCrispSlabFont()}, and {@link #getCrispSlabFamily()}, among others, as well as Inconsolata-LGC, which is
033 * more geometric sans-serif accessible with {@link #getStretchableFont()}, or (well-suited for square glyphs)
034 * {@link #getStretchableSquareFont()} (it does not have a crisp variety). Another is Computer Modern, accessible by
035 * {@link #getStretchableTypewriterFont()}, which has a chunky, ornamented style. For variable-width fonts
036 * that can be used in TextPanel, among others, you can use the recommended crisp font family Noto Serif
037 * with {@link #getCrispPrintFamily()}, or for stretchable fonts there's the serif font Gentium with
038 * {@link #getStretchablePrintFont()} or Noto Sans with {@link #getStretchableCleanFont()} (Noto Sans currently has
039 * problems that Noto Serif does not have). All of the fonts so far support the Latin, Greek, and Cyrillic alphabets.
040 * <br>
041 * If you can't decide, go with {@link #getCrispLeanFont()} or {@link #getCrispSlabFont()}, which return TextCellFactory
042 * objects, and call their .width(int), .height(int), and .initBySize() methods to make them the size (and aspect ratio)
043 * you want. You can use stretchable or crisp fonts with equal width and height to make
044 * a horizontally-stretched version of a square font instead of the existing square fonts that add blank space.
045 * <br>
046 * The most Latin script support for a monospaced font is in the font Mandrill, accessible by getDefaultUnicodeFont()
047 * and getLargeUnicodeFont() in two different sizes, and the latter should be suitable for everything from Spanish and
048 * French, to Polish to Vietnamese. You can use Gentium for even better language support with a variable-width font in
049 * TextPanel or the like; it is accessible with getStretchablePrintFont(). Google's Noto font also supports many glyphs
050 * in a variable-width format; it is accessible with getStretchableCleanFont() but may have some issues with baseline
051 * level changing and character-to-character alignment seeming too high or low.
052 * <br>
053 * The sample image is a tentacle taken from a public domain icon collection graciously released by Henrique Lazarini;
054 * it's fitting for SquidLib to have a tentacle as a logo or something, I guess?
055 * <br>
056 * The icons are from http://game-icons.net , there are over 2000 of them, and they're among the only images that should
057 * both be recolor-able easily (like chars in a font) and resize-able easily if you use a stretchable font at the same
058 * time. The stretchable font TextCellFactories do some work with shaders that makes most images look incorrect, but
059 * allow distance field fonts and these distance field icons to resize smoothly. Mixing stretchable fonts with
060 * non-stretchable images or fonts is not a great idea, and usually involves a slow shader change back and forth.
061 * <br>
062 * You can get a default RNG with getGuiRandom(); this should probably not be reused for non-GUI-related randomness,
063 * but is meant instead to be used wherever randomized purely-aesthetic effects are needed, such as a jiggling effect.
064 * Created by Tommy Ettinger on 7/11/2015.
065 */
066public class DefaultResources implements LifecycleListener {
067    private BitmapFont narrow1, narrow2, narrow3,
068            smooth1, smooth2, smoothSquare,
069            square1, square2,
070            unicode1, unicode2,
071            arial15, tiny, lessTiny,
072            sevenTwelve, computerSaysNo;
073
074    private TextCellFactory distanceNarrow, distanceSquare, typewriterDistanceNarrow,
075            distancePrint, distanceClean, distanceCode, distanceCodeJP,
076            distanceDejaVu, distanceOrbit, distanceHeavySquare,
077            distanceSlab, distanceSlabLight,
078            distanceLean, distanceLeanLight,
079            msdfSlab, msdfLean, msdfDejaVu,
080            msdfCurvySquare, msdfCarved, msdfRoboto, msdfOctagonalSquare,
081            msdfIcons;
082    private TextFamily familyLean, familySlab, familyGo,
083            familyLeanMSDF, familySlabMSDF, familyPrintMSDF;
084    private TextureAtlas iconAtlas;
085    public static final String squareName = "Zodiac-Square-12x12.fnt", squareTexture = "Zodiac-Square-12x12.png",
086            narrowName = "Rogue-Zodiac-6x12.fnt", narrowTexture = "Rogue-Zodiac-6x12_0.png",
087            unicodeName = "Mandrill-6x16.fnt", unicodeTexture = "Mandrill-6x16.png",
088            squareNameLarge = "Zodiac-Square-24x24.fnt", squareTextureLarge = "Zodiac-Square-24x24.png",
089            narrowNameLarge = "Rogue-Zodiac-12x24.fnt", narrowTextureLarge = "Rogue-Zodiac-12x24_0.png",
090            unicodeNameLarge = "Mandrill-12x32.fnt", unicodeTextureLarge = "Mandrill-12x32.png",
091            narrowNameExtraLarge = "Rogue-Zodiac-18x36.fnt", narrowTextureExtraLarge = "Rogue-Zodiac-18x36_0.png",
092            tinyName = "Monty-4x10.fnt", tinyTexture = "Monty-4x10.png",
093            lessTinyName = "Monty-8x20.fnt", lessTinyTexture = "Monty-8x20.png",
094            sevenTwelveName = "7-12-serif.fnt", sevenTwelveTexture = "7-12-serif.png",
095            computerSaysNoName = "ComputerSaysNo.fnt", computerSaysNoTexture = "ComputerSaysNo.png",
096            smoothName = "Inconsolata-LGC-8x18.fnt", smoothTexture = "Inconsolata-LGC-8x18.png",
097            smoothNameLarge = "Inconsolata-LGC-12x24.fnt", smoothTextureLarge = "Inconsolata-LGC-12x24.png",
098            smoothSquareName = "Inconsolata-LGC-Square-25x25.fnt", smoothSquareTexture = "Inconsolata-LGC-Square-25x25.png",
099            distanceFieldSquare = "Inconsolata-LGC-Square-distance.fnt",
100            distanceFieldSquareTexture = "Inconsolata-LGC-Square-distance.png",
101            distanceFieldNarrow = "Inconsolata-LGC-Custom-distance.fnt",
102            distanceFieldNarrowTexture = "Inconsolata-LGC-Custom-distance.png",
103            distanceFieldHeavySquare = "BoxedIn-distance.fnt",
104            distanceFieldHeavySquareTexture = "BoxedIn-distance.png",
105            distanceFieldPrint = "Gentium-distance.fnt",
106            distanceFieldPrintTexture = "Gentium-distance.png",
107            distanceFieldClean = "Noto-Sans-distance.fnt",
108            distanceFieldCleanTexture = "Noto-Sans-distance.png",
109            distanceFieldTypewriterNarrow = "CM-Custom-distance.fnt",
110            distanceFieldTypewriterNarrowTexture = "CM-Custom-distance.png",
111            distanceFieldCode = "SourceCodePro-Medium-distance.fnt",
112            distanceFieldCodeTexture = "SourceCodePro-Medium-distance.png",
113            distanceFieldCodeJP = "SourceHanCodeJP-Regular-distance.fnt",
114            distanceFieldCodeJPTexture = "SourceHanCodeJP-Regular-distance.png",
115            distanceFieldDejaVu = "DejaVuSansMono-distance.fnt",
116            distanceFieldDejaVuTexture = "DejaVuSansMono-distance.png",
117            distanceFieldOrbit = "Orbitron-distance.fnt",
118            distanceFieldOrbitTexture = "Orbitron-distance.png",
119            distanceFieldLean = "Iosevka-distance.fnt",
120            distanceFieldLeanTexture = "Iosevka-distance.png",
121            distanceFieldLeanLight = "Iosevka-Light-distance.fnt",
122            distanceFieldLeanLightTexture = "Iosevka-Light-distance.png",
123            distanceFieldSlabLight = "Iosevka-Slab-Light-distance.fnt",
124            distanceFieldSlabLightTexture = "Iosevka-Slab-Light-distance.png",
125            distanceFieldSlab = "Iosevka-Slab-distance.fnt",
126            distanceFieldSlabTexture = "Iosevka-Slab-distance.png",
127            crispSlab = "Iosevka-Slab-msdf.fnt",
128            crispSlabTexture = "Iosevka-Slab-msdf.png",
129            crispLean = "Iosevka-msdf.fnt",
130            crispLeanTexture = "Iosevka-msdf.png",
131            crispDejaVu = "DejaVuSansMono-msdf.fnt",
132            crispDejaVuTexture = "DejaVuSansMono-msdf.png",
133            crispNotoSerif = "NotoSerif-Family-msdf.fnt",
134            crispNotoSerifTexture = "NotoSerif-Family-msdf.png",
135            crispCarved = "bloccus-msdf.fnt",
136            crispCarvedTexture = "bloccus-msdf.png",
137            crispCurvySquare = "square-msdf.fnt",
138            crispCurvySquareTexture = "square-msdf.png", 
139            crispRobotoSans = "Roboto-Regular-msdf.fnt", 
140            crispRobotoSansTexture = "Roboto-Regular-msdf.png",
141            crispOctagonalSquare = "a-starry-msdf.fnt",
142            crispOctagonalSquareTexture = "a-starry-msdf.png",
143            crispIcons = "awesome-solid-msdf.fnt",
144            crispIconsTexture = "awesome-solid-msdf.png"
145                    ;
146    public static final String vertexShader = "attribute vec4 " + ShaderProgram.POSITION_ATTRIBUTE + ";\n"
147            + "attribute vec4 " + ShaderProgram.COLOR_ATTRIBUTE + ";\n"
148            + "attribute vec2 " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n"
149            + "uniform mat4 u_projTrans;\n"
150            + "varying vec4 v_color;\n"
151            + "varying vec2 v_texCoords;\n"
152            + "\n"
153            + "void main() {\n"
154            + " v_color = " + ShaderProgram.COLOR_ATTRIBUTE + ";\n"
155            + " v_color.a = v_color.a * (255.0/254.0);\n"
156            + " v_texCoords = " + ShaderProgram.TEXCOORD_ATTRIBUTE + "0;\n"
157            + " gl_Position =  u_projTrans * " + ShaderProgram.POSITION_ATTRIBUTE + ";\n"
158            + "}\n";
159
160    public static final String fragmentShader = "#ifdef GL_ES\n"
161            + " precision mediump float;\n"
162            + " precision mediump int;\n"
163            + "#endif\n"
164            + "\n"
165            + "uniform sampler2D u_texture;\n"
166            + "uniform float u_smoothing;\n"
167            + "varying vec4 v_color;\n"
168            + "varying vec2 v_texCoords;\n"
169            + "\n"
170            + "void main() {\n"
171            + "  if (u_smoothing > 0.0) {\n"
172            + "    vec4 box = vec4(v_texCoords-0.000125, v_texCoords+0.000125);\n"
173            + "    float asum = smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, texture2D(u_texture, box.xy).a) +\n"
174            + "                 smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, texture2D(u_texture, box.zw).a) +\n"
175            + "                 smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, texture2D(u_texture, box.xw).a) +\n"
176            + "                 smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, texture2D(u_texture, box.zy).a);\n"
177            + "    gl_FragColor = vec4(v_color.rgb, ((smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, texture2D(u_texture, v_texCoords).a) + 0.5 * asum) / 3.0) * v_color.a);\n"
178            + "  } else {\n"
179            + "         gl_FragColor = v_color * texture2D(u_texture, v_texCoords);\n"
180            + "  }\n"
181            + "}\n";
182//    public static final String fragmentShader = "#ifdef GL_ES\n"
183//            + "       precision mediump float;\n"
184//            + "       precision mediump int;\n"
185//            + "#endif\n"
186//            + "\n"
187//            + "uniform sampler2D u_texture;\n"
188//            + "uniform float u_smoothing;\n"
189//            + "varying vec4 v_color;\n"
190//            + "varying vec2 v_texCoords;\n"
191//            + "\n"
192//            + "void main() {\n"
193//            + "       if (u_smoothing > 0.0) {\n"
194//            + "               float distance = texture2D(u_texture, v_texCoords).a;\n"
195//            + "               float alpha = smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, distance);\n"
196//            + "               gl_FragColor = vec4(v_color.rgb, alpha * v_color.a);\n"
197//            + "       } else {\n"
198//            + "               gl_FragColor = v_color * texture2D(u_texture, v_texCoords);\n"
199//            + "       }\n"
200//            + "}\n";
201    public static final String msdfFragmentShader =  "#ifdef GL_ES\n"
202            + " precision mediump float;\n"
203            + " precision mediump int;\n"
204            + "#endif\n"
205            + "\n"
206            + "uniform sampler2D u_texture;\n"
207            + "uniform float u_smoothing;\n"
208            + "varying vec4 v_color;\n"
209            + "varying vec2 v_texCoords;\n"
210            + "\n"
211            + "void main() {\n"
212            + "  vec3 sdf = texture2D(u_texture, v_texCoords).rgb;\n"
213            + "  gl_FragColor = vec4(v_color.rgb, clamp((max(min(sdf.r, sdf.g), min(max(sdf.r, sdf.g), sdf.b)) - 0.5) * u_smoothing + 0.5, 0.0, 1.0) * v_color.a);\n"
214            //+ " float dist = (max(min(sdf.r, sdf.g), min(max(sdf.r, sdf.g), sdf.b)) - 0.5) / (2.75 * u_smoothing);\n"
215            //+ " float d = u_smoothing * 1.75;\n" 
216            //+ " float d = fwidth(dist);\n"
217            //+ " float alpha = clamp(dist + 0.5, 0.0, 1.0);\n"
218            //+ " float alpha = smoothstep(-d, d, dist);\n"
219            //+ " if(alpha == 0) { discard; }\n"
220            //+ "       gl_FragColor = vec4(v_color.rgb, alpha * v_color.a);\n"
221
222            //+ "        vec3 sdf;\n"
223            //+ "        vec4 box = vec4(v_texCoords-0.0000625, v_texCoords+0.0000625);\n"
224            //+ "  sdf = texture2D(u_texture, box.xy).rgb;\n"
225            //+ "        float asum = clamp((max(min(sdf.r, sdf.g), min(max(sdf.r, sdf.g), sdf.b)) - 0.5) / (6.0 * u_smoothing) + 0.5, 0.0, 0.5);\n"
226            //+ "  sdf = texture2D(u_texture, box.zw).rgb;\n"
227            //+ "  asum = asum + clamp((max(min(sdf.r, sdf.g), min(max(sdf.r, sdf.g), sdf.b)) - 0.5) / (6.0 * u_smoothing) + 0.5, 0.0, 0.5); +\n"
228            //+ "  sdf = texture2D(u_texture, box.xw).rgb;\n"
229            //+ "  asum = asum + clamp((max(min(sdf.r, sdf.g), min(max(sdf.r, sdf.g), sdf.b)) - 0.5) / (6.0 * u_smoothing) + 0.5, 0.0, 0.5); +\n"
230            //+ "  sdf = texture2D(u_texture, box.zy).rgb;\n"
231            //+ "  asum = asum + clamp((max(min(sdf.r, sdf.g), min(max(sdf.r, sdf.g), sdf.b)) - 0.5) / (6.0 * u_smoothing) + 0.5, 0.0, 0.5); +\n"
232            //+ "  sdf = texture2D(u_texture, v_texCoords).rgb;\n"
233            //+ "  gl_FragColor = vec4(v_color.rgb, clamp(((max(min(sdf.r, sdf.g), min(max(sdf.r, sdf.g), sdf.b)) - 0.625) / (3.0 * u_smoothing) + 0.625 + asum) / 3.0, 0.0, 1.0) * v_color.a);\n"
234            + "}\n";
235    /**
236     * An alternate shader based on {@link DefaultResources#fragmentShader}, but this draws outlines around characters.
237     * Only works with distance field fonts. You probably need to create a new ShaderProgram to use this, which would
238     * look like {@code new ShaderProgram(DefaultResources.vertexShader, DefaultResources.outlineFragmentShader)}, and
239     * would assign this to your TextCellFactory's {@link TextCellFactory#shader} field after the TextCellFactory is
240     * fully initialized (calling {@link TextCellFactory#initBySize()}) will set the shader back to the default).
241     */
242    public static final String outlineFragmentShader = "#ifdef GL_ES\n"
243            + "precision mediump float;\n"
244            + "precision mediump int;\n"
245            + "#endif\n"
246            + "\n"
247            + "uniform sampler2D u_texture;\n"
248            + "uniform float u_smoothing;\n"
249            + "varying vec4 v_color;\n"
250            + "varying vec2 v_texCoords;\n"
251            + "\n"
252            + "void main() {\n"
253            + "  if(u_smoothing <= 0.0) {\n"
254            + "    float smoothing = -u_smoothing;\n"
255            + "    vec4 box = vec4(v_texCoords-0.000125, v_texCoords+0.000125);\n"
256            + "    vec2 sample0 = texture2D(u_texture, v_texCoords).ra;\n"
257            + "    vec2 sample1 = texture2D(u_texture, box.xy).ra;\n"
258            + "    vec2 sample2 = texture2D(u_texture, box.zw).ra;\n"
259            + "    vec2 sample3 = texture2D(u_texture, box.xw).ra;\n"
260            + "    vec2 sample4 = texture2D(u_texture, box.zy).ra;\n"
261            + "    float asum = smoothstep(0.5 - smoothing, 0.5 + smoothing, min(sample0.x, sample0.y)) + 0.5 * (\n"
262            + "                 smoothstep(0.5 - smoothing, 0.5 + smoothing, min(sample1.x, sample1.y)) +\n"
263            + "                 smoothstep(0.5 - smoothing, 0.5 + smoothing, min(sample2.x, sample2.y)) +\n"
264            + "                 smoothstep(0.5 - smoothing, 0.5 + smoothing, min(sample3.x, sample3.y)) +\n"
265            + "                 smoothstep(0.5 - smoothing, 0.5 + smoothing, min(sample4.x, sample4.y)));\n"
266            + "    gl_FragColor = vec4(v_color.rgb, (asum / 3.0) * v_color.a);\n"
267            + "  } else {\n"
268            + "    vec2 radistance = texture2D(u_texture, v_texCoords).ra;\n"
269            + "    float distance = min(radistance.x, radistance.y);\n"
270//            + "          vec2 box = vec2(0.0, 0.00375 * (u_smoothing + 0.0825));\n"
271//            + "          float asum = 0.7 * (smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, distance) + \n"
272//            + "                   smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, texture2D(u_texture, v_texCoords + box.xy).a) +\n"
273//            + "                   smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, texture2D(u_texture, v_texCoords - box.xy).a) +\n"
274//            + "                   smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, texture2D(u_texture, v_texCoords + box.yx).a) +\n"
275//            + "                   smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, texture2D(u_texture, v_texCoords - box.yx).a)),\n"
276            + "    vec4 box = vec4(v_texCoords-0.000625, v_texCoords+0.000625);\n"
277            + "    vec2 sample0 = texture2D(u_texture, v_texCoords).ra;\n"
278            + "    vec2 sample1 = texture2D(u_texture, box.xy).ra;\n"
279            + "    vec2 sample2 = texture2D(u_texture, box.zw).ra;\n"
280            + "    vec2 sample3 = texture2D(u_texture, box.xw).ra;\n"
281            + "    vec2 sample4 = texture2D(u_texture, box.zy).ra;\n"
282            + "    float asum = smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, min(sample0.x, sample0.y)) + 0.5 * (\n"
283            + "                 smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, min(sample1.x, sample1.y)) +\n"
284            + "                 smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, min(sample2.x, sample2.y)) +\n"
285            + "                 smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, min(sample3.x, sample3.y)) +\n"
286            + "                 smoothstep(0.5 - u_smoothing, 0.5 + u_smoothing, min(sample4.x, sample4.y))),\n"
287//            + "                 char = step(distance, 0.35);\n"
288            + "                 fancy = step(0.55, distance);\n"
289//            + "                 outline = clamp((distance * 0.8 - 0.415) * 18.0, 0.0, 1.0);\n"
290            + "    gl_FragColor = vec4(v_color.rgb * fancy, (asum + step(0.3, distance)) * v_color.a);\n"
291            + "  }\n"
292            + "}\n";
293    /**
294     * An alternate shader based on {@link DefaultResources#msdfFragmentShader}, but this draws outlines around
295     * characters. This should be sharper than {@link #outlineFragmentShader},  but only works with MSDF (crisp) fonts.
296     * Unlike that shader, this doesn't have special behavior for negative
297     * {@link TextCellFactory#getSmoothingMultiplier()} values, though that may be added later.
298     * You probably need to create a new ShaderProgram to use this, which would look like
299     * {@code new ShaderProgram(DefaultResources.vertexShader, DefaultResources.msdfOutlineFragmentShader)}, and
300     * would assign this to your TextCellFactory's {@link TextCellFactory#shader} field after the TextCellFactory is
301     * fully initialized (calling {@link TextCellFactory#initBySize()}) will set the shader back to the default).
302     */
303    public static final String msdfOutlineFragmentShader =  "#ifdef GL_ES\n"
304            + " precision mediump float;\n"
305            + " precision mediump int;\n"
306            + "#endif\n"
307            + "\n"
308            + "uniform sampler2D u_texture;\n"
309            + "uniform float u_smoothing;\n"
310            + "varying vec4 v_color;\n"
311            + "varying vec2 v_texCoords;\n"
312            + "\n"
313            + "void main() {\n"
314            + "  vec3 sdf = texture2D(u_texture, v_texCoords).rgb;\n"
315//            + "  float distance = (max(min(sdf.r, sdf.g), min(max(sdf.r, sdf.g), sdf.b)) - 0.425);\n"
316//            + "  gl_FragColor = vec4(step(3.5 * u_smoothing, distance * 0.75) * v_color.rgb, clamp((distance / (3.4 * u_smoothing)) + 0.9125, 0.0, 1.0) * v_color.a);\n"
317
318            //+ "  float cd = clamp(distance, 0.0, 1.0);"
319
320            + "  float d = ((max(min(sdf.r, sdf.g), min(max(sdf.r, sdf.g), sdf.b))) - 0.4);\n"
321            + "  float block = step(-0.4999999, d);\n"
322            + "  float nice = step(0.24999999, d);\n"
323            + "  gl_FragColor = vec4(v_color.rgb * nice, clamp(d * u_smoothing + (block + 1.0) * 0.5, 0.0, 1.0) * v_color.a);\n"
324            + "}\n";
325
326    private SquidColorCenter scc;
327    private Texture tentacle;
328    private TextureRegion tentacleRegion;
329    private StatefulRNG guiRandom;
330
331    private static DefaultResources instance;
332
333    static BitmapFont copyFont(BitmapFont font)
334    {
335        if(font == null) return new BitmapFont();
336        return new BitmapFont(new BitmapFont.BitmapFontData(font.getData().getFontFile(), false),
337                font.getRegions(), font.usesIntegerPositions());
338    }
339    private DefaultResources()
340    {
341        if(Gdx.app == null)
342            throw new IllegalStateException("Gdx.app cannot be null; initialize GUI-using objects in create() or later.");
343        Gdx.app.addLifecycleListener(this);
344    }
345
346    private static void initialize()
347    {
348        if(instance == null)
349            instance = new DefaultResources();
350    }
351
352    /**
353     * Gets the one font guaranteed to be included in libGDX, which is Arial at size 15 px.
354     * @return the BitmapFont representing Arial.ttf at size 15 px
355     */
356    public static BitmapFont getIncludedFont()
357    {
358        initialize();
359        if(instance.arial15 == null)
360        {
361            try {
362                instance.arial15 = new BitmapFont();
363                //instance.narrow1.getData().padBottom = instance.narrow1.getDescent();
364            } catch (Exception e) {
365            }
366        }
367        return copyFont(instance.arial15);
368    }
369    /**
370     * Returns a 12x12px, stretched but curvaceous font as an embedded resource. Caches it for later calls.
371     * <br>
372     * Needs files:
373     * <ul>
374     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Zodiac-Square-12x12.fnt</li>
375     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Zodiac-Square-12x12.png</li>
376     * </ul>
377     * @return the BitmapFont object representing Zodiac-Square.ttf at size 16 pt
378     */
379    public static BitmapFont getDefaultFont()
380    {
381        initialize();
382        if(instance.square1 == null)
383        {
384            try {
385                instance.square1 = new BitmapFont(Gdx.files.internal(squareName), Gdx.files.internal(squareTexture), false);
386                //instance.square1.getData().padBottom = instance.square1.getDescent();
387            } catch (Exception e) {
388            }
389        }
390        return copyFont(instance.square1);
391    }
392    /**
393     * Returns a 24x24px, stretched but curvaceous font as an embedded resource. Caches it for later calls.
394     * <br>
395     * Needs files:
396     * <ul>
397     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Zodiac-Square-24x24.fnt</li>
398     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Zodiac-Square-24x24.png</li>
399     * </ul>
400     * @return the BitmapFont object representing Zodiac-Square.ttf at size 32 pt
401     */
402    public static BitmapFont getLargeFont()
403    {
404        initialize();
405        if(instance.square2 == null)
406        {
407            try {
408                instance.square2 = new BitmapFont(Gdx.files.internal(squareNameLarge), Gdx.files.internal(squareTextureLarge), false);
409                //instance.square2.getData().padBottom = instance.square2.getDescent();
410            } catch (Exception e) {
411            }
412        }
413        return copyFont(instance.square2);
414    }
415    /**
416     * Returns a 6x12px, narrow and curving font as an embedded resource. Caches it for later calls.
417     * <br>
418     * Needs files:
419     * <ul>
420     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Rogue-Zodiac-6x12.fnt</li>
421     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Rogue-Zodiac-6x12_0.png</li>
422     * </ul>
423     * @return the BitmapFont object representing Rogue-Zodiac.ttf at size 16 pt
424     */
425    public static BitmapFont getDefaultNarrowFont()
426    {
427        initialize();
428        if(instance.narrow1 == null)
429        {
430            try {
431                instance.narrow1 = new BitmapFont(Gdx.files.internal(narrowName), Gdx.files.internal(narrowTexture), false);
432                //instance.narrow1.getData().padBottom = instance.narrow1.getDescent();
433            } catch (Exception e) {
434            }
435        }
436        return copyFont(instance.narrow1);
437    }
438
439    /**
440     * Returns a 12x24px, narrow and curving font as an embedded resource. Caches it for later calls.
441     * <br>
442     * Needs files:
443     * <ul>
444     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Rogue-Zodiac-12x24.fnt</li>
445     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Rogue-Zodiac-12x24_0.png</li>
446     * </ul>
447     * @return the BitmapFont object representing Rogue-Zodiac.ttf at size 32 pt
448     */
449    public static BitmapFont getLargeNarrowFont()
450    {
451        initialize();
452        if(instance.narrow2 == null)
453        {
454            try {
455                instance.narrow2 = new BitmapFont(Gdx.files.internal(narrowNameLarge), Gdx.files.internal(narrowTextureLarge), false);
456                //instance.narrow2.getData().padBottom = instance.narrow2.getDescent();
457            } catch (Exception e) {
458            }
459        }
460        return copyFont(instance.narrow2);
461    }
462    /**
463     * Returns a 12x24px, narrow and curving font as an embedded resource. Caches it for later calls.
464     * <br>
465     * Needs files:
466     * <ul>
467     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Rogue-Zodiac-18x36.fnt</li>
468     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Rogue-Zodiac-18x36_0.png</li>
469     * </ul>
470     * @return the BitmapFont object representing Rogue-Zodiac.ttf at size 32 pt
471     */
472    public static BitmapFont getExtraLargeNarrowFont()
473    {
474        initialize();
475        if(instance.narrow3 == null)
476        {
477            try {
478                instance.narrow3 = new BitmapFont(Gdx.files.internal(narrowNameExtraLarge), Gdx.files.internal(narrowTextureExtraLarge), false);
479                //instance.narrow3.getData().padBottom = instance.narrow3.getDescent();
480            } catch (Exception e) {
481            }
482        }
483        return copyFont(instance.narrow3);
484    }
485
486    /**
487     * Returns a 8x18px, very smooth and generally good-looking font (based on Inconsolata) as an embedded resource.
488     * This font fully supports Latin, Greek, Cyrillic, and of particular interest to SquidLib, Box Drawing characters.
489     * Caches the font for later calls.
490     * <br>
491     * Needs files:
492     * <ul>
493     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Inconsolata-LGC-8x18.fnt</li>
494     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Inconsolata-LGC-8x18.png</li>
495     * </ul>
496     * @return the BitmapFont object representing Inconsolata-LGC.ttf at size... pretty sure it's 8x18 pixels
497     */
498    public static BitmapFont getSmoothFont()
499    {
500        initialize();
501        if(instance.smooth1 == null)
502        {
503            try {
504                instance.smooth1 = new BitmapFont(Gdx.files.internal(smoothName), Gdx.files.internal(smoothTexture), false);
505                //instance.smooth1.getData().padBottom = instance.smooth1.getDescent();
506            } catch (Exception e) {
507            }
508        }
509        return copyFont(instance.smooth1);
510    }
511    /**
512     * Returns a 12x24px, very smooth and generally good-looking font (based on Inconsolata) as an embedded resource.
513     * This font fully supports Latin, Greek, Cyrillic, and of particular interest to SquidLib, Box Drawing characters.
514     * Caches the font for later calls.
515     * <br>
516     * Needs files:
517     * <ul>
518     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Inconsolata-LGC-12x24.fnt</li>
519     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Inconsolata-LGC-12x24.png</li>
520     * </ul>
521     * @return the BitmapFont object representing Inconsolata-LGC.ttf at size... not actually sure, 12x24 pixels
522     */
523    public static BitmapFont getLargeSmoothFont()
524    {
525        initialize();
526        if(instance.smooth2 == null)
527        {
528            try {
529                instance.smooth2 = new BitmapFont(Gdx.files.internal(smoothNameLarge), Gdx.files.internal(smoothTextureLarge), false);
530                //instance.smooth2.getData().padBottom = instance.smooth2.getDescent();
531            } catch (Exception e) {
532            }
533        }
534        return copyFont(instance.smooth2);
535    }
536    /**
537     * Returns a 6x16px, narrow and curving font with a lot of unicode chars as an embedded resource. Caches it for later calls.
538     * <br>
539     * Needs files:
540     * <ul>
541     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Mandrill-6x16.fnt</li>
542     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Mandrill-6x16.png</li>
543     * </ul>
544     * @return the BitmapFont object representing Mandrill.ttf at size 16 pt
545     */
546    public static BitmapFont getDefaultUnicodeFont()
547    {
548        initialize();
549        if(instance.unicode1 == null)
550        {
551            try {
552                instance.unicode1 = new BitmapFont(Gdx.files.internal(unicodeName), Gdx.files.internal(unicodeTexture), false);
553                //instance.unicode1.getData().padBottom = instance.unicode1.getDescent();
554            } catch (Exception e) {
555            }
556        }
557        return copyFont(instance.unicode1);
558    }
559
560    /**
561     * Returns a 12x32px, narrow and curving font with a lot of unicode chars as an embedded resource. Caches it for later calls.
562     * <br>
563     * Needs files:
564     * <ul>
565     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Mandrill-12x32.fnt</li>
566     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Mandrill-12x32.png</li>
567     * </ul>
568     * @return the BitmapFont object representing Mandrill.ttf at size 32 pt
569     */
570    public static BitmapFont getLargeUnicodeFont()
571    {
572        initialize();
573        if(instance.unicode2 == null)
574        {
575            try {
576                instance.unicode2 = new BitmapFont(Gdx.files.internal(unicodeNameLarge), Gdx.files.internal(unicodeTextureLarge), false);
577                //instance.unicode2.getData().padBottom = instance.unicode2.getDescent();
578            } catch (Exception e) {
579            }
580        }
581        return copyFont(instance.unicode2);
582    }
583    /**
584     * Returns a 25x25px, very smooth and generally good-looking font (based on Inconsolata) as an embedded resource.
585     * This font fully supports Latin, Greek, Cyrillic, and of particular interest to SquidLib, Box Drawing characters.
586     * This variant is (almost) perfectly square, and box drawing characters should line up at size 25x25 px, but other
587     * glyphs will have much more horizontal spacing than in other fonts. Caches the font for later calls. You may want
588     * {@link #getStretchableSquareFont()} instead, which is the same font but can stretch smoothly to most sizes.
589     * <br>
590     * Needs files:
591     * <ul>
592     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Inconsolata-LGC-Square-25x25.fnt</li>
593     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Inconsolata-LGC-Square-25x25.png</li>
594     * </ul>
595     * @return the BitmapFont object representing Inconsolata-LGC-Square at size 25x25 pixels
596     */
597    public static BitmapFont getSquareSmoothFont()
598    {
599        initialize();
600        if(instance.smoothSquare == null)
601        {
602            try {
603                instance.smoothSquare = new BitmapFont(Gdx.files.internal(smoothSquareName), Gdx.files.internal(smoothSquareTexture), false);
604                //instance.smoothSquare.getData().padBottom = instance.smoothSquare.getDescent();
605            } catch (Exception e) {
606            }
607        }
608        return copyFont(instance.smoothSquare);
609    }
610    /**
611     * Returns a 4x10px, extremely thin font (that may be barely legible) as an embedded resource.
612     * The font builds on work by Christian Munk in his font called Monotwist, making some changes for legibility.
613     * This font has the lowest width of any font asset distributed with SquidLib. Caches the font for later calls.
614     * Attribution to Christian Munk (or the username he used, CMunk) is required to use this font; this is in the
615     * license file linked below.
616     * <br>
617     * Needs files:
618     * <ul>
619     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Monty-4x10.fnt</li>
620     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Monty-4x10.png</li>
621     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Monty-license.txt</li>
622     * </ul>
623     * @return the BitmapFont object representing Monty.ttf at size 8 pt
624     */
625    public static BitmapFont getTinyFont()
626    {
627        initialize();
628        if(instance.tiny == null)
629        {
630            try {
631                instance.tiny = new BitmapFont(Gdx.files.internal(tinyName), Gdx.files.internal(tinyTexture), false);
632                //instance.narrow1.getData().padBottom = instance.narrow1.getDescent();
633            } catch (Exception e) {
634            }
635        }
636        return copyFont(instance.tiny);
637    }
638    /**
639     * Returns a 8x20px, extremely thin font (that may be barely legible) as an embedded resource.
640     * The font builds on work by Christian Munk in his font called Monotwist, making some changes for legibility.
641     * A smaller version of this font, {@link #getTinyFont()}, has the lowest width of any font asset distributed with
642     * SquidLib; this doubles its resolution in case you like its appearance but don't want to go blind. Caches the font
643     * for later calls. Attribution to Christian Munk (or the username he used, CMunk) is required to use this font;
644     * this is in the license file linked below.
645     * <br>
646     * Needs files:
647     * <ul>
648     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Monty-8x20.fnt</li>
649     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Monty-8x20.png</li>
650     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Monty-license.txt</li>
651     * </ul>
652     * @return the BitmapFont object representing Monty.ttf at size 16 pt
653     */
654    public static BitmapFont getLessTinyFont()
655    {
656        initialize();
657        if(instance.lessTiny == null)
658        {
659            try {
660                instance.lessTiny = new BitmapFont(Gdx.files.internal(lessTinyName), Gdx.files.internal(lessTinyTexture), false);
661            } catch (Exception e) {
662            }
663        }
664        return copyFont(instance.lessTiny);
665    }
666    /**
667     * Returns a 7x12px font with identical (excellent) Unicode coverage to Iosevka, as an embedded resource.
668     * The font is 7-12-serif by Christian Munk, but not all of the Unicode glyphs supported in his amazingly-huge font
669     * are present here; just the subset that's compatible with Iosevka (which is way more than is required for SquidLib
670     * to present most things). Caches the font for later calls, but be aware that if you copy the BitmapFont instead of
671     * calling this method again, it won't stay monospaced because of a quirk of LibGDX. Attribution to Christian Munk
672     * (or the username he used, CMunk) is required to use this font; this is in the license file linked below.
673     * <br>
674     * Needs files:
675     * <ul>
676     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/7-12-serif.fnt</li>
677     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/7-12-serif.png</li>
678     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/7-12-serif-license.txt</li>
679     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/7-12-serif-readme.txt</li>
680     * </ul>
681     * @return the BitmapFont object representing 7-12-serif.ttf at a size that gives exactly 7 px wide by 12 px tall
682     */
683    public static BitmapFont getSevenTwelveFont()
684    {
685        initialize();
686        if(instance.sevenTwelve == null)
687        {
688            try {
689                instance.sevenTwelve = new BitmapFont(Gdx.files.internal(sevenTwelveName), Gdx.files.internal(sevenTwelveTexture), false);
690            } catch (Exception e) {
691            }
692        }
693        final BitmapFont cpy = copyFont(instance.sevenTwelve);
694        cpy.setFixedWidthGlyphs(" !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmno\n" +
695                "pqrstuvwxyz{|}~ ¡¢£¤¥¦§¨©ª«¬\u00AD®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßà\n" +
696                "áâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİ\n" +
697                "ıIJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƀ\n" +
698                "ƁƂƃƄƅƆƇƈƉƊƋƌƍƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐ\n" +
699                "ǑǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟȠ\n" +
700                "ȡȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰ\n" +
701                "ɱɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯʰʱʲʳʴʵʶʷʸʹʺʻʼʽʾʿˀ\n" +
702                "ˁ˂˃˄˅ˆˇˈˉˊˋˌˍˎˏːˑ˒˓˔˕˖˗˘˙˚˛˜˝˞˟ˠˡˢˣˤ˥˦˧˨˩˪˫ˬ˭ˮ˯˰˱˲˳˴˵˶˷˸˹˺˻˼˽˾˿ͰͱͲͳʹ͵Ͷͷͺͻͼͽ;Ϳ΄΅Ά\n" +
703                "·ΈΉΊΌΎΏΐΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϏϐϑϒϓϔϕϖϗϘϙ\n" +
704                "ϚϛϜϝϞϟϠϡϢϣϤϥϦϧϨϩϪϫϬϭϮϯϰϱϲϳϴϵ϶ϷϸϹϺϻϼϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩ\n" +
705                "ЪЫЬЭЮЯабвгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹ\n" +
706                "ѺѻѼѽѾѿҀҁ҂҃҄҅҆҇҈҉ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿӀӁӂӃӄӅӆӇӈӉ\n" +
707                "ӊӋӌӍӎӏӐӑӒӓӔӕӖӗӘәӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿԀԁԂԃԄԅԆԇԈԉԊԋԌԍԎԏԐԑԒԓԔԕԖԗԘԙ\n" +
708                "ԚԛԜԝԞԟԠԡԢԣԤԥԦԧԨԩԪԫԬԭԮԯԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖՙ՚՛՜՝՞՟աբգդեզէըթժիլխ\n" +
709                "ծկհձղճմյնշոչպջռսվտրցւփքօֆև։֊֍֎֏ሀሁሂሃሄህሆሇለሉሊላሌልሎሏሐሑሒሓሔሕሖሗመሙሚማሜምሞሟሠሡሢሣሤሥሦሧረሩሪራሬርሮሯሰ\n" +
710                "ሱሲሳሴስሶሷሸሹሺሻሼሽሾሿቀቁቂቃቄቅቆቇቈቊቋቌቍቐቑቒቓቔቕቖቘቚቛቜቝበቡቢባቤብቦቧቨቩቪቫቬቭቮቯተቱቲታቴትቶቷቸቹቺቻቼችቾቿኀኁኂኃኄኅኆኇ\n" +
711                "ኈኊኋኌኍነኑኒናኔንኖኗኘኙኚኛኜኝኞኟአኡኢኣኤእኦኧከኩኪካኬክኮኯኰኲኳኴኵኸኹኺኻኼኽኾᎀᎁᎂᎃᎄᎅᎆᎇᎈᎉᎊᎋᎌᎍᎎᎏ᎐᎑᎒᎓᎔᎕᎖᎗᎘᎙ᎠᎡᎢᎣᎤ\n" +
712                "ᎥᎦᎧᎨᎩᎪᎫᎬᎭᎮᎯᎰᎱᎲᎳᎴᎵᎶᎷᎸᎹᎺᎻᎼᎽᎾᎿᏀᏁᏂᏃᏄᏅᏆᏇᏈᏉᏊᏋᏌᏍᏎᏏᏐᏑᏒᏓᏔᏕᏖᏗᏘᏙᏚᏛᏜᏝᏞᏟᏠᏡᏢᏣᏤᏥᏦᏧᏨᏩᏪᏫᏬᏭᏮᏯᏰᏱᏲᏳᏴ\n" +
713                " ᚁᚂᚃᚄᚅᚆᚇᚈᚉᚊᚋᚌᚍᚎᚏᚐᚑᚒᚓᚔᚕᚖᚗᚘᚙᚚ᚛᚜ᚠᚡᚢᚣᚤᚥᚦᚧᚨᚩᚪᚫᚬᚭᚮᚯᚰᚱᚲᚳᚴᚵᚶᚷᚸᚹᚺᚻᚼᚽᚾᚿᛀᛁᛂᛃᛄᛅᛆᛇᛈᛉᛊᛋᛌᛍᛎᛏᛐᛑᛒ\n" +
714                "ᛓᛔᛕᛖᛗᛘᛙᛚᛛᛜᛝᛞᛟᛠᛡᛢᛣᛤᛥᛦᛧᛨᛩᛪ᛫᛬᛭ᛮᛯᛰᛱᛲᛳᛴᛵᛶᛷᛸᝀᝁᝂᝃᝄᝅᝆᝇᝈᝉᝊᝋᝌᝍᝎᝏᝐᝑᝒᝓᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕ\n" +
715                "ᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᴬᴭᴮᴯᴰᴱᴲᴳᴴᴵᴶᴷᴸᴹᴺᴻᴼᴽᴾᴿᵀᵁᵂᵃᵄᵅᵆᵇᵈᵉᵊᵋᵌᵍᵎᵏᵐᵑᵒᵓᵔᵕᵖᵗᵘᵙᵚᵛᵜᵝᵞᵟᵠᵡᵢᵣᵤᵥ\n" +
716                "ᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵸᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚᶛᶜᶝᶞᶟᶠᶡᶢᶣᶤᶥᶦᶧᶨᶩᶪᶫᶬᶭᶮᶯᶰᶱᶲᶳᶴᶵ\n" +
717                "ᶶᶷᶸᶹᶺᶻᶼᶽᶾᶿḀḁḂḃḄḅḆḇḈḉḊḋḌḍḎḏḐḑḒḓḔḕḖḗḘḙḚḛḜḝḞḟḠḡḢḣḤḥḦḧḨḩḪḫḬḭḮḯḰḱḲḳḴḵḶḷḸḹḺḻḼḽḾḿṀṁṂṃṄṅ\n" +
718                "ṆṇṈṉṊṋṌṍṎṏṐṑṒṓṔṕṖṗṘṙṚṛṜṝṞṟṠṡṢṣṤṥṦṧṨṩṪṫṬṭṮṯṰṱṲṳṴṵṶṷṸṹṺṻṼṽṾṿẀẁẂẃẄẅẆẇẈẉẊẋẌẍẎẏẐẑẒẓẔẕ\n" +
719                "ẖẗẘẙẚẛẜẝẞẟẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụ\n" +
720                "ỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹỺỻỼỽỾỿἀἁἂἃἄἅἆἇἈἉἊἋἌἍἎἏἐἑἒἓἔἕἘἙἚἛἜἝἠἡἢἣἤἥἦἧἨἩἪἫἬἭἮἯἰἱἲἳἴἵἶἷἸἹ\n" +
721                "ἺἻἼἽἾἿὀὁὂὃὄὅὈὉὊὋὌὍὐὑὒὓὔὕὖὗὙὛὝὟὠὡὢὣὤὥὦὧὨὩὪὫὬὭὮὯὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾈᾉᾊᾋᾌᾍᾎᾏᾐᾑᾒᾓ\n" +
722                "ᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾞᾟᾠᾡᾢᾣᾤᾥᾦᾧᾨᾩᾪᾫᾬᾭᾮᾯᾰᾱᾲᾳᾴᾶᾷᾸᾹᾺΆᾼ᾽ι᾿῀῁ῂῃῄῆῇῈΈῊΉῌ῍῎῏ῐῑῒΐῖῗῘῙῚΊ῝῞῟ῠῡῢΰῤῥῦῧῨ\n" +
723                "ῩῪΎῬ῭΅`ῲῳῴῶῷῸΌῺΏῼ´῾           \u200B\u200C\u200D\u200E\u200F‐‑‒–—―‖‗‘’‚‛“”„‟†‡•‣․‥…‧\u2028\u2029\u202A\u202B\u202C\u202D\u202E ‰‱′″‴‵‶‷‸‹›※‼\n" +
724                "‽‾‿⁀⁁⁂⁃⁄⁅⁆⁇⁈⁉⁊⁋⁌⁍⁎⁏⁐⁑⁒⁓⁔⁕⁖⁗⁘⁙⁚⁛⁜⁝⁞ \u2060\u2061\u2062\u2063\u2064\u2066\u2067\u2068\u2069\u206A\u206B\u206C\u206D\u206E\u206F⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐ\n" +
725                "ₑₒₓₔₕₖₗₘₙₚₛₜ₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲₳₴₵₶₷₸₹₺₻₼₽℀℁ℂ℃℄℅℆ℇ℈℉ℊℋℌℍℎℏℐℑℒℓ℔ℕ№℗℘ℙℚℛℜℝ℞℟℠℡™℣ℤ℥\n" +
726                "Ω℧ℨ℩KÅℬℭ℮ℯℰℱℲℳℴℵℶℷℸℹ℺℻ℼℽℾℿ⅀⅁⅂⅃⅄ⅅⅆⅇⅈⅉ⅊⅋⅌⅍ⅎ⅏⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵ\n" +
727                "ⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿↀↁↂↃↄↅↆↇↈ↉←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋\n" +
728                "⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪⇫⇬⇭⇮⇯⇰⇱⇲⇳⇴⇵⇶⇷⇸⇹⇺⇻⇼⇽⇾⇿∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛\n" +
729                "∜∝∞∟∠∡∢∣∤∥∦∧∨∩∪∫∬∭∮∯∰∱∲∳∴∵∶∷∸∹∺∻∼∽∾∿≀≁≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩≪≫\n" +
730                "≬≭≮≯≰≱≲≳≴≵≶≷≸≹≺≻≼≽≾≿⊀⊁⊂⊃⊄⊅⊆⊇⊈⊉⊊⊋⊌⊍⊎⊏⊐⊑⊒⊓⊔⊕⊖⊗⊘⊙⊚⊛⊜⊝⊞⊟⊠⊡⊢⊣⊤⊥⊦⊧⊨⊩⊪⊫⊬⊭⊮⊯⊰⊱⊲⊳⊴⊵⊶⊷⊸⊹⊺⊻\n" +
731                "⊼⊽⊾⊿⋀⋁⋂⋃⋄⋅⋆⋇⋈⋉⋊⋋⋌⋍⋎⋏⋐⋑⋒⋓⋔⋕⋖⋗⋘⋙⋚⋛⋜⋝⋞⋟⋠⋡⋢⋣⋤⋥⋦⋧⋨⋩⋪⋫⋬⋭⋮⋯⋰⋱⋲⋳⋴⋵⋶⋷⋸⋹⋺⋻⋼⋽⋾⋿⌀⌁⌂⌃⌄⌅⌆⌇⌈⌉⌊⌋\n" +
732                "⌌⌍⌎⌏⌐⌑⌒⌓⌔⌕⌖⌗⌘⌙⌚⌛⌜⌝⌞⌟⌠⌡⌢⌣⌤⌥⌦⌧⌨〈〉⌫⌬⌭⌮⌯⌰⌱⌲⌳⌴⌵⌶⌷⌸⌹⌺⌻⌼⌽⌾⌿⍀⍁⍂⍃⍄⍅⍆⍇⍈⍉⍊⍋⍌⍍⍎⍏⍐⍑⍒⍓⍔⍕⍖⍗⍘⍙⍚⍛\n" +
733                "⍜⍝⍞⍟⍠⍡⍢⍣⍤⍥⍦⍧⍨⍩⍪⍫⍬⍭⍮⍯⍰⍱⍲⍳⍴⍵⍶⍷⍸⍹⍺⍻⍼⍽⍾⍿⎔⎕⎖⎗⎘⎙⎚⎛⎜⎝⎞⎟⎠⎡⎢⎣⎤⎥⎦⎧⎨⎩⎪⎫⎬⎭⎮⎯⎰⎱⎲⎳⎴⎵⎶⎷⎸⎹⎺⎻⎼⎽⎾⎿\n" +
734                "⏀⏁⏂⏃⏄⏅⏆⏇⏈⏉⏊⏋⏌⏍⏎⏏⏐⏑⏒⏓⏔⏕⏖⏗⏘⏙⏚⏛⏜⏝⏞⏟⏠⏡⏢⏣⏤⏥⏦⏧⏨⏩⏪⏫⏬⏭⏮⏯⏰⏱⏲⏳⏴⏵⏶⏷⏸⏹⏺─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└\n" +
735                "┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤\n" +
736                "╥╦╧╨╩╪╫╬╭╮╯╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴\n" +
737                "▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇◈◉◊○◌◍◎●◐◑◒◓◔◕◖◗◘◙◚◛◜◝◞◟◠◡◢◣◤◥◦◧◨◩◪◫◬◭◮◯◰◱◲◳◴◵◶◷◸◹◺◻◼◽◾◿☀☁☂☃☄\n" +
738                "★☆☇☈☉☊☋☌☍☎☏☐☑☒☓☔☕☖☗☘☙☚☛☜☝☞☟☠☡☢☣☤☥☦☧☨☩☪☫☬☭☮☯☰☱☲☳☴☵☶☷☸☹☺☻☼☽☾☿♀♁♂♃♄♅♆♇♈♉♊♋♌♍♎♏♐♑♒♓♔\n" +
739                "♕♖♗♘♙♚♛♜♝♞♟♠♡♢♣♤♥♦♧♨♩♪♫♬♭♮♯♰♱♲♳♴♵♶♷♸♹♺♻♼♽♾♿⚀⚁⚂⚃⚄⚅⚆⚇⚈⚉⚊⚋⚌⚍⚎⚏⚐⚑⚒⚓⚔⚕⚖⚗⚘⚙⚚⚛⚜⚝⚞⚟⚠⚡⚢⚣⚤\n" +
740                "⚥⚦⚧⚨⚩⚪⚫⚬⚭⚮⚯⚰⚱⚲⚳⚴⚵⚶⚷⚸⚹⚺⚻⚼⚽⚾⚿⛀⛁⛂⛃⛄⛅⛆⛇⛈⛉⛊⛋⛌⛍⛎⛏⛐⛑⛒⛓⛔⛕⛖⛗⛘⛙⛚⛛⛜⛝⛞⛟⛠⛡⛢⛣⛤⛥⛦⛧⛨⛩⛪⛫⛬⛭⛮⛯⛰⛱⛲⛳⛴\n" +
741                "⛵⛶⛷⛸⛹⛺⛻⛼⛽⛾⛿✀✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟✠✡✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿❀❁❂❃❄\n" +
742                "❅❆❇❈❉❊❋❌❍❎❏❐❑❒❓❔❕❖❗❘❙❚❛❜❝❞❟❠❡❢❣❤❥❦❧❨❩❪❫❬❭❮❯❰❱❲❳❴❵❶❷❸❹❺❻❼❽❾❿➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓➔\n" +
743                "➕➖➗➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨➩➪➫➬➭➮➯➰➱➲➳➴➵➶➷➸➹➺➻➼➽➾➿⟰⟱⟲⟳⟴⟵⟶⟷⟸⟹⟺⟻⟼⟽⟾⟿⠀⠁⠂⠃⠄⠅⠆⠇⠈⠉⠊⠋⠌⠍⠎⠏⠐⠑⠒⠓⠔\n" +
744                "⠕⠖⠗⠘⠙⠚⠛⠜⠝⠞⠟⠠⠡⠢⠣⠤⠥⠦⠧⠨⠩⠪⠫⠬⠭⠮⠯⠰⠱⠲⠳⠴⠵⠶⠷⠸⠹⠺⠻⠼⠽⠾⠿⡀⡁⡂⡃⡄⡅⡆⡇⡈⡉⡊⡋⡌⡍⡎⡏⡐⡑⡒⡓⡔⡕⡖⡗⡘⡙⡚⡛⡜⡝⡞⡟⡠⡡⡢⡣⡤\n" +
745                "⡥⡦⡧⡨⡩⡪⡫⡬⡭⡮⡯⡰⡱⡲⡳⡴⡵⡶⡷⡸⡹⡺⡻⡼⡽⡾⡿⢀⢁⢂⢃⢄⢅⢆⢇⢈⢉⢊⢋⢌⢍⢎⢏⢐⢑⢒⢓⢔⢕⢖⢗⢘⢙⢚⢛⢜⢝⢞⢟⢠⢡⢢⢣⢤⢥⢦⢧⢨⢩⢪⢫⢬⢭⢮⢯⢰⢱⢲⢳⢴\n" +
746                "⢵⢶⢷⢸⢹⢺⢻⢼⢽⢾⢿⣀⣁⣂⣃⣄⣅⣆⣇⣈⣉⣊⣋⣌⣍⣎⣏⣐⣑⣒⣓⣔⣕⣖⣗⣘⣙⣚⣛⣜⣝⣞⣟⣠⣡⣢⣣⣤⣥⣦⣧⣨⣩⣪⣫⣬⣭⣮⣯⣰⣱⣲⣳⣴⣵⣶⣷⣸⣹⣺⣻⣼⣽⣾⣿ⰀⰁⰂⰃⰄ\n" +
747                "ⰅⰆⰇⰈⰉⰊⰋⰌⰍⰎⰏⰐⰑⰒⰓⰔⰕⰖⰗⰘⰙⰚⰛⰜⰝⰞⰟⰠⰡⰢⰣⰤⰥⰦⰧⰨⰩⰪⰫⰬⰭⰮⰰⰱⰲⰳⰴⰵⰶⰷⰸⰹⰺⰻⰼⰽⰾⰿⱀⱁⱂⱃⱄⱅⱆⱇⱈⱉⱊⱋⱌⱍⱎⱏⱐⱑⱒⱓⱔⱕ\n" +
748                "ⱖⱗⱘⱙⱚⱛⱜⱝⱞⱠⱡⱢⱣⱤⱥⱦⱧⱨⱩⱪⱫⱬⱭⱮⱯⱰⱱⱲⱳⱴⱵⱶⱷⱸⱹⱺⱻⱼⱽⱾⱿⲀⲁⲂⲃⲄⲅⲆⲇⲈⲉⲊⲋⲌⲍⲎⲏⲐⲑⲒⲓⲔⲕⲖⲗⲘⲙⲚⲛⲜⲝⲞⲟⲠⲡⲢⲣⲤⲥⲦ\n" +
749                "ⲧⲨⲩⲪⲫⲬⲭⲮⲯⲰⲱⲲⲳⲴⲵⲶⲷⲸⲹⲺⲻⲼⲽⲾⲿⳀⳁⳂⳃⳄⳅⳆⳇⳈⳉⳊⳋⳌⳍⳎⳏⳐⳑⳒⳓⳔⳕⳖⳗⳘⳙⳚⳛⳜⳝⳞⳟⳠⳡⳢⳣⳤ⳥⳦⳧⳨⳩⳪ⳫⳬⳭⳮ⳯⳰⳱Ⳳⳳ⳹⳺⳻\n" +
750                "⳼⳽⳾⳿ⴀⴁⴂⴃⴄⴅⴆⴇⴈⴉⴊⴋⴌⴍⴎⴏⴐⴑⴒⴓⴔⴕⴖⴗⴘⴙⴚⴛⴜⴝⴞⴟⴠⴡⴢⴣⴤⴥⴧⴭ⸀⸁⸂⸃⸄⸅⸆⸇⸈⸉⸊⸋⸌⸍⸎⸏⸐⸑⸒⸓⸔⸕⸖⸗⸘⸙⸚⸛⸜⸝⸞⸟⸠⸡⸢⸣\n" +
751                "⸤⸥⸦⸧⸨⸩⸪⸫⸬⸭⸮ⸯ⸰⸱⸲⸳⸴⸵⸶⸷⸸⸹⸺⸻⸼⸽⸾⸿⹀⹁⹂ 、。〃〄々〆〇〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟〠〡〢〣〤〥〦〧〨〩〪〭〮〯〫〬〰\n" +
752                "〱〲〳〴〵〶〷〸〹〺〻〼〽〾〿ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめ\n" +
753                "もゃやゅゆょよらりるれろゎわゐゑをんゔゕゖ゙゚゛゜ゝゞゟ゠ァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビ\n" +
754                "ピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿꔀꔁꔂꔃꔄꔅꔆꔇꔈꔉꔊꔋꔌꔍꔎꔏꔐꔑꔒꔓꔔꔕꔖꔗꔘꔙꔚꔛꔜꔝꔞꔟꔠꔡꔢꔣ\n" +
755                "ꔤꔥꔦꔧꔨꔩꔪꔫꔬꔭꔮꔯꔰꔱꔲꔳꔴꔵꔶꔷꔸꔹꔺꔻꔼꔽꔾꔿꕀꕁꕂꕃꕄꕅꕆꕇꕈꕉꕊꕋꕌꕍꕎꕏꕐꕑꕒꕓꕔꕕꕖꕗꕘꕙꕚꕛꕜꕝꕞꕟꕠꕡꕢꕣꕤꕥꕦꕧꕨꕩꕪꕫꕬꕭꕮꕯꕰꕱꕲꕳ\n" +
756                "ꕴꕵꕶꕷꕸꕹꕺꕻꕼꕽꕾꕿꖀꖁꖂꖃꖄꖅꖆꖇꖈꖉꖊꖋꖌꖍꖎꖏꖐꖑꖒꖓꖔꖕꖖꖗꖘꖙꖚꖛꖜꖝꖞꖟ꜠꜡ꜢꜣꜤꜥꜦꜧꜨꜩꜪꜫꜬꜭꜮꜯꜰꜱꜲꜳꜴꜵꜶꜷꜸꜹꜺꜻꜼꜽꜾꜿꝀꝁꝂꝃ\n" +
757                "ꝄꝅꝆꝇꝈꝉꝊꝋꝌꝍꝎꝏꝐꝑꝒꝓꝔꝕꝖꝗꝘꝙꝚꝛꝜꝝꝞꝟꝠꝡꝢꝣꝤꝥꝦꝧꝨꝩꝪꝫꝬꝭꝮꝯꝰꝱꝲꝳꝴꝵꝶꝷꝸꝹꝺꝻꝼꝽꝾꝿꞀꞁꞂꞃꞄꞅꞆꞇꞈ꞉꞊ꞋꞌꞍꞎꞐꞑꞒꞓꞔ\n" +
758                "ꞕꞖꞗꞘꞙꞚꞛꞜꞝꞞꞟꞠꞡꞢꞣꞤꞥꞦꞧꞨꞩꞪꞫꞬꞭꞰꞱꟷꟸꟹꟺꟻꟼꟽꟾꟿꡀꡁꡂꡃꡄꡅꡆꡇꡈꡉꡊꡋꡌꡍꡎꡏꡐꡑꡒꡓꡔꡕꡖꡗꡘꡙꡚꡛꡜꡝꡞꡟꡠꡡꡢꡣꡤꡥꡦꡧꡨꡩꡪꡫ\n" +
759                "ꡬꡭꡮꡯꡰꡱꡲꡳ꡴꡵꡶꡷ꬁꬂꬃꬄꬅꬆꬉꬊꬋꬌꬍꬎꬑꬒꬓꬔꬕꬖꬠꬡꬢꬣꬤꬥꬦꬨꬩꬪꬫꬬꬭꬮfffiflffifflſtstﬓﬔﬕﬖﬗ﹐﹑﹒﹔﹕﹖﹗﹘﹙﹚﹛﹜﹝﹞﹟﹠﹡﹢﹣﹤﹥﹦﹨﹩\n" +
760                "﹪﹫!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmn\n" +
761                "opqrstuvwxyz{|}~⦅⦆。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソタチツテトナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゙\n" +
762                "゚ᅠᄀᄁᆪᄂᆬᆭᄃᄄᄅᆰᆱᆲᆳᆴᆵᄚᄆᄇᄈᄡᄉᄊᄋᄌᄍᄎᄏᄐᄑ하ᅢᅣᅤᅥᅦᅧᅨᅩᅪᅫᅬᅭᅮᅯᅰᅱᅲᅳᅴᅵ¢£¬ ̄¦¥₩│←↑→↓■○");
763        return cpy;
764    }
765    /**
766     * Returns a 14x27px font with fairly good Unicode coverage and an octagonal, angular look, as an embedded resource.
767     * The font is Computer Says No by Christian Munk, which has a nice clean appearance. Caches the font for later
768     * calls, but be aware that if you copy the BitmapFont instead of calling this method again, it won't stay
769     * monospaced because of a quirk of LibGDX. Attribution to Christian Munk (or the username he used,
770     * CMunk) is required to use this font; this is in the license file linked below.
771     * <br>
772     * Needs files:
773     * <ul>
774     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/ComputerSaysNo.fnt</li>
775     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/ComputerSaysNo.png</li>
776     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/ComputerSaysNo-license.txt</li>
777     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/ComputerSaysNo-readme.txt</li>
778     * </ul>
779     * @return the BitmapFont object representing ComputerSaysNo.ttf at a size that gives about 14 px wide by 27 px tall
780     */
781    public static BitmapFont getOctagonalMonoFont()
782    {
783        initialize();
784        if(instance.computerSaysNo == null)
785        {
786            try {
787                instance.computerSaysNo = new BitmapFont(Gdx.files.internal(computerSaysNoName), Gdx.files.internal(computerSaysNoTexture), false);
788            } catch (Exception e) {
789                instance.computerSaysNo = new BitmapFont();
790            }
791        }
792        final BitmapFont cpy = copyFont(instance.computerSaysNo);
793        // ugh, this shouldn't be required...
794        cpy.setFixedWidthGlyphs("\u0000" +
795                " !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmno\n" +
796                "pqrstuvwxyz{|}~¡¢£¤¥¦§¨©ª«¬\u00AD®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàá\n" +
797                "âãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħĨĩĪīĬĭĮįİı\n" +
798                "IJijĴĵĶķĸĹĺĻļĽľĿŀŁłŃńŅņŇňʼnŊŋŌōŎŏŐőŒœŔŕŖŗŘřŚśŜŝŞşŠšŢţŤťŦŧŨũŪūŬŭŮůŰűŲųŴŵŶŷŸŹźŻżŽžſƀƁ\n" +
799                "ƂƃƄƅƆƇƈƉƊƋƌƍƎƏƐƑƒƓƔƕƖƗƘƙƚƛƜƝƞƟƠơƢƣƤƥƦƧƨƩƪƫƬƭƮƯưƱƲƳƴƵƶƷƸƹƺƻƼƽƾƿǀǁǂǃDŽDždžLJLjljNJNjnjǍǎǏǐǑ\n" +
800                "ǒǓǔǕǖǗǘǙǚǛǜǝǞǟǠǡǢǣǤǥǦǧǨǩǪǫǬǭǮǯǰDZDzdzǴǵǶǷǸǹǺǻǼǽǾǿȀȁȂȃȄȅȆȇȈȉȊȋȌȍȎȏȐȑȒȓȔȕȖȗȘșȚțȜȝȞȟȠȡ\n" +
801                "ȢȣȤȥȦȧȨȩȪȫȬȭȮȯȰȱȲȳȴȵȶȷȸȹȺȻȼȽȾȿɀɁɂɃɄɅɆɇɈɉɊɋɌɍɎɏɐɑɒɓɔɕɖɗɘəɚɛɜɝɞɟɠɡɢɣɤɥɦɧɨɩɪɫɬɭɮɯɰɱ\n" +
802                "ɲɳɴɵɶɷɸɹɺɻɼɽɾɿʀʁʂʃʄʅʆʇʈʉʊʋʌʍʎʏʐʑʒʓʔʕʖʗʘʙʚʛʜʝʞʟʠʡʢʣʤʥʦʧʨʩʪʫʬʭʮʯʰʱʲʳʴʵʶʷʸʹʺʻʼʽʾʿˀˁ\n" +
803                "˂˃˄˅ˆˇˈˉˊˋˌˍˎˏːˑ˒˓˔˕˖˗˘˙˚˛˜˝˞ˠˡˢˣˤ˥˦˧˨˩˪˫ˬ˭ˮ˳˴˵˶˷˸˹˺˻˼˽˾ͰͱͲͳʹ͵Ͷͷͺͻͼͽ;΄΅Ά·ΈΉΊΌΎΏΐ\n" +
804                "ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩΪΫάέήίΰαβγδεζηθικλμνξοπρςστυφχψωϊϋόύώϏϐϑϒϓϔϕϖϗϘϙϚϛϜϝϞϟϠϡ\n" +
805                "ϢϣϤϥϦϧϨϩϪϫϬϭϮϯϰϱϲϳϴϵ϶ϷϸϹϺϻϼϽϾϿЀЁЂЃЄЅІЇЈЉЊЋЌЍЎЏАБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯаб\n" +
806                "вгдежзийклмнопрстуфхцчшщъыьэюяѐёђѓєѕіїјљњћќѝўџѠѡѢѣѤѥѦѧѨѩѪѫѬѭѮѯѰѱѲѳѴѵѶѷѸѹѺѻѼѽѾѿҀҁ\n" +
807                "҃ҊҋҌҍҎҏҐґҒғҔҕҖҗҘҙҚқҜҝҞҟҠҡҢңҤҥҦҧҨҩҪҫҬҭҮүҰұҲҳҴҵҶҷҸҹҺһҼҽҾҿӀӁӂӃӄӅӆӇӈӉӊӋӌӍӎӏӐӑӒӓӔӕӖӗӘ\n" +
808                "әӚӛӜӝӞӟӠӡӢӣӤӥӦӧӨөӪӫӬӭӮӯӰӱӲӳӴӵӶӷӸӹӺӻӼӽӾӿԀԁԂԃԄԅԆԇԈԉԊԋԌԍԎԏԐԑԒԓԔԕԖԗԘԙԚԛԜԝԞԟԠԡԢԣԤԥԦԧԨ\n" +
809                "ԩԪԫԬԭԮԯԱԲԳԴԵԶԷԸԹԺԻԼԽԾԿՀՁՂՃՄՅՆՇՈՉՊՋՌՍՎՏՐՑՒՓՔՕՖՙ՚՛՜՝՞՟աբգդեզէըթժիլխծկհձղճմյնշոչպջռ\n" +
810                "սվտրցւփքօֆև։֊֏฿ႠႡႢႣႤႥႦႧႨႩႪႫႬႭႮႯႰႱႲႳႴႵႶႷႸႹႺႻႼႽႾႿჀჁჂჃჄჅჇჍაბგდევზთიკლმნოპჟრსტუფქღყშ\n" +
811                "ჩცძწჭხჯჰჱჲჳჴჵჶჷჸჹჺ჻ჽჾჿᎠᎡᎢᎣᎤᎥᎦᎧᎨᎩᎪᎫᎬᎭᎮᎯᎰᎱᎲᎳᎴᎵᎶᎷᎸᎹᎺᎻᎼᎽᎾᎿᏀᏁᏂᏃᏄᏅᏆᏇᏈᏉᏊᏋᏌᏍᏎᏏᏐᏑᏒᏓᏔᏕᏖᏗᏘᏙ\n" +
812                "ᏚᏛᏜᏝᏞᏟᏠᏡᏢᏣᏤᏥᏦᏧᏨᏩᏪᏫᏬᏭᏮᏯᏰᏱᏲᏳᏴᚠᚡᚢᚣᚤᚥᚦᚧᚨᚩᚪᚫᚬᚭᚮᚯᚰᚱᚲᚳᚴᚵᚶᚷᚸᚹᚺᚻᚼᚽᚾᚿᛀᛁᛂᛃᛄᛅᛆᛇᛈᛉᛊᛋᛌᛍᛎᛏᛐᛑᛒᛓᛔ\n" +
813                "ᛕᛖᛗᛘᛙᛚᛛᛜᛝᛞᛟᛠᛡᛢᛣᛤᛥᛦᛧᛨᛩᛪ᛫᛬᛭ᛮᛯᛰᴀᴁᴂᴃᴄᴅᴆᴇᴈᴉᴊᴋᴌᴍᴎᴏᴐᴑᴒᴓᴔᴕᴖᴗᴘᴙᴚᴛᴜᴝᴞᴟᴠᴡᴢᴣᴤᴥᴦᴧᴨᴩᴪᴫᴬᴭᴮᴯᴰᴱᴲᴳ\n" +
814                "ᴴᴵᴶᴷᴸᴹᴺᴻᴼᴽᴾᴿᵀᵁᵂᵃᵄᵅᵆᵇᵈᵉᵊᵋᵌᵍᵎᵏᵐᵑᵒᵓᵔᵕᵖᵗᵘᵙᵚᵛᵜᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᵫᵬᵭᵮᵯᵰᵱᵲᵳᵴᵵᵶᵷᵸᵹᵺᵻᵼᵽᵾᵿᶀᶁᶂᶃ\n" +
815                "ᶄᶅᶆᶇᶈᶉᶊᶋᶌᶍᶎᶏᶐᶑᶒᶓᶔᶕᶖᶗᶘᶙᶚᶛᶜᶝᶞᶟᶠᶡᶢᶣᶤᶥᶦᶧᶨᶩᶪᶫᶬᶭᶮᶯᶰᶱᶲᶳᶴᶵᶶᶷᶸᶹᶺᶻᶼᶽᶾᶿḀḁḂḃḄḅḆḇḈḉḊḋḌḍḎḏḐḑḒḓ\n" +
816                "ḔḕḖḗḘḙḚḛḜḝḞḟḠḡḢḣḤḥḦḧḨḩḪḫḬḭḮḯḰḱḲḳḴḵḶḷḸḹḺḻḼḽḾḿṀṁṂṃṄṅṆṇṈṉṊṋṌṍṎṏṐṑṒṓṔṕṖṗṘṙṚṛṜṝṞṟṠṡṢṣ\n" +
817                "ṤṥṦṧṨṩṪṫṬṭṮṯṰṱṲṳṴṵṶṷṸṹṺṻṼṽṾṿẀẁẂẃẄẅẆẇẈẉẊẋẌẍẎẏẐẑẒẓẔẕẖẗẘẙẚẛẜẝẞẟẠạẢảẤấẦầẨẩẪẫẬậẮắẰằẲẳ\n" +
818                "ẴẵẶặẸẹẺẻẼẽẾếỀềỂểỄễỆệỈỉỊịỌọỎỏỐốỒồỔổỖỗỘộỚớỜờỞởỠỡỢợỤụỦủỨứỪừỬửỮữỰựỲỳỴỵỶỷỸỹỺỻỼỽỾỿἀἁἂἃ\n" +
819                "ἄἅἆἇἈἉἊἋἌἍἎἏἐἑἒἓἔἕἘἙἚἛἜἝἠἡἢἣἤἥἦἧἨἩἪἫἬἭἮἯἰἱἲἳἴἵἶἷἸἹἺἻἼἽἾἿὀὁὂὃὄὅὈὉὊὋὌὍὐὑὒὓὔὕὖὗὙὛὝὟ\n" +
820                "ὠὡὢὣὤὥὦὧὨὩὪὫὬὭὮὯὰάὲέὴήὶίὸόὺύὼώᾀᾁᾂᾃᾄᾅᾆᾇᾈᾉᾊᾋᾌᾍᾎᾏᾐᾑᾒᾓᾔᾕᾖᾗᾘᾙᾚᾛᾜᾝᾞᾟᾠᾡᾢᾣᾤᾥᾦᾧᾨᾩᾪᾫᾬᾭᾮᾯᾰᾱ\n" +
821                "ᾲᾳᾴᾶᾷᾸᾹᾺΆᾼ᾽ι᾿῀῁ῂῃῄῆῇῈΈῊΉῌ῍῎῏ῐῑῒΐῖῗῘῙῚΊ῝῞῟ῠῡῢΰῤῥῦῧῨῩῪΎῬ῭΅`ῲῳῴῶῷῸΌῺΏῼ´῾‐‑‒–—―‖‗‘’‚\n" +
822                "‛“”„‟†‡•‣․‥…‧‰‱‸‹›※‼‽‾⁂⁄⁅⁆⁇⁈⁉⁊⁋⁌⁍⁎⁏⁑⁒⁖⁘⁙⁚⁛⁝⁞⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₔₕₖ\n" +
823                "ₗₘₙₚₛₜ₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲₳₴₵₶₷₸₹₺₽ℂ℃℄ℇ℈℉ℍ№™Ω℧℩KÅ℮Ⅎ⅐⅑⅒⅓⅔⅕⅖⅗⅘⅙⅚⅛⅜⅝⅞⅟ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭ\n" +
824                "ⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿↀↁↂↃↄↅↆↇↈ↉─━│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳\n" +
825                "┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬╭╮╯╰▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒\n" +
826                "▓▔▕▖▗▘▙▚▛▜▝▞▟ⱠⱡⱢⱣⱤⱥⱦⱧⱨⱩⱪⱫⱬⱭⱮⱯⱰⱱⱲⱳⱴⱵⱶⱷⱸⱹⱺⱻⱼⱽⱾⱿ꜠꜡ꜢꜣꜤꜥꜦꜧꜨꜩꜪꜫꜬꜭꜮꜯꜰꜱꜲꜳꜴꜵꜶꜷꜸꜹꜺꜻꜼꜽꜾꜿꝀꝁꝂ\n" +
827                "ꝃꝄꝅꝆꝇꝈꝉꝊꝋꝌꝍꝎꝏꝐꝑꝒꝓꝔꝕꝖꝗꝘꝙꝚꝛꝜꝝꝞꝟꝠꝡꝢꝣꝤꝥꝦꝧꝨꝩꝪꝫꝬꝭꝮꝯꝰꝱꝲꝳꝴꝵꝶꝷꝸꝹꝺꝻꝼꝽꝾꝿꞀꞁꞂꞃꞄꞅꞆꞇꞈ꞉꞊ꞋꞌꞍꞎꞐꞑꞒꞓ\n" +
828                "ꞔꞕꞖꞗꞘꞙꞚꞛꞜꞝꞞꞟꞠꞡꞢꞣꞤꞥꞦꞧꞨꞩꞪꞫꞬꞭꞰꞱꟷꟸꟹꟺꟻꟼꟽꟾꟿfffiflffifflſtstﬓﬔﬕﬖﬗ");
829        return cpy;
830    }
831
832    /**
833     * Returns a TextCellFactory already configured to use a square font that should scale cleanly to many sizes. Caches
834     * the result for later calls.
835     * <br>
836     * Preview: http://i.imgur.com/DD1RkPa.png
837     * <br>
838     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
839     * distance field font technique this uses can work.
840     * <br>
841     * Needs files:
842     * <ul>
843     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Inconsolata-LGC-Square-distance.fnt</li>
844     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Inconsolata-LGC-Square-distance.png</li>
845     * </ul>
846     * @return the TextCellFactory object that can represent many sizes of the square font Inconsolata-LGC-Square.ttf
847     */
848    public static TextCellFactory getStretchableSquareFont()
849    {
850        initialize();
851        if(instance.distanceSquare == null)
852        {
853            try {
854                instance.distanceSquare = new TextCellFactory().defaultDistanceFieldFont();
855            } catch (Exception e) {
856            }
857        }
858        if(instance.distanceSquare != null)
859            return instance.distanceSquare.copy();
860        return null;
861    }
862
863    /**
864     * Returns a TextCellFactory already configured to use an blocky, fairly-bold square font that should scale cleanly
865     * to many sizes. Unlike {@link #getStretchableSquareFont()}, the font this uses was made to be square initially,
866     * and is not a distorted/stretched version of an existing font. Caches the result for later calls.
867     * <br>
868     * Note: Uses a smoothing multiplier of 2.125f, instead of the default 1.2f. 
869     * <br>
870     * <a href="https://i.imgur.com/nIjgTOp.png">Preview at 6x6 size, https://i.imgur.com/nIjgTOp.png</a>
871     * <a href="https://i.imgur.com/lWaSgVN.png">Preview at much larger size, https://i.imgur.com/lWaSgVN.png</a>
872     * <br>
873     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
874     * distance field font technique this uses can work.
875     * <br>
876     * Needs files:
877     * <ul>
878     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/BoxedIn-distance.fnt</li>
879     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/BoxedIn-distance.png</li>
880     * </ul>
881     * @return the TextCellFactory object that can represent many sizes of the square font BoxedIn.ttf
882     */
883    public static TextCellFactory getStretchableHeavySquareFont()
884    {
885        initialize();
886        if(instance.distanceHeavySquare == null)
887        {
888            try {
889                instance.distanceHeavySquare = new TextCellFactory()
890                        .fontDistanceField(distanceFieldHeavySquare, distanceFieldHeavySquareTexture)
891                        .setSmoothingMultiplier(2.125f);
892            } catch (Exception e) {
893            }
894        }
895        if(instance.distanceHeavySquare != null)
896            return instance.distanceHeavySquare.copy();
897        return null;
898    }
899
900    /**
901     * Returns a TextCellFactory already configured to use an all-caps (with lighter-weight versions of upper-case
902     * letters for the lower-case glyphs) square font that should scale cleanly to many sizes.
903     * Unlike {@link #getStretchableSquareFont()}, the font this uses was made to be square initially, and is not a
904     * distorted/stretched version of an existing font. This font only supports ASCII, and as said before, it doesn't
905     * have separate lower-case letters. Note: if you use this font as-is, most characters will overlap slightly with
906     * each other, which can be an aesthetic benefit in some styles but can also be hard to read, at least if the colors
907     * aren't different between overlapping characters. For that reason, you may want to tweak the width and height of
908     * this font after passing it to a SquidLayers or SparseLayers; often you would pass 0.875 times the original
909     * width and height to {@link TextCellFactory#tweakWidth(float)} and {@link TextCellFactory#tweakHeight(float)}.
910     * Caches the result for later calls. The font is "square" by Wouter van Oortmerssen; it is available under a
911     * CC-BY-3.0 license, which requires attribution to Wouter van Oortmerssen if you use it.
912     * <br>
913     * Note: Uses a smoothing multiplier of 6f, instead of the default 1.2f. 
914     * <br>
915     * <a href="https://i.imgur.com/nvHl64v.png">Preview at large size</a>
916     * <br>
917     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
918     * distance field font technique this uses can work.
919     * <br>
920     * Needs files:
921     * <ul>
922     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/square-msdf.fnt</li>
923     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/square-msdf.png</li>
924     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/square-License.txt</li>
925     * </ul>
926     * @return the TextCellFactory object that can represent many sizes of the font square.ttf
927     */
928    public static TextCellFactory getCrispCurvySquareFont()
929    {
930        initialize();
931        if(instance.msdfCurvySquare == null)
932        {
933            try {
934                instance.msdfCurvySquare = new TextCellFactory()
935                        .fontMultiDistanceField(crispCurvySquare, crispCurvySquareTexture).setSmoothingMultiplier(6f);
936            } catch (Exception e) {
937            }
938        }
939        if(instance.msdfCurvySquare != null)
940            return instance.msdfCurvySquare.copy();
941        return null;
942    }
943
944    /**
945     * Returns a TextCellFactory already configured to use a square font with 45-degree angled sections, based on the
946     * typeface used on the Atari ST console, that should scale cleanly to many sizes. Unlike
947     * {@link #getStretchableSquareFont()}, the font this uses was made to be square initially, and is not a
948     * distorted/stretched version of an existing font. This font only supports ASCII, but it supports all of it, unlike
949     * {@link #getCrispCurvySquareFont()}. Caches the result for later calls. The font is "a-starry", based on "Atari ST
950     * (low-res)" by Damien Guard; it is available under a CC-BY-SA-3.0 license, which requires attribution to Damien
951     * Guard (and technically Tommy Ettinger, because he made changes in a-starry) if you use it.
952     * <br>
953     * Note: Uses a smoothing multiplier of 3f, instead of the default 1.2f. 
954     * <br>
955     * <a href="https://i.imgur.com/nvHl64v.png">Preview at large size</a>
956     * <br>
957     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
958     * distance field font technique this uses can work.
959     * <br>
960     * Needs files:
961     * <ul>
962     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/a-starry-msdf.fnt</li>
963     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/a-starry-msdf.png</li>
964     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/a-starry-license.txt</li>
965     * </ul>
966     * @return the TextCellFactory object that can represent many sizes of the font a-starry.ttf
967     */
968    public static TextCellFactory getCrispOctagonalSquareFont()
969    {
970        initialize();
971        if(instance.msdfOctagonalSquare == null)
972        {
973            try {
974                instance.msdfOctagonalSquare = new TextCellFactory()
975                        .fontMultiDistanceField(crispOctagonalSquare, crispOctagonalSquareTexture).setSmoothingMultiplier(3f);
976            } catch (Exception e) {
977            }
978        }
979        if(instance.msdfOctagonalSquare != null)
980            return instance.msdfOctagonalSquare.copy();
981        return null;
982    }
983
984
985    /**
986     * Returns a TextCellFactory already configured to use a narrow font (twice as tall as it is wide) that should scale
987     * cleanly to many sizes. Caches the result for later calls.
988     * <br>
989     * Preview: http://i.imgur.com/dvEEMqo.png
990     * <br>
991     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
992     * distance field font technique this uses can work.
993     * <br>
994     * Needs files:
995     * <ul>
996     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Inconsolata-LGC-Custom-distance.fnt</li>
997     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Inconsolata-LGC-Custom-distance.png</li>
998     * </ul>
999     * @return the TextCellFactory object that can represent many sizes of the font Inconsolata-LGC-Custom.ttf
1000     */
1001    public static TextCellFactory getStretchableFont()
1002    {
1003        initialize();
1004        if(instance.distanceNarrow == null)
1005        {
1006            try {
1007                instance.distanceNarrow = new TextCellFactory().defaultNarrowDistanceFieldFont();
1008            } catch (Exception e) {
1009                e.printStackTrace();
1010            }
1011        }
1012        if(instance.distanceNarrow != null)
1013            return instance.distanceNarrow.copy();
1014        return null;
1015
1016    }
1017
1018    /**
1019     * Returns a TextCellFactory already configured to use a narrow typewriter-style serif font that should scale
1020     * cleanly to many sizes. Caches the result for later calls.
1021     * <br>
1022     * Preview: http://i.imgur.com/oN2gRci.png
1023     * <br>
1024     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1025     * distance field font technique this uses can work.
1026     * <br>
1027     * Needs files:
1028     * <ul>
1029     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/CM-Custom-distance.fnt</li>
1030     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/CM-Custom-distance.png</li>
1031     * </ul>
1032     * @return the TextCellFactory object that can represent many sizes of the font CM-Custom.ttf
1033     */
1034    public static TextCellFactory getStretchableTypewriterFont()
1035    {
1036        initialize();
1037        if(instance.typewriterDistanceNarrow == null)
1038        {
1039            try {
1040                instance.typewriterDistanceNarrow = new TextCellFactory()
1041                        .fontDistanceField(distanceFieldTypewriterNarrow, distanceFieldTypewriterNarrowTexture);
1042            } catch (Exception e) {
1043                e.printStackTrace();
1044            }
1045        }
1046        if(instance.typewriterDistanceNarrow != null)
1047            return instance.typewriterDistanceNarrow.copy();
1048        return null;
1049    }
1050    /**
1051     * Returns a TextCellFactory already configured to use a highly-legible fixed-width font with broad Unicode support
1052     * that should scale cleanly to many sizes. Caches the result for later calls. The font used is Source Code Pro, an
1053     * open-source (SIL Open Font License) typeface by Adobe, and it has good Unicode support among the fixed-width
1054     * fonts used by SquidLib. It may be a good choice for science-fiction games because of its modern feel, but the
1055     * legibility enhancements made so the font could be usable in text editors also are nice for all text-based games.
1056     * The high glyph count means the part of the image for each glyph is smaller, though, so this may look slightly
1057     * pixelated if it starts small and is resized to much larger. A cell width of 15 and cell height of 27 is ideal;
1058     * this allows the font to resize fairly well to larger sizes using Viewports.
1059     * <br>
1060     * Preview: http://i.imgur.com/VC0xn2r.png
1061     * <br>
1062     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1063     * distance field font technique this uses can work.
1064     * <br>
1065     * Needs files:
1066     * <ul>
1067     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/SourceCodePro-Medium-distance.fnt</li>
1068     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/SourceCodePro-Medium-distance.png</li>
1069     * </ul>
1070     * @return the TextCellFactory object that can represent many sizes of the font SourceCodePro-Medium.otf
1071     */
1072    public static TextCellFactory getStretchableCodeFont()
1073    {
1074        initialize();
1075        if(instance.distanceCode == null)
1076        {
1077            try {
1078                instance.distanceCode = new TextCellFactory()
1079                        .fontDistanceField(distanceFieldCode, distanceFieldCodeTexture);
1080            } catch (Exception e) {
1081                e.printStackTrace();
1082            }
1083        }
1084        if(instance.distanceCode != null)
1085            return instance.distanceCode.copy();
1086        return null;
1087    }
1088    /**
1089     * Returns a TextCellFactory already configured to use a highly-legible fixed-width font with strong CJK support (in
1090     * particular, very good coverage for Japanese) that should scale cleanly to many sizes. Caches the result for later
1091     * calls. The font used is Source Han Code JP, an open-source (SIL Open Font License) typeface by Adobe, and it has
1092     * the best CJK char support among the fonts used by SquidLib. It is extremely wide if used only for English text,
1093     * which may be desirable to make square cells. The very high glyph count means the part of the image for each glyph
1094     * is smaller, though, so this may look slightly pixelated if it starts small and is resized to much larger. A cell
1095     * width of 19 and cell height of 20 is ideal; this allows the font to resize fairly well to larger sizes.
1096     * <br>
1097     * Note: Uses a smoothing multiplier of 1.125f, instead of the default 1.2f. 
1098     * <br>
1099     * Preview: https://i.imgur.com/g65jXxB.png
1100     * <br>
1101     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1102     * distance field font technique this uses can work.
1103     * <br>
1104     * Needs files:
1105     * <ul>
1106     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/SourceHanCodeJP-Regular-distance.fnt</li>
1107     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/SourceHanCodeJP-Regular-distance.png</li>
1108     * </ul>
1109     * @return the TextCellFactory object that can represent many sizes of the font SourceHanCodeJP-Regular.otf
1110     */
1111    public static TextCellFactory getStretchableCodeJPFont()
1112    {
1113        initialize();
1114        if(instance.distanceCodeJP == null)
1115        {
1116            try {
1117                instance.distanceCodeJP = new TextCellFactory()
1118                        .fontDistanceField(distanceFieldCodeJP, distanceFieldCodeJPTexture).setSmoothingMultiplier(1.125f);
1119            } catch (Exception e) {
1120                e.printStackTrace();
1121            }
1122        }
1123        if(instance.distanceCodeJP != null)
1124            return instance.distanceCodeJP.copy();
1125        return null;
1126    }
1127    /**
1128     * Returns a TextCellFactory already configured to use a highly-legible fixed-width font with good Unicode support
1129     * and a thin, geometric style, that should scale cleanly to many sizes. Caches the result for later calls. The font
1130     * used is Iosevka, an open-source (SIL Open Font License) typeface by Belleve Invis (see
1131     * https://be5invis.github.io/Iosevka/ ), and it uses several customizations thanks to Iosevka's special build
1132     * process. It supports a lot of glyphs, including quite a bit of extended Latin, Greek, and Cyrillic, but also
1133     * circled letters and digits and the necessary box drawing characters. The high glyph count means the part of the
1134     * image for each glyph is smaller, though, so this may look slightly pixelated if it starts small and is resized to
1135     * much larger. A cell width of 11 and cell height of 20 is ideal (or some approximate multiple of that aspect
1136     * ratio); this allows the font to resize fairly well to larger sizes using Viewports. As an aside, Luc Devroye (a
1137     * true typography expert) called Iosevka <a href="http://luc.devroye.org/fonts-82704.html">"A tour de force that
1138     * deserves an award."</a> You may want to try using both this sans-serif version of Iosevka and the slab-serif
1139     * version SquidLib has, {@link #getStretchableSlabFont()}, though they have subtly different sizes. There are
1140     * also versions of Iosevka that use a Light weight, available by {@link #getStretchableLeanLightFont()} and
1141     * {@link #getStretchableSlabLightFont()}.
1142     * <br>
1143     * Preview: http://i.imgur.com/sm0ULbU.png
1144     * <br>
1145     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1146     * distance field font technique this uses can work.
1147     * <br>
1148     * Needs files:
1149     * <ul>
1150     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-distance.fnt</li>
1151     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-distance.png</li>
1152     * </ul>
1153     * @return the TextCellFactory object that can represent many sizes of the font Iosevka.ttf
1154     */
1155    public static TextCellFactory getStretchableLeanFont()
1156    {
1157        initialize();
1158        if(instance.distanceLean == null)
1159        {
1160            try {
1161                instance.distanceLean = new TextCellFactory()
1162                        .fontDistanceField(distanceFieldLean, distanceFieldLeanTexture);
1163            } catch (Exception e) {
1164                e.printStackTrace();
1165            }
1166        }
1167        if(instance.distanceLean != null)
1168            return instance.distanceLean.copy();
1169        return null;
1170    }
1171
1172    /**
1173     * Returns a TextCellFactory already configured to use a highly-legible fixed-width font with good Unicode support
1174     * and a slab-serif geometric style, that should scale cleanly to many sizes. Caches the result for later calls. The
1175     * font used is Iosevka with Slab style, an open-source (SIL Open Font License) typeface by Belleve Invis (see
1176     * https://be5invis.github.io/Iosevka/ ), and it uses several customizations thanks to Iosevka's special build
1177     * process. It supports a lot of glyphs, including quite a bit of extended Latin, Greek, and Cyrillic, but also
1178     * circled letters and digits and the necessary box drawing characters. The high glyph count means the part of the
1179     * image for each glyph is smaller, though, so this may look slightly pixelated if it starts small and is resized to
1180     * much larger. A cell width of 11 and cell height of 20 is ideal (or some approximate multiple of that aspect
1181     * ratio); this allows the font to resize fairly well to larger sizes using Viewports. As an aside, Luc Devroye (a
1182     * true typography expert) called Iosevka <a href="http://luc.devroye.org/fonts-82704.html">"A tour de force that
1183     * deserves an award."</a> You may want to try using both this version of Iosevka with slab serifs and the other
1184     * version SquidLib has, {@link #getStretchableLeanFont()}, though they have subtly different sizes. There are
1185     * also versions of Iosevka that use a Light weight, available by {@link #getStretchableLeanLightFont()} and
1186     * {@link #getStretchableSlabLightFont()}.
1187     * <br>
1188     * Preview: http://i.imgur.com/5kb697p.png
1189     * <br>
1190     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1191     * distance field font technique this uses can work.
1192     * <br>
1193     * Needs files:
1194     * <ul>
1195     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Slab-distance.fnt</li>
1196     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Slab-distance.png</li>
1197     * </ul>
1198     * @return the TextCellFactory object that can represent many sizes of the font Iosevka-Slab.ttf
1199     */
1200    public static TextCellFactory getStretchableSlabFont()
1201    {
1202        initialize();
1203        if(instance.distanceSlab == null)
1204        {
1205            try {
1206                instance.distanceSlab = new TextCellFactory()
1207                        .fontDistanceField(distanceFieldSlab, distanceFieldSlabTexture);
1208            } catch (Exception e) {
1209                e.printStackTrace();
1210            }
1211        }
1212        if(instance.distanceSlab != null)
1213            return instance.distanceSlab.copy();
1214        return null;
1215    }
1216    /**
1217     * Returns a TextCellFactory already configured to use a highly-legible fixed-width font with good Unicode support
1218     * and a very thin, geometric style, that should scale cleanly to many sizes. Caches the result for later calls. The
1219     * font used is Iosevka (at Light weight), an open-source (SIL Open Font License) typeface by Belleve Invis (see
1220     * https://be5invis.github.io/Iosevka/ ), and it uses several customizations thanks to Iosevka's special build
1221     * process. It supports a lot of glyphs, including quite a bit of extended Latin, Greek, and Cyrillic, but also
1222     * circled letters and digits and the necessary box drawing characters. The high glyph count means the part of the
1223     * image for each glyph is smaller, though, so this may look slightly pixelated if it starts small and is resized to
1224     * much larger. A cell width of 11 and cell height of 20 is ideal (or some approximate multiple of that aspect
1225     * ratio); this allows the font to resize fairly well to larger sizes using Viewports. As an aside, Luc Devroye (a
1226     * true typography expert) called Iosevka <a href="http://luc.devroye.org/fonts-82704.html">"A tour de force that
1227     * deserves an award."</a> You may want to try using both this sans-serif version of Iosevka and the slab-serif
1228     * version SquidLib has, {@link #getStretchableSlabLightFont()}, though they have subtly different sizes. There are
1229     * also versions of Iosevka that do not use this Light weight, available by {@link #getStretchableLeanFont()} and
1230     * {@link #getStretchableSlabFont()}.
1231     * <br>
1232     * Preview: http://i.imgur.com/edKimT4.png
1233     * <br>
1234     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1235     * distance field font technique this uses can work.
1236     * <br>
1237     * Needs files:
1238     * <ul>
1239     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Light-distance.fnt</li>
1240     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Light-distance.png</li>
1241     * </ul>
1242     * @return the TextCellFactory object that can represent many sizes of the font Iosevka-Light.ttf
1243     */
1244    public static TextCellFactory getStretchableLeanLightFont()
1245    {
1246        initialize();
1247        if(instance.distanceLeanLight == null)
1248        {
1249            try {
1250                instance.distanceLeanLight = new TextCellFactory()
1251                        .fontDistanceField(distanceFieldLeanLight, distanceFieldLeanLightTexture);
1252            } catch (Exception e) {
1253                e.printStackTrace();
1254            }
1255        }
1256        if(instance.distanceLeanLight != null)
1257            return instance.distanceLeanLight.copy();
1258        return null;
1259    }
1260
1261    /**
1262     * Returns a TextCellFactory already configured to use a highly-legible fixed-width font with good Unicode support
1263     * and a very thin, slab-serif geometric style, that should scale cleanly to many sizes. Caches the result for later
1264     * calls. The font used is Iosevka with Slab style at Light weight, an open-source (SIL Open Font License) typeface
1265     * by Belleve Invis (see https://be5invis.github.io/Iosevka/ ), and it uses several customizations thanks to
1266     * Iosevka's special build process. It supports a lot of glyphs, including quite a bit of extended Latin, Greek, and
1267     * Cyrillic, but also circled letters and digits and the necessary box drawing characters. The high glyph count
1268     * means the part of the image for each glyph is smaller, though, so this may look slightly pixelated if it starts
1269     * small and is resized to much larger. A cell width of 11 and cell height of 20 is ideal (or some approximate
1270     * multiple of that aspect ratio); this allows the font to resize fairly well to larger sizes using Viewports. As an
1271     * aside, Luc Devroye (a true typography expert) called Iosevka <a href="http://luc.devroye.org/fonts-82704.html">"A
1272     * tour de force that deserves an award."</a> You may want to try using both this version of Iosevka with slab
1273     * serifs and the other version SquidLib has, {@link #getStretchableLeanLightFont()}, though they have subtly
1274     * different sizes. There are also versions of Iosevka that do not use this Light weight, available by
1275     * {@link #getStretchableLeanFont()} and {@link #getStretchableSlabFont()}.
1276     * <br>
1277     * Preview: http://i.imgur.com/B5eSGfj.png
1278     * <br>
1279     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1280     * distance field font technique this uses can work.
1281     * <br>
1282     * Needs files:
1283     * <ul>
1284     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Slab-Light-distance.fnt</li>
1285     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Slab-Light-distance.png</li>
1286     * </ul>
1287     * @return the TextCellFactory object that can represent many sizes of the font Iosevka-Slab-Light.ttf
1288     */
1289    public static TextCellFactory getStretchableSlabLightFont()
1290    {
1291        initialize();
1292        if(instance.distanceSlabLight == null)
1293        {
1294            try {
1295                instance.distanceSlabLight = new TextCellFactory()
1296                        .fontDistanceField(distanceFieldSlabLight, distanceFieldSlabLightTexture);
1297            } catch (Exception e) {
1298                e.printStackTrace();
1299            }
1300        }
1301        if(instance.distanceSlabLight != null)
1302            return instance.distanceSlabLight.copy();
1303        return null;
1304    }
1305    
1306    /**
1307     * Returns a TextCellFactory already configured to use a font with extremely wide Unicode support that should scale
1308     * cleanly to many sizes. Caches the result for later calls. The font is DejaVu Sans Mono, a common font on Linux
1309     * operating systems and a clean-looking, legible font, though it has some visual quirks like a "tail" on lower-case
1310     * 'l', that take some getting used to. A possible requirement for this font is that the size of the text in a
1311     * SquidPanel or SquidLayers may need to be increased 1-5 pixels past what the cell width and height are; this can
1312     * be done with {@link SquidPanel#setTextSize(float, float)} or {@link SquidLayers#setTextSize(float, float)},
1313     * giving 1-2 more than the cell width for x and 3-5 more than the cell height for y.
1314     * <br>
1315     * Preview: http://i.imgur.com/1haETOe.png
1316     * <br>
1317     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1318     * distance field font technique this uses can work.
1319     * <br>
1320     * Needs files:
1321     * <ul>
1322     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/DejaVuSansMono-distance.fnt</li>
1323     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/DejaVuSansMono-distance.png</li>
1324     * </ul>
1325     * @return the TextCellFactory object that can represent many sizes of the font DejaVuSansMono.ttf
1326     */
1327    public static TextCellFactory getStretchableDejaVuFont()
1328    {
1329        initialize();
1330        if(instance.distanceDejaVu == null)
1331        {
1332            try {
1333                instance.distanceDejaVu = new TextCellFactory().fontDistanceField(distanceFieldDejaVu, distanceFieldDejaVuTexture);
1334            } catch (Exception e) {
1335                e.printStackTrace();
1336            }
1337        }
1338        if(instance.distanceDejaVu != null)
1339            return instance.distanceDejaVu.copy();
1340        return null;
1341
1342    }
1343    /**
1344     * Returns a TextCellFactory already configured to use a variable-width serif font that should look like the serif
1345     * fonts used in many novels' main texts, and that should scale cleanly to many sizes. Meant to be used in variable-
1346     * width displays like TextPanel. Caches the result for later calls.
1347     * <br>
1348     * Preview: http://i.imgur.com/eIYYt8C.png
1349     * <br>
1350     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1351     * distance field font technique this uses can work.
1352     * <br>
1353     * Needs files:
1354     * <ul>
1355     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Gentium-distance.fnt</li>
1356     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Gentium-distance.png</li>
1357     * </ul>
1358     * @return the TextCellFactory object that can represent many sizes of the font Gentium, by SIL
1359     */
1360    public static TextCellFactory getStretchablePrintFont() {
1361        initialize();
1362        if (instance.distancePrint == null) {
1363            try {
1364                instance.distancePrint = new TextCellFactory().fontDistanceField(distanceFieldPrint, distanceFieldPrintTexture)
1365                        .height(30).width(7);
1366                instance.distancePrint.bmpFont.setUseIntegerPositions(false);
1367                
1368            } catch (Exception e) {
1369                e.printStackTrace();
1370            }
1371        }
1372        if(instance.distancePrint != null)
1373            return instance.distancePrint.copy();
1374        return null;
1375    }
1376
1377    /**
1378     * Returns a TextCellFactory already configured to use a variable-width sans-serif font that should have a blocky,
1379     * futuristic look (based on the font Orbitron), and that should scale cleanly to many sizes. Meant to be used in
1380     * variable-width displays like TextPanel. Caches the result for later calls.
1381     * <br>
1382     * Note: Uses a smoothing multiplier of 1.3f, instead of the default 1.2f. 
1383     * <br>
1384     * Preview: http://i.imgur.com/grJhoMs.png
1385     * <br>
1386     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1387     * distance field font technique this uses can work.
1388     * <br>
1389     * Needs files:
1390     * <ul>
1391     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Orbitron-distance.fnt</li>
1392     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Orbitron-distance.png</li>
1393     * </ul>
1394     * @return the TextCellFactory object that can represent many sizes of the font Orbitron, by The League of Movable Type
1395     */
1396    public static TextCellFactory getStretchableOrbitFont() {
1397        initialize();
1398        if (instance.distanceOrbit == null) {
1399            try {
1400                instance.distanceOrbit = new TextCellFactory().setDirectionGlyph('ˆ')
1401                        .fontDistanceField(distanceFieldOrbit, distanceFieldOrbitTexture)
1402                        .setSmoothingMultiplier(1.3f).height(30).width(11);
1403            } catch (Exception e) {
1404                e.printStackTrace();
1405            }
1406        }
1407        if(instance.distanceOrbit != null)
1408            return instance.distanceOrbit.copy();
1409        return null;
1410    }
1411
1412    /**
1413     * Returns a TextCellFactory already configured to use a variable-width sans-serif font that currently looks
1414     * slightly jumbled without certain layout features. Meant to be used in variable-width displays like TextPanel, but
1415     * currently you should prefer getStretchablePrintFont() for legibility. Caches the result for later calls.
1416     * <br>
1417     * Note: Uses a smoothing multiplier of 0.8, instead of the default 1.2f. If you set the smoothing multiplier
1418     * yourself, it should be similarly smaller than what other fonts use (most fonts are 1.2, so multiplying whatever
1419     * you would normally set the smoothing multiplier to by 0.66f should work).
1420     * <br>
1421     * Preview: http://i.imgur.com/GF5qQxn.png
1422     * <br>
1423     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1424     * distance field font technique this uses can work.
1425     * <br>
1426     * Needs files:
1427     * <ul>
1428     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Noto-Sans-distance.fnt</li>
1429     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Noto-Sans-distance.png</li>
1430     * </ul>
1431     * @return the TextCellFactory object that can represent many sizes of the font Noto Sans, by Google
1432     */
1433    public static TextCellFactory getStretchableCleanFont() {
1434        initialize();
1435        if (instance.distanceClean == null) {
1436            try {
1437                instance.distanceClean = new TextCellFactory().fontDistanceField(distanceFieldClean, distanceFieldCleanTexture)
1438                        .setSmoothingMultiplier(0.8f).height(30).width(5);
1439                instance.distanceClean.bmpFont.setUseIntegerPositions(false);
1440            } catch (Exception e) {
1441                e.printStackTrace();
1442            }
1443        }
1444        if(instance.distanceClean != null)
1445            return instance.distanceClean.copy();
1446        return null;
1447    }
1448
1449    /**
1450     * Returns a TextCellFactory already configured to use a highly-legible fixed-width font with good Unicode support
1451     * and a slab-serif geometric style, that should scale cleanly to even very large sizes (using an MSDF technique).
1452     * Caches the result for later calls. The font used is Iosevka with Slab style, an open-source (SIL Open Font
1453     * License) typeface by Belleve Invis (see https://be5invis.github.io/Iosevka/ ), and it uses several customizations
1454     * thanks to Iosevka's special build process. It supports a lot of glyphs, including quite a bit of extended Latin,
1455     * Greek, and Cyrillic, but also the necessary box drawing characters. This uses the Multi-channel Signed Distance
1456     * Field (MSDF) technique as opposed to the normal Signed Distance Field technique, which gives the rendered font
1457     * sharper edges and precise corners instead of rounded tips on strokes. As an aside, Luc Devroye (a true typography
1458     * expert) called Iosevka
1459     * <a href="http://luc.devroye.org/fonts-82704.html">"A tour de force that deserves an award."</a>
1460     * <br>
1461     * Preview: <a href="https://i.imgur.com/YlzFEVX.png">Image link</a>
1462     * <br>
1463     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1464     * multi-channel distance field font technique this uses can work.
1465     * <br>
1466     * Needs files:
1467     * <ul>
1468     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Slab-msdf.fnt</li>
1469     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Slab-msdf.png</li>
1470     * </ul>
1471     * @return the TextCellFactory object that can represent many sizes of the font Iosevka-Slab.ttf using MSDF
1472     */
1473    public static TextCellFactory getCrispSlabFont()
1474    {
1475        initialize();
1476        if(instance.msdfSlab == null)
1477        {
1478            try {
1479                instance.msdfSlab = new TextCellFactory()
1480                        .fontMultiDistanceField(crispSlab, crispSlabTexture);
1481            } catch (Exception e) {
1482                e.printStackTrace();
1483            }
1484        }
1485        if(instance.msdfSlab != null)
1486            return instance.msdfSlab.copy();
1487        return null;
1488    }
1489    /**
1490     * Not supported; use {@link #getCrispSlabFamily()} instead, using {@link GDXMarkup} to add italics with its
1491     * {@code [/]} tag.
1492     * @return always throws an UnsupportedOperationException
1493     * @deprecated use {@link #getCrispSlabFamily()} instead
1494     */
1495    @Deprecated
1496    public static TextCellFactory getCrispSlabItalicFont()
1497    {
1498        throw new UnsupportedOperationException("Use getCrispSlabFamily() instead, with GDXMarkup to add italics.");
1499    }
1500    /**
1501     * Returns a TextCellFactory already configured to use a highly-legible fixed-width font with good Unicode support
1502     * and a sans-serif geometric style, that should scale cleanly to even very large sizes (using an MSDF technique).
1503     * Caches the result for later calls. The font used is Iosevka, an open-source (SIL Open Font
1504     * License) typeface by Belleve Invis (see https://be5invis.github.io/Iosevka/ ), and it uses several customizations
1505     * thanks to Iosevka's special build process. It supports a lot of glyphs, including quite a bit of extended Latin,
1506     * Greek, and Cyrillic, but also the necessary box drawing characters. This uses the Multi-channel Signed Distance
1507     * Field (MSDF) technique as opposed to the normal Signed Distance Field technique, which gives the rendered font
1508     * sharper edges and precise corners instead of rounded tips on strokes. As an aside, Luc Devroye (a true typography
1509     * expert) called Iosevka
1510     * <a href="http://luc.devroye.org/fonts-82704.html">"A tour de force that deserves an award."</a>
1511     * <br>
1512     * Preview: <a href="https://i.imgur.com/42rMRz5.png">Image link</a>
1513     * <br>
1514     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1515     * multi-channel distance field font technique this uses can work.
1516     * <br>
1517     * Needs files:
1518     * <ul>
1519     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-msdf.fnt</li>
1520     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-msdf.png</li>
1521     * </ul>
1522     * @return the TextCellFactory object that can represent many sizes of the font Iosevka.ttf
1523     */
1524    public static TextCellFactory getCrispLeanFont()
1525    {
1526        initialize();
1527        if(instance.msdfLean == null)
1528        {
1529            try {
1530                instance.msdfLean = new TextCellFactory()
1531                        .fontMultiDistanceField(crispLean, crispLeanTexture);
1532            } catch (Exception e) {
1533                e.printStackTrace();
1534            }
1535        }
1536        if(instance.msdfLean != null)
1537            return instance.msdfLean.copy();
1538        return null;
1539    }
1540    /**
1541     * Not supported; use {@link #getCrispLeanFamily()} instead, using {@link GDXMarkup} to add italics with its
1542     * {@code [/]} tag.
1543     * @return always throws an UnsupportedOperationException
1544     * @deprecated use {@link #getCrispLeanFamily()} instead
1545     */
1546    @Deprecated
1547    public static TextCellFactory getCrispLeanItalicFont()
1548    {
1549        throw new UnsupportedOperationException("Use getCrispLeanFamily() instead, with GDXMarkup to add italics.");
1550    }
1551    /**
1552     * Returns a TextCellFactory already configured to use a fixed-width sans-serif font with excellent Unicode support,
1553     * that should scale cleanly to even very large sizes. Caches the result for later calls. The font used is DejaVu
1554     * Sans Mono, an open-source (SIL Open Font License) typeface that is widely used by Linux distros and other groups.
1555     * It supports a lot of glyphs, including quite a bit of extended Latin, Greek, and Cyrillic, but also the
1556     * necessary box drawing characters. This uses the Multi-channel Signed Distance Field technique as opposed to the
1557     * normal Signed Distance Field technique, which should allow sharper edges. It has been updated so it is laid out
1558     * mostly-correctly now; some glyphs may be a little wide, such as {@code @}, but the line height, baseline, and the
1559     * width for most glyphs seem correct. If you find the box drawing characters don't line up, try 
1560     * {@link TextCellFactory#tweakWidth(float)} with values like 1.125f; the exact value may depend on size.
1561     * <br>
1562     * Note: Uses a smoothing multiplier of 1f, instead of the default 1.2f. 
1563     * <br>
1564     * Preview: <a href="https://i.imgur.com/SCwhduv.png">Image link</a>
1565     * <br>
1566     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1567     * multi-channel distance field font technique this uses can work.
1568     * <br>
1569     * Needs files:
1570     * <ul>
1571     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/DejaVuSansMono-msdf.fnt</li>
1572     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/DejaVuSansMono-msdf.png</li>
1573     * </ul>
1574     * @return the TextCellFactory object that can represent many sizes of the font DejaVuSansMono.ttf with an MSDF effect
1575     */
1576    public static TextCellFactory getCrispDejaVuFont()
1577    {
1578        initialize();
1579        if(instance.msdfDejaVu == null)
1580        {
1581            try {
1582                instance.msdfDejaVu = new TextCellFactory()
1583                        .fontMultiDistanceField(crispDejaVu, crispDejaVuTexture).setSmoothingMultiplier(1f);
1584            } catch (Exception e) {
1585                e.printStackTrace();
1586            }
1587        }
1588        if(instance.msdfDejaVu != null)
1589            return instance.msdfDejaVu.copy();
1590        return null;
1591    }
1592    
1593    /**
1594     * Returns a TextFamily already configured to use a highly-legible fixed-width font with good Unicode support and a
1595     * slab-serif geometric style, that should scale cleanly to many sizes and supports 4 styles (regular, bold, italic,
1596     * and bold italic). Caches the result for later calls. The font used is Iosevka with Slab style, an open-source
1597     * (SIL Open Font License) typeface by Belleve Invis (see https://be5invis.github.io/Iosevka/ ), and it uses several
1598     * customizations thanks to Iosevka's special build process, applied to the 4 styles. It supports a lot of glyphs,
1599     * including quite a bit of extended Latin, Greek, and Cyrillic, but also circled letters and digits and the
1600     * necessary box drawing characters (which line up even for italic text). The high glyph count means the part of the
1601     * image for each glyph is smaller, though, so this may look slightly pixelated if it starts small and is resized to
1602     * much larger. A cell width of 11 and cell height of 20 is ideal (or some approximate multiple of that aspect
1603     * ratio); this allows the font to resize fairly well to larger sizes using Viewports. As an aside, Luc Devroye (a
1604     * true typography expert) called Iosevka <a href="http://luc.devroye.org/fonts-82704.html">"A tour de force that
1605     * deserves an award."</a> You may want to try using both this version of Iosevka with slab serifs and the other
1606     * version SquidLib has, {@link #getLeanFamily()}.
1607     * <br>
1608     * <br>
1609     * This creates a TextFamily instead of a BitmapFont because it needs to set some extra information so the
1610     * distance field font technique this uses can work, but it can also be used as a TextCellFactory.
1611     * <br>
1612     * Needs files:
1613     * <ul>
1614     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Slab-Family-distance.fnt</li>
1615     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Slab-Family-distance.png</li>
1616     * </ul>
1617     * @return the TextFamily object that can represent many sizes of the font Iosevka-Slab.ttf with 4 styles
1618     */
1619    public static TextFamily getSlabFamily()
1620    {
1621        initialize();
1622        if(instance.familySlab == null)
1623        {
1624            try {
1625                instance.familySlab = new TextFamily().defaultFamilySlabDistance();
1626            } catch (Exception e) {
1627                e.printStackTrace();
1628            }
1629        }
1630        if(instance.familySlab != null)
1631            return instance.familySlab.copy();
1632        return null;
1633    }
1634    /**
1635     * Returns a TextFamily already configured to use a highly-legible fixed-width font with good Unicode support and a
1636     * sans-serif geometric style, that should scale cleanly to many sizes and supports 4 styles (regular, bold, italic,
1637     * and bold italic). Caches the result for later calls. The font used is Iosevka, an open-source (SIL Open Font
1638     * License) typeface by Belleve Invis (see https://be5invis.github.io/Iosevka/ ), and it uses several customizations
1639     * thanks to Iosevka's special build process, applied to the 4 styles. It supports a lot of glyphs, including quite
1640     * a bit of extended Latin, Greek, and Cyrillic, but also circled letters and digits and the necessary box drawing
1641     * characters (which line up even for italic text). The high glyph count means the part of the image for each glyph
1642     * is smaller, though, so this may look slightly pixelated if it starts small and is resized to much larger. A cell
1643     * width of 11 and cell height of 20 is ideal (or some approximate multiple of that aspect ratio); this allows the
1644     * font to resize fairly well to larger sizes using Viewports. As an aside, Luc Devroye (a true typography expert)
1645     * called Iosevka <a href="http://luc.devroye.org/fonts-82704.html">"A tour de force that deserves an award."</a>
1646     * You may want to try using both this version of Iosevka without serifs and the other version SquidLib has,
1647     * {@link #getSlabFamily()}.
1648     * <br>
1649     * <br>
1650     * This creates a TextFamily instead of a BitmapFont because it needs to set some extra information so the
1651     * distance field font technique this uses can work, but it can also be used as a TextCellFactory.
1652     * <br>
1653     * Needs files:
1654     * <ul>
1655     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Family-distance.fnt</li>
1656     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Family-distance.png</li>
1657     * </ul>
1658     * @return the TextFamily object that can represent many sizes of the font Iosevka.ttf with 4 styles
1659     */
1660    public static TextFamily getLeanFamily()
1661    {
1662        initialize();
1663        if(instance.familyLean == null)
1664        {
1665            try {
1666                instance.familyLean = new TextFamily().defaultFamilyLeanDistance();
1667            } catch (Exception e) {
1668                e.printStackTrace();
1669            }
1670        }
1671        if(instance.familyLean != null)
1672            return instance.familyLean.copy();
1673        return null;
1674    }
1675    /**
1676     * Returns a TextFamily already configured to use a fixed-width font with good Unicode support and a traditional
1677     * serif style, that should scale cleanly to many sizes and supports 4 styles (regular, bold, italic,
1678     * and bold italic). Caches the result for later calls. The font used is Go Mono, a typeface released by the team
1679     * behind the Go programming language as open-source (3-clause BSD, the same license as the Go language; the license
1680     * is included with the assets). It supports a lot of glyphs, including quite a bit of extended Latin, Greek, and
1681     * Cyrillic, bu also the necessary box drawing characters (which line up even for italic text). There's more
1682     * information about this font available where it was introduced,
1683     * <a href="https://blog.golang.org/go-fonts">on the Go blog</a>.
1684     * You may want to try using this Go font family and contrasting it with Iosevka with and without slab serifs, which
1685     * are {@link #getSlabFamily()} and {@link #getLeanFamily()} respectively.
1686     * <br>
1687     * <br>
1688     * This creates a TextFamily instead of a BitmapFont because it needs to set some extra information so the
1689     * distance field font technique this uses can work, but it can also be used as a TextCellFactory.
1690     * <br>
1691     * Needs files:
1692     * <ul>
1693     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/GoMono-Family-distance.fnt</li>
1694     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/GoMono-Family-distance.png</li>
1695     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/GoMono-License.txt</li>
1696     * </ul>
1697     * @return the TextFamily object that can represent many sizes of the font GoMono.ttf with 4 styles
1698     */
1699    public static TextFamily getGoFamily()
1700    {
1701        initialize();
1702        if(instance.familyGo == null)
1703        {
1704            try {
1705                instance.familyGo = new TextFamily();
1706                instance.familyGo.fontDistanceField("GoMono-Family-distance.fnt", "GoMono-Family-distance.png");
1707            } catch (Exception e) {
1708                e.printStackTrace();
1709            }
1710        }
1711        if(instance.familyGo != null)
1712            return instance.familyGo.copy();
1713        return null;
1714    }
1715    /**
1716     * Returns a TextFamily already configured to use a highly-legible fixed-width font with good Unicode support and a
1717     * sans-serif geometric style, that should scale cleanly to many sizes (using an MSDF technique) and supports 4
1718     * styles (regular, bold, italic, and bold italic). Caches the result for later calls. The font used is Iosevka, an
1719     * open-source (SIL Open Font License) typeface by Belleve Invis (see https://be5invis.github.io/Iosevka/ ), and it 
1720     * uses several customizations thanks to Iosevka's special build process, applied to the 4 styles. It supports a lot
1721     * of glyphs, including quite a bit of extended Latin, Greek, and Cyrillic, but also circled letters and digits and
1722     * the necessary box drawing characters (which line up even for italic text). The high glyph count means the texture
1723     * that holds all four faces of the font is larger than normal, at 4096x4096; this may be too large for some devices
1724     * to load correctly (mostly older phones or tablets). A cell width of 11 and cell height of 20 is ideal (or some
1725     * approximate multiple of that aspect ratio); this allows the font to resize fairly well to larger sizes using
1726     * Viewports.  This uses the Multi-channel Signed Distance Field (MSDF) technique as opposed to the normal Signed
1727     * Distance Field technique, which gives the rendered font sharper edges and precise corners instead of rounded tips
1728     * on strokes. As an aside, Luc Devroye (a true typography expert) called Iosevka
1729     * <a href="http://luc.devroye.org/fonts-82704.html">"A tour de force that deserves an award."</a> You may want to
1730     * try using both this version of Iosevka without serifs and the other version SquidLib has with an MSDF effect, 
1731     * {@link #getCrispSlabFamily()}.
1732     * <br>
1733     * Preview: <a href="https://i.imgur.com/dMVzpEi.png">image link</a>, with bold at the bottom.
1734     * <br>
1735     * This creates a TextFamily instead of a BitmapFont because it needs to set some extra information so the
1736     * distance field font technique this uses can work, but it can also be used as a TextCellFactory.
1737     * <br>
1738     * Needs files:
1739     * <ul>
1740     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Family-msdf.fnt</li>
1741     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Family-msdf.png</li>
1742     * </ul>
1743     * @return the TextFamily object that can represent many sizes of the font Iosevka.ttf with 4 styles and an MSDF effect
1744     */
1745    public static TextFamily getCrispLeanFamily()
1746    {
1747        initialize();
1748        if(instance.familyLeanMSDF == null)
1749        {
1750            try {
1751                instance.familyLeanMSDF = new TextFamily();
1752                instance.familyLeanMSDF.fontMultiDistanceField("Iosevka-Family-msdf.fnt", "Iosevka-Family-msdf.png");
1753            } catch (Exception e) {
1754                e.printStackTrace();
1755            }
1756        }
1757        if(instance.familyLeanMSDF != null)
1758            return instance.familyLeanMSDF.copy();
1759        return null;
1760
1761    }
1762
1763    /**
1764     * Returns a TextFamily already configured to use a highly-legible fixed-width font with good Unicode support and a
1765     * slab-serif geometric style, that should scale cleanly to many sizes (using an MSDF technique) and supports 4
1766     * styles (regular, bold, italic, and bold italic). Caches the result for later calls. The font used is Iosevka with
1767     * slab style, an open-source (SIL Open Font License) typeface by Belleve Invis (see
1768     * https://be5invis.github.io/Iosevka/ ), and it uses several customizations thanks to Iosevka's special build
1769     * process, applied to the 4 styles. It supports a lot of glyphs, including quite a bit of extended Latin, Greek,
1770     * and Cyrillic, but also circled letters and digits and the necessary box drawing characters (which line up even 
1771     * for italic text). The high glyph count means the texture that holds all four faces of the font is larger than
1772     * normal, at 4096x4096; this may be too large for some devices to load correctly (mostly older phones or tablets).
1773     * A cell width of 11 and cell height of 20 is ideal (or some approximate multiple of that aspect ratio); this
1774     * allows the font to resize fairly well to larger sizes using Viewports.  This uses the Multi-channel Signed
1775     * Distance Field (MSDF) technique as opposed to the normal Signed  Distance Field technique, which gives the
1776     * rendered font sharper edges and precise corners instead of rounded tips on strokes. As an aside, Luc Devroye (a
1777     * true typography expert) called Iosevka <a href="http://luc.devroye.org/fonts-82704.html">"A tour de force that
1778     * deserves an award."</a> You may want to try using both this version of Iosevka with slab serifs and the other
1779     * version SquidLib has with an MSDF effect, {@link #getCrispLeanFamily()}.
1780     * <br>
1781     * Note: Uses a smoothing multiplier of 1.55f, instead of the default 1.2f. 
1782     * <br>
1783     * Preview: <a href="https://i.imgur.com/wRNlpL5.png">image link</a>, with bold at the bottom.
1784     * <br>
1785     * This creates a TextFamily instead of a BitmapFont because it needs to set some extra information so the
1786     * distance field font technique this uses can work, but it can also be used as a TextCellFactory.
1787     * <br>
1788     * Needs files:
1789     * <ul>
1790     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Slab-Family-msdf.fnt</li>
1791     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Iosevka-Slab-Family-msdf.png</li>
1792     * </ul>
1793     * @return the TextFamily object that can represent many sizes of the font Iosevka-Slab.ttf with 4 styles and an MSDF effect
1794     */
1795    public static TextFamily getCrispSlabFamily()
1796    {
1797        initialize();
1798        if(instance.familySlabMSDF == null)
1799        {
1800            try {
1801                instance.familySlabMSDF = new TextFamily();
1802                instance.familySlabMSDF
1803                        .fontMultiDistanceField("Iosevka-Slab-Family-msdf.fnt", "Iosevka-Slab-Family-msdf.png")
1804                        .setSmoothingMultiplier(1.55f);
1805            } catch (Exception e) {
1806                e.printStackTrace();
1807            }
1808        }
1809        if(instance.familySlabMSDF != null)
1810            return instance.familySlabMSDF.copy();
1811        return null;
1812
1813    }
1814    /**
1815     * Returns a TextFamily already configured to use a variable-width serif font that should look like the serif
1816     * fonts used in many novels' main texts, and that should scale cleanly to many sizes using an MSDF technique, and
1817     * supports 4 styles (regular, bold, italic, and bold italic). Caches the result for later calls. The font used is 
1818     * Noto Serif, which is OFL-licensed by Google, and looks very legible in normal use. Meant to be used in
1819     * variable-width displays like TextPanel.
1820     * <br>
1821     * Note: Uses a smoothing multiplier of 1.5f, instead of the default 1.2f. 
1822     * <br>
1823     * Preview: <a href="https://i.imgur.com/WsDqSfJ.png">In the foreground message box in ZoneDemo</a>
1824     * <br>
1825     * This creates a TextFamily instead of a BitmapFont because it needs to set some extra information so the
1826     * distance field font technique this uses can work, but it can also be used as a TextCellFactory.
1827     * <br>
1828     * Needs files:
1829     * <ul>
1830     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/NotoSerif-Family-msdf.fnt</li>
1831     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/NotoSerif-Family-msdf.png</li>
1832     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/NotoSerif-license.txt</li>
1833     * </ul>
1834     * @return the TextCellFactory object that can represent many sizes of the font Noto Serif, made available by Google
1835     */
1836    public static TextFamily getCrispPrintFamily() {
1837        initialize();
1838        if (instance.familyPrintMSDF == null) {
1839            try {
1840                instance.familyPrintMSDF = new TextFamily();
1841                instance.familyPrintMSDF.fontMultiDistanceField(crispNotoSerif, crispNotoSerifTexture)
1842                        .width(7).height(30).setSmoothingMultiplier(1.5f);
1843                instance.familyPrintMSDF.font().setUseIntegerPositions(false);
1844            } catch (Exception e) {
1845                e.printStackTrace();
1846            }
1847        }
1848        if(instance.familyPrintMSDF != null)
1849            return instance.familyPrintMSDF.copy();
1850        return null;
1851    }
1852    /**
1853     * Returns a TextCellFactory already configured to use a partially-angular variable-width font with good Unicode
1854     * support and an appearance as if it were carved into solid rock, that should scale cleanly to even very large
1855     * sizes (using an MSDF technique). Caches the result for later calls. The font used is
1856     * <a href="https://fontstruct.com/fontstructions/show/507930/bloccus">Bloccus by Christian Munk</a>. It supports a
1857     * lot of glyphs, including most of extended Latin, Greek, Cyrillic, and the International Phonetic Alphabet (IPA),
1858     * but not box drawing characters because this is variable-width. This uses the Multi-channel Signed Distance
1859     * Field (MSDF) technique as opposed to the normal Signed Distance Field technique, which gives the rendered font
1860     * sharper edges and precise corners instead of rounded tips on strokes.
1861     * <br>
1862     * Note: Uses a smoothing multiplier of 1f, instead of the default 1.2f. 
1863     * <br>
1864     * Preview: <a href="https://i.imgur.com/zaqgHTW.png">Image link</a>
1865     * <br>
1866     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1867     * multi-channel distance field font technique this uses can work.
1868     * <br>
1869     * Needs files:
1870     * <ul>
1871     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/bloccus-msdf.fnt</li>
1872     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/bloccus-msdf.png</li>
1873     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/bloccus-license.txt</li>
1874     * </ul>
1875     * @return the TextCellFactory object that can represent many sizes of the font bloccus.ttf
1876     */
1877    public static TextCellFactory getCrispCarvedFont()
1878    {
1879        initialize();
1880        if(instance.msdfCarved == null)
1881        {
1882            try {
1883                instance.msdfCarved = new TextCellFactory()
1884                        .fontMultiDistanceField(crispCarved, crispCarvedTexture)
1885                        .width(7f).height(24f).setSmoothingMultiplier(1.0f);
1886            } catch (Exception e) {
1887                e.printStackTrace();
1888            }
1889        }
1890        if(instance.msdfCarved != null)
1891            return instance.msdfCarved.copy();
1892        return null;
1893    }
1894    /**
1895     * Returns a TextCellFactory already configured to use a variable-width sans-serif font with good Unicode support
1896     * and a no-nonsense look, that should scale cleanly to even very large or small sizes (using an MSDF technique).
1897     * Caches the result for later calls. The font used is <a href="https://fonts.google.com/specimen/Roboto">Roboto
1898     * Regular by Christian Robertson</a>. It supports a lot of glyphs, including most Latin, Greek, and Cyrillic,
1899     * but not box drawing characters because this is variable-width. This uses the Multi-channel Signed Distance
1900     * Field (MSDF) technique as opposed to the normal Signed Distance Field technique, which gives the rendered font
1901     * sharper edges and precise corners instead of rounded tips on strokes.
1902     * <br>
1903     * Note: Uses a smoothing multiplier of 2f, instead of the default 1.2f. 
1904     * <br>
1905     * Preview: <a href="https://i.imgur.com/ASjdjc6.png">Image link when scaled to a small size</a>
1906     * <br>
1907     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1908     * multi-channel distance field font technique this uses can work.
1909     * <br>
1910     * Needs files:
1911     * <ul>
1912     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Roboto-Regular-msdf.fnt</li>
1913     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Roboto-Regular-msdf.png</li>
1914     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Roboto-License.txt</li>
1915     * </ul>
1916     * @return the TextCellFactory object that can represent many sizes of the font Roboto-Regular.ttf
1917     */
1918    public static TextCellFactory getCrispRobotoSansFont()
1919    {
1920        initialize();
1921        if(instance.msdfRoboto == null)
1922        {
1923            try {
1924                instance.msdfRoboto = new TextCellFactory()
1925                        .fontMultiDistanceField(crispRobotoSans, crispRobotoSansTexture)
1926                        .width(3f).height(14f).setSmoothingMultiplier(2f);
1927            } catch (Exception e) {
1928                e.printStackTrace();
1929            }
1930        }
1931        if(instance.msdfRoboto != null)
1932            return instance.msdfRoboto.copy();
1933        return null;
1934    }
1935
1936    /**
1937     * Returns a TextCellFactory already configured to use a fixed-width icon font (no letters are supported) using the
1938     * Font-Awesome icon set, that should scale cleanly to even very large sizes. Caches the result for later calls.
1939     * The icon font used is the popular Font-Awesome free set (solid style), an open-source (SIL Open Font License)
1940     * typeface that is often used online. You will probably want to consult the cheatsheet for what chars are actually
1941     * supported; <a href="https://fontawesome.com/cheatsheet">the cheatsheet is here</a>. This uses the Multi-channel
1942     * Signed Distance Field technique as opposed to the normal Signed Distance Field technique, which should allow
1943     * sharper edges. You may also want the list of all chars in this icon font; {@link #iconFontAll} has that.
1944     * <br>
1945     * Preview: <a href="">Image link</a>
1946     * <br>
1947     * This creates a TextCellFactory instead of a BitmapFont because it needs to set some extra information so the
1948     * multi-channel distance field font technique this uses can work.
1949     * <br>
1950     * Needs files:
1951     * <ul>
1952     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/awesome-solid-msdf.fnt</li>
1953     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/awesome-solid-msdf.png</li>
1954     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Font-Awesome-license.txt</li>
1955     * </ul>
1956     * @return the TextCellFactory object that can represent many sizes of Font Awesome Free (solid) with an MSDF effect
1957     */
1958    public static TextCellFactory getCrispIconFont()
1959    {
1960        initialize();
1961        if(instance.msdfIcons == null)
1962        {
1963            try {
1964                instance.msdfIcons = new TextCellFactory()
1965                        .fontMultiDistanceField(crispIcons, crispIconsTexture);
1966            } catch (Exception e) {
1967                e.printStackTrace();
1968            }
1969        }
1970        if(instance.msdfIcons != null)
1971            return instance.msdfIcons.copy();
1972        return null;
1973
1974    }
1975    
1976    
1977
1978    /**
1979     * Gets an image of a (squid-like, for SquidLib) tentacle, 32x32px.
1980     * Source is public domain: http://opengameart.org/content/496-pixel-art-icons-for-medievalfantasy-rpg
1981     * Created by Henrique Lazarini (7Soul1, http://7soul1.deviantart.com/ )
1982     * <br>
1983     * Needs file:
1984     * <ul>
1985     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/Tentacle.png</li>
1986     * </ul>
1987     * @return a TextureRegion containing an image of a tentacle.
1988     */
1989    public static TextureRegion getTentacle()
1990    {
1991        initialize();
1992        if(instance.tentacle == null || instance.tentacleRegion == null)
1993        {
1994            try {
1995                instance.tentacle = new Texture(Gdx.files.internal("Tentacle.png"));
1996                instance.tentacleRegion = new TextureRegion(instance.tentacle);
1997            } catch (Exception ignored) {
1998            }
1999        }
2000        return instance.tentacleRegion;
2001    }
2002
2003
2004    /**
2005     * Gets a TextureAtlas containing many icons with a distance field effect applied, allowing them to be used with
2006     * "stretchable" fonts and be resized in the same way. These will not look as-expected if stretchable fonts are not
2007     * in use, and will seem hazy and indistinct if the shader hasn't been set up for a distance field effect by
2008     * TextCellFactory (which stretchable fonts will do automatically). The one page of the TextureAtlas is 2048x2048,
2009     * which may be too large for some old, low-end Android phones, and possibly integrated graphics with fairly old
2010     * processors on desktop. It has over 2000 icons.
2011     * <br>
2012     * The icons are CC-BY and the license is distributed with them, though the icons are not necessarily included with
2013     * SquidLib. If you use the icon atlas, be sure to include icons-license.txt with it and reference it with your
2014     * game's license and/or credits information.
2015     * <br>
2016     * Needs files:
2017     * <ul>
2018     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/icons.atlas</li>
2019     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/icons.png</li>
2020     *     <li>https://github.com/SquidPony/SquidLib/blob/master/assets/icons-license.txt Needed to credit artists</li>
2021     * </ul>
2022     * @return a TextureAtlas containing over 2000 icons with a distance field effect
2023     */
2024    public static TextureAtlas getIconAtlas()
2025    {
2026        initialize();
2027        if(instance.iconAtlas == null)
2028        {
2029            try {
2030                instance.iconAtlas = new TextureAtlas(Gdx.files.internal("icons.atlas"));
2031            } catch (Exception ignored) {
2032            }
2033        }
2034        return instance.iconAtlas;
2035    }
2036
2037    /**
2038     * This is a static global StatefulRNG that's meant for usage in cases where the seed does not matter and any
2039     * changes to this RNG's state will not change behavior elsewhere in the program; this means the GUI mainly.
2040     */
2041    public static StatefulRNG getGuiRandom()
2042    {
2043        initialize();
2044        if(instance.guiRandom == null)
2045        {
2046            instance.guiRandom =  new StatefulRNG();
2047        }
2048        return instance.guiRandom;
2049    }
2050    /**
2051     * This is a static global SquidColorCenter that can be used in places that just need an existing object that can do
2052     * things like analyze hue or saturation of a color.
2053     */
2054    public static SquidColorCenter getSCC()
2055    {
2056        initialize();
2057        if(instance.scc == null)
2058        {
2059            instance.scc =  new SquidColorCenter();
2060        }
2061        return instance.scc;
2062    }
2063
2064    /**
2065     * Special symbols that can be used as icons if you use the narrow default font.
2066     */
2067    public static final String narrowFontSymbols = "ሀሁሂሃሄህሆሇለሉሊላሌልሎሏሐሑሒሓሔሕሖሗመሙሚማሜ";
2068    public static final String narrowFontAll = " !\"#$%&'()*+,-./0123\n" +
2069                                          "456789:;<=>?@ABCDEFG\n" +
2070                                          "HIJKLMNOPQRSTUVWXYZ[\n" +
2071                                          "\\]^_`abcdefghijklmno\n" +
2072                                          "pqrstuvwxyz{|}~¡¢£¤¥\n" +
2073                                          "¦§¨©ª«¬\u00AD®¯°±²³´µ¶·¸¹\n" +
2074                                          "º»¼½¾¿×ß÷øɍɎሀሁሂሃሄህሆሇ\n" +
2075                                          "ለሉሊላሌልሎሏሐሑሒሓሔሕሖሗመሙሚማ\n" +
2076                                          "ሜẞ‐‒–—―‖‗‘’‚‛“”„‟†‡•\n" +
2077                                          "…‧‹›€™"+
2078                                          "←↑→↓↷↺↻"+ // left, up, right, down, "tap", "counterclockwise", "clockwise"
2079                                          "∀∁∂∃∄∅∆\n" +
2080                                          "∇∈∉∋∌∎∏∐∑−∓∔∕∖∘∙√∛∜∝\n" +
2081                                          "∞∟∠∡∢∣∤∥∦∧∨∩∪∫∬∮∯∱∲∳\n" +
2082                                          "∴∵∶∷≈≋≠≡≢≣≤≥≦≧≨≩≪≫─━\n" +
2083                                          "│┃┄┅┆┇┈┉┊┋┌┍┎┏┐┑┒┓└┕\n" +
2084                                          "┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩\n" +
2085                                          "┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽\n" +
2086                                          "┾┿╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║\n" +
2087                                          "╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥\n" +
2088                                          "╦╧╨╩╪╫╬╭╮╯╰╱╲╳╴╵╶╷╸╹\n" +
2089                                          "╺╻╼╽╾╿▁▄▅▆▇█▌▐░▒▓▔▖▗\n" +
2090                                          "▘▙▚▛▜▝▞▟";
2091    /**
2092     * All of the Font-Awesome Free (solid style) characters in {@link #getCrispIconFont()}, as a String.
2093     */
2094    public static final String iconFontAll = "\u200E\uF000\uF001\uF002\uF004\uF005\uF007\uF008\uF009\uF00A\uF00B\uF00C\uF00D\uF00E\uF010\uF011\uF012\uF013\uF015\uF017\uF018\uF019\uF01C\uF01E\uF021\uF022\uF023\uF024\uF025\uF026\uF027\uF028\uF029\uF02A\uF02B\uF02C\uF02D\uF02E\uF02F\uF030\uF031\uF032\uF033\uF034\uF035\uF036\uF037\uF038\uF039\uF03A\uF03B\uF03C\uF03D\uF03E\uF041\uF042\uF043\uF044\uF048\uF049\uF04A\uF04B\uF04C\uF04D\uF04E\uF050\uF051\uF052\uF053\uF054\uF055\uF056\uF057\uF058\uF059\uF05A\uF05B\uF05E\uF060\uF061\uF062\uF063\uF064\uF065\uF066\uF067\uF068\uF069\uF06A\uF06B\uF06C\uF06D\uF06E\uF070\uF071\uF072\uF073\uF074\uF075\uF076\uF077\uF078\uF079\uF07A\uF07B\uF07C\uF080\uF083\uF084\uF085\uF086\uF089\uF08D\uF091\uF093\uF094\uF095\uF098\uF09C\uF09D\uF09E\uF0A0\uF0A1\uF0A3\uF0A4\uF0A5\uF0A6\uF0A7\uF0A8\uF0A9\uF0AA\uF0AB\uF0AC\uF0AD\uF0AE\uF0B0\uF0B1\uF0B2\uF0C0\uF0C1\uF0C2\uF0C3\uF0C4\uF0C5\uF0C6\uF0C7\uF0C8\uF0C9\uF0CA\uF0CB\uF0CC\uF0CD\uF0CE\uF0D0\uF0D1\uF0D6\uF0D7\uF0D8\uF0D9\uF0DA\uF0DB\uF0DC\uF0DD\uF0DE\uF0E0\uF0E2\uF0E3\uF0E7\uF0E8\uF0E9\uF0EA\uF0EB\uF0F0\uF0F1\uF0F2\uF0F3\uF0F4\uF0F8\uF0F9\uF0FA\uF0FB\uF0FC\uF0FD\uF0FE\uF100\uF101\uF102\uF103\uF104\uF105\uF106\uF107\uF108\uF109\uF10A\uF10B\uF10D\uF10E\uF110\uF111\uF118\uF119\uF11A\uF11B\uF11C\uF11E\uF120\uF121\uF122\uF124\uF125\uF126\uF127\uF128\uF129\uF12A\uF12B\uF12C\uF12D\uF12E\uF130\uF131\uF133\uF134\uF135\uF137\uF138\uF139\uF13A\uF13D\uF13E\uF140\uF141\uF142\uF143\uF144\uF146\uF14A\uF14B\uF14D\uF14E\uF150\uF151\uF152\uF153\uF154\uF155\uF156\uF157\uF158\uF159\uF15B\uF15C\uF15D\uF15E\uF160\uF161\uF162\uF163\uF164\uF165\uF182\uF183\uF185\uF186\uF187\uF188\uF191\uF192\uF193\uF195\uF197\uF199\uF19C\uF19D\uF1AB\uF1AC\uF1AD\uF1AE\uF1B0\uF1B2\uF1B3\uF1B8\uF1B9\uF1BA\uF1BB\uF1C0\uF1C1\uF1C2\uF1C3\uF1C4\uF1C5\uF1C6\uF1C7\uF1C8\uF1C9\uF1CD\uF1CE\uF1D8\uF1DA\uF1DC\uF1DD\uF1DE\uF1E0\uF1E1\uF1E2\uF1E3\uF1E4\uF1E5\uF1E6\uF1EA\uF1EB\uF1EC\uF1F6\uF1F8\uF1F9\uF1FA\uF1FB\uF1FC\uF1FD\uF1FE\uF200\uF201\uF204\uF205\uF206\uF207\uF20A\uF20B\uF217\uF218\uF21A\uF21B\uF21C\uF21D\uF21E\uF221\uF222\uF223\uF224\uF225\uF226\uF227\uF228\uF229\uF22A\uF22B\uF22C\uF22D\uF233\uF234\uF235\uF236\uF238\uF239\uF240\uF241\uF242\uF243\uF244\uF245\uF246\uF247\uF248\uF249\uF24D\uF24E\uF251\uF252\uF253\uF254\uF255\uF256\uF257\uF258\uF259\uF25A\uF25B\uF25C\uF25D\uF26C\uF271\uF272\uF273\uF274\uF275\uF276\uF277\uF279\uF27A\uF28B\uF28D\uF290\uF291\uF292\uF295\uF29A\uF29D\uF29E\uF2A0\uF2A1\uF2A2\uF2A3\uF2A4\uF2A7\uF2A8\uF2B5\uF2B6\uF2B9\uF2BB\uF2BD\uF2C1\uF2C2\uF2C7\uF2C8\uF2C9\uF2CA\uF2CB\uF2CC\uF2CD\uF2CE\uF2D0\uF2D1\uF2D2\uF2DB\uF2DC\uF2E5\uF2E7\uF2EA\uF2ED\uF2F1\uF2F2\uF2F5\uF2F6\uF2F9\uF2FE\uF302\uF303\uF304\uF305\uF309\uF30A\uF30B\uF30C\uF31E\uF328\uF337\uF338\uF358\uF359\uF35A\uF35B\uF35D\uF360\uF362\uF381\uF382\uF3A5\uF3BE\uF3BF\uF3C1\uF3C5\uF3C9\uF3CD\uF3D1\uF3DD\uF3E0\uF3E5\uF3ED\uF3FA\uF3FD\uF3FF\uF406\uF410\uF433\uF434\uF436\uF439\uF43A\uF43C\uF43F\uF441\uF443\uF445\uF447\uF44B\uF44E\uF450\uF453\uF458\uF45C\uF45D\uF45F\uF461\uF462\uF466\uF468\uF469\uF46A\uF46B\uF46C\uF46D\uF470\uF471\uF472\uF474\uF477\uF478\uF479\uF47D\uF47E\uF47F\uF481\uF482\uF484\uF485\uF486\uF487\uF48B\uF48D\uF48E\uF490\uF491\uF492\uF493\uF494\uF496\uF497\uF49E\uF4AD\uF4B3\uF4B8\uF4B9\uF4BA\uF4BD\uF4BE\uF4C0\uF4C2\uF4C4\uF4CD\uF4CE\uF4D3\uF4D6\uF4D7\uF4D8\uF4D9\uF4DA\uF4DB\uF4DE\uF4DF\uF4E2\uF4E3\uF4FA\uF4FB\uF4FC\uF4FD\uF4FE\uF4FF\uF500\uF501\uF502\uF503\uF504\uF505\uF506\uF507\uF508\uF509\uF517\uF518\uF519\uF51A\uF51B\uF51C\uF51D\uF51E\uF51F\uF520\uF521\uF522\uF523\uF524\uF525\uF526\uF527\uF528\uF529\uF52A\uF52B\uF52C\uF52D\uF52E\uF52F\uF530\uF531\uF532\uF533\uF534\uF535\uF536\uF537\uF538\uF539\uF53A\uF53B\uF53C\uF53D\uF53E\uF53F\uF540\uF541\uF542\uF543\uF544\uF545\uF546\uF547\uF548\uF549\uF54A\uF54B\uF54C\uF54D\uF54E\uF54F\uF550\uF551\uF552\uF553\uF554\uF555\uF556\uF557\uF558\uF559\uF55A\uF55B\uF55C\uF55D\uF55E\uF55F\uF560\uF561\uF562\uF563\uF564\uF565\uF566\uF567\uF568\uF569\uF56A\uF56B\uF56C\uF56D\uF56E\uF56F\uF570\uF571\uF572\uF573\uF574\uF575\uF576\uF577\uF578\uF579\uF57A\uF57B\uF57C\uF57D\uF57E\uF57F\uF580\uF581\uF582\uF583\uF584\uF585\uF586\uF587\uF588\uF589\uF58A\uF58B\uF58C\uF58D\uF58E\uF58F\uF590\uF591\uF593\uF594\uF595\uF596\uF597\uF598\uF599\uF59A\uF59B\uF59C\uF59D\uF59F\uF5A0\uF5A1\uF5A2\uF5A4\uF5A5\uF5A6\uF5A7\uF5AA\uF5AB\uF5AC\uF5AD\uF5AE\uF5AF\uF5B0\uF5B1\uF5B3\uF5B4\uF5B6\uF5B7\uF5B8\uF5BA\uF5BB\uF5BC\uF5BD\uF5BF\uF5C0\uF5C1\uF5C2\uF5C3\uF5C4\uF5C5\uF5C7\uF5C8\uF5C9\uF5CA\uF5CB\uF5CD\uF5CE\uF5D0\uF5D1\uF5D2\uF5D7\uF5DA\uF5DC\uF5DE\uF5DF\uF5E1\uF5E4\uF5E7\uF5EB\uF5EE\uF5FC\uF5FD\uF610\uF613\uF619\uF61F\uF621\uF62E\uF62F\uF630\uF637\uF63B\uF63C\uF641\uF644\uF647\uF64A\uF64F\uF651\uF653\uF654\uF655\uF658\uF65D\uF65E\uF662\uF664\uF665\uF666\uF669\uF66A\uF66B\uF66D\uF66F\uF674\uF676\uF678\uF679\uF67B\uF67C\uF67F\uF681\uF682\uF683\uF684\uF687\uF688\uF689\uF696\uF698\uF699\uF69A\uF69B\uF6A0\uF6A1\uF6A7\uF6AD";
2095    
2096    /**
2097     * Called when the {@link Application} is about to pause
2098     */
2099    @Override
2100    public void pause() {
2101    }
2102
2103    /**
2104     * Called when the Application is about to be resumed
2105     */
2106    @Override
2107    public void resume() {
2108    }
2109
2110    /**
2111     * Called when the {@link Application} is about to be disposed
2112     */
2113    @Override
2114    public void dispose() {
2115        if(arial15 != null) {
2116            arial15.dispose();
2117            arial15 = null;
2118        }
2119        if(narrow1 != null) {
2120            narrow1.dispose();
2121            narrow1 = null;
2122        }
2123        if(narrow2 != null) {
2124            narrow2.dispose();
2125            narrow2 = null;
2126        }
2127        if(narrow3 != null) {
2128            narrow3.dispose();
2129            narrow3 = null;
2130        }
2131        if(smooth1 != null) {
2132            smooth1.dispose();
2133            smooth1 = null;
2134        }
2135        if(smooth2 != null) {
2136            smooth2.dispose();
2137            smooth2 = null;
2138        }
2139        if(square1 != null) {
2140            square1.dispose();
2141            square1 = null;
2142        }
2143        if(square2 != null) {
2144            square2.dispose();
2145            square2 = null;
2146        }
2147        if(smoothSquare != null) {
2148            smoothSquare.dispose();
2149            smoothSquare = null;
2150        }
2151        if(distanceSquare != null) {
2152            distanceSquare.dispose();
2153            distanceSquare = null;
2154        }
2155        if(distanceNarrow != null) {
2156            distanceNarrow.dispose();
2157            distanceNarrow = null;
2158        }
2159        if(typewriterDistanceNarrow != null) {
2160            typewriterDistanceNarrow.dispose();
2161            typewriterDistanceNarrow = null;
2162        }
2163        if(distanceCode != null) {
2164            distanceCode.dispose();
2165            distanceCode = null;
2166        }
2167        if(distanceCodeJP != null) {
2168            distanceCodeJP.dispose();
2169            distanceCodeJP = null;
2170        }
2171        if(distanceDejaVu != null) {
2172            distanceDejaVu.dispose();
2173            distanceDejaVu = null;
2174        }
2175        if(distanceLean != null) {
2176            distanceLean.dispose();
2177            distanceLean = null;
2178        }
2179        if(distanceSlab != null) {
2180            distanceSlab.dispose();
2181            distanceSlab = null;
2182        }
2183        if(distanceLeanLight != null) {
2184            distanceLeanLight.dispose();
2185            distanceLeanLight = null;
2186        }
2187        if(distanceSlabLight != null) {
2188            distanceSlabLight.dispose();
2189            distanceSlabLight = null;
2190        }
2191        if(distanceClean != null) {
2192            distanceClean.dispose();
2193            distanceClean = null;
2194        }
2195        if(distancePrint != null) {
2196            distancePrint.dispose();
2197            distancePrint = null;
2198        }
2199        if(distanceOrbit != null) {
2200            distanceOrbit.dispose();
2201            distanceOrbit = null;
2202        }
2203        if(distanceHeavySquare != null) {
2204            distanceHeavySquare.dispose();
2205            distanceHeavySquare = null;
2206        }
2207        if(msdfSlab != null) {
2208            msdfSlab.dispose();
2209            msdfSlab = null;
2210        }
2211        if(msdfLean != null) {
2212            msdfLean.dispose();
2213            msdfLean = null;
2214        }
2215        if(msdfDejaVu != null) {
2216            msdfDejaVu.dispose();
2217            msdfDejaVu = null;
2218        }
2219        if(msdfCarved != null) {
2220            msdfCarved.dispose();
2221            msdfCarved = null;
2222        }
2223        if(msdfCurvySquare != null) {
2224            msdfCurvySquare.dispose();
2225            msdfCurvySquare = null;
2226        }
2227        if(msdfRoboto != null) {
2228            msdfRoboto.dispose();
2229            msdfRoboto = null;
2230        }
2231        if(msdfIcons != null) {
2232            msdfIcons.dispose();
2233            msdfIcons = null;
2234        }
2235        if (unicode1 != null) {
2236            unicode1.dispose();
2237            unicode1 = null;
2238        }
2239        if (unicode2 != null) {
2240            unicode2.dispose();
2241            unicode2 = null;
2242        }
2243        if(tiny != null){
2244            tiny.dispose();
2245            tiny = null;
2246        }
2247        if(lessTiny != null){
2248            lessTiny.dispose();
2249            lessTiny = null;
2250        }
2251        if(computerSaysNo != null){
2252            computerSaysNo.dispose();
2253            computerSaysNo = null;
2254        }
2255        if(sevenTwelve != null){
2256            sevenTwelve.dispose();
2257            sevenTwelve = null;
2258        }
2259        if(familyLean != null) {
2260            familyLean.dispose();
2261            familyLean = null;
2262        }
2263        if(familySlab != null) {
2264            familySlab.dispose();
2265            familySlab = null;
2266        }
2267        if(familyGo != null) {
2268            familyGo.dispose();
2269            familyGo = null;
2270        }
2271        if(familyLeanMSDF != null) {
2272            familyLeanMSDF.dispose();
2273            familyLeanMSDF = null;
2274        }
2275        if(familySlabMSDF != null) {
2276            familySlabMSDF.dispose();
2277            familySlabMSDF = null;
2278        }
2279        if(familyPrintMSDF != null) {
2280            familyPrintMSDF.dispose();
2281            familyPrintMSDF = null;
2282        }
2283        if(tentacle != null) {
2284            tentacle.dispose();
2285            tentacle = null;
2286        }
2287        if(iconAtlas != null) {
2288            iconAtlas.dispose();
2289            iconAtlas = null;
2290        }
2291        Gdx.app.removeLifecycleListener(this);
2292        instance = null;
2293    }
2294}