svs 1.0.0 copy "svs: ^1.0.0" to clipboard
svs: ^1.0.0 copied to clipboard

Streams and renders Aperio SVS whole-slide pathology images: pan/zoom, LOD tile streaming, JPEG & JPEG2000, no full-image load.

1.0.0 #

  • Fixed: with an annotationController attached, a two-finger pinch could occasionally fail to zoom at all (ScaleGestureRecognizer computing scale == 1.0 despite a finger clearly moving), even in drawMode.none where pan/zoom is supposed to work normally. GestureDetector's own onTapUp (a TapGestureRecognizer) and the pan/zoom onScaleStart/ Update/End (a ScaleGestureRecognizer) were both live for the same pointer, and having the two recognizers compete in the same gesture arena made the scale recognizer's own math unreliable. Tap detection no longer goes through a separate TapGestureRecognizer at all — it's synthesized from raw Listener pointer events instead (which don't participate in the gesture arena), so there's nothing left for ScaleGestureRecognizer to compete with.
  • SvsFile.readInfo, SvsLevel.readAllTags/readTags, SvsAssociatedImage.readAllTags/readTags: read every TIFF tag on any level/associated-image IFD (or just a chosen subset), decoded regardless of type (ints, ASCII, RATIONAL/SRATIONAL, FLOAT/DOUBLE, raw bytes) — a full structured dump of the file's own metadata, alongside the existing narrower accessors (metadata.raw, level/associated-image geometry) for callers that only need specific fields. SvsFileInfo/SvsIfdInfo carry the result, with a namedTags getter (via the new tiffTagName) for presenting tag IDs as human-readable names.
  • SvsImageAdjustments: brightness/contrast/shadow/highlight adjustment, applied identically live (SvsImageView.adjustments, GPU-accelerated — cheap to change every frame) and on export (every exportSvs*/ encodeSvsImage function's new adjustments parameter) — both derive from the same affine transform, so the two are always in sync.
  • exportSvsRegionAsSvs/exportSvsRegionAsSvsToFile: crop a region and re-encode it as a brand new, valid multi-level pyramidal .svs file (a tiled BigTIFF with JPEG-compressed tiles and an Aperio-style ImageDescription) instead of a single flat raster image — the result can be reopened with SvsFile.open, by this package or any other tiled-TIFF/ OpenSlide-aware tool, and panned/zoomed like any other slide.
  • SvsImageView.showMinimap/showZoomLevel/showScaleBar: independently toggle the minimap, the zoom-percentage HUD text, and the physical scale bar — all default to true (unchanged behavior). showMinimap: false skips decoding the slide's thumbnail entirely, not just hiding it.
  • Fixed: SvsImageView's zoom-percent HUD could jump to a garbage value while drawing a point/polyline/polygon annotation. Only rectangle mode used to suppress pan/zoom while drawing; point/polyline/polygon mode placed vertices via tap but left the underlying pan/zoom gesture live underneath, so a quick run of taps could occasionally be misread as a pinch. Pan/zoom is now fully suppressed (GestureDetector's scale callbacks are nulled out entirely, not just short-circuited) for the whole time any annotation shape is being drawn, and takes effect on the very next gesture even if drawMode changes with no other rebuild in between.
  • Fixed: SvsFile.readInfo()/readAllTags()/readTags() could throw (or, for a corrupted count field, attempt a multi-gigabyte read) if any tag anywhere in the file had an unrecognized TIFF field type — aborting the entire "best-effort full dump" over one bad tag. Both now surface as a short <unreadable: ...> placeholder for that one tag instead.
  • Fixed: concurrent DiskTileCache.put() calls for different tiles (routine during fast pan/zoom, since decoded tiles persist to disk unawaited) could race on the shared byte-budget accounting and eviction, letting the cache temporarily grow past maxBytes by more than the documented single-oversized-tile allowance. The accounting/eviction half of put is now serialized against itself.
  • exportSvsRegionAsSvs now builds the pyramid (downsampling, JPEG encoding, the BigTIFF write) on a background isolate instead of blocking the calling isolate — previously a large crop could freeze the UI for the whole encode.
  • LodController no longer persists prefetch-margin tiles (only ever fetched speculatively, not yet on screen) to the disk cache — only tiles actually visible when decoded are, roughly halving disk I/O during fast panning.
  • Internal: TileCache and DiskTileCache now share their LRU eviction policy (pickEvictions) instead of maintaining two independent copies of the same algorithm.

0.3.0 #

  • SvsAnnotationController, SvsAnnotation: draw and manage point, rectangle, polyline, and polygon annotations over an SvsImageView, anchored in level-0 pixel space so they stay put across pan/zoom. Pass a controller to SvsImageView.annotationController to render its annotations and route pointer gestures to it while drawMode isn't SvsAnnotationDrawMode.none — point mode commits on tap, rectangle mode draws on drag, polyline/polygon mode adds a vertex per tap (call finishPath() to commit). Tapping in view mode (drawMode.none) hit-tests and auto-selects an existing annotation, and fires the new SvsImageView.onAnnotationTap callback. Annotations round-trip to JSON via SvsAnnotationController.toJsonList/loadFromJsonList.
  • measureAnnotation: physical length (and, for rectangles/polygons, area) of an SvsAnnotation, computed from the slide's microns-per-pixel. SvsImageView shows this as a live label on line/rectangle/polygon annotations — including the one being drawn, so drawing doubles as a ruler — toggle with the new SvsImageView.showMeasurements.
  • DiskTileCache: an opt-in persistent tile cache. Pass one to the new SvsImageView.diskCache and decoded tiles are read from disk first (and written back after a fresh decode), so re-viewing the same region of a slide — even across app restarts — skips the tile fetch and, for JPEG2000 slides, the wavelet decode. Byte-budgeted and LRU-evicted like the existing in-memory TileCache.

0.2.0 #

  • readSvsRegion: crops an arbitrary rectangle of any pyramid level to a single composited image, stitching together only the tiles it overlaps. The rectangle may hang off the level's edges; the out-of-bounds part decodes transparent.
  • encodeSvsImage, exportSvsRegion, exportAssociatedImage, exportSvsLevel: encode a decoded image (a crop, an associated image, or a whole pyramid level) to PNG, JPEG, BMP, TIFF, or WebP bytes, via the new image dependency. exportSvsLevel guards against accidentally compositing/encoding a gigapixel level whole. Each has a ...ToFile counterpart (exportSvsRegionToFile, exportAssociatedImageToFile, exportSvsLevelToFile) that writes straight to a path instead of returning bytes.

0.1.0 #

  • Initial release.
  • SvsFile: opens Aperio SVS (and generic tiled TIFF) files — resolution pyramid levels, associated images (thumbnail/label/macro), and parsed Aperio metadata (magnification, microns-per-pixel).
  • SvsImageView: a pan/zoom widget streaming only the tiles the current viewport needs, at the resolution level matching the current zoom. Includes a minimap, zoom percentage, and a physical (µm/mm) scale bar.
  • JPEG (Compression=7) and JPEG2000 (Compression=33005) tile decoding — JPEG2000 via the openjpeg_ffi package.
  • Tile fetch and JPEG2000 decode run on background isolates; a memory-budgeted LRU tile cache responds to OS memory-pressure signals and actively cancels in-flight requests for tiles scrolled out of view.
0
likes
0
points
595
downloads

Publisher

verified publishermonlycute.id.vn

Weekly Downloads

Streams and renders Aperio SVS whole-slide pathology images: pan/zoom, LOD tile streaming, JPEG & JPEG2000, no full-image load.

Repository (GitHub)
View/report issues

Topics

#image #medical #widget

Funding

Consider supporting this project:

ko-fi.com

License

unknown (license)

Dependencies

flutter, image, openjpeg_ffi

More

Packages that depend on svs