Limn UI 0.7.0
Packages
Package
Description
Animated values for widget properties:
Transition eases one
float toward a target, ColorTransition does the same for a
Color, and Easing names the curve both
follow.The service-provider interface a native platform implements:
Backend
runs the event loop and creates NativeWindows.The shipped backend: GLFW windows and input, an OpenGL 3.3 core renderer that batches
the 2D canvas and hosts the 3D provider, OpenAL audio, and stb for font rasterization
and image decoding.
Ready-to-use components (Label, Button, TextField, Checkbox/Switch, Dialog)
and the light/dark
Theme.Charts:
BarChart, LineChart
and DonutChart, over a shared
Chart that carries the data, the palette, the legend, the
tooltip, the click callback and the animation.The headless editing engine behind the text components:
TextEditModel owns the buffer, the caret, the anchor-based
selection, line movement with a sticky goal column and bounded undo/redo, stepping by
grapheme cluster so combining marks and ZWJ emoji are never split.The threading model and the async API on top of it: a single UI thread that every widget
mutation is confined to, reached through
Ui, with
Ui.post(java.lang.Runnable) to cross onto it, Ui.async(java.util.function.Supplier<T>) for
future-shaped work, and Ui.work(limn.concurrent.Work.Body<T>) for a cancellable
Work that reports Progress and is held
as a Job.The kitchen-sink demo: one runnable program that exercises every widget and subsystem,
with the screenshot and benchmark harnesses the project's visual verification runs
through.
The generators behind the project website: the capture run that renders every gallery
entry in both shipped palettes and writes the manifest the site builds its component
pages from, the export that writes the palettes out as CSS custom properties, and the
compiled samples the site quotes so that every snippet a reader copies is a program the
build has compiled.
Internationalization: a localizable string as a value (
I18nString),
the process-wide language it resolves against (I18n), and the
translation sources it reads (StringBundle,
PropertyBundle).Toolkit key codes and modifier bits:
Keys is what a key or mouse
event carries and what an application binds a shortcut against, so no code above the
backend names a windowing library's constants.Render-to-texture 3D:
Graphics3D is both the facade a caller uses
inside a frame and the SPI the backend installs, and around it sit the neutral resources
a scene is made of: MeshData and TextureData
built on any thread, their uploaded twins GpuMesh and
GpuTexture, Camera with its controllers,
Material, Light, and the
RenderPass draws are issued into.glTF 2.0 loading:
GltfLoader reads .gltf or binary
.glb into a neutral GltfModel of meshes, materials
and node transforms (no GPU and no third-party parser), so the reading and decoding
can run on a worker (the loadAsync forms are cancellable and report progress)
and the upload happens later, inside a frame.A neutral, typed shader IR: a material's surface is a
SurfaceOutputs built from
Expr nodes, and a backend's code generator walks that DAG
to emit its own shading language, so the toolkit ships no GLSL, and a new target means
a new generator rather than new materials.Widget tree, event dispatch (coalescing + bubbling), focus and the
measure/layout pass.
The input events the scene dispatches:
MouseEvent,
KeyEvent, CharEvent for committed
text, PreeditEvent for IME composition still in flight, and
FileDropEvent.Backend-neutral audio: an immutable PCM
AudioClip
(synthesized via AudioClip.tone(float, float, float) or decoded from WAV/OGG),
played through the Sounds facade over the installed
AudioEngine SPI.A screen for authoring a
Theme, so that an application's users
can build a palette instead of choosing from the fifteen that ship.Backend-neutral video: a pooled
VideoFrame of planar YCbCr samples described
by a PixelFormat layout and a VideoColor interpretation,
produced by a VideoStreamSource that a VideoDecoder opened
through the Videos facade, timed by VideoClock and shown by
uploading it to a VideoSurface that the VideoSurfaces
facade created, or, where no device conversion exists, turned into RGBA by
YuvConverter.Decoders, and the pooling every decoder needs.
H.264 and AAC out of MP4, through a trimmed FFmpeg behind a hand-written JNI shim.