diff --git a/src/main/resources/assets/opencomputers/font.hex b/src/main/resources/assets/opencomputers/font.hex index 551966dbf..00221c12f 100644 --- a/src/main/resources/assets/opencomputers/font.hex +++ b/src/main/resources/assets/opencomputers/font.hex @@ -186,8 +186,8 @@ 00B9:00307030303030300000000000000000 00BA:0000003C6666663C007E000000000000 00BB:0000000000CC663366CC000000000000 -00BC:000066E66C6C18183032666ACFC20000 -00BD:000066E66C6C181830306C66CCCE0000 +00BC:000046C64C4C58183032666ACFC20000 +00BD:000046C64C4C581830306C66CCCE0000 00BE:0000C6266C2CD8183032666ACFC20000 00BF:0018180000183030606066663C000000 00C0:301800183C6666667E66666666000000 @@ -910,13 +910,14 @@ 201D:66CC0000000000000000000000000000 2020:00001818187E18181818181818000000 2021:00001818187E1818187E181818000000 -2022:0000000018183C3C3C3C181800000000 +2022:000000000000183C3C18000000000000 2024:00000000000000000000181818000000 2025:00000000000000000000666666660000 2026:00000000000000000000009292000000 2030:0000C6C6CCCC18186060DBDBDBDB0000 2031:0000C6C6CCCC18186060D5D5D5D50000 203C:66666666666666666666000066660000 +2044:000006060C0C181830306060C0C00000 2047:CCCC66666666CCCCCCCC0000CCCC0000 2048:E6E6363636366666C6C60000C6C60000 2049:DCDCC6C6C6C6CCCCD8D80000D8D80000 @@ -928,11 +929,31 @@ 2078:00386C6C386C6C380000000000000000 2079:00386C6C3C0C0C380000000000000000 207F:000000786C6C6C6C0000000000000000 +20A3:00007E6060607C6060F8606060000000 +20A4:0000386C6C60F060F0606666FC000000 20A7:00FC66667C62666F666666F300000000 +20AA:000000FA8AAAAAAAAAA2BE0000000000 20AC:00003C666660FC60F86066663C000000 2117:7E7E8181B9B9A5A5B9B9A1A181817E7E 2120:006A8E8E4A2A2ACA0000000000000000 2122:00EA4E4E4A4A4A4A0000000000000000 +2150:000046C64C4C581830376162C2C20000 +2151:000046C64C4C581830366967C1C60000 +2152:000046C64C4C581A36326062C5C20000 +2153:000046C64C4C581830366162C1C60000 +2154:0000C6264C8CF81830366162C1C60000 +2155:000046C64C4C5818303E686CC2CC0000 +2156:0000C6264C8CF818303E686CC2CC0000 +2157:0000C6266C2CD818303E686CC2CC0000 +2158:00002666ACFC3818303E686CC2CC0000 +2159:000046C64C4C58183036686EC9C60000 +215A:0000E686CC2CD8183036686EC9C60000 +215B:000046C64C4C581830366966C9C60000 +215C:0000C6266C2CD81830366966C9C60000 +215D:0000E686CC2CD81830366966C9C60000 +215E:0000E6264C4C581830366966C9C60000 +215F:000046C64C4C581830306060C0C00000 +2189:000046A6ACAC581830366162C1C60000 2190:000000000010307F7F30100000000000 2191:183C7E18181818181818181818181818 2192:0000000000080CFEFE0C080000000000 @@ -943,26 +964,53 @@ 2199:000004040E0E1C1CB8B8F0F0E0E0F0F0 21A5:183C7E181818181818181818187E3C18 21A8:183C7E1818181818181818187E3C18FF -21E6:181838386F6FC1C1C1C16F6F38381818 -21E7:18183C3C6666C3C3E7E7242424243C3C -21E8:18181C1CF6F683838383F6F61C1C1818 -21E9:3C3C24242424E7E7C3C366663C3C1818 +21E6:0000000018386FC1C16F381800000000 +21E7:00000000183C66C3E724243C00000000 +21E8:00000000181CF68383F61C1800000000 +21E9:000000003C2424E7C3663C1800000000 +220E:00000000007E7E7E7E7E7E0000000000 +2211:0000FEC06030180C183060C0FE000000 2212:000000000000007E0000000000000000 -2218:000000003C3C666666663C3C00000000 +2213:000000007E001818187E181818000000 +2214:0000001818001818187E181818000000 +2215:000006060C0C181830306060C0C00000 +2218:0000000000003C66663C000000000000 +2219:000000000000183C3C18000000000000 221A:0003030606060606CCCC6C3818000000 +221B:0063132616660606CCCC6C3818000000 +221C:002363A6F6262606CCCC6C3818000000 221E:000000000076DBDBDB6E000000000000 221F:000000000000FE060606060000000000 +2223:00001818181818181818181818000000 +2224:000018181A1C18183858181818000000 +2225:00006C6C6C6C6C6C6C6C6C6C6C000000 +2226:00006C6C6E6C6C7C6C6CEC6C6C000000 2229:0000003C666666666666666600000000 +222A:00000066666666666666663C00000000 +222B:00000E1B18181818181818D870000000 2248:0000000072D69C0072D69C0000000000 2261:000000007E00007E00007E0000000000 2264:000000000C18306030180C007E000000 2265:0000000030180C060C1830007E000000 +2295:0000000000385492FE92543800000000 +2296:0000000000384482FE82443800000000 +2297:00000000003844AA92AA443800000000 +2298:000000000038448A92A2443800000000 +2299:00000000003844829282443800000000 +229A:0000000000384492AA92443800000000 +229C:00000000003844BA82BA443800000000 +229D:0000000000384482BA82443800000000 +229E:0000000000FE9292FE9292FE00000000 +229F:0000000000FE8282FE8282FE00000000 +22A0:0000000000FEC6AA92AAC6FE00000000 +22A1:0000000000FE8282928282FE00000000 22C5:00000000181818180000000000000000 2320:00000E1B1B1B18181818181818181818 2321:181818181818181818D8D8D870000000 +23E9:000000008888CCCCEEEECCCC88880000 23EA:0000000022226666EEEE666622220000 23EB:101038387C7C0000101038387C7C0000 -23EC:000000008888CCCCEEEECCCC88880000 +23EC:7C7C3838101000007C7C383810100000 2500:00000000000000FFFF00000000000000 2501:000000000000FFFFFFFF000000000000 2502:18181818181818181818181818181818 @@ -1123,20 +1171,20 @@ 259D:0F0F0F0F0F0F0F0F0000000000000000 259E:0F0F0F0F0F0F0F0FF0F0F0F0F0F0F0F0 259F:0F0F0F0F0F0F0F0FFFFFFFFFFFFFFFFF -25A0:00007E7E7E7E7E7E7E7E7E7E7E7E0000 -25A1:00007E7E66666666666666667E7E0000 -25A2:7C7CC6C6C6C6C6C6C6C6C6C67C7C0000 -25A3:FEFE8282BABABABABABA8282FEFE0000 +25A0:00000000007E7E7E7E7E7E0000000000 +25A1:00000000007E666666667E0000000000 +25A2:000000007CC6C6C6C6C67C0000000000 +25A3:00000000FE82BABABA82FE0000000000 25A4:FF00FF00FF00FF00FF00FF00FF00FF00 25A5:AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA 25A6:44FF444444FF444444FF444444FF4444 25A7:88884444222211118888444422221111 25A8:11112222444488881111222244448888 25A9:AAAA4444AAAA1111AAAA4444AAAA1111 -25AA:00000000383838383838000000000000 -25AB:00000000383828283838000000000000 -25AC:00000000000000007E7E7E7E7E7E0000 -25AD:00000000000000007E7E66667E7E0000 +25AA:00000000000038383800000000000000 +25AB:00000000000038283800000000000000 +25AC:0000000000000000007E7E7E00000000 +25AD:0000000000000000007E667E00000000 25AE:3C3C3C3C3C3C3C3C3C3C3C3C3C3C0000 25AF:3C3C242424242424242424243C3C0000 25B0:00000000000000003F3F7E7EFCFC0000 @@ -1147,8 +1195,8 @@ 25B5:000010103828286C4444C68282FE0000 25B6:80C0E0F0F8FCFEFFFEFCF8F0E0C08000 25B7:80C0E0F0D8CCC6C3C6CCD8F0E0C08000 -25B8:00000000406070787C78706040000000 -25B9:00000000406050484448506040000000 +25B8:000000002030383C3E3C383020000000 +25B9:00000000203028242224283020000000 25BA:00000000C0F0FCFFFCF0C00000000000 25BB:00000000C0F0DCC7DCF0C00000000000 25BC:FEFEFEFE7C7C7C7C3838383810101010 @@ -1164,25 +1212,25 @@ 25C6:18183C3C7E7EFFFFFFFF7E7E3C3C1818 25C7:18183C3C6666C3C3C3C366663C3C1818 25C8:181824245A5ABDBDBDBD5A5A24241818 -25C9:3C3C6666C3C3DBDBDBDBC3C366663C3C +25C9:000000003C66C3DBDBC3663C00000000 25CA:101038386C6CC6C6C6C66C6C38381010 -25CB:00003C3C66664242424266663C3C0000 -25CC:10104444000082820000444410100000 -25CD:000038386C6CAAAAAAAA6C6C38380000 -25CE:383844449292AAAA9292444438380000 -25CF:00003C3C7E7E7E7E7E7E7E7E3C3C0000 -25D0:3C3C7676F3F3F3F3F3F3F3F376763C3C -25D1:3C3C6E6ECFCFCFCFCFCFCFCF6E6E3C3C -25D2:3C3C6666C3C3C3C3FFFFFFFF7E7E3C3C -25D3:3C3C7E7EFFFFFFFFC3C3C3C366663C3C -25D4:3C3C6E6ECFCFCFCFC3C3C3C366663C3C -25D5:3C3C6E6ECFCFCFCFFFFFFFFF7E7E3C3C +25CB:00000000003C664242663C0000000000 +25CC:00000000104400820044100000000000 +25CD:0000000000386CAAAA6C380000000000 +25CE:00000000384492AA9244380000000000 +25CF:00000000003C7E7E7E7E3C0000000000 +25D0:000000003C76F3F3F3F3763C00000000 +25D1:000000003C6ECFCFCFCF6E3C00000000 +25D2:000000003C66C3C3FFFF7E3C00000000 +25D3:000000003C7EFFFFC3C3663C00000000 +25D4:000000003C6ECFCFC3C3663C00000000 +25D5:000000003C6ECFCFFFFF7E3C00000000 25D6:00030F1F1F3F3F3F3F3F1F1F0F030000 25D7:00C0F0F8F8FCFCFCFCFCF8F8F0C00000 -25D8:FFFFFFFFE7E7C3C3C3C3E7E7FFFFFFFF -25D9:FFFFC3C39999BDBDBDBD9999C3C3FFFF -25DA:FFFFC3C39999BDBD0000000000000000 -25DB:0000000000000000BDBD9999C3C3FFFF +25D8:FFFFFFFFFFFFE7C3C3E7FFFFFFFFFFFF +25D9:FFFFFFFFFFC399BDBD99C3FFFFFFFFFF +25DA:FFFFFFFFFFC399BD0000000000000000 +25DB:0000000000000000BD99C3FFFFFFFFFF 25DC:38386060C0C0C0C00000000000000000 25DD:1C1C0606030303030000000000000000 25DE:00000000000000000303030306061C1C @@ -1193,32 +1241,38 @@ 25E3:8080C0C0E0E0F0F0F8F8FCFCFEFEFFFF 25E4:FFFFFEFEFCFCF8F8F0F0E0E0C0C08080 25E5:FFFF7F7F3F3F1F1F0F0F070703030101 -25E6:00000000181824242424181800000000 -25E7:FFFFF3F3F3F3F3F3F3F3F3F3F3F3FFFF -25E8:FFFFCFCFCFCFCFCFCFCFCFCFCFCFFFFF -25E9:FFFFFFFFFFFFFBFBF3F3E3E3C3C3FFFF -25EA:FFFFC3C3C7C7CFCFDFDFFFFFFFFFFFFF -25EB:FFFFDBDBDBDBDBDBDBDBDBDBDBDBFFFF +25E6:00000000000018242418000000000000 +25E7:00000000FFF3F3F3F3F3F3FF00000000 +25E8:00000000FFCFCFCFCFCFCFFF00000000 +25E9:00000000FFFFFFFBF3E3C3FF00000000 +25EA:00000000FFC3C7CFDFFFFFFF00000000 +25EB:00000000FFDBDBDBDBDBDBFF00000000 25EC:18181818242442425A5A99998181FFFF 25ED:181818183C3C76767676F3F3F3F3FFFF 25EE:181818183C3C6E6E6E6ECFCFCFCFFFFF -25EF:3C3C6666C3C3C3C3C3C3C3C366663C3C -25F0:FFFFDBDBDBDBDBDBFBFBC3C3C3C3FFFF -25F1:FFFFC3C3C3C3C3C3FBFBDBDBDBDBFFFF -25F2:FFFFC3C3C3C3C3C3DFDFDBDBDBDBFFFF -25F3:FFFFDBDBDBDBDBDBDFDFC3C3C3C3FFFF -25F4:3C3C7E7EDBDBDBDBFBFBC3C366663C3C -25F5:3C3C6666C3C3FBFBDBDBDBDB7E7E3C3C -25F6:3C3C6666C3C3DFDFDBDBDBDB7E7E3C3C -25F7:3C3C7E7EDBDBDBDBDFDFC3C366663C3C +25EF:000000003C66C3C3C3C3663C00000000 +25F0:00000000FFDBDBDBFBC3C3FF00000000 +25F1:00000000FFC3C3C3FBDBDBFF00000000 +25F2:00000000FFC3C3C3DFDBDBFF00000000 +25F3:00000000FFDBDBDBDFC3C3FF00000000 +25F4:000000003C7EDBDBFBC3663C00000000 +25F5:000000003C66C3FBDBDB7E3C00000000 +25F6:000000003C66C3DFDBDB7E3C00000000 +25F7:000000003C7EDBDBDFC3663C00000000 25F8:FFFFC6C6CCCCD8D8F0F0E0E0C0C08080 25F9:FFFF636333331B1B0F0F070703030101 -25FA:0101030307070F0F1B1B33336363FFFF -25FB:00007C7C6C6C6C6C6C6C7C7C00000000 -25FC:00007C7C7C7C7C7C7C7C7C7C00000000 -25FD:000000003C3C242424243C3C00000000 -25FE:000000003C3C3C3C3C3C3C3C00000000 -25FF:8080C0C0E0E0F0F0D8D8CCCCC6C6FFFF +25FA:8080C0C0E0E0F0F0D8D8CCCCC6C6FFFF +25FB:00000000007C6C6C6C7C000000000000 +25FC:00000000007C7C7C7C7C000000000000 +25FD:0000000000003C24243C000000000000 +25FE:0000000000003C3C3C3C000000000000 +25FF:0101030307070F0F1B1B33336363FFFF +2605:000001000380038007C03FF87FFC3FF80FE00FE01FF03C783018000000000000 +2606:000001000380038006C03C78600C38380C600C601BB03C783018000000000000 +2609:00000000003C425A5A423C0000000000 +2610:00000000FE8282828282FE0000000000 +2611:00000000FE868AAA9282FE0000000000 +2612:00000000FE82AA92AA82FE0000000000 2625:00007CC6C66C38FE3838383838000000 2628:000018183C18187E1818181818000000 262F:0000003C428D81B3FFCF7E3C00000000 @@ -1230,9 +1284,12 @@ 2635:00000000C6C60000FEFE0000C6C60000 2636:00000000FEFE0000C6C60000C6C60000 2637:00000000C6C60000C6C60000C6C60000 -2639:00003C4281A5818199BD81423C000000 -263A:00003C4281A58181BD9981423C000000 -263B:00003C7EFFDBFFFFC3E7FF7E3C000000 +2639:0000007E81A5A5818199BD817E000000 +263A:0000007E81A5A58181BD99817E000000 +263B:0000007EFFDBDBFFFFC3E7FF7E000000 +2640:0000003C6666663C187E181800000000 +2641:00000018187E183C6666663C00000000 +2642:0000001E0E1A78CCCCCCCC7800000000 2660:00000010387CFEFEFE38387C00000000 2661:0000006CFEC6C6C66C6C381000000000 2662:0000001038386CC66C38381000000000 @@ -1251,9 +1308,9 @@ 268D:0000000000000000C6C60000FEFE0000 268E:0000000000000000FEFE0000C6C60000 268F:0000000000000000C6C60000C6C60000 -26AA:000000003C3C4242424242423C3C0000 -26AB:000000003C3C7E7E7E7E7E7E3C3C0000 -26AC:000038387C7C6C6C7C7C383800000000 +26AA:0000000000003C4242423C0000000000 +26AB:0000000000003C7E7E7E3C0000000000 +26AC:0000000000387C6C7C38000000000000 2708:303038389C9CFFFFFFFF9C9C38383030 2734:929254543838FEFE3838545492920000 2800:00000000000000000000000000000000 @@ -1513,10 +1570,17 @@ 28FE:0F0F0F0FFFFFFFFFFFFFFFFFFFFFFFFF 28FF:FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 2913:181818181818181818181818187E3C18 +2A00:000007C01C7030183018600C638C638C638C600C301830181C7007C000000000 +2A01:000007C01D7031183118610C610C7FFC610C610C311831181D7007C000000000 +2A02:000007C01C70301838386C6C66CC638C66CC6C6C383830181C7007C000000000 +2A03:44444444444454544444444438380000 +2A04:4444444454547C7C5454444438380000 +2A05:7C7C4444444444444444444444440000 +2A06:4444444444444444444444447C7C0000 2B1D:00000000000018181818000000000000 -2B24:3C3C7E7EFFFFFFFFFFFFFFFF7E7E3C3C -2B55:3C3C7E7EE7E7C3C3C3C3E7E77E7E3C3C -2B58:00003C3C7E7E666666667E7E3C3C0000 +2B24:000000003C7EFFFFFFFF7E3C00000000 +2B55:000000003C7EE7C3C3E77E3C00000000 +2B58:00000000003C7E66667E3C0000000000 2E2E:3C3C6666666630301818000018180000 3000:0000000000000000000000000000000000000000000000000000000000000000 3001:0000000000000000000000000000000000000000000000002000100008000800 @@ -8509,125 +8573,6 @@ EC03:000052523434060660602C2C4A4A0000 EC04:000010102C2C3A3A5C5C343404040000 EC05:525244442D2DC4C41111B4B423234A4A EC06:9191525200000303C0C000004A4A8989 -EC07:00003C7EFF99FFFFC3BDFF7E3C000000 -EC08:7E7EC3C3D3D3D3D3DBDBC3C3C3C37E7E -EC09:18183C3C3C3C3C3C7E7E101038381010 -EC0A:0505050505050D0D0D0D191979797171 -EC0B:A0A0A0A0A0A0B0B0B0B098989E9E8E8E -EC0C:10105454545454545454545454549292 -EC0D:7070C6C6C4C4C0C0C4C4C6C670700000 -EC0E:181818183C3C7E7EFFFFDBDB18183C3C -EC0F:3C3C1818DBDBFFFF7E7E3C3C18181818 -EC10:0C0C1C1C3939FFFFFFFF39391C1C0C0C -EC11:BABAEEEEAAAA38383838BABAFEFEBABA -EC12:BABAFEFEBABA38383838AAAAEEEEBABA -EC13:E7E74242FFFFF9F9FFFF4242E7E70000 -EC14:E7E74242FFFF9F9FFFFF4242E7E70000 -EC15:22226363F7F7B7B7FFFF7E7E3C3C3C3C -EC16:3C3C7E7EFFFFBFBFFFFF7E7E3C3C3C3C -EC17:3C3C3C3C18183C3C3C3C3C3C3C3C1818 -EC18:18183C3C3C3C3C3C3C3C18183C3C3C3C -EC19:000000007B7BFFFFFFFF7B7B00000000 -EC1A:00000000DEDEFFFFFFFFDEDE00000000 -EC1B:2020606020202020303028283C3C3C3C -EC1C:000030305858FDFDFFFF797930300000 -EC1D:00000C0C1A1ABFBFFFFF9E9E0C0C0000 -EC1E:000030305858FDFD3F3FF9F930300000 -EC1F:00000C0C1A1ABFBFFCFC9F9F0C0C0000 -EC20:101028286868BCBCFCFC787810103838 -EC21:00000000FCFC1C1C7F7F63633E3E0000 -EC22:3838383892927C7C1010282828282828 -EC23:383838381010FEFE1010282844448282 -EC24:8282444428281010FEFE101038383838 -EC25:11111212D4D4F8F8D4D4121211110000 -EC26:888848482B2B1F1F2B2B484888880000 -EC27:3838383812127C7C9090282824242222 -EC28:3838383890907C7C1212282848488888 -EC29:383838381010FEFE101038387C7CFEFE -EC2A:8181C3C3E7E7FFFFFFFF99992424C3C3 -EC2B:00007C7CD6D67C7C3838545492920000 -EC2C:0000000038385454FEFE000000000000 -EC2D:3C3C5A5AFFFFE7E77E7E242442428181 -EC2E:3C3C5A5AFFFFE7E77E7E242424246666 -EC2F:08081C1C2A2A7F7F77773E3E36366363 -EC30:08081C1C2A2A7F7F77773E3E36361414 -EC31:4141A2A23C3C5A5A7E7EFFFF42426363 -EC32:828245453C3C5A5A7E7EFFFF4242C6C6 -EC33:00005A5ABDBD99992424424224240000 -EC34:8181A5A55A5A181818182424C3C30000 -EC35:000024247E7EBDBD7E7E24242424E7E7 -EC36:24247E7EBDBD7E7E242442424242C3C3 -EC37:3C3C5A5AFFFFABABD5D5FFFFDDDD8989 -EC38:3C3C5A5AFFFFABABD5D5FFFF77772222 -EC39:3C3C4242A5A5818199998181D5D5AAAA -EC3A:3C3C4242A5A5818199998181ABAB5555 -EC3B:181824247E7EFFFF5A5A242400000000 -EC3C:3C3CFFFFFFFF18180C0C181830301818 -EC3D:3C3C4242ABABD5D51010101014140808 -EC3E:0000C0C0C8C854545454555522220000 -EC3F:FFFF89899191C5C5A3A389899191FFFF -EC40:FFFFC3C3A5A599999999A5A5C3C3FFFF -EC41:FFFF99999999FFFFFFFF99999999FFFF -EC42:FFFF8181A5A581818181A5A58181FFFF -EC43:E7E7818181810000000081818181E7E7 -EC44:92925454383810101010101010101010 -EC45:38381010383810103838101038381010 -EC46:000000000000AAAAFFFFAAAA00000000 -EC47:7E7E42427E7E42427E7E42427E7E4242 -EC48:0000FFFF5555555555555555FFFF0000 -EC49:000000000000C0C0B0B08C8C8383FFFF -EC4A:00000000000003030D0D3131C1C1FFFF -EC4B:0F0F303040404E4E8A8A8E8E80808181 -EC4C:F0F00C0C020272725151717101018181 -EC4D:0F0F3030404040408E8E808080808181 -EC4E:F0F00C0C020202027171010101018181 -EC4F:81818080888884844343404030300F0F -EC50:8181010111112121C2C202020C0CF0F0 -EC51:81818080808087874040404030300F0F -EC52:818101010101E1E1020202020C0CF0F0 -EC53:81818080838384844343404030300F0F -EC54:81810101C1C12121C2C202020C0CF0F0 -EC55:81818080878788884848404030300F0F -EC56:81810101E1E11111121202020C0CF0F0 -EC57:07070F0F1F1F1818181810101E1E1717 -EC58:F0F0F8F8ECEC0404040404043C3C5454 -EC59:11110B0B0D0D060607072E2E39393838 -EC5A:04042828D8D82828D0D01010E0E00000 -EC5B:00000303040408083F3F7F7FFFFF3F3F -EC5C:0000C0C020201010FCFCFEFEFFFFFCFC -EC5D:03030C0C3F3F3F3FFFFF7F7F37371F1F -EC5E:C0C03030B8B8DCDCEEEEF6F6FBFBFBFB -EC5F:04044E4EE4E446466F6F7F7F60603F3F -EC60:2020727227276262F6F6FEFE0606FCFC -EC61:3B3B31311B1B1F1F10101F1F0F0F0707 -EC62:DCDC8C8CD8D8F8F80808F8F8F0F0E0E0 -EC63:010133337B7B59598C8CDFDF7F7F3F3F -EC64:8080CCCCDEDE9A9A3131FBFBFEFEFCFC -EC65:01010303070706060E0E3E3E70703030 -EC66:8080C0C0E0E0606070707C7C0E0E0C0C -EC67:787870706060E0E0C0C0ECECFEFED1D1 -EC68:1E1E0E0E06060707030337377F7F8B8B -EC69:3F3F1F1F1F1F0F0F0F0F7F7F0000FFFF -EC6A:FCFCF8F8F8F8F0F0F0F0FEFE0000FFFF -EC6B:0000010102020404020201011F1F1F1F -EC6C:000080804040202040408080F8F8F8F8 -EC6D:02020202020202021F1F20207F7F0000 -EC6E:4040404040404040F8F80404FEFE0000 -EC6F:7373737373737F7F3F3F1F1F0F0F0F0F -EC70:CECECECECECEFEFEFCFCF8F8F0F0F0F0 -EC71:0F0F0F0F0F0F18187F7F40407F7FFFFF -EC72:F0F0F0F0F0F01818FEFE0202FEFEFFFF -EC73:F8F8444442422121212142424444F8F8 -EC74:FFFF050507070000000007070505FFFF -EC75:FCFC868682828181818182828686FCFC -EC76:00000000808040407F7F808000000000 -EC77:0000010106061D1D2A2A2A2A2A2A1F1F -EC78:1B1B8F8F65651111C9C9A9A9B1B1F3F3 -EC79:4C4CF7F7F0F01818070702023E3EFEFE -EC7A:7F7F9F9F3131414181818181F9F9FDFD -EC7B:5F5F60606363626264647B7B60605F5F -EC7C:FFFF04040303FCFC0202FCFC0404F8F8 -EC7D:FCFC0202FCFC00000000000000000000 FE81:7E801010101010101010000000000000 FE82:3C401010101010101F0F000000000000 FE84:30403840101010101F0F000000000000 @@ -8781,7 +8726,9 @@ FF37:00000000781E781E781E781E781E799E7BDE7FFE7E7E7C3E781E000000000000 FF38:00000000F00F781E3C3C1E780FF007E00FF01E783C3C781EF00F000000000000 FF39:00000000F00F781E3C3C1E780FF007E003C003C003C003C003C0000000000000 FF3A:000000003FFC003C007800F001E003C007800F001E003C003FFC000000000000 +FF3B:00000FF00F000F000F000F000F000F000F000F000F000F000F000FF000000000 FF3C:F00078003C001E000F00078003C001E000F00078003C001E000F000700000000 +FF3D:00000FF000F000F000F000F000F000F000F000F000F000F000F00FF000000000 FF3E:000003C007E00FF01E783C3C781E000000000000000000000000000000000000 FF3F:0000000000000000000000000000000000000000000000000000000000007FFE FF40:000003C001E000F0003C00000000000000000000000000000000000000000000 @@ -8811,9 +8758,12 @@ FF57:000000000000000000000000781E781E799E7BDE7FFE3FFC1E78000000000000 FF58:000000000000000000000000781E3C3C1E780FF01E783C3C781E000000000000 FF59:0000000000000000000000003C3C3C3C3C3C3C3C3C3C3C3C0FFC003C003C0FF0 FF5A:0000000000000000000000003FFC003C00F003C00F003C003FFC000000000000 -FF5C:0000007E01E001E001E001E003C07F8003C001E001E001E001E0007E00000000 +FF5B:0000007E01E001E001E001E003C07F8003C001E001E001E001E0007E00000000 +FF5C:03C003C003C003C003C003C003C003C003C003C003C003C003C003C000000000 FF5D:00007E00078007800780078003C001FE03C007800780078007807E0000000000 FF5E:00001F867BDE60F8000000000000000000000000000000000000000000000000 +FF5F:00000330066006600CC00CC00CC00CC00CC00CC00CC006600660033000000000 +FF60:00000CC0066006600330033003300330033003300330066006600CC000000000 FF61:000000000000000000386C6C38000000 FF62:001E1818181800000000000000000000 FF63:00000000000000000018181818780000 @@ -8964,7 +8914,3 @@ FF9F:00386C6C380000000000000000000000 1D354:929200009292000092920000FEFE0000 1D355:929200009292000092920000C6C60000 1D356:92920000929200009292000092920000 -1F34E:080810106C6CFEFEFCFCFCFC7E7E6C6C -1F34F:080810106C6C82828484848452526C6C -1F352:00000606080810103030787878783030 -1F860:1010383838383838383838387C7CD6D6 diff --git a/src/main/resources/assets/opencomputers/wcwidth.bin b/src/main/resources/assets/opencomputers/wcwidth.bin deleted file mode 100644 index 7fa116d28..000000000 Binary files a/src/main/resources/assets/opencomputers/wcwidth.bin and /dev/null differ diff --git a/src/main/scala/li/cil/oc/client/renderer/font/FontParserHex.java b/src/main/scala/li/cil/oc/client/renderer/font/FontParserHex.java index 21909c33b..78eee0844 100644 --- a/src/main/scala/li/cil/oc/client/renderer/font/FontParserHex.java +++ b/src/main/scala/li/cil/oc/client/renderer/font/FontParserHex.java @@ -17,7 +17,7 @@ public class FontParserHex implements IGlyphProvider { private static final byte[] OPAQUE = {(byte) 255, (byte) 255, (byte) 255, (byte) 255}; private static final byte[] TRANSPARENT = {0, 0, 0, 0}; - private final byte[][] glyphs = new byte[0x10000][]; + private final byte[][] glyphs = new byte[FontUtils.codepoint_limit()][]; @Override public void initialize() { @@ -26,7 +26,6 @@ public class FontParserHex implements IGlyphProvider { } try { final InputStream font = Minecraft.getMinecraft().getResourceManager().getResource(new ResourceLocation(Settings.resourceDomain(), "font.hex")).getInputStream(); - OpenComputers.log().info("Initialized unicode glyph provider."); try { OpenComputers.log().info("Initializing unicode glyph provider."); final BufferedReader input = new BufferedReader(new InputStreamReader(font)); diff --git a/src/main/scala/li/cil/oc/util/FontUtils.scala b/src/main/scala/li/cil/oc/util/FontUtils.scala index 5c32324f9..08f691192 100644 --- a/src/main/scala/li/cil/oc/util/FontUtils.scala +++ b/src/main/scala/li/cil/oc/util/FontUtils.scala @@ -1,28 +1,182 @@ package li.cil.oc.util -import java.io.IOException +import java.io.{BufferedReader, InputStreamReader} +import java.nio.charset.StandardCharsets +import scala.collection.mutable.BitSet import li.cil.oc.OpenComputers object FontUtils { - // Note: we load the widths from a file (one byte per width) because the Scala - // compiler craps its pants when we try to have it as an array in the source - // file... seems having an array with 0x10000 entries leads to stack overflows, - // who would have known! - private val widths = { - val ba = Array.fill[Byte](0x10000)(-1) - // Note to self: NOT VIA THE FUCKING RESOURCE SYSTEM BECAUSE IT'S FUCKING CLIENT ONLY YOU IDIOT. - val is = FontUtils.getClass.getResourceAsStream("/assets/opencomputers/wcwidth.bin") - if (is != null) { - try { - is.read(ba) - is.close() - } catch { - case e: IOException => OpenComputers.log.warn("Failed loading character widths. Font rendering will probably be derpy as all hell.", e) - } - } - ba - } + private val defined_double_wide: BitSet = BitSet() + + // font.hex actually has some codepoints larger than 0x10000 + // but, UnicodeAPI.scala is using java's Integer.ToChar which only supports the utf-16 range + // and thus will truncate any incoming codepoint, forcing it below 0x10000 + // I believe the solution is to use StringBuffer.appendCodePoint + // but that change would deserve a bit of testing first, postponing for a later update + // review http://www.oracle.com/us/technologies/java/supplementary-142654.html + val codepoint_limit: Int = 0x10000 + def wcwidth(charCode: Int): Int = if (defined_double_wide(charCode)) 2 else 1 - def wcwidth(ch: Int) = if (ch < 0 || ch >= widths.length) -1 else widths(ch) + { + val table = Array[Int]( + 16,16,16,18,19,20,21,22,23,24,25,26,27,28,29,30,31,16,16,32,16,16,16,33,34,35, + 36,37,38,39,16,16,40,16,16,16,16,16,16,16,16,16,16,16,41,42,16,16,43,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,44,16,45,46,47,48,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,49,16,16,50,51,16,52,16,16, + 16,16,16,16,16,16,53,16,16,16,16,16,54,55,16,16,16,16,56,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,57,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,58,59,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,248,3,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,191, + 182,0,0,0,0,0,0,0,31,0,255,7,0,0,0,0,0,248,255,255,0,0,1,0,0,0,0,0,0,0,0,0,0, + 0,192,191,159,61,0,0,0,128,2,0,0,0,255,255,255,7,0,0,0,0,0,0,0,0,0,0,192,255, + 1,0,0,0,0,0,0,248,15,0,0,0,192,251,239,62,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,240,255,255,127,7,0,0,0,0,0,0,20,254,33,254,0,12,0,0,0,2,0,0,0,0,0, + 0,16,30,32,0,0,12,0,0,0,6,0,0,0,0,0,0,16,134,57,2,0,0,0,35,0,6,0,0,0,0,0,0,16, + 190,33,0,0,12,0,0,0,2,0,0,0,0,0,0,144,30,32,64,0,12,0,0,0,4,0,0,0,0,0,0,0,1, + 32,0,0,0,0,0,0,0,0,0,0,0,0,0,192,193,61,96,0,12,0,0,0,0,0,0,0,0,0,0,144,64,48, + 0,0,12,0,0,0,0,0,0,0,0,0,0,0,30,32,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,4,92,0,0,0, + 0,0,0,0,0,0,0,0,242,7,128,127,0,0,0,0,0,0,0,0,0,0,0,0,242,27,0,63,0,0,0,0,0,0, + 0,0,0,3,0,0,160,2,0,0,0,0,0,0,254,127,223,224,255,254,255,255,255,31,64,0,0,0, + 0,0,0,0,0,0,0,0,0,224,253,102,0,0,0,195,1,0,30,0,100,32,0,32,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,224,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 28,0,0,0,28,0,0,0,12,0,0,0,12,0,0,0,0,0,0,0,176,63,64,254,15,32,0,0,0,0,0,56, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,135,1,4, + 14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,1,0,0,0,0,0,0,64, + 127,229,31,248,159,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,0,208,23,4,0,0, + 0,0,248,15,0,3,0,0,0,60,11,0,0,0,0,0,0,64,163,3,0,0,0,0,0,0,240,207,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,247,255,253,33,16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,255,255,255,127,0,0,240,0,248,0,0,0,124,0,0,0,0,0,0,31, + 252,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,3,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,6,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,247,63,0,0,0,128,0,0,0,0,0, + 0,0,0,0,0,3,0,68,8,0,0,96,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,255, + 255,3,0,0,0,0,0,192,63,0,0,128,255,3,0,0,0,0,0,7,0,0,0,0,0,200,19,0,0,0,0,0,0, + 0,0,0,0,0,0,0,126,102,0,8,16,0,0,0,0,0,0,0,0,0,0,0,0,157,193,2,0,0,0,0,48,64, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,33,0,0,0,0,0,64, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,32,110,240,0,0,0,0,0,135,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,255,127,0,0,0,0,0,0,0,3,0,0,0,0,0,120,38,0,0, + 0,0,0,0,0,0,7,0,0,0,128,239,31,0,0,0,0,0,0,0,0,0,3,0,0,0,0,0,192,127,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,40,191,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,128,7,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,128,3,248,255,231,15,0,0,0,60,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 28,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ) + val wtable = Array[Int]( + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,18,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,19,16,16,16,16,16,16,16,16,16,16,20,21,22,23,24,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,25, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,26,16,16,16,16,27,16,16,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17, + 17,17,17,17,17,17,17,28,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,17,17,16,16,16,29,30,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,31,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16,16, + 16,16,16,16,32,16,16,16,16,16,16,16,16,16,16,16,16,16,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0, + 0,248,0,0,0,0,0,0,0,0,0,0,252,0,0,0,0,0,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,251,255,255,255, + 255,255,255,255,255,255,255,15,0,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,63,0,0,0,255,15, + 255,255,255,255,255,255,255,127,254,255,255,255,255,255,255,255,255,255,127, + 254,255,255,255,255,255,255,255,255,255,255,255,255,224,255,255,255,255,63, + 254,255,255,255,255,255,255,255,255,255,255,127,255,255,255,255,255,7,255,255, + 255,255,15,0,255,255,255,255,255,127,255,255,255,255,255,0,255,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,127,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,255,255, + 255,255,255,255,255,255,31,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255, + 255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,15,0,255, + 255,127,248,255,255,255,255,255,15,0,0,255,3,0,0,255,255,255,255,247,255,127, + 15,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,254,255,255,255,255,255,255,255,255, + 255,255,255,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,3,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,0,255,255,255,255,255,7,255,1,3,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 + ) + def c_wcwidth(charCode: Int): Int = { + if (charCode < 0xFF) { + if (((charCode + 1) & 0x7F) >= 0x21) 1 + else if (charCode > 0) -1 + else 0 + } + else if ((charCode & 0xfffeffff) < 0xfffe) { + if (((table(table(charCode >> 8) * 32 + ((charCode & 0xFF) >> 3)) >> (charCode & 7)) & 1) == 1) 0 + else if (((wtable(wtable(charCode >> 8) * 32 + ((charCode & 0xFF) >> 3)) >> (charCode & 7)) & 1) == 1) 2 + else 1 + } + else if ((charCode & 0xfffe) == 0xfffe) -1 + else if ((charCode - 0x20000) < 0x20000) 2 + else if ((charCode == 0xe0001) || ((charCode - 0xe0020) < 0x5f) || ((charCode - 0xe0100) < 0xef)) 0 + else 1 + } + OpenComputers.log.info("Initializing unicode wcwidth.") + for (i <- 0 until codepoint_limit) { + if (c_wcwidth(i) == 2) + defined_double_wide += i + } + try { + OpenComputers.log.info("Initializing font glyph widths.") + val font = FontUtils.getClass.getResourceAsStream("/assets/opencomputers/font.hex") + try { + var line: String = null + val input = new BufferedReader(new InputStreamReader(font, StandardCharsets.UTF_8)) + while ({line = input.readLine; line != null}) { + val info = line.split(":") + val charCode = Integer.parseInt(info(0), 16) + if (charCode >= 0 && charCode < codepoint_limit) { + info(1).trim.length match { + case 64 => defined_double_wide += charCode + case 32 => defined_double_wide -= charCode + case n => OpenComputers.log.warn(s"Invalid glyph size detected in font.hex. Expected 64 or 32, got: $n") + } + } else { + OpenComputers.log.warn(f"Invalid glyph char code detected in font.hex. Expected 0<= charCode <$codepoint_limit%X, got: $charCode%X") + } + } + } finally { + try { + font.close() + } catch { + case ex: Throwable => OpenComputers.log.error(s"Error closing font.hex: $ex") + } + } + } catch { + case ex: Throwable => OpenComputers.log.error(s"Error parsing glyphs to determine widths: $ex") + } + OpenComputers.log.info("glyph width ready.") + } }