Repository navigation
v1.0.0
Platform Support
Android
- Android window support with
YupActivityJava class (#29, #34) - Java bytecode compilation via
yup_android_java.cmake(#53) - External storage permissions (
READ_EXTERNAL_STORAGE/WRITE_EXTERNAL_STORAGE) for file access (#61)
iOS
- iOS CI pipeline with Xcode toolchain (#8)
- Updated minimum deployment targets: iOS/tvOS 13.0, watchOS 6.0, macOS 11.0 (#72)
- ARC enabled by default on Apple platforms (#91)
- iOS Simulator-specific framework groups (
iosSimFrameworks/iosSimWeakFrameworks) in module declarations (#48)
macOS
- macOS message loop reworked: time-sliced event dispatch via
CFRunLoopRunInModetargeting ~60 Hz; quit event registered withNSAppleEventManagerfor proper Apple Event quit handling (#47) NSSupportsSuddenTermination = falseadded to macOSInfo.plist(#47)
Emscripten / WebAssembly
- Full Emscripten/WASM support including
AudioWorkletaudio device (#25) - WASM threading with exported runtime methods (#61)
-msimd128compile flag and configurable stack size for Emscripten targets (#98)
SDL2
- SDL2 integration with libpng, libwebp, and rive_decoders (#37)
- Improved SDL/YUP Message Manager dispatch loop (#38)
- SDL symbol namespacing to prevent linker conflicts in Apple platform plugins (#112)
Graphics
- Reworked rendering backend selection API:
YUP_RIVE_USE_D3D,YUP_RIVE_USE_METAL,YUP_RIVE_USE_OPENGL,YUP_RIVE_USE_DAWN(#24) - Headless graphics context and no-op Rive factory for offscreen rendering (#32, #52)
- SVG rendering support (#56, #64)
- SVG 1.1 spec compliance: blend modes, patterns, polygon/polyline (#100, #118)
- Path API improvements with comprehensive examples (basic shapes, arcs, curves, transforms, advanced) (#56)
createStrokePolygon()with feather effects (#55)- Improved color management and gradient editor (#87)
- Improved CPU and GPU image rendering (#39, #87)
Color::brighter()/darker()madeconst(#32)AffineTransform::inverted()constexpr method (#19)- constexpr math utilities:
jabs(),jmap(),jlimit(),findMinimum()/findMaximum(),nextPowerOfTwo(), and more (#18) ColorGradient::Spreadenum:Pad,Repeat,Reflecttiling modes withwithSpread()builder (#119)CubicBezierclass:pointAt(),derivative(),length(),splitAt(), bounding box, and intersection (#119)
Image Formats
- New image format I/O framework:
ImageFormat,ImageFormatReader,ImageFormatWriter,ImageFormatManager- plugin-style registry with magic-byte detection and animated image support (#119) - BMP image format: reader (1/4/8/16/24/32-bpp, RLE4/RLE8, palette) and writer (24-bpp uncompressed), controlled by
YUP_IMAGE_FORMAT_BMP(#119) - PPM/PGM/PBM (Netpbm) image format: full P1–P6 plain and binary read/write, controlled by
YUP_IMAGE_FORMAT_PPM(#119) - PNG image format via
libpng: grayscale, grayscale+alpha, RGB, and RGBA at 8- and 16-bit depths, controlled byYUP_IMAGE_FORMAT_PNG(#119) - JPEG image format via
libjpeg: quality-level encoding, controlled byYUP_IMAGE_FORMAT_JPEG(#119) - WebP image format via
libwebp, controlled byYUP_IMAGE_FORMAT_WEBP(#119) - Animated GIF image format via
libgif: per-frame delay, loop count, animated write API (beginAnimation/writeFrame/endAnimation), controlled byYUP_IMAGE_FORMAT_GIF(#119) Image::loadFromData()reimplemented viaImageFormatManager(#119)
Offscreen Rendering
GraphicsContext::OffscreenTargetabstract interface for opaque platform GPU offscreen resources (#119)- Offscreen API on
GraphicsContext:createOffscreenTarget(),beginOffscreen(),endOffscreen(),readOffscreenPixels()- implemented for Metal, OpenGL, and D3D backends (#119) Graphicsconstructors for rendering to anImageorOffscreenTargetoutside the main frame cycle (#119)ImagegainedrenderCanvasbacking (RenderCanvas) alongside texture for offscreen render-to-texture;duplicate()re-enabled with proper deep copy (#119)Graphics::TransparencyLayerRAII class for isolated group opacity compositing: renders into an offscreen target and composites back at the given opacity oncommit()(#119)
Animations (yup_animation)
- New
yup_animationmodule: Lottie-compatible animation engine depending onyup_coreandyup_graphics(#119) Animation: high-level handle withloadFromFile(),loadFromData(),loadFromStream(),renderFrame(),renderAtTime(),renderAtProgress(),toJson(), andsaveToFile()(#119)AnimationPlayer: stateful playback controller with forward, reverse, and ping-pong direction modes, looping, variable speed, frame-range clamping, seek, andonFrameChanged/onLoopCompleted/onPlaybackEndedcallbacks (#119)AnimationEasing: cubic bezier easing with named presets (linear,easeIn,easeOut,easeInOut,hold) andfromLottieTangents()import (#119)AnimationProperty<T>: generic animated property with keyframe interpolation; specializations forfloat,Point<float>,Size<float>, andColor(#119)AnimationTransform: animated anchor, position, scale, rotation, and opacity with conversion toAffineTransformat a given frame (#119)- Full animation data model:
AnimationComposition,AnimationGroup,AnimationLayer,ShapeLayer, shape types (ellipse, rect, path, star, merge, trim, repeater, polystar), paint types (fill, stroke, linear/radial gradient), and modifiers (#119) LottieReader: parse.jsonand.lottie(ZIP) files from file, string, or stream into the animation data model (#119)LottieWriter: serialize the animation data model back to Lottie JSON (pretty or compact) with full round-trip support (#119)LottieExpressionEvaluator: JavaScript expression evaluator for Lottie property expressions viaJavascriptEngine(#119)AnimationRenderer: renders anAnimationCompositionto aGraphicscontext - layer hierarchy, parent-child transforms, matte layers (track-matte), shape fills/strokes/gradients, and image layers (#119)AnimationFrameExporter: exports individual or all frames toImageobjects via offscreen GPU, and exports animations to animated GIF files (#119)
Audio
Plugin Support
- VST3 plugin support (#44)
- Audio Unit (AUv2) plugin support (#93, #106)
- Barebone Audio Unit (AUv3) plugin support (#122)
- Barebone AAX plugin support (#122)
- Barebone LV2 plugin support (#122)
- Audio Plugin Host for AUv2, VST3, and CLAP (#93, #98, #106)
- Standalone plugin support with improved audio parameters (#46)
- CLAP/VST3/AU validators and code signing (
YUP_ENABLE_VST3_VALIDATOR, etc.) (#106) - pluginval integration for automated VST3 validation (#67)
Audio Formats (yup_audio_formats)
- New
yup_audio_formatsmodule:AudioFormat,AudioFormatManager,AudioFormatReader,AudioFormatWriter, WAV codec (#51) - Opus, MP3, FLAC, AAC, CoreAudio, and WMF codec support (#86, #88)
DSP (yup_dsp)
- New
yup_dspmodule with FFT/windowing via ooura, pffft, vDSP, IPP, FFTW3 (#71) - Basic IIR filter implementations (#71)
- Linkwitz-Riley crossover filters (#71)
- FIR filter (#75)
- Partitioned convolution (#75)
- Oversampler and Resampler (2×/4×/8×) (#97)
- Noise generators (#71)
- Virtual analog filters:
AnalogTwoPoleFilter,AnalogVowelFilter,AnalogKorg35Filter,AnalogMoogLadderFilter,AnalogRolandDiodeFilter,CombFilter(#103) - Spectral processor (#116)
- Onset detectors (
SpectralFluxandComplexFluxODF) with perceptual filter bank (#117) - Time-domain and Frequency-domain stretching with backend selection (homebrew PSOLA plus bungee) (#104)
- Distortion processors with oversampling:
TanhDistortionProcessor,BlunterSoftClipperProcessor,AaIirHardClipperProcessor(#108) - Click-less fractionally addressed delay (FAD) (#109)
- Emscripten
AudioWorkletaudio device (#25) - MIDI 2.0 / Universal MIDI Packets (UMP) implementation (#83)
KMeterStatede-interleaving buffers pre-allocated inprepare(), eliminating per-block heap allocation in the audio callback (#119)
Synthesiser
SynthesiserVoiceconverted toReferenceCountedObjectwithPtr = ReferenceCountedObjectPtr<SynthesiserVoice>;Synthesiser::addVoice()now acceptsSynthesiserVoice::Ptr(#82)
Audio Graph (yup_audio_graph / yup_audio_plugin_host)
- New
yup_audio_graphandyup_audio_plugin_hostmodules (#93) - Thread-safe
BufferingAudioSourcewith atomicnextPlayPos(#98) AudioPlayHead::getContinuousTimeInSamples(): continuous sample time without loop-reset (#35)
UI
Components and Widgets
- Customizable theming/skinning system (#13)
mouseDoubleClick()virtual method with configurable threshold (#14)KeyboardFocusModeenum replacing booleansetWantsKeyboardFocus(); addedtextInput()callback (#16)PopupMenuandComboBoxcomponents (#57, #62)- Native file chooser via
FileChooser(#61) - Component paint profiling:
PaintProfilerwith ring-buffer stats (min/max/mean/p50/p95/p99) (#95) ComponentNative::getGraphicsContext()virtual method allowing components to access the GPU context for offscreen operations (#119)MouseListenerweak-referenceable interface for all mouse events;Component::addMouseListener()/removeMouseListener()(#30)- Improved slider components (knob, linear, range) and button components (#70)
Text
TextEditorandLabelcomponents (#16, #55)- Improved fonts: better layouting, variable font axis manipulation, embedded fallback font (#55)
- Clipboard support (#55)
Audio GUI (yup_audio_gui)
- New
yup_audio_guimodule (#70) - MIDI keyboard component (#70)
- Filter frequency response visualisation (#71)
- Spectrum analyser component (#71)
- Spectrogram component with peak/RMS/power/PSD level modes (#102)
- Oscilloscope and spectrum analyzer display processors (#109)
Data Models (yup_data_model)
- New
yup_data_modelmodule (#15) UndoManagerwithTransaction,ScopedTransaction,UndoableAction(#15)DataTreehierarchical data structure with builder pattern and transactional mutations (#73, #74)DataTreequery support (#74)DataTreeschema validation (#74)CachedValue<T>for type-safeDataTreeproperty references (#74)DataTreecompleteUndoableActionsuite for transactional mutations:PropertySetAction,PropertyRemoveAction,RemoveAllPropertiesAction,AddChildAction,RemoveChildAction,RemoveAllChildrenAction,MoveChildAction,CompoundAction- all with full undo/redo semantics (#82)Identifierusable asstd::unordered_mapkey viastd::hashspecialization (#27)
Artboard (Rive Integration)
- Improved artboard placement (#17, #43)
- Shared Rive file across multiple
Artboardcomponents (#43) - State machine inputs:
setNumberInput(),setBoolInput(),triggerInput()(#17, #43) advanceAndApply()anddurationSeconds()for timeline control (#17)- State machine event handling (#43)
- Multi-artboard component support (#43)
Core & Utilities
New Modules
yup_core Additions
SqliteDatabasewithStatementandTransaction(#94)- Perfetto profiling:
YUP_ENABLE_PROFILING,Profilersingleton,YUP_PROFILE_START/YUP_PROFILE_STOPmacros (#20) Watchdogfile watching utility (#50)URLcopy and move constructors (#58)messageThreadIDmade atomic (removed mutex) (#26)ReferenceCountedObject::incReferenceCount()/decReferenceCount()madeconst(#28)DatagramSocketmulticast overloads with local IP (#60)ResultValue<T>::valueOr()(#96)AudioSampleBuffer::fill()overloads (#110)JavascriptEngine::executeWithResult()to execute a code block and capture the last expression result (#119)JavascriptEngine::registerNativeFunction()for top-level native function registration by name (#119)- JavaScript
$accepted as valid identifier character, required for Lottie expression compatibility (#119) - WASM: POSIX file API extended with
symlink(),dirent.h,fnmatch.h,utime.hsupport; WASMFS enabled for standalone builds (#36, #59) - Linux:
File::isOnRemovableDrive()implemented via/sys/block/<dev>/removable(#36)
Build System
zlibandoboeextracted from inline module sources into standalonethirdparty/modules for cleaner namespace isolation and build separation (#6, #7)TARGET_IDE_GROUPparameter onyup_standalone_appandyup_audio_plugin; all modules, tests, and examples placed in dedicated "Modules", "Tests", and "Examples" IDE folders (#11)appleFrameworks/appleWeakFrameworksmodule declaration fields unifying iOS and macOS framework lists (#36)- Per-platform C++ standard override via
*CppStandardmodule header fields (appleCppStandard,osxCppStandard,linuxCppStandard,wasmCppStandard,androidCppStandard,msftCppStandard) (#52) - Platform CMake files reorganized under
cmake/platforms/and loaded dynamically per target platform (#36) - Circular dependency detection for YUP modules (#111)
- Module link options support (per-platform
*LinkOptions) (#53) - Module target aliases (
yup::yup_core, etc.) (#53) - Code coverage:
YUP_ENABLE_COVERAGE, codecov integration (#54) - Test sharding support:
--gtest_total_shards/--gtest_shard_indexfor parallel CI runs (#119)
Bug Fixes
- Crash at startup when height/width is 0 on custom-scaled screens (#21)
- Application never quits: incorrect
quitMessagePostedordering instopDispatchLoop()(#42) - Redraw issues and app icon rendering on macOS (#31)
- iOS toolchain: removed hardcoded
DEVELOPER_DIRpath (#72) - CoreAudio thread safety: atomic operations replacing mutex (#76)
- SMPTE timecode validation, SSE macro, and memory fixes (#78)
- ZIP timestamp: missing
>>1for 2-second resolution (#92) StyledText::clear()fully resets state; caret bounds and glyph index for empty lines (#96)- Duplicated SDL symbols in Apple plugins (#112)
ComboBoxpopup re-opens on click-to-dismiss; addedignoreMouseDownAfterPopupDismissal(#114)AudioDeviceManagerdestructor race onmidiCallbackLock(#115)- Android oboe:
__ANDROID__preprocessor instead ofANDROID(#9) Graphics::drawImage(),renderStrokePath(),renderFillPath(),renderFittedText(): opacity not propagated to renderer - fixed (#119)SIMDRegister: tail-loop bounds check preventing out-of-bounds access inloadandstorepaths (#119)- Mouse-wheel events now dispatched to the component under the cursor when no component is focused (#30)
- Linux
Watchdog: inotify fd set to non-blocking, read buffer heap-allocated, thread join order corrected to prevent crash on destruction (#36)
New Contributors
- @eyalamirmusic made their first contribution in #2
- @dikadk made their first contribution in #21
- @AnimatorJeroen made their first contribution in #42
- @kunitoki with @Copilot made their first contribution in #115
Full Changelog: https://github.com/kunitoki/yup/commits/v1.0.0