xous-core/libs/blitstr2/codegen/config_editor.rb
bunnie 4477af6058 fix broken font rendering in rust 1.91
Rust 1.91 (or perhaps, more accurately llvm?) changed how link
ordering works.

Previously, modules would be linked in the order they were referenced
(e.g. pub mod b; pub mod a; would result in b being at a lower address
than a in the resulting binary).

However, apparently, this has changed and now someone in their
infinite wisdom decided that modules should be alphabetized before
linking.

I'm really not sure why the arbitrary ordering of the human alphabet
is superior to any other system, and also, if you really wanted
things alphabetized, you could just alphabetize them in your
reference order.

Previously the fonts were laid out in a way that tried to minimize
cache thrashing by co-locating certain sets of fonts together.

Now they are just sprayed around through the arbitrary and not
terribly useful permutation funtion of the english alphabet.

Rant off.

This changes the specification of the fonts in the code generator
to be in alphabetical order, making the screen once again legible.
2025-11-18 00:18:55 +08:00

364 lines
14 KiB
Ruby
Executable file
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/ruby
# coding: utf-8
# Copyright (c) 2022 Sam Blenny
# SPDX-License-Identifier: Apache-2.0 OR MIT
#
# Generate json config, index, and alias files for codegen. Resorting to this
# depth of meta-config feels a bit silly. But, working from ruby dictionaries
# allows for better commenting and the chance to avoid json syntax errors in
# manual edits. Ruby also has good library support for translating between
# Unicode Normalization Forms, which is useful for making alias lists.
#
# Usage:
#
# ruby config_editor.rb
#
require 'json'
config_outfile = "config.json"
latin_index_outfile = "src_data/latin_index.json"
config = {
comment: [
"Config for use with main.go. Before making changes here, see config_editor.rb. NOTE: the glyph set list MUST be alphabetized since Rust 1.91",
],
loadermod: [
"../../../../../loader/src/fonts.rs",
],
fontmap: [
"../../fontmap.rs",
],
glyphSets: [
{
name: "Bold",
sprites: "src_data/latin_bold.png", size: 15, cols: 16, gutter: 1, border: 1,
legal: "src_data/chicago_legal.txt",
index: latin_index_outfile,
indexType: "json-grid-coord",
glyphTrim: "proportional",
rustout: "../fonts/bold.rs",
loaderout: "../../../../../loader/src/fonts/bold.rs",
},
{
name: "Emoji",
sprites: "src_data/basic_emoji.png", size: 16, cols: 30, gutter: 2, border: 2,
legal: "src_data/basic_emoji_legal.txt",
index: "src_data/basic_emoji.codepoints",
indexType: "txt-row-major",
glyphTrim: "CJK",
rustout: "../fonts/emoji.rs",
loaderout: "../../../../../loader/src/fonts/emoji.rs",
},
{
name: "ja",
sprites: "src_data/Izumi16.png", size: 16, cols: 30, gutter: 2, border: 2,
legal: "src_data/izumi_legal.txt",
index: "src_data/Izumi16.codepoints",
indexType: "txt-row-major",
glyphTrim: "CJK",
rustout: "../fonts/ja.rs",
loaderout: "../../../../../loader/src/fonts/ja.rs",
},
{
name: "kr",
sprites: "src_data/neodgm.png", size: 16, cols: 30, gutter: 2, border: 2,
legal: "src_data/neodgm_legal.txt",
index: "src_data/neodgm.codepoints",
indexType: "txt-row-major",
glyphTrim: "CJK",
rustout: "../fonts/kr.rs",
loaderout: "../../../../../loader/src/fonts/kr.rs",
},
{
name: "Mono",
sprites: "src_data/latin_mono.png", size: 15, cols: 16, gutter: 1, border: 1,
legal: "src_data/courier_legal.txt",
index: latin_index_outfile,
indexType: "json-grid-coord",
glyphTrim: "monospace",
rustout: "../fonts/mono.rs",
loaderout: "../../../../../loader/src/fonts/mono.rs",
},
{
name: "Regular",
sprites: "src_data/latin_regular.png", size: 15, cols: 16, gutter: 1, border: 1,
legal: "src_data/geneva_legal.txt",
index: latin_index_outfile,
indexType: "json-grid-coord",
glyphTrim: "proportional",
rustout: "../fonts/regular.rs",
loaderout: "../../../../../loader/src/fonts/regular.rs",
},
{
name: "Small",
sprites: "src_data/latin_small.png", size: 12, cols: 16, gutter: 1, border: 1,
legal: "src_data/geneva_legal.txt",
index: latin_index_outfile,
indexType: "json-grid-coord",
glyphTrim: "proportional",
rustout: "../fonts/small.rs",
loaderout: "../../../../../loader/src/fonts/small.rs",
},
{
name: "Tall",
sprites: "src_data/latin_tall.png", size: 19, cols: 30, gutter: 1, border: 1,
legal: "src_data/helvetica_legal.txt",
index: latin_index_outfile,
indexType: "json-grid-coord",
glyphTrim: "proportional",
rustout: "../fonts/tall.rs",
loaderout: "../../../../../loader/src/fonts/tall.rs",
},
{
name: "zh",
sprites: "src_data/hanzi.png", size: 16, cols: 30, gutter: 2, border: 2,
legal: "src_data/hanzi_legal.txt",
index: "src_data/hanzi.codepoints",
indexType: "txt-row-major",
glyphTrim: "CJK",
rustout: "../fonts/zh.rs",
loaderout: "../../../../../loader/src/fonts/zh.rs",
},
]
}
latin_index = {
comment: [
"Before making changes here, see ../config_editor.rb.",
],
map: [
# Unicode Basic Latin block
{hex: "20", row: 0, col: 2, label: " "},
{hex: "21", row: 1, col: 2, label: "!"},
{hex: "22", row: 2, col: 2, label: "\""},
{hex: "23", row: 3, col: 2, label: "#"},
{hex: "24", row: 4, col: 2, label: "$"},
{hex: "25", row: 5, col: 2, label: "%"},
{hex: "26", row: 6, col: 2, label: "&"},
{hex: "27", row: 7, col: 2, label: "'"},
{hex: "28", row: 8, col: 2, label: "("},
{hex: "29", row: 9, col: 2, label: ")"},
{hex: "2A", row: 10, col: 2, label: "*"},
{hex: "2B", row: 11, col: 2, label: "+"},
{hex: "2C", row: 12, col: 2, label: ","},
{hex: "2D", row: 13, col: 2, label: "-"},
{hex: "2E", row: 14, col: 2, label: "."},
{hex: "2F", row: 15, col: 2, label: "/"},
{hex: "30", row: 0, col: 3, label: "0"},
{hex: "31", row: 1, col: 3, label: "1"},
{hex: "32", row: 2, col: 3, label: "2"},
{hex: "33", row: 3, col: 3, label: "3"},
{hex: "34", row: 4, col: 3, label: "4"},
{hex: "35", row: 5, col: 3, label: "5"},
{hex: "36", row: 6, col: 3, label: "6"},
{hex: "37", row: 7, col: 3, label: "7"},
{hex: "38", row: 8, col: 3, label: "8"},
{hex: "39", row: 9, col: 3, label: "9"},
{hex: "3A", row: 10, col: 3, label: ":"},
{hex: "3B", row: 11, col: 3, label: ";"},
{hex: "3C", row: 12, col: 3, label: "<"},
{hex: "3D", row: 13, col: 3, label: "="},
{hex: "3E", row: 14, col: 3, label: ">"},
{hex: "3F", row: 15, col: 3, label: "?"},
{hex: "40", row: 0, col: 4, label: "@"},
{hex: "41", row: 1, col: 4, label: "A"},
{hex: "42", row: 2, col: 4, label: "B"},
{hex: "43", row: 3, col: 4, label: "C"},
{hex: "44", row: 4, col: 4, label: "D"},
{hex: "45", row: 5, col: 4, label: "E"},
{hex: "46", row: 6, col: 4, label: "F"},
{hex: "47", row: 7, col: 4, label: "G"},
{hex: "48", row: 8, col: 4, label: "H"},
{hex: "49", row: 9, col: 4, label: "I"},
{hex: "4A", row: 10, col: 4, label: "J"},
{hex: "4B", row: 11, col: 4, label: "K"},
{hex: "4C", row: 12, col: 4, label: "L"},
{hex: "4D", row: 13, col: 4, label: "M"},
{hex: "4E", row: 14, col: 4, label: "N"},
{hex: "4F", row: 15, col: 4, label: "O"},
{hex: "50", row: 0, col: 5, label: "P"},
{hex: "51", row: 1, col: 5, label: "Q"},
{hex: "52", row: 2, col: 5, label: "R"},
{hex: "53", row: 3, col: 5, label: "S"},
{hex: "54", row: 4, col: 5, label: "T"},
{hex: "55", row: 5, col: 5, label: "U"},
{hex: "56", row: 6, col: 5, label: "V"},
{hex: "57", row: 7, col: 5, label: "W"},
{hex: "58", row: 8, col: 5, label: "X"},
{hex: "59", row: 9, col: 5, label: "Y"},
{hex: "5A", row: 10, col: 5, label: "Z"},
{hex: "5B", row: 11, col: 5, label: "["},
{hex: "5C", row: 12, col: 5, label: "\\"},
{hex: "5D", row: 13, col: 5, label: "]"},
{hex: "5E", row: 14, col: 5, label: "^"},
{hex: "5F", row: 15, col: 5, label: "_"},
{hex: "60", row: 0, col: 6, label: "`"},
{hex: "61", row: 1, col: 6, label: "a"},
{hex: "62", row: 2, col: 6, label: "b"},
{hex: "63", row: 3, col: 6, label: "c"},
{hex: "64", row: 4, col: 6, label: "d"},
{hex: "65", row: 5, col: 6, label: "e"},
{hex: "66", row: 6, col: 6, label: "f"},
{hex: "67", row: 7, col: 6, label: "g"},
{hex: "68", row: 8, col: 6, label: "h"},
{hex: "69", row: 9, col: 6, label: "i"},
{hex: "6A", row: 10, col: 6, label: "j"},
{hex: "6B", row: 11, col: 6, label: "k"},
{hex: "6C", row: 12, col: 6, label: "l"},
{hex: "6D", row: 13, col: 6, label: "m"},
{hex: "6E", row: 14, col: 6, label: "n"},
{hex: "6F", row: 15, col: 6, label: "o"},
{hex: "70", row: 0, col: 7, label: "p"},
{hex: "71", row: 1, col: 7, label: "q"},
{hex: "72", row: 2, col: 7, label: "r"},
{hex: "73", row: 3, col: 7, label: "s"},
{hex: "74", row: 4, col: 7, label: "t"},
{hex: "75", row: 5, col: 7, label: "u"},
{hex: "76", row: 6, col: 7, label: "v"},
{hex: "77", row: 7, col: 7, label: "w"},
{hex: "78", row: 8, col: 7, label: "x"},
{hex: "79", row: 9, col: 7, label: "y"},
{hex: "7A", row: 10, col: 7, label: "z"},
{hex: "7B", row: 11, col: 7, label: "{"},
{hex: "7C", row: 12, col: 7, label: "|"},
{hex: "7D", row: 13, col: 7, label: "}"},
{hex: "7E", row: 14, col: 7, label: "~"},
# Unicode Latin 1 block
{hex: "A0", row: 0, col: 2, label: "No-Break Space"},
{hex: "A1", row: 1, col: 12, label: "¡"},
{hex: "A2", row: 2, col: 10, label: "¢"},
{hex: "A3", row: 3, col: 10, label: "£"},
{hex: "A4", row: 15, col: 1, label: "¤"},
{hex: "A5", row: 4, col: 11, label: "¥"},
{hex: "A6", row: 15, col: 7, label: "¦"},
{hex: "A7", row: 4, col: 10, label: "§"},
{hex: "A8", row: 12, col: 10, label: "¨"},
{hex: "A9", row: 9, col: 10, label: "©"},
{hex: "AA", row: 11, col: 11, label: "ª"},
{hex: "AB", row: 7, col: 12, label: "«"},
{hex: "AC", row: 2, col: 12, label: "¬"},
{hex: "AD", row: 13, col: 2, label: "Soft Hyphen"},
{hex: "AE", row: 8, col: 10, label: "®"},
{hex: "AF", row: 8, col: 15, label: "¯ Macron"},
{hex: "B0", row: 1, col: 10, label: "° Degree Sign"},
{hex: "B1", row: 1, col: 11, label: "±"},
{hex: "B2", row: 3, col: 1, label: "²"},
{hex: "B3", row: 4, col: 1, label: "³"},
{hex: "B4", row: 11, col: 10, label: "´"},
{hex: "B5", row: 5, col: 11, label: "µ"},
{hex: "B6", row: 6, col: 10, label: ""},
{hex: "B7", row: 1, col: 14, label: "·"},
{hex: "B8", row: 12, col: 15, label: "¸ Cedillia"},
{hex: "B9", row: 2, col: 1, label: "¹"},
{hex: "BA", row: 12, col: 11, label: "º"},
{hex: "BB", row: 8, col: 12, label: "»"},
{hex: "BC", row: 5, col: 1, label: "¼"},
{hex: "BD", row: 6, col: 1, label: "½"},
{hex: "BE", row: 7, col: 1, label: "¾"},
{hex: "BF", row: 0, col: 12, label: "¿"},
{hex: "C0", row: 11, col: 12, label: "À"},
{hex: "C1", row: 7, col: 14, label: "Á"},
{hex: "C2", row: 5, col: 14, label: "Â"},
{hex: "C3", row: 12, col: 12, label: "Ã"},
{hex: "C4", row: 0, col: 8, label: "Ä"},
{hex: "C5", row: 1, col: 8, label: "Å"},
{hex: "C6", row: 14, col: 10, label: "Æ"},
{hex: "C7", row: 2, col: 8, label: "Ç"},
{hex: "C8", row: 9, col: 14, label: "È"},
{hex: "C9", row: 3, col: 8, label: "É"},
{hex: "CA", row: 6, col: 14, label: "Ê"},
{hex: "CB", row: 8, col: 14, label: "Ë"},
{hex: "CC", row: 13, col: 14, label: "Ì"},
{hex: "CD", row: 10, col: 14, label: "Í"},
{hex: "CE", row: 11, col: 14, label: "Î"},
{hex: "CF", row: 12, col: 14, label: "Ï"},
{hex: "D0", row: 8, col: 1, label: "Ð"},
{hex: "D1", row: 4, col: 8, label: "Ñ"},
{hex: "D2", row: 1, col: 15, label: "Ò"},
{hex: "D3", row: 14, col: 14, label: "Ó"},
{hex: "D4", row: 15, col: 14, label: "Ô"},
{hex: "D5", row: 13, col: 12, label: "Õ"},
{hex: "D6", row: 5, col: 8, label: "Ö"},
{hex: "D7", row: 9, col: 1, label: "× Multiplication Sign"},
{hex: "D8", row: 15, col: 10, label: "Ø"},
{hex: "D9", row: 4, col: 15, label: "Ù"},
{hex: "DA", row: 2, col: 15, label: "Ú"},
{hex: "DB", row: 3, col: 15, label: "Û"},
{hex: "DC", row: 6, col: 8, label: "Ü"},
{hex: "DD", row: 10, col: 1, label: "Ý"},
{hex: "DE", row: 11, col: 1, label: "Þ"},
{hex: "DF", row: 7, col: 10, label: "ß"},
{hex: "E0", row: 8, col: 8, label: "à"},
{hex: "E1", row: 7, col: 8, label: "á"},
{hex: "E2", row: 9, col: 8, label: "â"},
{hex: "E3", row: 11, col: 8, label: "ã"},
{hex: "E4", row: 10, col: 8, label: "ä"},
{hex: "E5", row: 12, col: 8, label: "å"},
{hex: "E6", row: 14, col: 11, label: "æ"},
{hex: "E7", row: 13, col: 8, label: "ç"},
{hex: "E8", row: 15, col: 8, label: "è"},
{hex: "E9", row: 14, col: 8, label: "é"},
{hex: "EA", row: 0, col: 9, label: "ê"},
{hex: "EB", row: 1, col: 9, label: "ë"},
{hex: "EC", row: 3, col: 9, label: "ì"},
{hex: "ED", row: 2, col: 9, label: "í"},
{hex: "EE", row: 4, col: 9, label: "î"},
{hex: "EF", row: 5, col: 9, label: "ï"},
{hex: "F0", row: 12, col: 1, label: "ð"},
{hex: "F1", row: 6, col: 9, label: "ñ"},
{hex: "F2", row: 8, col: 9, label: "ò"},
{hex: "F3", row: 7, col: 9, label: "ó"},
{hex: "F4", row: 9, col: 9, label: "ô"},
{hex: "F5", row: 11, col: 9, label: "õ"},
{hex: "F6", row: 10, col: 9, label: "ö"},
{hex: "F7", row: 6, col: 13, label: "÷"},
{hex: "F8", row: 15, col: 11, label: "ø"},
{hex: "F9", row: 13, col: 9, label: "ù"},
{hex: "FA", row: 12, col: 9, label: "ú"},
{hex: "FB", row: 14, col: 9, label: "û"},
{hex: "FC", row: 15, col: 9, label: "ü"},
{hex: "FD", row: 13, col: 1, label: "ý"},
{hex: "FE", row: 14, col: 1, label: "þ"},
{hex: "FF", row: 8, col: 13, label: "ÿ"},
# Unicode Latin Extended A block
{hex: "152", row: 14, col: 12, label: "Œ"},
{hex: "153", row: 15, col: 12, label: "œ"},
# Unicode General Punctuation block
{hex: "2018", row: 4, col: 13, label: "‘ Left Single Quotation Mark"},
{hex: "2019", row: 5, col: 13, label: "’ Right Single Quotation Mark"},
{hex: "201A", row: 2, col: 14, label: "‚ Single Low-9 Quotation Mark"},
{hex: "201B", row: 7, col: 11, label: "‛ Single High-Reversed-9 Quotation Mark"},
{hex: "201C", row: 2, col: 13, label: "“ Left Double Quotation Mark"},
{hex: "201D", row: 3, col: 13, label: "” Right Double Quotation Mark"},
{hex: "201E", row: 3, col: 14, label: "„ Double Low-9 Quotation Mark"},
{hex: "201F", row: 8, col: 11, label: "‟ Double High-Reversed-9 Quotation Mark"},
{hex: "2020", row: 0, col: 10, label: "†"},
{hex: "2021", row: 0, col: 14, label: "‡"},
{hex: "2022", row: 5, col: 10, label: "•"},
{hex: "2026", row: 9, col: 12, label: "…"},
# Unicode Currency Symbols block
{hex: "20AC", row: 11, col: 13, label: "€"},
# Unicode Specials Block
{hex: "FFFD", row: 0, col: 15, label: "<EFBFBD>"},
]
}
puts "Preparing to overwrite files..."
puts " #{config_outfile}"
puts " #{latin_index_outfile}"
print "Do you want to proceed? [y/N]: "
abort "Operation canceled" if !["y", "Y"].include? gets.chomp
puts "writing #{latin_index_outfile}"
File.open(latin_index_outfile, "w") {|f|
f.write JSON.generate(latin_index, {space: " ", object_nl: " ", array_nl: "\n"})
}
puts "writing #{config_outfile}"
File.open(config_outfile, "w") {|f|
f.puts JSON.pretty_generate(config)
}