Skip to content

Release 0.1.0

Choose a tag to compare

@github-actions github-actions released this 02 Nov 20:50
· 17 commits to main since this release

0.1.0 (2026-11-02)

⚠ BREAKING CHANGES

  • image: Image takes a source; TgfxImage is the handle-taking host tag (#245)
  • camera: TgfxViewMethods.drawCameraFrame is removed. It drew the
    frame and blurred a polygon list without replaying the scene, so no child of
    the React tree was drawn on a camera canvas. Use
    inside a normal ; contours stay in frame pixels either way.
  • android: Vulkan is the default backend; TgfxVulkan=OFF falls back to GL (#252)

Features

  • adb-driven memory-leak gate (#258) (3daa970)
  • add 3D transforms and preserve3d to Group (3c85c10)
  • add Fill and useClock (#114) (43b5985)
  • android: experimental Vulkan backend + registry-wake regression fix (#218) (b4eb393)
  • android: Vulkan is the default backend; TgfxVulkan=OFF falls back to GL (#252) (73b94a4)
  • animate shader uniforms on the UI thread (#113) (19bcc78)
  • atlas: draw many sprites from one image in a single op (#199) (27655b0)
  • Blend and ColorShader shaders, and composing filters (468216c)
  • camera: a native frame-processor plugin, and a C++ export contract for it (#149) (#154) (dc89078)
  • camera: camera frames as a scene input via (#148) (bb3dc94)
  • camera: useCameraFrame owns the buffer lifetime (#149) (#152) (65d0b80)
  • Canvas.snapshot() and Canvas.save() without stalling the render loop (#137) (9e9c324)
  • canvas: a fonts prop that registers faces and gates children (#244) (2987433)
  • canvas: a SharedValue viewport, driven from the UI thread (#235) (756b0fa), references #234
  • color: accept CSS Color 4 color(display-p3 ...) syntax (#208) (6d860c8)
  • color: draw on a display-p3 surface and tag snapshots with its space (#209) (f43c2c1)
  • compiler: workletize the compile graph (#246) (8aa90b7)
  • composite prop to choose SurfaceView or TextureView on Android (d5623b0)
  • docs: add an animated figure to the overview page (b01ceb6)
  • docs: add animated figures to the drawing, effects and motion pages (926561f)
  • docs: add per-page Open Graph images (f24b94d)
  • docs: port the VisionCamera docs design with a purple accent (c46c751)
  • effects: film grain over a group, from tgfx's NoiseStyle (#229) (45506d2)
  • example: add a 3D cube screen (5277836)
  • example: add physics screen (88227b0)
  • example: camera effects screen with a neon-edge runtime shader (885b09c)
  • filters: an alpha threshold, and a colour filter that can follow an image filter (#228) (1eb2016)
  • fromPixels and setPixels for decoded RGBA (738a0d8)
  • getCacheInfo and purgeCaches — cache introspection and an immediate purge (#259) (8800cb4)
  • glass: expose the light, and make the whole material animate (#225) (b7aa8c7)
  • Group clip, invertClip and layer (856f515)
  • headless: callable forms for the clock, video pump, camera sink, buffers and press dispatch (#241) (ea2f53e)
  • hittest: report which nodes are under a canvas point (#205) (bb0c142)
  • image: draw SVG documents as image sources (9065e8f)
  • image: draw SVG documents as image sources (#169) (5b9bad6)
  • image: encode to bytes and save to disk from any image handle (#239) (8e9285c)
  • image: Image takes a source; TgfxImage is the handle-taking host tag (#245) (0f9bb59)
  • image: native image handles, hardware buffers, and Skia-parity + (#136) (472d471)
  • image: subset, scaled, oriented and blurred handles that share the parent decode (#202) (4b7cafb)
  • imperative: colour, transform and uniform slots, plus an imperative docs page (#161) (63f567a)
  • imperative: node handles that change a mounted scene without React (#155) (#156) (0c6ddaa)
  • imperative: slot coverage for the whole surface — text, path, image, gradients, filters, enums, visibility, shared buffers (#213) (7a0af16), closes #204
  • inner shadow, Luma and AlphaThreshold filters (8fdb652)
  • JS path utilities — boolean ops, bounds, contains, transform, measure (b969f08)
  • offscreen: a retained GPU surface with the view's scene contract (#240) (327fcd4)
  • offscreen: render a scene to an image without mounting a canvas (#201) (84657b3)
  • offscreen: scene inputs for export, and a React-free module split (#238) (1e14b7f)
  • opaque prop for a canvas that composites without an alpha channel (06a1460)
  • path effects — dash, corner, trim and fillType (e4f832b)
  • pdf: export a scene to a vector PDF (#206) (6fd95df)
  • picture: record a static group once and replay it every frame (#203) (272b67a)
  • prewarm the GPU device and font table at launch (#263) (41b9264)
  • react-native-tgfx — declarative GPU 2D canvas via Nitro + tgfx (f0adb4f)
  • scene: colour filters, blend modes and image filters as paint children (#140) (acecacd)
  • scene: element factories and a React-free Scene container (#237) (f9b0248)
  • scene: save, toImage, toSvg and toPdf straight off the scene (5945184)
  • scene: scenes built and mutated on worklet runtimes (#247) (f9bd05f)
  • shaders: child shaders — uniform shader, .eval() and sample() (#147) (b5e810f)
  • shaders: support helper functions in SkSL sources (#138) (aab52b9), references #136
  • strokeMiter, fauxBold and fauxItalic props (1f4605d)
  • svg: draw whole SVG documents, from a file or from markup (#223) (718dffe)
  • svg: export a scene to SVG markup (#207) (4cf8848)
  • text: a caret from a coordinate, and the boxes a range occupies (#231) (8a6db33)
  • text: bidi reordering and complex-script shaping through HarfBuzz (#232) (9bb16f5)
  • text: font manager, weight/style, paragraphs, measurement and (#142) (1ab6581), references #140
  • text: styled runs, per-line metrics, textPath() and (#145) (#159) (21c2f79)
  • vertices: triangle meshes with per-vertex colours and texture coordinates (#200) (101d5e6)
  • video: play videos into a native image handle (8dd424a)
  • viewport: a root zoom/pan the renderer owns, so a pinch costs no recommit (#221) (0066a7a)

Bug Fixes

  • 3d: keep clip, layer and grain under preserve3d, compose 3D hit tests, cache static plane rasters (0035063)
  • address the full-repo audit findings in #162 (#163) (c66a042)
  • align example app deps and drop the absolute-path thor dependency (4b639f0)
  • android: build every ABI, not just arm64-v8a (#166) (6822352)
  • android: convert Vulkan camera frames to RGB via immutable YCbCr conversion samplers (1d7a326)
  • android: decode images in-process so EXIF orientation survives (#151) (#158) (bce74e1)
  • android: guard nativePtr against release racing the staging calls (#56) (54a21dd)
  • android: preserve planar video on API 26-28 (e308d95)
  • android: read video planes through a CPU lock, not the reported geometry (4ae9f46)
  • android: route a SurfaceView size change to surfaceResized instead of a rebind (#63) (b6eeed9)
  • android: set the tgfx JavaVM in JNI_OnLoad (#150) (643f865)
  • android: warn about a missing hardware buffer only when no frame was produced (cd41f55)
  • animate strokeWidth instead of snapshotting it (#72) (cd5c4de), references #49
  • apply an inherited opacity once through a layer, and keep clipPath off every node (3817d97)
  • apply the tgfx CONFIG_DIR change from patches/ instead of rewriting the submodule (#83) (65d0586)
  • atomic pixelRatio, constexpr base64 table, bounded scene recursion (#46) (#79) (07773a9)
  • backdrop: frosted and liquid-glass panels that read the scene beneath them (#214) (1e0932f)
  • bench: fail the gate when no frame was captured, and reclaim leaked device sessions (#91) (f7be3bc)
  • benchmark: make tgfx-animated measure what it claims and draw what everything else draws (#78) (3015fd5)
  • bench: match the thread names the kernel actually reports (#99) (a0305fb), references #24
  • camera black-forever from guest shared-value race, faster camera start (13506ee)
  • camera: map any producer's pixel format, not just BT.601 (f4e1356)
  • ci: drop the PAT header before fetching upstream lfs (345d7b8)
  • ci: fetch tgfx lfs objects from upstream (fd266c5)
  • clear stale image data and fail on non-ok responses in useImage (#115) (f8798c6)
  • clear the image and typeface caches on the render thread (#75) (8f1e0e0)
  • color: colour-manage every surface, not just the window (#222) (e981034)
  • crash on android (017cd7f)
  • deps: align react-native-worklets with reanimated's peer range (6e54dce)
  • docs: (9e1dfec)
  • docs: (415441d)
  • draw the canvas style's backgroundColor (#198) (320ca64)
  • drop AlphaThreshold, whose tgfx shader never re-premultiplies (0f0b627)
  • eval child shaders at the requested coordinate on GL and bind runtime shader coords at highp (e453e14)
  • evict one image from the cache instead of flushing all 32 (#117) (e0ba861)
  • faux emphasis reaches fallback faces and respects span overrides (0c11d3e)
  • hash the string table into the setScene dedupe key (#55) (0d9e764)
  • hide the content when either mask side is empty, and keep the matte unshaded (de889e1)
  • ios: HybridTgfxView adopts RecyclableView so prepareForRecycle() fires (#255) (#257) (f2828bb)
  • ios: implement drawCameraFrame (62bbbea)
  • keep a Blend child resolving per frame instead of baking it (431cdbe)
  • keep the Canvas reconciler root alive across a StrictMode remount (#70) (43475c6)
  • keep the fill type across path effects and trim before reshaping (6858656)
  • load require()d images, fonts and video in Android release builds (f2a199d)
  • make group, paint and image opacity actually apply (#69) (f886138)
  • mask: seed the mask layer with Clear so DstIn spans the clip (081bb3a)
  • minor build issues (c354a1a)
  • native heap growth — slot-write serialization churn and the nitro CxxPart JNI cycle (#254) (#256) (64c1ab9)
  • nest contours by outline sampling and measure every contour (3d55e48)
  • offscreen: pre-drain hit tests, empty-path rejection, zero-copy encode (#243) (9768a36)
  • pack only the tgfx sources the native build compiles (#119) (e9aaa8a)
  • pack only the tgfx sources the native build compiles (#119) (#122) (5f7cbf2)
  • package: make a clean install of the published tarball build (#167) (4c6d10d)
  • real package metadata (#44) and non-silent color parse failures (#42) (#73) (3c3ff75)
  • reanimated: make the optional peer real and stop swallowing a broken install (#53) (4698c9d)
  • reject a missing image source by name (8b0d3eb)
  • reject a rowBytes that is not whole pixels, which the GPU row-length uploads would shear (f630d33)
  • release: keep versions on the 0.0.x prerelease line (0943e58)
  • releasse (64c0417)
  • releasse (c507fd9)
  • render SVG elliptical arcs instead of flattening them to lines (#80) (2022f6d)
  • replace the racy iOS idle-frame counter with a wake generation (#66) (80ffa98)
  • retain the Android camera buffer across the render hop, coalesce frames (#84) (7e0289d)
  • scene: ownership-aware reseed and quiet exports (#242) (e3740bb)
  • shader positions are points, and useClock ticks in seconds (#123) (9f5871a)
  • ship license, notice, and built entrypoints in the npm package (#116) (165abf2)
  • stop the SVG path parser spinning on an implicit repeat of Z (#67) (80c2bb3), references #58
  • tests: harness's jest global put Reanimated in mock mode, killing every slot write (#233) (d9bf9d0)
  • test: update the mixed-group golden for the post-#89 animated literal (#94) (9e04a99)
  • validate fromPixels geometry, refuse stream handles in replaceExternal, report pixel bytes to the GC (ae79c3a)
  • video: decode Android frames through a SurfaceTexture, not a hardware buffer (78fe09a)
  • video: produce Android frames at draw time so a paused video keeps its frame (d68193d)
  • video: rebuild the Android frame reader across background and resume (4fad058)
  • worklet: review follow-ups across colours, guards and the invariant test (#251) (bdd65b2)
  • write an animated field's current value as its literal, not zero (#89) (76e0c68)

Performance Improvements

  • alias drawing components to their host type instead of wrapping them (#54) (cc9aafb)
  • android: skip draws for offscreen canvases, cache decoded image handles, tighten registry dependency scan (#217) (f458575)
  • android: trace the render thread's phases (#100) (5b7ce89), references #24
  • bake the static effect prefix so only moving effects re-run (73211ba)
  • batch adjacent paths into one draw and keep frame proxies alive — 900 rotating paths from 70 to 114 fps (#264) (ea90732)
  • binary scene wire format, SurfaceView canvas, off-main-thread iOS rendering (978c7da)
  • build a node's paint, line path and font once at setScene instead of per frame (#93) (096fe27)
  • build plain shape trees without mounting the reconciler (#101) (1101644), references #24
  • build the mask Luma filter once instead of per frame (701d25f)
  • cache parsed color strings instead of re-parsing per node per commit (#61) (310e8fa)
  • commit-time batch clustering — 20k interleaved shapes from 8fps to 53fps (#260) (088cd8e)
  • compile-once render pipeline, dirty redraw, idle loop suspension (c7a9662)
  • cut per-node allocations and string dispatch in the compile path (7258f73)
  • drop the per-group child filter, gradient probe, and angle closure (#71) (66ecb27)
  • fold a static Blend without materialising its children (940743e)
  • fold static group matrices, elide transform-free group saves, stop the per-frame allocation under the render lock (#68) (2c026ec)
  • GPU render thread, tgfx runtime shaders, and a tgfx face-blur app (9bb25f1)
  • pre-filter contour nesting by bounds and skip single-contour work (c67da0d)
  • redraw a canvas only for the registries its own scene reads (dfe30d3)
  • seed the mask layer with a clip rect, and fill the new demo panels (75f1324)
  • send the scene string table as a delta so image payloads cross once (#92) (4c0d643)
  • shader: cache the SkSL transpile, and parse child declarations (#111) (e77a18c)
  • snapshot animating slots from a shared mirror and hold a program until its first push (#261) (b7d6c77)
  • stop clearing the image cache when the window is released (#96) (610d2a9)

Reverts

  • release pipeline and tarball allowlist pending verification (#121) (f6a1157)