DIR.Lib
4.2.931
dotnet add package DIR.Lib --version 4.2.931
NuGet\Install-Package DIR.Lib -Version 4.2.931
<PackageReference Include="DIR.Lib" Version="4.2.931" />
<PackageVersion Include="DIR.Lib" Version="4.2.931" />
<PackageReference Include="DIR.Lib" />
paket add DIR.Lib --version 4.2.931
#r "nuget: DIR.Lib, 4.2.931"
#:package DIR.Lib@4.2.931
#addin nuget:?package=DIR.Lib&version=4.2.931
#tool nuget:?package=DIR.Lib&version=4.2.931
DIR.Lib
Device-Independent input + Rendering library for .NET. Provides the shared foundation for both GPU (SDL3 + Vulkan) and terminal (Console) applications. Pure-managed, AOT-compatible, no native dependencies.
Rendering Primitives
PointInt— 2D integer pointRectInt— 2D integer rectangle (note: constructor argument order is(LowerRight, UpperLeft))RectF32— 2D float rectangle (x, y, width, height) for pixel-based layoutRGBAColor32— 32-bit RGBA color with Lerp, WithAlpha, LuminanceTextAlign— Near/Center/Far alignment enumRenderer<TSurface>— Abstract renderer: FillRectangle, DrawRectangle, FillEllipse / DrawEllipse, DrawLine, DrawLineDashed, DrawPolyline, DrawPolylineDashed, DrawText, MeasureTextRgbaImage/RgbaImageRenderer : Renderer<RgbaImage>— pure software renderer for tests and headless scenarios; output is plain RGBA pixels (callers own the choice of PNG / JPEG / TIFF / sixel encoder)GlyphBitmap/SdfGlyphBitmap— raw RGBA glyph bitmap with bearing/advance info; SDF variant for scalable text on the GPU sideManagedFontRasterizer— pure-managed glyph rasterizer backed bySharpAstro.Fonts.OpenTypeFont; supports COLRv1 color glyphs, grayscale, and PDF subset fonts. AOT-compatible, no GC pinning, no native bindings.FontResolver— resolves platform-default monospace fonts and enumerates installed font files across system + per-user font directories (incl. Windows 11%LOCALAPPDATA%\Microsoft\Windows\Fonts)
Input Handling
InputEvent— open record hierarchy:KeyDown,TextInput,MouseDown,MouseUp,MouseMove,Scroll,Pinch,PinchEndInputKey— platform-agnostic key codes (letters, digits, function keys, navigation, symbols)InputModifier— modifier flags (Shift, Ctrl, Alt)MouseButton— Left / Middle / RightIWidget— shared interface withHandleInputfor both pixel and terminal widgets
Platform bridges (in downstream packages):
SdlVulkan.RendererprovidesSdlInputMapping(SDL3 Scancode → InputKey)Console.LibprovidesConsoleInputMapping(ConsoleKey → InputKey)
Widget System
IPixelWidget— extends IWidget with pixel-coordinate hit testing and click dispatchPixelWidgetBase<TSurface>— base class for pixel widgets: clickable regions, text input, buttons, dropdowns, drawing helpersPixelLayout+PixelDockStyle— dock-based layout engine (Top/Bottom/Left/Right/Fill)DockLayout<T>— generic dock layout usingINumber<T>(the integer / pixel layouts above are built on this)ClickableRegion+ClickableRegionTracker— registered during render, walked in reverse for hit testingHitResult— open discriminated union:TextInputHit,ButtonHit,ListItemHit,SlotHit<T>,SliderHitDropdownMenuState— dropdown / popup menu state machine
Text Input
TextInputState— single-line text input state machine with cursor, selection, undoTextInputRenderer— renders text input using anyRenderer<T>(blinking cursor, selection highlight)- Callbacks:
OnCommit(async),OnCancel,OnTextChanged,OnKeyOverride
Signals & Async
SignalBus— thread-safe typed event bus.Post<T>()is thread-safe,ProcessPending()runs on the render thread.- Built-in signals:
ActivateTextInputSignal,DeactivateTextInputSignal,RequestExitSignal,RequestRedrawSignal BackgroundTaskTracker— collects background tasks, checks completions per frame, logs errors viaILogger. CallProcessCompletions()each frame,DrainAsync()at shutdown.
Math Layout (DIR.Lib.MathLayout)
TeX-style box model for rendering mathematical expressions. Each Box exposes Width / Height (ascent) / Depth (descent) and paints itself relative to a (penX, baselineY) the parent provides.
Box+BoxStyle— abstract box with baseline, plus a record of font / size / spacing parameters threaded through layout. Pixel-valued math metrics (axis height, fraction-rule thickness, …) come from the font's OpenType MATH table when available, with TeX-style ratio fallbacks.- Box types:
GlyphBox,MathGlyphBox,HBox,FracBox,SqrtBox,BracketBox,BigOperatorBox,SupSubBox,AccentBox,LimitsBox,MatrixBox,OverlayBox,StretchyVerticalBox BoxRasterizer.RenderToRgba(box, style)— rasterizes aBoxto a transparentRgbaImage. Pure — no encoder coupling; callers choose PNG / sixel / half-block downstream.
Markdown + LaTeX (DIR.Lib.Markdown)
A LALR.CC-driven markdown + math-mode LaTeX pipeline. The math, markdown-inline, and markdown-block grammars (grammars/*.lalr.yaml) are compiled at build time by the SharpAstro.LALR.CC source generator into partial classes baked into this assembly — no runtime parser construction, AOT-clean.
MdAst— block & inline AST records (MdParagraph,MdHeading,MdMathBlock,MdList,MdTable,MdInline, …)MarkdownBlockVisitor/MarkdownInlineVisitor— visitors over the generated grammars; produce the AST.LatexUnicodeVisitor— math-mode LaTeX → Unicode (inline math:$x^2$→x²).BoxBuildingVisitor— math-mode LaTeX → deferredBoxbuilders (display math:$$..$$→MathLayoutbox tree →BoxRasterizer).Mhchem— renders an mhchem\ce{...}body to Unicode (auto-subscripts, arrows, ion charges, …).MarkdownMacros— parser-side facade: macro expansion (\text{},\boxed{},\ce{},\begin/\endenvironments), backslash-escape resolution, and theRenderMathUnicodeentry point.
Usage
using DIR.Lib;
using DIR.Lib.MathLayout;
using DIR.Lib.Markdown;
// Rendering
renderer.FillRectangle(rect, new RGBAColor32(0x30, 0x50, 0x90, 0xff));
renderer.DrawText("Hello", fontPath, 14f, white, layout);
renderer.DrawPolyline(points, color, thickness: 2);
// Input handling
widget.HandleInput(new InputEvent.KeyDown(InputKey.Enter, InputModifier.Ctrl));
// Pixel layout
var layout = new PixelLayout(contentRect);
var header = layout.Dock(PixelDockStyle.Top, 28f);
var sidebar = layout.Dock(PixelDockStyle.Left, 200f);
var content = layout.Fill();
// Background tasks
tracker.Run(async () => await SaveAsync(), "Save profile");
if (tracker.ProcessCompletions(logger)) needsRedraw = true;
// Math rendering (display LaTeX → RGBA image)
var unicode = MarkdownMacros.RenderMathUnicode("E = mc^2"); // "E = mc²"
var image = BoxRasterizer.RenderToRgba(boxBuilder(style), style);
Dependencies
- SharpAstro.Fonts — pure-managed OpenType font loader & rasterizer (COLRv1, MATH table, CFF/glyf, hinting)
- SharpAstro.LALR.CC — LALR(1) parser + source generator (compile-time, build-only)
- Microsoft.Extensions.Logging.Abstractions —
ILoggerinterface forBackgroundTaskTracker
DIR.Lib is codec-agnostic (4.0+): BoxRasterizer.RenderToRgba returns an RgbaImage, and consumers that need TIFF / PNG / JPEG / ICC encoding declare those packages (SharpAstro.Tiff, SharpAstro.Png, SharpAstro.Color.Icc, …) themselves.
License
MIT
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net10.0 is compatible. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net10.0
- Microsoft.Extensions.Logging.Abstractions (>= 10.0.0)
- SharpAstro.Fonts (>= 1.4.211)
- SharpAstro.LALR.CC (>= 3.1.0)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on DIR.Lib:
| Package | Downloads |
|---|---|
|
TianWen.Lib
Package Description |
|
|
Console.Lib
Package Description |
|
|
SdlVulkan.Renderer
Package Description |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 4.2.931 | 0 | 5/19/2026 |
| 4.1.921 | 0 | 5/19/2026 |
| 4.1.911 | 0 | 5/19/2026 |
| 4.1.901 | 0 | 5/19/2026 |
| 4.1.891 | 0 | 5/19/2026 |
| 4.0.881 | 80 | 5/16/2026 |
| 4.0.861 | 49 | 5/14/2026 |
| 4.0.851 | 21 | 5/14/2026 |
| 4.0.841 | 57 | 5/14/2026 |
| 3.0.831 | 90 | 5/12/2026 |
| 2.14.821 | 25 | 5/12/2026 |
| 2.14.811 | 22 | 5/12/2026 |
| 2.14.801 | 22 | 5/12/2026 |
| 2.14.791 | 25 | 5/12/2026 |
| 2.14.781 | 29 | 5/12/2026 |
| 2.14.771 | 75 | 5/9/2026 |
| 2.14.761 | 30 | 5/9/2026 |
| 2.14.751 | 28 | 5/6/2026 |
| 2.13.741 | 25 | 5/6/2026 |
| 2.12.731 | 28 | 5/6/2026 |