#font #line #floem #multi-line #glyph #layout #cosmic

no-std floem-cosmic-text

为Floem的不官方cosmic-text分支

3个版本

0.7.2 2024年5月1日
0.7.1 2024年3月30日
0.7.0 2024年1月13日

#254 in 图像

Download history 602/week @ 2024-04-29 487/week @ 2024-05-06 426/week @ 2024-05-13 580/week @ 2024-05-20 549/week @ 2024-05-27 647/week @ 2024-06-03 578/week @ 2024-06-10 438/week @ 2024-06-17 451/week @ 2024-06-24 466/week @ 2024-07-01 575/week @ 2024-07-08 611/week @ 2024-07-15 512/week @ 2024-07-22 452/week @ 2024-07-29 360/week @ 2024-08-05 216/week @ 2024-08-12

1,694 每月下载量
用于 9 个crate(2个直接)

MIT/Apache

1MB
4.5K SLoC

你可能正在寻找真正的cosmic-text crate

Floem依赖于尚未合并到上游的cosmic-text更改。为了使Floem可以在crates.io上发布,必须将其所有依赖项都发布在那里 - 因此这个非官方crate。


lib.rs:

COSMIC 文本

该库以通用方式提供高级文本处理。它提供了形状、字体发现、字体回退、布局、光栅化和编辑的抽象。形状使用rustybuzz,字体发现使用fontdb,光栅化是可选的,并使用swash。其他功能是在此库内部开发的。

建议您首先创建一个 FontSystem,之后您可以创建一个 Buffer,向其提供一些文本,然后检查它产生的布局。此时,您可以使用 SwashCache 将字符形状光栅化为图像或像素。

use floem_cosmic_text::{Attrs, Color, FontSystem, SwashCache, Buffer, Metrics};

// A FontSystem provides access to detected system fonts, create one per application
let mut font_system = FontSystem::new();

// A SwashCache stores rasterized glyphs, create one per application
let mut swash_cache = SwashCache::new();

// Text metrics indicate the font size and line height of a buffer
let metrics = Metrics::new(14.0, 20.0);

// A Buffer provides shaping and layout for a UTF-8 string, create one per text widget
let mut buffer = Buffer::new(&mut font_system, metrics);

// Borrow buffer together with the font system for more convenient method calls
let mut buffer = buffer.borrow_with(&mut font_system);

// Set a size for the text buffer, in pixels
buffer.set_size(80.0, 25.0);

// Attributes indicate what font to choose
let attrs = Attrs::new();

// Add some text!
buffer.set_text("Hello, Rust! 🦀\n", attrs);

// Perform shaping as desired
buffer.shape_until_scroll();

// Inspect the output runs
for run in buffer.layout_runs() {
    for glyph in run.glyphs.iter() {
        println!("{:#?}", glyph);
    }
}

// Create a default text color
let text_color = Color::rgb(0xFF, 0xFF, 0xFF);

// Draw the buffer (for performance, instead use SwashCache directly)
buffer.draw(&mut swash_cache, text_color, |x, y, w, h, color| {
    // Fill in your code here for drawing rectangles
});

依赖关系

~12–26MB
~344K SLoC