원클릭으로
sdf-text
Work with Pulp's SDF / MSDF / PSDF glyph atlases — building, sampling via SkSL, and the shared text-layout helpers.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
메뉴
Work with Pulp's SDF / MSDF / PSDF glyph atlases — building, sampling via SkSL, and the shared text-layout helpers.
Codex 또는 Claude로 설치 이 Prompt를 복사해 Codex, Claude 또는 다른 어시스턴트에 붙여 넣으면 Skill 페이지를 검토하고 설치를 진행할 수 있습니다.
SOC 직업 분류 기준
Pulp musical/media time primitives, immutable compiled tempo maps, monotonic transport beats, exact sample anchors, corrected inverse conversion, and shared transport quantization arithmetic.
Import designs from Figma, Stitch, v0, Pencil, React Native, or Claude Design into Pulp web-compat JS with automated visual validation. Claude Design imports also scaffold a pulp::view::EditorBridge handler file. Versioned parser, format, and compatibility-schema detection lives behind `--detect-only` and `--report-new-format`.
Pick the right Pulp Stream for a given I/O task, wire async callbacks correctly without deadlocking the worker, and avoid the backpressure / cancellation footguns in `pulp::runtime::AsyncStream`.
Editor lifecycle and multi-view attach for Pulp plugins — when to override Processor::create_view(), the open → notify_attached → resize → close protocol, release_view() ownership rules, and secondary-view roles.
Load, run, and test VST3 / AU / CLAP / LV2 plugins from Pulp code. Use when working on `core/host/` (scanner, plugin_slot, signal_graph), when adding a new format backend, when wiring a plugin into a SignalGraph, or when writing an integration test that needs a real plug-in binary.
Audio Unit v3 (AUAudioUnit) format adapter for Pulp — render-block wiring, parameter tree bridging, MIDI / sysex via AURenderEvent, sidechain pulls, state persistence, iOS extension surface, and the pitfalls discovered while wiring the adapter.
| name | sdf-text |
| description | Work with Pulp's SDF / MSDF / PSDF glyph atlases — building, sampling via SkSL, and the shared text-layout helpers. |
Pulp renders text through a GPU-sampled signed-distance-field pipeline so
a single atlas serves every font size with crisp edges. This skill is
for when you are touching core/canvas/src/sdf_atlas.cpp,
msdf_atlas.cpp, or the shader files, or when you add call-sites that
consume pulp/canvas/sdf_text.hpp.
core/canvas/include/pulp/canvas/sdf_atlas.hpp — single-channel atlascore/canvas/include/pulp/canvas/msdf_atlas.hpp — multi-channel atlas (RGB/RGBA)core/canvas/include/pulp/canvas/psdf_atlas.hpp — pseudo-SDF + vector-fallback policycore/canvas/include/pulp/canvas/sdf_text.hpp — SdfPenSnap, SdfTextOptions,
build_text_quads<AtlasT>(), fill_text_sdf/msdf/psdf<AtlasT>()core/canvas/shaders/sdf_text.sksl — single-channel samplercore/canvas/shaders/msdf_text.sksl — median(r,g,b) samplerdocs/reference/sdf-text.md — rendering pipeline referenceexamples/sdf-text-demo/ — runtime SDF text rendering and bloom demoexamples/sdf-vs-msdf-demo/ — console SDF/MSDF atlas dump; MSDF RGB
output is currently single-channel-equivalent until msdfgen is wiredexamples/sdf-effects-demo/ — enumerates host-side effect presets and
writes software-rendered baseline files; visual effects wait for the SkSL
draw pathSdfAtlas::build("") can leave advance = base_size
and bearing_y = base_size for every glyph. Write tests that assert
invariants that hold in both the real and fallback paths, and
tighten only when you can detect the real path was taken
(gM->advance != gi->advance). See test_sdf_atlas.cpp.fwidth gives you subpixel AA for free. Do not add a second
softness uniform for "anti-alias width" — snapping belongs at the
pen (host side), not in the shader.include_alpha=true changes the pixel stride from 3 to 4 bytes.
Use MsdfAtlas::channels() rather than assuming 3.build_text_quads<AtlasT>() only requires
that the atlas expose glyph(c), base_size(), and the usual
SdfGlyph-shaped fields. That means the same helper works for every
atlas variant; do not branch on type.should_use_vector_fallback
is a pure policy helper; callers decide at draw time whether to hit
the Skia path rasterizer instead of the SDF sampler.SkFont via the SkSpan overloads. The historical
(pointer, count, ...) forms of unicharsToGlyphs, textToGlyphs,
getWidthsBounds, getWidths, getPos, getXPos, getPaths, and
getIntercepts are gated behind SK_SUPPORT_UNSPANNED_APIS in
include/core/SkFont.h. On Skia builds where that macro is not
defined (including some chrome/m144 drops), the overloads vanish and
sdf_atlas.cpp fails to compile. On this repo PULP_HAS_SKIA is
only set when libskia.a links successfully, so the break can hide
behind a headers-only pin — confirm by building pulp-canvas
against a tree that ships libskia.a (e.g.
SKIA_DIR=<other-worktree>/external/skia-build) so the compile path
exercises real Skia libraries, not just headers.tools/ci/governed-build.sh cmake --build build --target \
pulp-test-sdf-atlas pulp-test-msdf-atlas pulp-test-psdf-atlas \
pulp-test-sdf-text pulp-test-sdf-effects \
pulp-sdf-text-demo pulp-sdf-vs-msdf-demo pulp-sdf-effects-demo
./build/test/pulp-test-sdf-atlas
./build/test/pulp-test-msdf-atlas
./build/test/pulp-test-psdf-atlas
./build/test/pulp-test-sdf-text
./build/test/pulp-test-sdf-effects
./build/examples/sdf-text-demo/pulp-sdf-text-demo
./build/examples/sdf-vs-msdf-demo/pulp-sdf-vs-msdf-demo # writes /tmp/pulp-*-atlas.{pgm,ppm}
./build/examples/sdf-effects-demo/pulp-sdf-effects-demo # writes /tmp/pulp-sdf-effects-*.pgm
planning/next-features-plan.md § Feature 4)msdfgen library (MIT) for shape-decomposed channelsSdfEffectParams through a SkSL-backed draw path so glow / shadow /
outline / bevel visibly render