add arabic test

Signed-off-by: Sean Cross <sean@xobs.io>
This commit is contained in:
Sean Cross 2019-11-21 15:16:52 +08:00
parent 4922d63c8c
commit e4cf2563be
4 changed files with 122 additions and 7 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
/target
**/*.rs.bk

99
Cargo.lock generated Normal file
View File

@ -0,0 +1,99 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
[[package]]
name = "approx"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"num-traits 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "arrayvec"
version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "autocfg"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "byteorder"
version = "1.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "fontdue"
version = "0.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"hashbrown 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "hashbrown"
version = "0.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "num-traits"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "ordered-float"
version = "1.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"num-traits 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rust-font-test"
version = "0.1.0"
dependencies = [
"fontdue 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
"rusttype 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)",
"stats_alloc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "rusttype"
version = "0.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"approx 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
"arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"ordered-float 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
"stb_truetype 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
]
[[package]]
name = "stats_alloc"
version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]]
name = "stb_truetype"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [
"byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
]
[metadata]
"checksum approx 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f0e60b75072ecd4168020818c0107f2857bb6c4e64252d8d3983f6263b40a5c3"
"checksum arrayvec 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cff77d8686867eceff3105329d4698d96c2391c176d5d03adc90c7389162b5b8"
"checksum autocfg 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "1d49d90015b3c36167a20fe2810c5cd875ad504b39cff3d4eae7977e6b7c1cb2"
"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
"checksum fontdue 0.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3ce5d972ee28d2830f868d3e1398721e0966a32113b888d8553712b50b1d03"
"checksum hashbrown 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e1de41fb8dba9714efd92241565cdff73f78508c95697dd56787d3cba27e2353"
"checksum num-traits 0.2.9 (registry+https://github.com/rust-lang/crates.io-index)" = "443c53b3c3531dfcbfa499d8893944db78474ad7a1d87fa2d94d1a2231693ac6"
"checksum ordered-float 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "18869315e81473c951eb56ad5558bbc56978562d3ecfb87abb7a1e944cea4518"
"checksum rusttype 0.8.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6fa38506b5cbf2fb67f915e2725cb5012f1b9a785b0ab55c4733acda5f6554ef"
"checksum stats_alloc 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "a260c96bf26273969f360c2fc2e2c7732acc2ce49d939c7243c7230c2ad179d0"
"checksum stb_truetype 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "824210d6fb52cbc3ad2545270ead6860c7311aa5450642b078da4515937b6f7a"

BIN
resources/LateefRegOT.ttf Normal file

Binary file not shown.

View File

@ -9,12 +9,22 @@ use std::alloc::System;
static GLOBAL: &StatsAlloc<System> = &INSTRUMENTED_SYSTEM; static GLOBAL: &StatsAlloc<System> = &INSTRUMENTED_SYSTEM;
fn main() { fn main() {
// Chinese test
let font = include_bytes!("../resources/WenQuanYiMicroHei-01.ttf"); let font = include_bytes!("../resources/WenQuanYiMicroHei-01.ttf");
test_rusttype(font); let message = " 發啊你好";
test_fontdue(font); let rtl = false;
test_rusttype(font, message, rtl);
test_fontdue(font, message, rtl);
// Arabic test
let font = include_bytes!("../resources/LateefRegOT.ttf");
let message = "مرحبا بالعالم";
let rtl = true;
test_rusttype(font, message, rtl);
test_fontdue(font, message, rtl);
} }
fn test_fontdue(font: &[u8]) { fn test_fontdue(font: &[u8], message: &str, _rtl: bool) {
let reg = Region::new(&GLOBAL); let reg = Region::new(&GLOBAL);
println!("start: {:#?}", reg.change()); println!("start: {:#?}", reg.change());
@ -23,7 +33,7 @@ fn test_fontdue(font: &[u8]) {
println!("from_bytes: {:#?}", reg.change()); println!("from_bytes: {:#?}", reg.change());
// Rasterize and get the layout metrics for the letter 'g' at 17px. // Rasterize and get the layout metrics for the letter 'g' at 17px.
let (metrics, bitmap) = font.rasterize('欢', 17.0); let (metrics, bitmap) = font.rasterize(message.chars().nth(0).unwrap(), 17.0);
println!("font.rasterize: {:#?}", reg.change()); println!("font.rasterize: {:#?}", reg.change());
// Used here to ensure that the value is not // Used here to ensure that the value is not
@ -33,7 +43,7 @@ fn test_fontdue(font: &[u8]) {
::std::mem::size_of_val(&font); ::std::mem::size_of_val(&font);
} }
fn test_rusttype(font: &[u8]) { fn test_rusttype(font: &[u8], message: &str, rtl: bool) {
let reg = Region::new(&GLOBAL); let reg = Region::new(&GLOBAL);
let collection = FontCollection::from_bytes(font).unwrap_or_else(|e| { let collection = FontCollection::from_bytes(font).unwrap_or_else(|e| {
panic!("error constructing a FontCollection from bytes: {}", e); panic!("error constructing a FontCollection from bytes: {}", e);
@ -65,7 +75,7 @@ fn test_rusttype(font: &[u8]) {
println!("metrics: {:#?}", reg.change()); println!("metrics: {:#?}", reg.change());
// Glyphs to draw for "RustType". Feel free to try other strings. // Glyphs to draw for "RustType". Feel free to try other strings.
let glyphs: Vec<PositionedGlyph<'_>> = font.layout("Xous:發啊你好", scale, offset).collect(); let glyphs: Vec<PositionedGlyph<'_>> = font.layout(message, scale, offset).collect();
println!("glyphs: {:#?}", reg.change()); println!("glyphs: {:#?}", reg.change());
// Find the most visually pleasing width to display // Find the most visually pleasing width to display
@ -94,7 +104,11 @@ fn test_rusttype(font: &[u8]) {
let y = y as i32 + bb.min.y; let y = y as i32 + bb.min.y;
// There's still a possibility that the glyph clips the boundaries of the bitmap // There's still a possibility that the glyph clips the boundaries of the bitmap
if x >= 0 && x < width as i32 && y >= 0 && y < pixel_height as i32 { if x >= 0 && x < width as i32 && y >= 0 && y < pixel_height as i32 {
let x = x as usize; let x = if rtl {
width - (x as usize) - 1
} else {
x as usize
};
let y = y as usize; let y = y as usize;
pixel_data[(x + y * width)] = c; pixel_data[(x + y * width)] = c;
} }