Install
$ agentstack add skill-sagev1-makepad-skills-makepad-font ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Makepad Font Skill
> Version: makepad-widgets (dev branch) | Last Updated: 2026-01-19 > > Check for updates: https://crates.io/crates/makepad-widgets
You are an expert at Makepad text and font rendering. Help users by:
- Font configuration: Font families, sizes, styles
- Text layout: Understanding text layouter and shaping
- Text rendering: GPU-based text rendering with SDF
Documentation
Refer to the local files for detailed documentation:
./references/font-system.md- Font module structure and APIs
IMPORTANT: Documentation Completeness Check
Before answering questions, Claude MUST:
- Read the relevant reference file(s) listed above
- If file read fails or file is empty:
- Inform user: "本地文档不完整,建议运行
/sync-crate-skills makepad --force更新文档" - Still answer based on SKILL.md patterns + built-in knowledge
- If reference file exists, incorporate its content into the answer
Text Module Structure
draw/src/text/
├── font.rs # Font handle and metrics
├── font_atlas.rs # GPU texture atlas for glyphs
├── font_face.rs # Font face data
├── font_family.rs # Font family management
├── fonts.rs # Built-in fonts
├── glyph_outline.rs # Glyph vector outlines
├── glyph_raster_image.rs # Rasterized glyph images
├── layouter.rs # Text layout engine
├── rasterizer.rs # Glyph rasterization
├── sdfer.rs # Signed distance field generator
├── selection.rs # Text selection/cursor
├── shaper.rs # Text shaping (harfbuzz)
Using Fonts in DSL
Text Style
{
text: "Hello World"
draw_text: {
text_style: {
font: { path: dep("crate://self/resources/fonts/MyFont.ttf") }
font_size: 16.0
line_spacing: 1.5
letter_spacing: 0.0
}
color: #FFFFFF
}
}
Theme Fonts
{
text: "Styled Text"
draw_text: {
text_style: {
font_size: (THEME_FONT_SIZE_P)
}
}
}
Font Definition in DSL
live_design! {
// Define font path
FONT_REGULAR = {
font: { path: dep("crate://self/resources/fonts/Regular.ttf") }
}
FONT_BOLD = {
font: { path: dep("crate://self/resources/fonts/Bold.ttf") }
}
// Use in widget
{
draw_text: {
text_style: {
font_size: 14.0
}
}
}
}
Layouter API
pub struct Layouter {
loader: Loader,
cache_size: usize,
cached_params: VecDeque,
cached_results: HashMap>,
}
impl Layouter {
pub fn new(settings: Settings) -> Self;
pub fn rasterizer(&self) -> &Rc>;
pub fn is_font_family_known(&self, id: FontFamilyId) -> bool;
pub fn define_font_family(&mut self, id: FontFamilyId, definition: FontFamilyDefinition);
pub fn define_font(&mut self, id: FontId, definition: FontDefinition);
pub fn get_or_layout(&mut self, params: impl LayoutParams) -> Rc;
}
Layout Parameters
pub struct OwnedLayoutParams {
pub text: Substr,
pub spans: Box,
pub options: LayoutOptions,
}
pub struct Span {
pub style: Style,
pub len: usize,
}
pub struct Style {
pub font_family_id: FontFamilyId,
pub font_size_in_pts: f32,
pub color: Option,
}
pub struct LayoutOptions {
pub max_width_in_lpxs: Option, // Max width for wrapping
pub wrap: bool, // Enable word wrap
pub first_row_indent_in_lpxs: f32, // First line indent
}
Rasterizer Settings
pub struct Settings {
pub loader: loader::Settings,
pub cache_size: usize, // Default: 4096
}
pub struct rasterizer::Settings {
pub sdfer: sdfer::Settings {
padding: 4, // SDF padding
radius: 8.0, // SDF radius
cutoff: 0.25, // SDF cutoff
},
pub grayscale_atlas_size: Size::new(4096, 4096),
pub color_atlas_size: Size::new(2048, 2048),
}
DrawText Widget
{
// Label is a simple text widget
{
text: "Simple Label"
draw_text: {
color: #FFFFFF
text_style: {
font_size: 14.0
}
}
}
// TextFlow for rich text
{
{ text: "Bold text" }
{ text: "Italic text" }
{
text: "Click here"
href: "https://example.com"
}
}
}
Text Properties
| Property | Type | Description | |----------|------|-------------| | text | String | Text content | | font | Font | Font resource | | font_size | f64 | Size in points | | line_spacing | f64 | Line height multiplier | | letter_spacing | f64 | Character spacing | | color | Vec4 | Text color | | brightness | f64 | Text brightness | | curve | f64 | Text curve effect |
When Answering Questions
- Makepad uses SDF (Signed Distance Field) for crisp text at any scale
- Fonts are loaded once and cached in GPU texture atlases
- Text shaping uses harfbuzz for proper glyph positioning
- Use
dep("crate://...")for embedded font resources - Default font cache size is 4096 glyphs
- Atlas sizes: 4096x4096 for grayscale, 2048x2048 for color (emoji)
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: SageV1
- Source: SageV1/makepad-skills
- License: MIT
- Homepage: https://sagev1.github.io
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.