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}