Skip to content

v1.0.0

Choose a tag to compare

@kunitoki kunitoki released this 03 Jul 15:26
· 167 commits to main since this release
51ee1e1

Platform Support

Android

  • Android window support with YupActivity Java 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 CFRunLoopRunInMode targeting ~60 Hz; quit event registered with NSAppleEventManager for proper Apple Event quit handling (#47)
  • NSSupportsSuddenTermination = false added to macOS Info.plist (#47)

Emscripten / WebAssembly

  • Full Emscripten/WASM support including AudioWorklet audio device (#25)
  • WASM threading with exported runtime methods (#61)
  • -msimd128 compile 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() made const (#32)
  • AffineTransform::inverted() constexpr method (#19)
  • constexpr math utilities: jabs(), jmap(), jlimit(), findMinimum() / findMaximum(), nextPowerOfTwo(), and more (#18)
  • ColorGradient::Spread enum: Pad, Repeat, Reflect tiling modes with withSpread() builder (#119)
  • CubicBezier class: 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 by YUP_IMAGE_FORMAT_PNG (#119)
  • JPEG image format via libjpeg: quality-level encoding, controlled by YUP_IMAGE_FORMAT_JPEG (#119)
  • WebP image format via libwebp, controlled by YUP_IMAGE_FORMAT_WEBP (#119)
  • Animated GIF image format via libgif: per-frame delay, loop count, animated write API (beginAnimation / writeFrame / endAnimation), controlled by YUP_IMAGE_FORMAT_GIF (#119)
  • Image::loadFromData() reimplemented via ImageFormatManager (#119)

Offscreen Rendering

  • GraphicsContext::OffscreenTarget abstract interface for opaque platform GPU offscreen resources (#119)
  • Offscreen API on GraphicsContext: createOffscreenTarget(), beginOffscreen(), endOffscreen(), readOffscreenPixels() - implemented for Metal, OpenGL, and D3D backends (#119)
  • Graphics constructors for rendering to an Image or OffscreenTarget outside the main frame cycle (#119)
  • Image gained renderCanvas backing (RenderCanvas) alongside texture for offscreen render-to-texture; duplicate() re-enabled with proper deep copy (#119)
  • Graphics::TransparencyLayer RAII class for isolated group opacity compositing: renders into an offscreen target and composites back at the given opacity on commit() (#119)

Animations (yup_animation)

  • New yup_animation module: Lottie-compatible animation engine depending on yup_core and yup_graphics (#119)
  • Animation: high-level handle with loadFromFile(), loadFromData(), loadFromStream(), renderFrame(), renderAtTime(), renderAtProgress(), toJson(), and saveToFile() (#119)
  • AnimationPlayer: stateful playback controller with forward, reverse, and ping-pong direction modes, looping, variable speed, frame-range clamping, seek, and onFrameChanged / onLoopCompleted / onPlaybackEnded callbacks (#119)
  • AnimationEasing: cubic bezier easing with named presets (linear, easeIn, easeOut, easeInOut, hold) and fromLottieTangents() import (#119)
  • AnimationProperty<T>: generic animated property with keyframe interpolation; specializations for float, Point<float>, Size<float>, and Color (#119)
  • AnimationTransform: animated anchor, position, scale, rotation, and opacity with conversion to AffineTransform at 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 .json and .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 via JavascriptEngine (#119)
  • AnimationRenderer: renders an AnimationComposition to a Graphics context - layer hierarchy, parent-child transforms, matte layers (track-matte), shape fills/strokes/gradients, and image layers (#119)
  • AnimationFrameExporter: exports individual or all frames to Image objects 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_formats module: AudioFormat, AudioFormatManager, AudioFormatReader, AudioFormatWriter, WAV codec (#51)
  • Opus, MP3, FLAC, AAC, CoreAudio, and WMF codec support (#86, #88)

DSP (yup_dsp)

  • New yup_dsp module 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 (SpectralFlux and ComplexFluxODF) 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 AudioWorklet audio device (#25)
  • MIDI 2.0 / Universal MIDI Packets (UMP) implementation (#83)
  • KMeterState de-interleaving buffers pre-allocated in prepare(), eliminating per-block heap allocation in the audio callback (#119)

Synthesiser

  • SynthesiserVoice converted to ReferenceCountedObject with Ptr = ReferenceCountedObjectPtr<SynthesiserVoice>; Synthesiser::addVoice() now accepts SynthesiserVoice::Ptr (#82)

Audio Graph (yup_audio_graph / yup_audio_plugin_host)

  • New yup_audio_graph and yup_audio_plugin_host modules (#93)
  • Thread-safe BufferingAudioSource with atomic nextPlayPos (#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)
  • KeyboardFocusMode enum replacing boolean setWantsKeyboardFocus(); added textInput() callback (#16)
  • PopupMenu and ComboBox components (#57, #62)
  • Native file chooser via FileChooser (#61)
  • Component paint profiling: PaintProfiler with 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)
  • MouseListener weak-referenceable interface for all mouse events; Component::addMouseListener() / removeMouseListener() (#30)
  • Improved slider components (knob, linear, range) and button components (#70)

Text

  • TextEditor and Label components (#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_gui module (#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_model module (#15)
  • UndoManager with Transaction, ScopedTransaction, UndoableAction (#15)
  • DataTree hierarchical data structure with builder pattern and transactional mutations (#73, #74)
  • DataTree query support (#74)
  • DataTree schema validation (#74)
  • CachedValue<T> for type-safe DataTree property references (#74)
  • DataTree complete UndoableAction suite for transactional mutations: PropertySetAction, PropertyRemoveAction, RemoveAllPropertiesAction, AddChildAction, RemoveChildAction, RemoveAllChildrenAction, MoveChildAction, CompoundAction - all with full undo/redo semantics (#82)
  • Identifier usable as std::unordered_map key via std::hash specialization (#27)

Artboard (Rive Integration)

  • Improved artboard placement (#17, #43)
  • Shared Rive file across multiple Artboard components (#43)
  • State machine inputs: setNumberInput(), setBoolInput(), triggerInput() (#17, #43)
  • advanceAndApply() and durationSeconds() for timeline control (#17)
  • State machine event handling (#43)
  • Multi-artboard component support (#43)

Core & Utilities

New Modules

  • yup_simd: SIMD vectorization framework (#107)
  • yup_python: Python bindings (from popsicle) (#65)

yup_core Additions

  • SqliteDatabase with Statement and Transaction (#94)
  • Perfetto profiling: YUP_ENABLE_PROFILING, Profiler singleton, YUP_PROFILE_START / YUP_PROFILE_STOP macros (#20)
  • Watchdog file watching utility (#50)
  • URL copy and move constructors (#58)
  • messageThreadID made atomic (removed mutex) (#26)
  • ReferenceCountedObject::incReferenceCount() / decReferenceCount() made const (#28)
  • DatagramSocket multicast 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.h support; WASMFS enabled for standalone builds (#36, #59)
  • Linux: File::isOnRemovableDrive() implemented via /sys/block/<dev>/removable (#36)

Build System

  • zlib and oboe extracted from inline module sources into standalone thirdparty/ modules for cleaner namespace isolation and build separation (#6, #7)
  • TARGET_IDE_GROUP parameter on yup_standalone_app and yup_audio_plugin; all modules, tests, and examples placed in dedicated "Modules", "Tests", and "Examples" IDE folders (#11)
  • appleFrameworks / appleWeakFrameworks module declaration fields unifying iOS and macOS framework lists (#36)
  • Per-platform C++ standard override via *CppStandard module 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_index for parallel CI runs (#119)

Bug Fixes

  • Crash at startup when height/width is 0 on custom-scaled screens (#21)
  • Application never quits: incorrect quitMessagePosted ordering in stopDispatchLoop() (#42)
  • Redraw issues and app icon rendering on macOS (#31)
  • iOS toolchain: removed hardcoded DEVELOPER_DIR path (#72)
  • CoreAudio thread safety: atomic operations replacing mutex (#76)
  • SMPTE timecode validation, SSE macro, and memory fixes (#78)
  • ZIP timestamp: missing >>1 for 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)
  • ComboBox popup re-opens on click-to-dismiss; added ignoreMouseDownAfterPopupDismissal (#114)
  • AudioDeviceManager destructor race on midiCallbackLock (#115)
  • Android oboe: __ANDROID__ preprocessor instead of ANDROID (#9)
  • Graphics::drawImage(), renderStrokePath(), renderFillPath(), renderFittedText(): opacity not propagated to renderer - fixed (#119)
  • SIMDRegister: tail-loop bounds check preventing out-of-bounds access in load and store paths (#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

Full Changelog: https://github.com/kunitoki/yup/commits/v1.0.0