Published July 31, 2026 | Version v7.1.0

ejeschke/ginga: Ginga v7.1.0

  • 1. Space Telescope Science Institute
  • 2. Aperio Software
  • 3. Caltech/IPAC
  • 4. HeidelbergCement
  • 5. Academia Sinica
  • 6. Universidad Complutense de Madrid
  • 7. UCO
  • 8. Cisco | Splunk
  • 9. National Institute for Standards and Technology
  • 10. Leibniz Institute for Astrophysics @aipescience
  • 11. STScI
  • 12. SETI Institute & LMSAL (@LM-SAL)
  • 13. Minnesota State University Moorhead
  • 14. W. M. Keck Observatory
  • 15. University of Maryland
  • 16. U of Maryland
  • 17. AURA/Vera C. Rubin Observatory

Description

  • Added an experimental Vulkan renderer (renderer='vulkan'), a GPU-accelerated, toolkit-agnostic renderer built as an alternative to the OpenGL one. It renders GPU-native (images colormapped in-shader with live cut levels/distribution, shapes/wide/dashed lines, native Pillow text, RGBA alpha, and a 3D camera mode) into an offscreen Vulkan image and hands the result back as an array, so every backend (qt, gtk3, gtk4, tk, and the pg web/websocket backend) can use it via the same array path as the pil/agg renderers. Select it with ginga -t <toolkit> -r vulkan or the new per-viewer renderer setting; it falls back automatically when the vulkan binding or a device is unavailable. Requires the optional vulkan dependency (pip install ginga[vulkan]) and a system Vulkan driver (Mesa lavapipe works for a CPU/headless device). See the developer manual ("The Vulkan renderer") for details. Not available in-situ under Pyodide/PyScript.
  • The OpenGL renderer now draws text by rasterizing it with Pillow and blitting a texture (filled, anti-aliased) instead of converting it to cairo path outlines, and supports wide and dashed lines by expanding them into filled triangles (OpenGL does not guarantee lineWidth > 1 or stippling). This drops the cairo dependency for OpenGL text.
  • bump required version of a few dependencies
  • Menu items can now show an icon as well as (or instead of) text, like toolbar actions. Menu.add_name(), Menu.add_menu() and Menubar.add_name() accept iconpath/iconsize keyword arguments, and MenuAction gains a set_icon() method. An icon_only flag requests showing just the icon where the backend can render it, always falling back to the text label otherwise, so the same calling code shows the icon, the text, or both depending on the backend. Fully supported on the qt, gtk3, and pg (web) backends; the gtk4 backend accepts the arguments for API parity but renders text only for now
  • The qt RadioButton now honors the group keyword across different containers. Previously qt only made radio buttons mutually exclusive when they shared a parent widget; grouped buttons now use a shared QButtonGroup, matching the gtk3/gtk4/pg backends
  • Added a TreeView.delete_tree() method (qt/gtk3/gtk4/pg) that removes the nodes named by a subtree of keys -- individual leaves or whole subtrees -- from a loaded tree, optionally pruning branches left empty, preserving the selection on surviving items, and firing the selected callback if the selection changed and changed if anything was deleted
  • The ColorDist color distribution classes now produce a normalized 0.0-1.0 floating point curve; the RGB mapping Distribute stage scales that to the output level (bit depth) and quantizes to the index type. This preserves precision (no longer capped at 256 levels for deeper outputs) and is slightly faster. The colorlen argument to the ColorDist classes is now vestigial and deprecated (it has no effect). Custom ColorDist subclasses should now install their curve as a normalized 0.0-1.0 float array via the new public set_hash() method (formerly _set_hash). For backward compatibility, a subclass whose calc_hash() still stores a pre-7.1 integer/colorlen-scaled hash is detected at build time and normalized automatically, with a PendingDeprecationWarning; this shim will be removed in a future release (github issue #1148)
  • Color maps are now resolution-independent: ginga.cmap.ColorMap gains get_colors(n), which samples/interpolates the map to any size, and can be built from a discrete list (as before), piecewise-linear control points (ColorMap.from_control_points), or a callable (from_function). matplotlib color maps are captured without retaining a runtime dependency on matplotlib
  • Added a color_depth viewer setting that controls the resolution (in bits) at which pseudocolor is distributed, decoupled from the RGB output depth. Raising it (e.g. to 12) yields much smoother gradients -- many more distinct colors and far less banding -- for colorful color maps on a standard 8-bit display, at negligible cost. The default (8) is unchanged. Both the standard and OpenGL renderers honor the setting (the OpenGL renderer sizes its GPU colormap texture up to 4096 entries)
  • The DS9-derived color maps (gray, ramp, red, green, blue, heat, ds9_cool, ds9_a, ds9_b, ds9_bb, ds9_he) are now defined by their authoritative SAOImageDS9 piecewise-linear control points instead of baked 256-entry arrays. They are exact, resolution-independent (smooth at any color depth), and small (this also removed ~2600 lines from ginga/cmap.py)
  • Fixed an issue with matplotlib plots getting their axes labels cut off

Files

ejeschke/ginga-v7.1.0.zip

Files (35.0 MB)

Name Size Download all
md5:6cda8e5c1d61bb7fc286a3f33916979f
35.0 MB Preview Download

Additional details

Related works

Is supplement to
Software: https://github.com/ejeschke/ginga/tree/v7.1.0 (URL)

Software