unicode stuff for psf rendering
make silly keyboard app
This commit is contained in:
parent
086948d47a
commit
664334fd00
312
Cargo.lock
generated
312
Cargo.lock
generated
|
@ -97,9 +97,9 @@ checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b"
|
|||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.1.34"
|
||||
version = "1.1.36"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67b9470d453346108f93a59222a9a1a5724db32d0a4727b7ab7ace4b4d822dc9"
|
||||
checksum = "baee610e9452a8f6f0a1b6194ec09ff9e2d85dea54432acdae41aa0761c95d70"
|
||||
dependencies = [
|
||||
"shlex",
|
||||
]
|
||||
|
@ -173,6 +173,17 @@ dependencies = [
|
|||
"logos",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "displaydoc"
|
||||
version = "0.2.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "equivalent"
|
||||
version = "1.0.1"
|
||||
|
@ -241,9 +252,9 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
|
|||
|
||||
[[package]]
|
||||
name = "hashbrown"
|
||||
version = "0.15.0"
|
||||
version = "0.15.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e087f84d4f86bf4b218b927129862374b72199ae7d8657835f1e89000eea4fb"
|
||||
checksum = "3a9bfc1af68b1726ea47d3d5109de126281def866b33970e10fbab11b5dafab3"
|
||||
dependencies = [
|
||||
"allocator-api2",
|
||||
"equivalent",
|
||||
|
@ -253,14 +264,14 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "hbbytecode"
|
||||
version = "0.1.0"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#e8f1d2af8ca7520bbb695dcaf1029a348f29592e"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#87cb77a553d68d45c4ade7a71cae5a56edcf686b"
|
||||
|
||||
[[package]]
|
||||
name = "hblang"
|
||||
version = "0.1.0"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#e8f1d2af8ca7520bbb695dcaf1029a348f29592e"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#87cb77a553d68d45c4ade7a71cae5a56edcf686b"
|
||||
dependencies = [
|
||||
"hashbrown 0.15.0",
|
||||
"hashbrown 0.15.1",
|
||||
"hbbytecode",
|
||||
"hbvm",
|
||||
"log",
|
||||
|
@ -270,7 +281,7 @@ dependencies = [
|
|||
[[package]]
|
||||
name = "hbvm"
|
||||
version = "0.1.0"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#e8f1d2af8ca7520bbb695dcaf1029a348f29592e"
|
||||
source = "git+https://git.ablecorp.us/AbleOS/holey-bytes.git#87cb77a553d68d45c4ade7a71cae5a56edcf686b"
|
||||
dependencies = [
|
||||
"hbbytecode",
|
||||
]
|
||||
|
@ -299,13 +310,142 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "0.5.0"
|
||||
name = "icu_collections"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6"
|
||||
checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526"
|
||||
dependencies = [
|
||||
"unicode-bidi",
|
||||
"unicode-normalization",
|
||||
"displaydoc",
|
||||
"yoke",
|
||||
"zerofrom",
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "icu_locid"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "13acbb8371917fc971be86fc8057c41a64b521c184808a698c02acc242dbf637"
|
||||
dependencies = [
|
||||
"displaydoc",
|
||||
"litemap",
|
||||
"tinystr",
|
||||
"writeable",
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "icu_locid_transform"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "01d11ac35de8e40fdeda00d9e1e9d92525f3f9d887cdd7aa81d727596788b54e"
|
||||
dependencies = [
|
||||
"displaydoc",
|
||||
"icu_locid",
|
||||
"icu_locid_transform_data",
|
||||
"icu_provider",
|
||||
"tinystr",
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "icu_locid_transform_data"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fdc8ff3388f852bede6b579ad4e978ab004f139284d7b28715f773507b946f6e"
|
||||
|
||||
[[package]]
|
||||
name = "icu_normalizer"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f"
|
||||
dependencies = [
|
||||
"displaydoc",
|
||||
"icu_collections",
|
||||
"icu_normalizer_data",
|
||||
"icu_properties",
|
||||
"icu_provider",
|
||||
"smallvec",
|
||||
"utf16_iter",
|
||||
"utf8_iter",
|
||||
"write16",
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "icu_normalizer_data"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f8cafbf7aa791e9b22bec55a167906f9e1215fd475cd22adfcf660e03e989516"
|
||||
|
||||
[[package]]
|
||||
name = "icu_properties"
|
||||
version = "1.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5"
|
||||
dependencies = [
|
||||
"displaydoc",
|
||||
"icu_collections",
|
||||
"icu_locid_transform",
|
||||
"icu_properties_data",
|
||||
"icu_provider",
|
||||
"tinystr",
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "icu_properties_data"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "67a8effbc3dd3e4ba1afa8ad918d5684b8868b3b26500753effea8d2eed19569"
|
||||
|
||||
[[package]]
|
||||
name = "icu_provider"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6ed421c8a8ef78d3e2dbc98a973be2f3770cb42b606e3ab18d6237c4dfde68d9"
|
||||
dependencies = [
|
||||
"displaydoc",
|
||||
"icu_locid",
|
||||
"icu_provider_macros",
|
||||
"stable_deref_trait",
|
||||
"tinystr",
|
||||
"writeable",
|
||||
"yoke",
|
||||
"zerofrom",
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "icu_provider_macros"
|
||||
version = "1.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna"
|
||||
version = "1.0.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
|
||||
dependencies = [
|
||||
"idna_adapter",
|
||||
"smallvec",
|
||||
"utf8_iter",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "idna_adapter"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71"
|
||||
dependencies = [
|
||||
"icu_normalizer",
|
||||
"icu_properties",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -315,7 +455,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "707907fe3c25f5424cce2cb7e1cbcafee6bdbe735ca90ef77c29e84591e5b9da"
|
||||
dependencies = [
|
||||
"equivalent",
|
||||
"hashbrown 0.15.0",
|
||||
"hashbrown 0.15.1",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -334,7 +474,7 @@ dependencies = [
|
|||
"aarch64-cpu",
|
||||
"crossbeam-queue",
|
||||
"derive_more",
|
||||
"hashbrown 0.15.0",
|
||||
"hashbrown 0.15.1",
|
||||
"hbvm",
|
||||
"limine",
|
||||
"log",
|
||||
|
@ -366,6 +506,12 @@ version = "0.1.12"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "02034f8f6b3e7bf050f310fbaf6db0018b8e54b75598d0a4c97172054752fede"
|
||||
|
||||
[[package]]
|
||||
name = "litemap"
|
||||
version = "0.7.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
version = "0.4.12"
|
||||
|
@ -663,6 +809,12 @@ dependencies = [
|
|||
"lock_api",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "stable_deref_trait"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3"
|
||||
|
||||
[[package]]
|
||||
name = "str-reader"
|
||||
version = "0.1.2"
|
||||
|
@ -687,19 +839,25 @@ dependencies = [
|
|||
]
|
||||
|
||||
[[package]]
|
||||
name = "tinyvec"
|
||||
version = "1.8.0"
|
||||
name = "synstructure"
|
||||
version = "0.13.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
|
||||
checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971"
|
||||
dependencies = [
|
||||
"tinyvec_macros",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tinyvec_macros"
|
||||
version = "0.1.1"
|
||||
name = "tinystr"
|
||||
version = "0.7.6"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
||||
checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f"
|
||||
dependencies = [
|
||||
"displaydoc",
|
||||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tock-registers"
|
||||
|
@ -752,27 +910,12 @@ dependencies = [
|
|||
"x86",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-bidi"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-normalization"
|
||||
version = "0.1.24"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5033c97c4262335cded6d6fc3e5c18ab755e1a3dc96376350f3d8e9f009ad956"
|
||||
dependencies = [
|
||||
"tinyvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-xid"
|
||||
version = "0.2.6"
|
||||
|
@ -802,15 +945,27 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "url"
|
||||
version = "2.5.2"
|
||||
version = "2.5.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "22784dbdf76fdde8af1aeda5622b546b422b6fc585325248a2bf9f5e41e94d6c"
|
||||
checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada"
|
||||
dependencies = [
|
||||
"form_urlencoded",
|
||||
"idna",
|
||||
"percent-encoding",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "utf16_iter"
|
||||
version = "1.0.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246"
|
||||
|
||||
[[package]]
|
||||
name = "utf8_iter"
|
||||
version = "1.0.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
|
||||
|
||||
[[package]]
|
||||
name = "versioning"
|
||||
version = "0.1.3"
|
||||
|
@ -986,6 +1141,18 @@ dependencies = [
|
|||
"memchr",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "write16"
|
||||
version = "1.0.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936"
|
||||
|
||||
[[package]]
|
||||
name = "writeable"
|
||||
version = "0.5.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
|
||||
|
||||
[[package]]
|
||||
name = "x2apic"
|
||||
version = "0.4.3"
|
||||
|
@ -1042,8 +1209,75 @@ dependencies = [
|
|||
"serde",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "yoke"
|
||||
version = "0.7.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"stable_deref_trait",
|
||||
"yoke-derive",
|
||||
"zerofrom",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "yoke-derive"
|
||||
version = "0.7.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"synstructure",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerofrom"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55"
|
||||
dependencies = [
|
||||
"zerofrom-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerofrom-derive"
|
||||
version = "0.1.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
"synstructure",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zeroize"
|
||||
version = "1.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde"
|
||||
|
||||
[[package]]
|
||||
name = "zerovec"
|
||||
version = "0.10.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079"
|
||||
dependencies = [
|
||||
"yoke",
|
||||
"zerofrom",
|
||||
"zerovec-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerovec-derive"
|
||||
version = "0.10.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
.{math, memory, dt} := @use("../../stn/src/lib.hb");
|
||||
.{Color, text} := @use("lib.hb");
|
||||
.{get_glyph, Font} := text;
|
||||
.{get_glyph, get_glyph_unicode, Font, UNC_TABLE_SIZE} := text;
|
||||
.{Vec2} := math
|
||||
|
||||
// safety: don't use before init() or you will get a memory access violation
|
||||
|
@ -266,29 +266,90 @@ put_text := fn(surface: Surface, font: Font, pos: Vec2(uint), color: Color, str:
|
|||
current_char := str
|
||||
|
||||
loop if *current_char == 0 break else {
|
||||
if *current_char == 10 {
|
||||
cursor.x = pos.x
|
||||
cursor.y += font.height + font.line_gap
|
||||
glyph_data := memory.dangling(^u8)
|
||||
|
||||
if font.unicode != null {
|
||||
code_point := @as(uint, 0)
|
||||
first_byte := *current_char
|
||||
num_bytes := 1
|
||||
|
||||
if (first_byte & 0x80) == 0 {
|
||||
code_point = first_byte
|
||||
} else if (first_byte & 0xE0) == 0xC0 {
|
||||
num_bytes = 2
|
||||
code_point = first_byte & 0x1F
|
||||
} else if (first_byte & 0xF0) == 0xE0 {
|
||||
num_bytes = 3
|
||||
code_point = first_byte & 0xF
|
||||
} else if (first_byte & 0xF8) == 0xF0 {
|
||||
// handle later
|
||||
current_char += 1
|
||||
continue
|
||||
} else {
|
||||
current_char += 1
|
||||
continue
|
||||
}
|
||||
|
||||
valid_sequence := true
|
||||
i := 1
|
||||
loop if i >= num_bytes break else {
|
||||
current_char += 1
|
||||
// have to check twice due to odd compiler bug...?
|
||||
if *current_char == 0 | (*current_char & 0xC0) != 0x80 {
|
||||
valid_sequence = false
|
||||
}
|
||||
if valid_sequence == false {
|
||||
break
|
||||
}
|
||||
code_point = code_point << 6 | *current_char & 0x3F
|
||||
i += 1
|
||||
}
|
||||
|
||||
if valid_sequence == false {
|
||||
current_char += 1
|
||||
continue
|
||||
}
|
||||
|
||||
current_char += 1
|
||||
|
||||
if code_point == 10 {
|
||||
cursor.x = pos.x
|
||||
cursor.y += font.height + font.line_gap
|
||||
continue
|
||||
}
|
||||
|
||||
if code_point < UNC_TABLE_SIZE {
|
||||
glyph_index := *(font.unicode + code_point)
|
||||
|
||||
if glyph_index == 0xFFFF {
|
||||
continue
|
||||
}
|
||||
glyph_data = font.data + glyph_index * font.bytes_per_glyph
|
||||
} else {
|
||||
continue
|
||||
}
|
||||
} else {
|
||||
if *current_char > font.num_glyphs {
|
||||
continue
|
||||
}
|
||||
glyph_data = @inline(get_glyph, font, *current_char)
|
||||
if *current_char == 10 {
|
||||
cursor.x = pos.x
|
||||
cursor.y += font.height + font.line_gap
|
||||
current_char += 1
|
||||
continue
|
||||
}
|
||||
current_char += 1
|
||||
continue
|
||||
}
|
||||
|
||||
glyph_data := @inline(get_glyph, font, @intcast(*current_char))
|
||||
// ! cool null check don't disable :dead:
|
||||
// !! i disabled the cool null check because compiler
|
||||
// if glyph_data == null {
|
||||
// current_char += 1
|
||||
// continue
|
||||
// }
|
||||
if cursor.y + font.height > surface.height break
|
||||
|
||||
if cursor.x % surface.width + font.width >= surface.width {
|
||||
cursor.x = pos.x
|
||||
cursor.y += font.height + font.line_gap
|
||||
}
|
||||
if cursor.y + font.height > surface.height break
|
||||
|
||||
dest := @inline(indexptr, surface, cursor.x, cursor.y)
|
||||
src := glyph_data
|
||||
rows_remaining := font.height
|
||||
|
||||
loop if rows_remaining == 0 break else {
|
||||
|
@ -303,7 +364,7 @@ put_text := fn(surface: Surface, font: Font, pos: Vec2(uint), color: Color, str:
|
|||
}
|
||||
pixel_dest += 1
|
||||
mask >>= 1
|
||||
if mask == 0 {
|
||||
if mask == 0 & bits_remaining > 0 {
|
||||
glyph_data += 1
|
||||
byte = *glyph_data
|
||||
mask = 0x80
|
||||
|
@ -311,13 +372,14 @@ put_text := fn(surface: Surface, font: Font, pos: Vec2(uint), color: Color, str:
|
|||
bits_remaining -= 1
|
||||
}
|
||||
|
||||
glyph_data += 1
|
||||
if mask != 0x80 {
|
||||
glyph_data += 1
|
||||
}
|
||||
dest += surface.width
|
||||
rows_remaining -= 1
|
||||
}
|
||||
|
||||
cursor.x += font.width + font.char_gap
|
||||
current_char += 1
|
||||
}
|
||||
|
||||
return
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
.{log} := @use("../../stn/src/lib.hb")
|
||||
.{log, memory} := @use("../../stn/src/lib.hb")
|
||||
|
||||
PSF1Header := packed struct {
|
||||
magic: u16,
|
||||
|
@ -23,9 +23,9 @@ Font := struct {
|
|||
height: uint,
|
||||
num_glyphs: uint,
|
||||
bytes_per_glyph: uint,
|
||||
has_unicode_table: bool,
|
||||
line_gap: uint,
|
||||
char_gap: uint,
|
||||
unicode: ?^u16,
|
||||
}
|
||||
|
||||
font_from_psf1 := fn(psf: ^u8): ?Font {
|
||||
|
@ -43,13 +43,13 @@ font_from_psf1 := fn(psf: ^u8): ?Font {
|
|||
header.character_size,
|
||||
256,
|
||||
header.character_size,
|
||||
false,
|
||||
0,
|
||||
0,
|
||||
null,
|
||||
)
|
||||
}
|
||||
|
||||
font_from_psf2 := fn(psf: ^u8): ?Font {
|
||||
font_from_psf2 := fn(psf: ^u8, unicode: bool): ?Font {
|
||||
header := @as(^PSF2Header, @bitcast(psf))
|
||||
if header.magic != 0x864AB572 {
|
||||
log.error("failed to load psf font: not a psf2 font, idiot\0")
|
||||
|
@ -58,18 +58,105 @@ font_from_psf2 := fn(psf: ^u8): ?Font {
|
|||
|
||||
psf += header.header_size
|
||||
|
||||
return .(
|
||||
font := Font.(
|
||||
psf,
|
||||
header.width,
|
||||
header.height,
|
||||
header.num_glyph,
|
||||
header.bytes_per_glyph,
|
||||
(header.flags & 1) != 0,
|
||||
0,
|
||||
0,
|
||||
null,
|
||||
)
|
||||
if (header.flags & 1) != 0 & unicode {
|
||||
init_unicode(&font)
|
||||
}
|
||||
return font
|
||||
}
|
||||
|
||||
get_glyph := fn(font: Font, index: uint): ^u8 {
|
||||
return font.data + index * font.bytes_per_glyph
|
||||
get_glyph := fn(font: Font, index: u8): ^u8 {
|
||||
return font.data + @as(uint, index) * font.bytes_per_glyph
|
||||
}
|
||||
|
||||
UNC_TABLE_SIZE := 1 << 16
|
||||
|
||||
init_unicode := fn(font: ^Font): void {
|
||||
font.unicode = memory.alloc(u16, UNC_TABLE_SIZE)
|
||||
|
||||
@inline(memory.set, u16, &0xFFFF, font.unicode, UNC_TABLE_SIZE)
|
||||
|
||||
table := font.data + font.num_glyphs * font.bytes_per_glyph
|
||||
curr_glyph := @as(u16, 0)
|
||||
|
||||
loop if curr_glyph >= font.num_glyphs break else {
|
||||
loop {
|
||||
byte := *table
|
||||
table += 1
|
||||
|
||||
if byte == 0xFF break
|
||||
if byte == 0xFE {
|
||||
continue
|
||||
}
|
||||
|
||||
unicode := @as(uint, 0)
|
||||
bytes_to_read := @as(uint, 1)
|
||||
|
||||
if (byte & 0x80) == 0 {
|
||||
unicode = byte
|
||||
} else if (byte & 0xE0) == 0xC0 {
|
||||
unicode = byte & 0x1F
|
||||
bytes_to_read = 2
|
||||
} else if (byte & 0xF0) == 0xE0 {
|
||||
unicode = byte & 0xF
|
||||
bytes_to_read = 3
|
||||
} else if (byte & 0xF8) == 0xF0 {
|
||||
unicode = byte & 0x7
|
||||
bytes_to_read = 4
|
||||
} else {
|
||||
continue
|
||||
}
|
||||
|
||||
valid := true
|
||||
loop if bytes_to_read <= 1 break else {
|
||||
next_byte := *table
|
||||
if (next_byte & 0xC0) != 0x80 {
|
||||
valid = false
|
||||
}
|
||||
if valid == false {
|
||||
break
|
||||
}
|
||||
unicode = unicode << 6 | next_byte & 0x3F
|
||||
table += 1
|
||||
bytes_to_read -= 1
|
||||
}
|
||||
|
||||
if valid == false continue
|
||||
|
||||
if bytes_to_read == 4 {
|
||||
if unicode < 0x10000 | unicode > 0x10FFFF continue
|
||||
|
||||
if unicode <= 0xFFFF {
|
||||
if unicode < UNC_TABLE_SIZE {
|
||||
*(@unwrap(font.unicode) + unicode) = curr_glyph
|
||||
}
|
||||
} else {
|
||||
unicode -= 0x10000
|
||||
high_surrogate := 0xD800 | unicode >> 10 & 0x3FF
|
||||
low_surrogate := 0xDC00 | unicode & 0x3FF
|
||||
|
||||
if high_surrogate < UNC_TABLE_SIZE {
|
||||
*(@unwrap(font.unicode) + high_surrogate) = curr_glyph
|
||||
}
|
||||
if low_surrogate < UNC_TABLE_SIZE {
|
||||
*(@unwrap(font.unicode) + low_surrogate) = curr_glyph
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if unicode < UNC_TABLE_SIZE {
|
||||
*(@unwrap(font.unicode) + unicode) = curr_glyph
|
||||
}
|
||||
}
|
||||
}
|
||||
curr_glyph += 1
|
||||
}
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
string := @use("string.hb")
|
||||
|
||||
recv := fn($Expr: type, buffer_id: int, memory_map_location: ^u8): ?^Expr {
|
||||
recv := fn($Expr: type, buffer_id: int, memory_map_location: ^u8): void {
|
||||
return @eca(4, buffer_id, memory_map_location, @sizeof(Expr))
|
||||
}
|
||||
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
length := fn(ptr: ^u8): uint {
|
||||
len := 0
|
||||
loop if *(ptr + len) == 0 return len else len += 1
|
||||
|
|
|
@ -1,37 +1,163 @@
|
|||
.{memory, log, string} := @use("../../../../libraries/stn/src/lib.hb")
|
||||
render := @use("../../../../libraries/render/src/lib.hb")
|
||||
|
||||
/* expected result:
|
||||
extended unicode test */
|
||||
trash notepad app, colours should change with r,g,b,w keys */
|
||||
|
||||
psf := @embed("../../../../consolefonts/tamsyn/10x20r.psf")
|
||||
|
||||
send_byte := fn(byte: u8): u8 {
|
||||
memory.outb(96, byte)
|
||||
return memory.inb(96)
|
||||
}
|
||||
|
||||
example := fn(): void {
|
||||
screen := render.init(false)
|
||||
font := render.text.font_from_psf2(@bitcast(&psf))
|
||||
screen := render.init(true)
|
||||
font := render.text.font_from_psf2(@bitcast(&psf), false)
|
||||
|
||||
str := "Extended unicode test:
|
||||
msg := "ableboard (tm) (patent pending):\n\0"
|
||||
msg_len := string.length(msg)
|
||||
|
||||
ABCDEFGHIJKLMNOPQRSTUVWXYZ
|
||||
abcdefghijklmnopqrstuvwxyz
|
||||
0123456789
|
||||
!\"#$%&'()*+,-./:;<=>?@[]^_`{|}~
|
||||
ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞß
|
||||
àáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿ
|
||||
ĀāĂ㥹ĆćĈĉĊċČčĎďĐđĒēĔĕĖėĘęĚěĜĝĞğ
|
||||
ĠġĢģĤĥĦħĨĩĪīĬĭĮįİıIJijĴĵĶķĸĹĺĻļĽľĿ
|
||||
„‟†‡•‣․‥…‧
|
||||
₠₡₢₣₤₥₦₧₨₩₪₫€₭₮₯₰₱₲₳₴₵₶₷₸₹₺₻₼₽₾₿
|
||||
∀∁∂∃∄∅∆∇∈∉∊∋∌∍∎∏∐∑−∓∔∕∖∗∘∙√∛∜∝∞∟
|
||||
─│┌┐└┘├┤┬┴┼╋╭╮╯╰╱╲╳╴╵╶╷╸╹╺╻╼╽╾╿
|
||||
▀▁▂▃▄▅▆▇█▉▊▋▌▍▎▏▐░▒▓▔▕▖▗▘▙▚▛▜▝▞▟
|
||||
■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯▰▱▲△▴▵▶▷▸▹►▻▼▽▾▿◀◁◂◃◄◅◆◇◈◉◊○
|
||||
←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻
|
||||
、。〃〄々〆〇〈〉《》「」『』【】〒〓〔〕〖〗〘〙〚〛〜〝〞〟
|
||||
✀✁✂✃✄✅✆✇✈✉✊✋✌✍✎✏✐✑✒✓✔✕✖✗✘✙✚✛✜✝✞✟
|
||||
✠✡✢✣✤✥✦✧✨✩✪✫✬✭✮✯✰✱✲✳✴✵✶✷✸✹✺✻✼✽✾✿\0"
|
||||
buf := memory.alloc(u8, 4096)
|
||||
|
||||
@inline(memory.copy, u8, msg, buf, msg_len)
|
||||
cursor := buf + msg_len
|
||||
|
||||
if font == null {
|
||||
return
|
||||
}
|
||||
|
||||
_ = send_byte(238)
|
||||
log.info("PS/2 Driver Loaded\0")
|
||||
if send_byte(238) == 238 {
|
||||
log.info("PS/2 Keyboard Echoed\0")
|
||||
}
|
||||
if send_byte(244) == 250 {
|
||||
log.info("Enabled scanning\0")
|
||||
}
|
||||
|
||||
color := render.white
|
||||
|
||||
prev_input := 250
|
||||
|
||||
loop {
|
||||
input := memory.inb(96)
|
||||
if input != prev_input {
|
||||
prev_input = input
|
||||
char := map_keys(input)
|
||||
if char != 0 {
|
||||
if char == 0xA {
|
||||
*cursor = 32
|
||||
cursor += 1;
|
||||
*cursor = 92
|
||||
cursor += 1
|
||||
} else if char == 0x72 {
|
||||
color = render.red
|
||||
} else if char == 0x67 {
|
||||
color = render.green
|
||||
} else if char == 0x62 {
|
||||
color = render.blue
|
||||
} else if char == 0x77 {
|
||||
color = render.white
|
||||
};
|
||||
*cursor = char
|
||||
cursor += 1
|
||||
}
|
||||
}
|
||||
render.clear(screen, render.black)
|
||||
render.put_text(screen, font, .(0, 0), color, buf)
|
||||
render.sync(screen)
|
||||
}
|
||||
|
||||
render.clear(screen, render.black)
|
||||
render.put_text(screen, @unwrap(font), .(0, 0), render.white, str)
|
||||
render.sync(screen)
|
||||
return
|
||||
}
|
||||
|
||||
map_keys := fn(inp: u8): u8 {
|
||||
if inp == 0x29 {
|
||||
return 0x7E
|
||||
} else if inp == 0x2 {
|
||||
return 0x31
|
||||
} else if inp == 0x3 {
|
||||
return 0x32
|
||||
} else if inp == 0x4 {
|
||||
return 0x33
|
||||
} else if inp == 0x5 {
|
||||
return 0x34
|
||||
} else if inp == 0x6 {
|
||||
return 0x35
|
||||
} else if inp == 0x7 {
|
||||
return 0x36
|
||||
} else if inp == 0x8 {
|
||||
return 0x37
|
||||
} else if inp == 0x9 {
|
||||
return 0x38
|
||||
} else if inp == 0xA {
|
||||
return 0x39
|
||||
} else if inp == 0xB {
|
||||
return 0x30
|
||||
} else if inp == 0xC {
|
||||
return 0x2D
|
||||
} else if inp == 0xD {
|
||||
return 0x3D
|
||||
} else if inp == 0x1C {
|
||||
return 0xA
|
||||
} else if inp == 0x10 {
|
||||
return 0x71
|
||||
} else if inp == 0x11 {
|
||||
return 0x77
|
||||
} else if inp == 0x12 {
|
||||
return 0x65
|
||||
} else if inp == 0x13 {
|
||||
return 0x72
|
||||
} else if inp == 0x14 {
|
||||
return 0x74
|
||||
} else if inp == 0x15 {
|
||||
return 0x79
|
||||
} else if inp == 0x16 {
|
||||
return 0x75
|
||||
} else if inp == 0x17 {
|
||||
return 0x69
|
||||
} else if inp == 0x18 {
|
||||
return 0x6F
|
||||
} else if inp == 0x19 {
|
||||
return 0x70
|
||||
} else if inp == 0x1E {
|
||||
return 0x61
|
||||
} else if inp == 0x1F {
|
||||
return 0x73
|
||||
} else if inp == 0x20 {
|
||||
return 0x64
|
||||
} else if inp == 0x21 {
|
||||
return 0x66
|
||||
} else if inp == 0x22 {
|
||||
return 0x67
|
||||
} else if inp == 0x23 {
|
||||
return 0x68
|
||||
} else if inp == 0x24 {
|
||||
return 0x6A
|
||||
} else if inp == 0x25 {
|
||||
return 0x6B
|
||||
} else if inp == 0x26 {
|
||||
return 0x6C
|
||||
} else if inp == 0x2C {
|
||||
return 0x7A
|
||||
} else if inp == 0x2D {
|
||||
return 0x78
|
||||
} else if inp == 0x2E {
|
||||
return 0x63
|
||||
} else if inp == 0x2F {
|
||||
return 0x76
|
||||
} else if inp == 0x30 {
|
||||
return 0x62
|
||||
} else if inp == 0x31 {
|
||||
return 0x6E
|
||||
} else if inp == 0x32 {
|
||||
return 0x6D
|
||||
} else if inp == 0x2B {
|
||||
return 0x5C
|
||||
} else if inp == 0x39 {
|
||||
return 32
|
||||
} else {
|
||||
return 0
|
||||
}
|
||||
}
|
|
@ -28,8 +28,8 @@ resolution = "1024x768x24"
|
|||
# [boot.limine.ableos.modules.diskio_driver]
|
||||
# path = "boot:///diskio_driver.hbf"
|
||||
|
||||
# [boot.limine.ableos.modules.render_example]
|
||||
# path = "boot:///render_example.hbf"
|
||||
[boot.limine.ableos.modules.render_example]
|
||||
path = "boot:///render_example.hbf"
|
||||
|
||||
# [boot.limine.ableos.modules.serial_driver]
|
||||
# path = "boot:///serial_driver.hbf"
|
||||
|
@ -58,8 +58,8 @@ path = "boot:///ps2_keyboard_driver.hbf"
|
|||
# [boot.limine.ableos.modules.pumpkin_print]
|
||||
# path = "boot:///pumpkin_print.hbf"
|
||||
|
||||
[boot.limine.ableos.modules.ps2_mouse_driver]
|
||||
path = "boot:///ps2_mouse_driver.hbf"
|
||||
# [boot.limine.ableos.modules.ps2_mouse_driver]
|
||||
# path = "boot:///ps2_mouse_driver.hbf"
|
||||
|
||||
# [boot.limine.ableos.modules.app_bar]
|
||||
# path = "boot:///app_bar.hbf"
|
||||
|
|
Loading…
Reference in a new issue