Update example to show emojis and clipping
This commit is contained in:
parent
8c8cfba093
commit
07b04f511a
6 changed files with 21 additions and 3786 deletions
|
@ -1,3 +0,0 @@
|
||||||
I like to render اللغة العربية in Rust!
|
|
||||||
|
|
||||||
عندما يريد العالم أن يتكلّم ، فهو يتحدّث بلغة يونيكود. تسجّل الآن لحضور المؤتمر الدولي العاشر ليونيكود (Unicode Conference)، الذي سيعقد في 10-12 آذار 1997 بمدينة مَايِنْتْس، ألمانيا. و سيجمع المؤتمر بين خبراء من كافة قطاعات الصناعة على الشبكة العالمية انترنيت ويونيكود، حيث ستتم، على الصعيدين الدولي والمحلي على حد سواء مناقشة سبل استخدام يونكود في النظم القائمة وفيما يخص التطبيقات الحاسوبية، الخطوط، تصميم النصوص والحوسبة متعددة اللغات.
|
|
|
@ -1 +0,0 @@
|
||||||
I want more terminals to be able to handle ZWJ sequence emoji characters. For example, the service dog emoji 🐕🦺 is actually 3 Unicode characters. Kitty handles this fairly well. All VTE-based terminals, however, show "🐶🦺".
|
|
3769
examples/emoji.txt
3769
examples/emoji.txt
File diff suppressed because it is too large
Load diff
|
@ -70,13 +70,14 @@ async fn run() {
|
||||||
let mut atlas = TextAtlas::new(&device, &queue, swapchain_format);
|
let mut atlas = TextAtlas::new(&device, &queue, swapchain_format);
|
||||||
let mut buffer = Buffer::new(
|
let mut buffer = Buffer::new(
|
||||||
unsafe { FONT_SYSTEM.as_ref().unwrap() },
|
unsafe { FONT_SYSTEM.as_ref().unwrap() },
|
||||||
Metrics::new(14, 20),
|
Metrics::new(30, 42),
|
||||||
);
|
|
||||||
buffer.set_size((width as f64 * scale_factor) as i32, (height as f64) as i32);
|
|
||||||
buffer.set_text(
|
|
||||||
include_str!("./emoji-zjw.txt"),
|
|
||||||
Attrs::new().monospaced(true).family(Family::Monospace),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
let physical_width = (width as f64 * scale_factor) as i32;
|
||||||
|
let physical_height = (height as f64 * scale_factor) as i32;
|
||||||
|
|
||||||
|
buffer.set_size(physical_width, physical_height);
|
||||||
|
buffer.set_text("Hello world! 👋\nThis is rendered with 🦅 glyphon 🦁\nThe text below should be partially clipped.\na b c d e f g h i j k l m n o p q r s t u v w x y z", Attrs::new().family(Family::SansSerif));
|
||||||
buffer.shape_until_scroll();
|
buffer.shape_until_scroll();
|
||||||
|
|
||||||
event_loop.run(move |event, _, control_flow| {
|
event_loop.run(move |event, _, control_flow| {
|
||||||
|
@ -105,11 +106,13 @@ async fn run() {
|
||||||
},
|
},
|
||||||
&[TextArea {
|
&[TextArea {
|
||||||
buffer: &buffer,
|
buffer: &buffer,
|
||||||
bounds: TextBounds {
|
|
||||||
left: 10,
|
left: 10,
|
||||||
top: 10,
|
top: 10,
|
||||||
right: 500,
|
bounds: TextBounds {
|
||||||
bottom: 50,
|
left: 0,
|
||||||
|
top: 0,
|
||||||
|
right: 600,
|
||||||
|
bottom: 160,
|
||||||
},
|
},
|
||||||
}],
|
}],
|
||||||
Color::rgb(255, 255, 255),
|
Color::rgb(255, 255, 255),
|
||||||
|
|
|
@ -86,6 +86,11 @@ impl Default for TextBounds {
|
||||||
pub struct TextArea<'a> {
|
pub struct TextArea<'a> {
|
||||||
/// The buffer containing the text to be rendered.
|
/// The buffer containing the text to be rendered.
|
||||||
pub buffer: &'a cosmic_text::Buffer<'a>,
|
pub buffer: &'a cosmic_text::Buffer<'a>,
|
||||||
/// The bounds of the text area.
|
/// The left edge of the buffer.
|
||||||
|
pub left: i32,
|
||||||
|
/// The top edge of the buffer.
|
||||||
|
pub top: i32,
|
||||||
|
/// The visible bounds of the text area. This is used to clip the text and doesn't have to
|
||||||
|
/// match the `left` and `top` values.
|
||||||
pub bounds: TextBounds,
|
pub bounds: TextBounds,
|
||||||
}
|
}
|
||||||
|
|
|
@ -252,8 +252,8 @@ impl TextRenderer {
|
||||||
|
|
||||||
let details = atlas.glyph(&glyph.cache_key).unwrap();
|
let details = atlas.glyph(&glyph.cache_key).unwrap();
|
||||||
|
|
||||||
let mut x = glyph.x_int + details.left as i32;
|
let mut x = glyph.x_int + details.left as i32 + text_area.left;
|
||||||
let mut y = line_y + glyph.y_int - details.top as i32;
|
let mut y = line_y + glyph.y_int - details.top as i32 + text_area.top;
|
||||||
|
|
||||||
let (mut atlas_x, mut atlas_y, content_type) = match details.gpu_cache {
|
let (mut atlas_x, mut atlas_y, content_type) = match details.gpu_cache {
|
||||||
GpuCacheStatus::InAtlas { x, y, content_type } => (x, y, content_type),
|
GpuCacheStatus::InAtlas { x, y, content_type } => (x, y, content_type),
|
||||||
|
|
Loading…
Reference in a new issue