# Changelog
All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [12.2.1] – 2024-12-07

### Added

- Support for building the SWIG-generated R language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-DENABLE_R={AUTO|ON|OFF}` option.
- A sandboxing wrapper, `dot_sandbox`, is now included with Graphviz. Users
  should prefer their platform’s native security solutions, but if nothing
  better is available this wrapper offers safe processing of untrusted inputs in
  some scenarios.

### Changed

- JPEG images without an `APP0` leading segment are supported for use in `src`
  fields and friends. Previously Graphviz was overly strict with the types of
  JPEGs it would recognize. #2619

### Fixed

- The GVPR library program `depath` no longer acts on previously deleted nodes,
  causing unpredictable results. #1702
- Void-typed function parameters (`int foo(void bar)`) and variables `void baz;`
  in GVPR are gracefully rejected. #2585
- Input that induce a set node height but no set node width no longer crash with
  the failure “Assertion failed: `(r->boundary[i] <= r->boundary[NUMDIMS + i])`,
  function RTreeInsert”. It is typically not obvious to users when their input
  falls into this situation, hence why the assertion message is quoted here.
  This was a regression in Graphviz 12.0.0. #2613
- Strings containing double quote characters preceded by escape sequences (e.g.
  `\n"`) are once again correctly escaped in dot or canonical output. This was a
  regression in Graphviz 9.0.0. #2614
- `dot_builtins` no longer lists duplicate format options in its error messages.
  #2604
- A precision error that resulted in truncated edge lines has been corrected.
  This was a regression in Graphviz 12.0.0. #2620
- The xlib plugin (`-Tx11`) resets its initialization state during finalization.
  This fixes a rare scenario where multiple input graphs are supplied and
  initialization for one of the not-first graphs fails. In this scenario,
  finalization would be unaware of this failure and act on invalid state.

## [12.2.0] – 2024-11-04

### Removed

- Visual Studio build files have been removed. CMake is now the only supported
  build system on Windows.

### Added

- Support for building the SWIG-generated PHP language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-DENABLE_PHP={AUTO|ON|OFF}` option.
- Support for building the SWIG-generated Python language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-DENABLE_PYTHON={AUTO|ON|OFF}` option.

### Changed

- An algorithm closer to that described in RFC 1942 and/or the CSS 2.1
  specification is now used for sizing table cells within HTML-like labels. This
  is less scalable than the network simplex algorithm it replaces, but in
  general produces more intuitive results. #2159
- Tooltips on table elements within HTML-like labels are now propagated to SVGs
  produced by the core plugin (`-Tsvg`) even when the elements do not have
  `href` attributes. #1425
- In the Autotools build system, `pkg-config` is the only supported way for
  discovering Guile. Previous use of `guile-config*` has been removed. #2606
- The Autotools release artifacts for macOS (`Darwin_*_graphviz-*.tar.gz`) now
  use relative paths in links to dependent libraries and plugins. This should
  make the tree relocatable instead of having to live at /Users/gitlab/builds.
  #2501
- `gml2gv` no longer maps GML `label` attributes to Graphviz `name` attributes.
  These are now mapped to Graphviz `label` attributes. #2586

### Fixed

- In the Autotools build system, the core plugin links against libm, fixing some
  unresolvable symbols. This was a regression in Graphviz 4.0.0. Though it would
  primarily have affected non-Graphviz applications attempting to load this
  plugin on Linux.
- The osage layout engine now understands a cluster to be indicated by the
  common rules, including the “cluster” prefix being case insensitive and the
  `cluster=true` attribute as an alternative. #2187
- `acyclic` once again produces its output on stdout. This was a regression in
  Graphviz 10.0.1. #2600
- When using the Tclpathplan module, created vgpanes can once again be named and
  addressed. This was a regression in Graphviz 12.1.2.
- Omitting a polygon identifier when running triangulation using the Tclpathplan
  module (e.g. `vgpane0 triangulate` instead of `vgpane0 triangulate 42`) no
  longer goes unnoticed and reads invalid memory. This bug seems to have existed
  since the first revision of Graphviz.
- When using the Tclpathplan module, defining a malformed &lt;3-point polygon
  and then attempting to triangulate this polygon no longer reads invalid
  memory. This case is now rejected with an error during triangulation. Like the
  previous entry, this bug seems to have existed since the first revision of
  Graphviz.
- When using the Tclpathplan module, binding a pane’s triangulation callback to
  a string ending in a trailing `%` (e.g. `vgpane0 bind triangle %`) no longer
  causes later out-of-bounds reads during triangulation. Like the previous
  entries, this bug seems to have existed since the first revision of Graphviz.
  #2596
- Mouse right-clicks in Smyrna are no longer sticky. In some contexts,
  right-clicking the mouse would register a mouse down event but no mouse up
  event, leading Smyrna to believe the user was dragging with the right button
  held down.
- Arrowhead missing from tail-end of edge #2437
- The Ruby bindings package (libgv-ruby) is once again installable on Ubuntu.
  This became uninstallable when Ruby 1.8 was no longer available on Ubuntu, as
  it had a hard coded dependency of Ruby 1.8. This has now been relaxed to
  depend on any Ruby version ≥ 1.8. #2607
- Generated GIFs and JPEGs display the graphed image instead of a single solid
  color. This was a regression in Graphviz 12.1.1. #2609
- The CMake build system includes some supporting pieces of the SWIG-generated
  language bindings that were previously missing. It also links further
  dependencies that were previously missing.
- In the CMake build system, linking of the Guile language bindings uses the
  full path to libguile, fixing issues on macOS.
- The provided release packages for Debian-based operating systems (only Ubuntu
  currently) have corrected package dependencies. #2466
- Discussion of `gvpr -c ""` in the `gvpr` man page has been removed. This
  invocation did not do what was claimed. #2584

## [12.1.2] – 2024-09-28

### Changed

- In the Autotools build system, the rsvg plugin is no longer built when
  pangocairo is missing. Previously, when librsvg was found but pangocairo was
  not, this plugin would be enabled and built but offer no functionality.
- The RSVG plugin now requires librsvg ≥ 2.42.7.
- The RSVG plugin uses newer librsvg APIs where available. #2206

### Fixed

- In the Autotools build system, fallback discovery of libANN when `pkg-config`
  support is unavailable has been corrected to properly enable use of libANN.
  This primarily affects `mingle` users on Debian-based operating systems or
  macOS.
- The RSVG plugin no longer dereferences a null pointer when failing to create
  new RSVG handles.
- The Pango plugin no longer assumes a little endian environment when loading PS
  images.
- Deleting a “vgpane” when using the Tclpathplan module no longer frees an
  invalid pointer. This bug appears to have existed since the first revision of
  Graphviz. That is, deleting a “vgpane” has always crashed the TCL interpreter
  or silently corrupted the heap prior to this release.

## [12.1.1] – 2024-09-09

### Added

- Support for building the SWIG-generated Guile language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-DENABLE_GUILE={AUTO|ON|OFF}` option.
- Support for building the SWIG-generated Java language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-DENABLE_JAVA={AUTO|ON|OFF}` option.
- Support for building the SWIG-generated Lua language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-DENABLE_LUA={AUTO|ON|OFF}` option.
- Support for building the SWIG-generated Perl language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-DENABLE_PERL={AUTO|ON|OFF}` option.

### Changed

- Comparison against a plugin’s `knowncolors` array is now case-insensitive,
  rather than requiring all entries of the array to be lower-cased. The
  requirement that the `knowncolors` array is lexically ordered remains.
- The Smyrna “Color Theme”, “Edge Attr. For Color”, and “Node Alpha” settings
  have been removed. The values of these settings had no effect.
- Graphviz libraries set close-on-exec on job output files being written and
  user shape files being read. This should only affect applications using
  Graphviz libraries that rely on a fork-and-exec-ed child subprocess being able
  to access these open files. Applications with this requirement can regain the
  old behavior by unsetting the close-on-exec flag immediately after creating
  these objects. Graphviz libraries themselves are not affected by whether or
  not this flag is set.
- The Autotools build system no longer detects or uses the `-perl` option to
  SWIG to build Perl language bindings. Only `-perl5` is used.

### Fixed

- A reference to the non-existent `colxlate` function in an error message has
  been corrected to `colorxlate`.
- `gvgen` no longer crashes sometimes when running random graph generation. This
  was a regression in Graphviz 12.0.0. #2588
- Dashed and dotted pen styles in VRML images loaded by the GD plugin have been
  corrected.
- `mm2gv` no longer crashes when reading various types of malformed Matrix
  Market files.
- The `edgepaint` `--color_scheme` command-line option is once again functional.
  This was a regression in Graphviz 2.49.0. #2591
- An incorrect deallocation call during OpenGL texture construction failure has
  been corrected. This could previously have caused crashes or heap corruption.
  This was a regression in Graphviz 2.26.0.
- The CMake build on Windows no longer fails if TCL is detected. This was
  technically a regression in 12.0.0 since building the Graphviz TCL bindings
  was integrated into the CMake build system in that release. #2581
- When its output file cannot be opened, `edgepaint` no longer dereferences a
  null pointer when printing its error message.

## [12.1.0] – 2024-08-12

### Added

- Enable the GNU Triangulated Surface Library (GTS) in Windows builds. #2557
- `dot_builtins` now also includes the vt plugin (`-Tvt` output format).
- The vt plugin gained new output formats, `-Tvt-4up`, `-Tvt-6up`, and
  `-Tvt-8up`, for drawing monochrome 4-, 6-, and 8-pixel-per-character
  visualizations, respectively.
- The CMake build system now includes the WebP plugin also on Windows.
- A Windows x64 `mingle` binary is now built with CMake.
- Support for building the SWIG-generated D language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-DENABLE_D={AUTO|ON|OFF}` option.
- Support for building the SWIG-generated Go language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-DENABLE_GO={AUTO|ON|OFF}` option. The target integer size can be set with
  `-DINTGOSIZE=…` if it is not auto-detected correctly.
- Support for building the SWIG-generated JavaScript language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-DENABLE_JAVASCRIPT={AUTO|ON|OFF}` option.

### Changed

- The GTK plugin, for which build system support was removed in Graphviz 10.0.1,
  has been removed from the portable source tarball. #1848
- To build from source, the required C++ standard has been upgraded from C++11
  to C++17. #2536
- **Breaking**: the CMake variables `enable_ltdl`, `with_expat`, `with_gvedit`,
  `with_smyrna`, `with_zlib`, `enable_tcl`, `enable_swig` and `enable_sharp`
  have been renamed  to `ENABLE_LTDL`, `WITH_EXPAT`, `WITH_GVEDIT`,
  `WITH_SMYRNA`, `WITH_ZLIB`, `ENABLE_TCL`, `ENABLE_SWIG` and `ENABLE_SHARP`,
  respectively.
- To build from source, the required Python version has been upgraded from 3.6
  to 3.8. #2549
- Build system discovery of GDK now looks for GDK 3.0 instead of GDK 2.0. #1848
- Visual Studio build files are no longer distributed in the portable source
  tarball. Builds on Windows must now use a repository clone.

### Fixed

- `ccomps`, `gc`, the fdp layout engine, the neato layout engine, and the
  patchwork algorithm now understand a cluster to be indicated by the common
  rules, including the “cluster” prefix being case insensitive and the
  `cluster=true` attribute as an alternative. #2187
- `overlap` values whose prefixes are themselves valid values (e.g.
  `overlap=scalexy` where `overlap=scale` is also a valid setting) are once
  again usable. Previously such values would silently select the shortest valid
  prefix. This was a regression in Graphviz 2.24.0. #2563
- Setting `overlap=ortho_xy` no longer also runs the constraint pass of
  `overlap=porthoxy`. Setting `overlap=ortho` no longer also runs the constraint
  passes of `overlap=ortho_xy` and `ortho=porthoxy`. This bug has existed ever
  since these overlap modes were introduced in Graphviz 2.4. However its effect
  was masked by the bug discussed in the prior CHANGELOG entry that made it not
  possible to select `overlap=ortho_xy` or `overlap=porthoxy`.
- `splines = true` merging multiedges together when using the neato engine.
  #2241 (fixed on Windows by enabling GTS)
- The GVC output writing APIs handle writes of compressed data `> UINT_MAX` more
  correctly.
- GVPR casts of strings to floats now produce the expected values. This was a
  regression in Graphviz 2.30.
- CMake builds do not support format png:gd #1786
- The diffimg utility is not built in CMake builds #1788 (fixed also for
  Windows x64 builds)
- The Windows x86 `mingle` binary built with CMake no longer fails to start
  because of missing `ANN.dll`.
- The node and edge tags printed by the TK output format (`-Ttk`) are once again
  usable for later referencing those same nodes and edges in TCL scripting. This
  was likely broken in the transition from 32-bit to 64-bit hardware. #2568
- Ubuntu 24.04 binaries incorrectly are ASan enabled and produce memory leak
  errors. #2574
- gvpr’s ability to handle empty string parameters to `printf` (e.g.
  `printf("hello%s world", "")`) has been restored. This was a regression in
  Graphviz 9.0.0. #2577
- pkgIndex.tcl for the TCL bindings is constructed based on target system
  properties instead of host system properties. Previously, cross-compilation
  would result in potentially incorrect library loading directives in this file.
- The Autotools build system no longer checks for the presence of php.h, which
  previously caused spurious failures when trying to build the PHP bindings with
  PHP 8.3. #2589
- A `gvmap` crash due to out-of-bounds memory writes has been fixed. This was a
  regression in Graphviz 8.0.1.

## [12.0.0] – 2024-07-04

### Added

- Support for building the Graphviz TCL bindings has been integrated into the
  CMake build system. This is controllable by the `-Denable_tcl={AUTO|ON|OFF}`
  option.
- Support for building the SWIG-generated TCL language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-Denable_swig={AUTO|ON|OFF}` option.
- Support for building the SWIG-generated C# language bindings has been
  integrated into the CMake build system. This is controllable by the
  `-Denable_sharp={AUTO|ON|OFF}` option.

### Changed

- The Catch2-based test suite in the CMake build system has been ported from
  Catch2 v2 to Catch2 v3. Support for Catch2 v2 has been removed. #2465
- The Windows release artifacts are now built on Windows 2022 and Visual Studio
  2022 17 and toolset v143.
- The macOS release artifacts are now built on macOS 13 (Ventura).
- The CMake build system no longer links `dot_builtins` against libsocket.
- The CMake build system now only compiles `dot_builtins` if building shared
  libraries (`-DBUILD_SHARED_LIBS=ON`).
- **Breaking**: the `polygon_t.style` member is now a struct.
- **Breaking**: the `LEN` and `MAXDOUBLE` constants have been removed.
- Accuracy in processing compass points has been improved.
- **Breaking**: the `CMYK_BYTE` member of the `color_type_t` enum and the
  corresponding `gvolor_t.u.cmyk` field have been removed. The color format this
  mapped to was neither documented nor implemented correctly.
- The Windows releases available for download on graphviz.org now only include
  CMake-produced packages, not MS Build-produced packages. The MS Build packages
  are available in the
  [Gitlab package registry](https://gitlab.com/graphviz/graphviz/-/packages) if
  needed.
- The CMake build system more pervasively sets rpaths of compiled binaries,
  libraries, and plugins, which should result in them more reliably finding
  their supporting components.
  without `$LD_LIBRARY_PATH`/`$DYLD_LIBRARY_PATH` tricks.
- **Breaking**: the `Agraph_t.n_id` field is now an opaque pointer.
- **Breaking**: the libpack functions `putGraphs`, `putRects`, and `shiftGraphs`
  now operate on floating-point points (`pointf`) instead of integer points
  (`point`).
- **Breaking**: the `BF2B` macro has been removed.
- **Breaking**: the undocumented `-Tmp` output format has been removed.
- **Breaking**: the arith.h header defines neither `_GNU_SOURCE` nor `sincos`
  any more. None of the build systems attempt to discover `sincos` any more.
- The FIG output format (`-Tfig`) supports up to 512 custom colors. The previous
  limit was 256, after which it would crash (see note in the “Fixed” section).
- **Breaking**: The TCL binding’s `tcldot_layout` function no longer tries to
  fallback to the `dot` layout engine if the requested engine is unavailable but
  instead fails with an error message.
- The TCL binding’s graph `render` command no longer ignores layout errors.
- The TCL binding’s graph `write` command now does layout unconditionally,
  regardless of what output renderer is selected.
- The CMake build system builds cgraph++ and gvc++ as either shared or static
  libraries, respecting the `BUILD_SHARED_LIBS` setting.
- Discovery of the fcntl.h header has been removed from all build systems. This
  header is now unconditionally assumed to exist.
- **Breaking**: `obj_state_t.gradient_frac` is now a `double`.
- **Breaking**: `path.nbox` is now a `size_t`.
- The change described as “Some `routesplines` miscalculations that led to lost
  edges and fatal errors have been avoided” in 11.0.0 has been reverted. The fix
  for this caused other problems.
- **Breaking**: the `d` and `disc` parameters have been removed from
  `Dtcompar_f`.
- CentOS packages are no longer provided.
- In the CMake build system, the minimum required CMake version has been
  increased to 3.14.1.
- **Breaking**: the `disc` parameter has been removed from `Dtfree_f`.
- Gvedit no longer depends on the getopt library.

### Fixed

- The CMake build system now uses absolute paths to PangoCairo libraries during
  linking, resolving build problems on macOS.
- The CMake build system’s path for third-party headers for the DevIL plugin has
  been corrected.
- Edges not rendering properly when using ports and the `crow` arrowhead/tail
  with Windows `Release` builds. #2490
- A duplicate prototype of `aghtmlstr` has been removed.
- `agrelabel_node` (or equivalently, `agrename` when operating on a node) no
  longer corrupts the node-by-id set, causing a crash. This bug was preventing
  `gxl2gv` from processing inputs that used node `name` attributes. #2300
- Accuracy improvements have fixed an assertion failure on macOS. #2538
- The FIG output format (`-Tfig`) no longer crashes when handling more than 256
  colors.
- The `scale` operation implemented by the TCL binding’s tclpathplan scales
  relative to the center of the points being scaled instead of reading
  uninitialized memory.
- The xlib plugin sets “close-on-exec” on the file descriptors it creates,
  preventing them leaking into either web browsers it starts or other processes
  created by the hosting application.
- A sign confusion issue in neatogen’s weighting calculations was fixed. This
  was a regression in Graphviz 11.0.0.
- The CMake build system no longer attaches `dllimport`/`dllexport` annotations
  when compiling static libraries on Windows and MinGW.
- An issue with linking gvpack when building static libraries in the CMake build
  system was fixed.
- An sfdp use-after-free issue was fixed. #2556
- Using `concentrate=true` once again works. This was a regression in Graphviz
  11.0.0. #2559
- `overlap="scale"` no longer causes nodes to be placed on top of one another.
  This was a regression in Graphviz 7.0.5. #2564
- libpack code now understands a cluster to be indicated by the common rules,
  including the “cluster” prefix being case insensitive and the `cluster=true`
  attribute as an alternative. #2187, #2555

## [11.0.0] – 2024-04-28

### Added

- `gv2gml` gained a `-y` option to output the yWorks.com variant of GML instead
  of the default.
- A new command line option, `--filepath=…` has been added to perform the
  function previously served by the `$GV_FILE_PATH` environment variable, use of
  which was removed in Graphviz 6.0.1. Unlike the old `$GV_FILE_PATH` mechanism,
  `--filepath=…` takes effect regardless of the setting of the `$SERVER_NAME`
  environment variable. #2396

### Changed

- `gvpack`, in addition to recognizing a “cluster” name prefix as a mark of a
  cluster, now recognizes this case insensitively as well as recognizing the
  `cluster` attribute. This is more consistent with how the Graphviz libraries
  work.
- **Breaking**: `pkg-config` (.pc) files shipped with Graphviz now include
  `${prefix}/include` in the include path in addition to
  `${prefix}/include/graphviz`. Previously this missing path meant building
  Graphviz demo examples against an installation of Graphviz in a non-system
  path would not work. #2474
- The core PostScript output format (`-Tps`) warns if using an
  out-of-specification font name. To avoid this, use a more sophisticated output
  format like Cairo (`-Tps:cairo`) that does font name lookup and translation.
  #218
- **Breaking**: The libpack functions `putRects`, `packRects`, `putGraphs`,
  `packGraphs`, `packSubgraphs`, `pack_graph`, `shiftGraphs`, `ccomps`,
  `cccomps`, and `pccomps` now take the number of items they are operating on
  (`ng`) as a `size_t`.
- **Breaking**: The `bsearch_cmpf` and `qsort_cmpf` typedefs have been removed.
- `dot -c -v`, when constructing the config6 file, includes comments explaining
  any attempted actions that failed during plugin loading. #2456
- **Breaking**: The `Ndim` global is now a `unsigned short`.
- fdpgen no longer truncates graph names when inferring new names for connected
  component subgraphs.
- **Breaking**: The `nodequeue` type has been removed.
- **Breaking**: The field `Agraphinfo_t.n_nodes` has been removed. The function
  `agnnodes` is a more robust way of retrieving the number of nodes.
- The `-q` command line option will now suppress “no hard-coded metrics…”
  and other font lookup warnings. #2379
- **Breaking**: The `CMP` and `SGN` macros have been removed.
- The CMake build system no longer early-binds all enabled plugins into
  `dot`/`dot.exe`. This early binding was a change introduced in 10.0.1, but was
  not noted in this changelog. Traditionally, of the three Graphviz build
  systems (Autotools, CMake, MS Build), only changes to the Autotools build
  system were noted in this changelog under the assumption that packaging
  ecosystems making use of the other two build systems would need finer grained
  details and would be monitoring the Git commit history instead. This seems to
  not be the case, so in future side-effecting changes to any of the three build
  systems will be included here. #2527, #2528
- The precision of `sep`- and `esep`-based calculations has been improved.
- **Breaking**: Defines `AGRAPH`, `AGNODE`, `AGOUTEDGE`, `AGINEDGE`, and `AGEDGE` are
  replaced with `enum`.
- **Breaking**: The `obj_state_t.url_bsplinemap_poly_n` field is now a `size_t`
  and the `obj_state_t.url_bsplinemap_n` field is now a `size_t *`.
- **Breaking**: The `Ppoly_t.pn` (`Ppolyline_t.pn`) field is now a `size_t`.
- **Breaking**: The `Proutespline` function takes its `n_barriers` parameter as
  a `size_t`.
- **Breaking**: The `gvattr_t` type and the `GVJ_t.selected_obj_attributes` and
  `GVJ_t.selected_obj_type_name` fields have been removed.
- **Breaking**: The `gv_argvlist_t` type and functions that operate on it have
  been removed.
- Control characters in some error messages are escaped, preventing certain
  types of text injection that could cause user confusion.
- **Breaking**: `GVJ_t.numkeys` is a `size_t`.

### Fixed

- Indexing within `gvNextInputGraph` no longer incorrectly retains the index
  from prior use of the GVC context. When using Graphviz libraries
  programmatically, this could previously cause crashes or misbehavior. #2484
- Color schemes, typically controlled through the `colorscheme` attribute are
  now pushed and popped as they are applied and released. Previously processing
  multiple graphs wherein the first uses color schemes but later ones do not
  could result in color schemes being incorrectly retained and reapplied or
  use-after-free memory accesses.
- The GDI+ plugin, when asked to render a graphic metafile, no longer references
  uninitialized memory. This bug was introduced in Graphviz 2.24.0.
- A `free` of an invalid pointer in `edgepaint` was fixed. #2513
- `gvmap` no longer references uninitialized variables when trying to process
  triangles and encountering only 2 points.
- Using the `point` shape in combination with `peripheries=0` no longer causes
  out of bounds memory writes. This was a regression in Graphviz 7.0.0. #2497
- Unsafe use of a dangling pointer in `ccomps` has been removed. This was a
  regression in Graphviz 7.1.0.
- `gvcolor` no longer crashes when processing color names longer than 127
  characters.
- Interleaving calls to `colorxlate` and `gvrender_resolve_color` no longer
  confuse internal caching mechanisms. Callers should now get the correct color
  back.
- The `nop2` layout engine provided by the neato layout plugin is now equivalent
  to `neato -n2` as intended instead of mistakenly being equivalent to
  `nop`/`nop1`/`neato -n1`.
- An off-by-one error in rank installation was corrected. Previously, an unusual
  `rank=same` constraint could cause a crash when installing ranks. #1308
- `gxl2gv` no longer crashes or misbehaves when symlinked to a non-ASCII file
  name. This is a rare scenario that normal users should not encounter.
- `mm2gv` no longer crashes or misbehaves when reading malformed Matrix Market
  files with non-ASCII bytes in the header.
- A stack buffer overflow in `mm2gv` when processing malformed Matrix Market
  files has been fixed.
- The `newrank` attribute is treated as a boolean instead of any value
  (including `"false"`) being coerced into `"true"`. #2521
- Crashes and misbehavior no longer occur when the `sides` attribute contains
  non-ASCII characters.
- Graphviz binaries like `dot.exe` and `neato.exe` no longer crash or misbehave
  when symlinked to a non-ASCII file name on Windows. This is a rare scenario
  that normal users should not encounter.
- GVPR programs that use `tolower` or `toupper` on strings containing non-ASCII
  characters no longer crash. These functions do not lowercase/uppercase
  non-ASCII characters, so users probably still do not want to use non-ASCII
  strings in a GVPR program.
- Some `routesplines` miscalculations that led to lost edges and fatal errors
  have been avoided. #2368
- An inaccuracy involving an edge case when constructing lines within libpack
  has been corrected.
- A bug in the internal heap implementation used in the network simplex
  algorithm has been corrected. This would previously cause certain runs to
  infer incorrect ordering or subtrees. This was a regression in Graphviz
  2.40.0. #2391, #2529
- Compass points may be more accurately placed on the node boundary in some cases.
- A very small random adjustment in the calculation of the space available for
  edge routing around ellipse shaped nodes in fdp and neato layouts, has been
  removed.
- Incorrect edge splines for ellipse shaped nodes with ports using fdp or
  neato. #2168
- Incorrect edge splines for ellipse and polygon shaped nodes with ports and
  large penwidths using fdp or neato, causing the same symptoms as #2168.
- Incorrect edge splines for polygon shaped nodes with ports more than one
  periphery using fdp or neato, causing the same symptoms as #2168.
- Adjust the space available for edge routing based on penwidth when
  using fdp or neato and `splines=ortho`.
- Setting "mindist" graph attribute for circo layout causes GraphViz library to
  crash with "access violation in cgraph.dll" on gvLayout (checked for Windows
  only). #2356

## [10.0.1] – 2024-02-11

### Added

- Releases now include packages for [Rocky Linux](https://rockylinux.org/) 8 and
  9.
- A new output format, `-Tsvg_inline`, has been added to generate a header-less
  SVG suitable for inlining into HTML. #2285
- The functionality of the `acyclic`, `tred` and `unflatten` command line tools
  are now exposed via the `graphviz_acyclic`, `graphviz_tred` and
  `graphviz_unflatten` API functions in libcgraph. #2194
- `graphviz_node_induce` is available as a new API function in cgraph.h.
- `tred` gained a `-o` command line option to redirect its output to a file.

### Changed

- The Criterion unit tests have been removed and migrated to Pytest. This is
  primarily relevant to downstream packagers of Graphviz. #2443
- **Breaking**: `Dtdisc_t.memoryf` and its associated macros has been removed.
- **Breaking**: The `Dt_t.type` field has been removed.
- **Breaking**: The `dtfound`, `DT_FOUND`, `dtleast`, and `dtmost` macros have
  been removed.
- The nrtmain.c test program has been removed from the portable tarball.
- The TCL Graphviz packages for inter-release versions/snapshots report
  themselves as `<next release>b<internal number>` instead of
  `<next release>~dev.<internal number>`. This fixes a problem wherein TCL would
  see `~dev` as being invalid characters to appear in a version. #2370
- Support for discovering Lua via `lua-config*` has been removed from the
  Autotools build system.
- Lua discovery in the Autotools build system should now respect the location of
  your Lua installation and not unconditionally attempt installation into
  `/usr`. #2152
- The GTK plugin is no longer built or distributed. This plugin relies on GTK 2
  and X11. If you use this plugin, please contact the maintainers to let
  them know it is worthwhile re-enabling this and forward porting it to GTK 3/4
  and Wayland. #1848
- In the Autotools build system, `LIBPOSTFIX=` can now be used to suppress `64`
  being appended to the library installation path.
- The `-m` command line option, whose functionality was disabled in Graphviz
  3.0.0, has been removed.
- Man page typography has been slightly improved.
- macOS release artifacts no longer include `vimdot`. This may be restored in
  future. #2423
- macOS release artifacts no longer include `smyrna`. This may be restored in
  future. #2422
- The PDF output format, `-Tpdf`, respects the environment variable
  `$SOURCE_DATE_EPOCH` for overriding `CreationDate` when built against Cairo
  ≥ 1.16.0. #2473
- The legacy C# viewer app is no longer distributed in the portable source
  tarball.
- Graphviz headers no longer define the `FALSE` and `TRUE` constants.
- The Autotools build system no longer supports Darwin 9 (Mac OSX Leopard).
- **Breaking**: `Agraph_t.link` has been split into `Agraph_t.id_link` and
  `Agraph_t.seq_link`. `Agraph_t.g_dict` has been split into `Agraph_t.g_id`
  and `Agraph_t.g_seq`.
- **Breaking**: `gvpropts.n_outgraphs` is now a `size_t`.
- The OCaml bindings have been removed. If you use these bindings, please contact
  the maintainers to notify them of the existence of users.
- **Breaking**: `polygon_t.sides` and `polygon_t.peripheries` are now `size_t`s.
- **Breaking**: liblab_gamut is no longer included in a Graphviz installation.
  This library had no accompanying header, so using it was not easy. If you are
  using this library, please contact the maintainers to notify them of the
  existence of users. #2489
- **Breaking**: `bezier.size` and `splines.size` are now `size_t`s.
- **Breaking**: the gv.i and gv.cpp SWIG inputs are no longer included in a
  Graphviz installation. #2491
- **Breaking**: the `gvrender_engine_t.beziercurve`,
  `gvrender_engine_t.library_shape`, `gvrender_engine_t.polygon`,  and
  `gvrender_engine_t.polyline` callbacks now take the number of points, `n`, as
  a `size_t`.
- **Breaking**: the `AVG` macro has been removed.
- **Breaking**: the `inside_t.s` union member gained members `lastn`, `radius`,
  `last_poly`, `last`, `outp`, `scalex`, `scaley`, `box_URx`, and `box_URy`.
  Zero initialize these when you construct instances of this type. #2498

### Fixed

- The paper size for Doxygen docs generation in the Autotools build system has
  been corrected to `a4`.
- References to `eventf` and `hashf` data structures in the libcdt man page
  have been removed. These data structures were removed in Graphviz 9.0.0.
- References to `DTOFFSET` in the libcdt man page have been removed. This macro
  was removed in Graphviz 2.40.0.
- A number of further updates to the libcdt man page have been made to reflect
  other changes that happened in Graphviz 9.0.0.
- Use of the non-portable `PATH_MAX` constant has been removed. This was a
  regression in Graphviz 7.0.1. In addition to fixing the regression, code has
  been adjusted to remove assumptions on the maximum path length and treat it as
  unbounded. #2452
- Compilation on NetBSD has been repaired. This was a regression in Graphviz
  9.0.0.
- Compilation on SunOS has been repaired. This appears to have been broken since
  the xlib plugin was added some time prior to Graphviz 2.38.0.
- gvpr programs that attempt to close out of range file descriptors no longer
  cause out of bounds memory accesses.
- When large edge weights are used that cause an integer overflow when summing
  them up, Graphviz now gracefully exits with an error message instead of
  crashing. #2450
- Support for the `%n` specifier in `scanf` in gvpr has been restored. This was
  a regression in Graphviz 9.0.0. #2454
- In the Autotools build system, `make dist` now processes cmd/gvedit correctly
  when Qt is not installed. Generating Qt “mocables” is postponed from configure
  time to build time. #2463
- The Autotools build system correctly detects Ruby headers, even when
  pkg-config support is unavailable. #2464
- Escaped characters in xdot fields no longer lead to the containing text being
  truncated. #2460
- When building against a libgd that is configured with `!gif && (jpeg || png)`,
  the GD plugin is once again compilable. This was a regression in Graphviz
  2.46.0.
- edgepaint spline intersection code would previously incorrectly use the second
  spline in one instance where it should have used the first. #1464
- In the Autotools build, libexpat discovery on macOS has been improved. #2477
- A bug that caused compound edges to sometimes be drawn in the wrong direction
  has been corrected. This was a regression in Graphviz 8.0.3. #2478
- When operating on multiple graphs, `unflatten` no longer retains chain node
  and size internal state across graphs.
- Repeated runs of a graph with subgraphs now produce a stable subgraph
  ordering. #2242
- The `dot` and `gml2gv` tools are now built with case-insensitive parsing
  by the CMake and MSBuild systems, as they always were by autotools, and
  in accordance with the graphviz specification. #2481
- Putting nodes in a subgraph no longer causes their layout order to be
  reversed. #1585
- Edges are no longer lost when using subgraphs and record shapes in
  combination. #1624
- A malformed config6 file that leads to plugin search failing no longer causes
  out-of-bounds memory reads. This now causes an error message and graceful
  failure. #2441
- Discovery of `php` in the Autotools build system has been improved.
- Text in the PIC output format is no longer forced to font size 1. This was a
  regression in Graphviz 8.0.2. Even with this fix, the PIC output format is
  limited in its utility. #2487
- When encountering a syntactically invalid HTML-like label, Graphviz.app no
  longer aborts. The abort was an intentional change in Graphviz 8.0.1 to avoid
  invalid memory reads in `dot`, but had the undesirable side effect of the
  graphical Graphviz.app exiting with no obvious cause. #2488
- Use of an uninitialized variable in `poly_inside` has been corrected. #2498
- Input containing UTF-8 data that is destined to appear as-is in the output
  (e.g. UTF-8 characters in a label when using the `-Tdot` output format) is
  once again processed correctly. On platforms with a signed `char` this could
  previously crash. This was a regression in Graphviz 2.49.0. #2502

## [9.0.0] - 2023-09-11

### Added

- On non-Windows platforms, new `-Tkitty` and `-Tkittyz` output formats are
  available that render to the Kitty terminal emulator’s graphvics protocol.
- HTML/CSS-style 3 letter hex colors are supported. Each R/G/B letter is
  duplicated to form a 6 letter hex color. E.g. `#09c` is equivalent to
  `#0099cc`. #2377

### Changed

- **Breaking**: The definition of `adjmatrix_t` is no longer exposed in public
  headers.
- **Breaking**: The upper limit for minimum edge length (`Agedgeinfo_t.minlen`)
  has been expanded from `USHRT_MAX` to `INT_MAX`. #2413
- **Breaking**: The libcdt macros `DTTREEMATCH`, `DTTREESEARCH`, `dtvnext`,
  `dtvcount`, `dtvhere`, and `dtcharhash` have been removed.
- **Breaking**: The libcgraph macros `AGHEADPOINTER`, `AGRIGHTPOINTER`,
  `AGLEFTPOINTER`, `FIRSTNREF`, `NEXTNREF`, `PREVNREF`, `LASTNREF`, `NODEOF`,
  `FIRSTOUTREF`, `LASTOUTREF`, `FIRSTINREF`, `NEXTEREF`, and `PREVEREF` have
  been removed.
- **Breaking**: The libcgraph types `Agnoderef_t` and `Agedgeref_t` have been
  removed.
- **Breaking**: The libcgraph function `agflatten` has been removed.
- **Breaking**: The `Agdesc_s.flatlock` field has been removed.
- **Breaking**: The `str` parameter from `gvPluginList` has been removed.
- **Breaking**: The definition of the `elist_append` and `alloc_elist` macros
  have been changed to use newer allocation functions. Users were/are not
  expected to call these macros.
- The functions `ageqedge`, `agtail`, `aghead`, `agopp`, `agmkout`, and `agmkin`
  have been reintroduced. These were previously removed in Graphviz 3.0.0. #2433
- **Breaking**: The first parameter `dt` to the `makef` and `freef` callbacks
  defined in cdt.h has been removed.
- Gvedit now identifies itself with organization name “Graphviz” and application
  name “gvedit” when reading and writing Qt-based settings. It would previously
  use organization name “Trolltech” and application name “MDI Example”. If you
  have existing settings under the old identification, Gvedit will attempt to
  migrate them to the new identification the first time it reads then writes
  settings. #2383
- **Breaking**: `gvprintf` is now tagged with
  `__attribute__((format(printf, …)))` when compiling with Clang or GCC. This
  enables the compiler to spot more misuses of this function. #2373
- **Breaking**: The `hashf` and `eventf` members of `Dtdisc_t` have been
  removed. Correspondingly, the `hshf` and `evf` parameters to the `DTDISC`
  macro have been removed. Also the `_DTHSH` macro has been removed.
- **Breaking**: The `Dtdata_t.minp` field has been removed.
- The print functionality of the macOS Graphviz app scales the graph to fit the
  output page size.
- **Breaking**: The libcdt containers `Dtbag`, `Dthash`, `Dtlist`, `Dtorder`,
  `Dtdeque`, and `Dtstack` have been removed.
- **Breaking**: The libcdt `dtappend` and `dtattach`  macros have been removed.
- Support for Lua 5.0 has been removed. Building the Graphviz Lua bindings now
  requires Lua ≥ 5.1.
- **Breaking**: The `Dt_t*` parameter to the callback for `dtwalk` has been
  removed.
- **Breaking**: The `POINTS_PER_PC` macro has been removed.
- **Breaking**: The `INITIAL_XDOT_CAPACITY` macro has been removed.
- **Breaking**: The `type` parameter to `dtdisc` has been removed.
- **Breaking**: The `h` parameter to `dtstrhash` has been removed.
- In addition to Guile 2.0 and Guile 2.2, Guile 3.0 is now supported by the
  Graphviz Guile bindings.
- **Breaking**: The concept of “memory allocator discipline” has been removed,
  along with the type `Agmemdisc_t` and fields `Agdisc_t.mem` and
  `Agdstate_t.mem`.
- **Breaking**: The `agcallbacks` function and `Agclos_t.callbacks_enabled` have
  been removed.
- **Breaking**: `pack_info.doSplines` is now a C99 `bool`. Correspondingly, the
  `doSplines` parameter to `shiftGraphs` is now a C99 `bool`.

### Fixed

- Processing large graphs that induce ranks containing more than 46340
  (`floor(√INT_MAX)`) nodes no longer results in an integer overflow during
  crossing matrix allocation. Ranks of up to `floor(√SIZE_MAX)` nodes are now
  supported.
- Double arrow head types like `invdot` and `onormalonormal` once again display
  correctly. This was a regression in Graphviz 8.0.1. #2406
- The `lvee` and `rvee` edge arrow shapes are slighty incorrect for
  penwidths &gt; 1. #2399
- Small gap between `lcurve` or `rcurve` arrow shaft and node. #2426
- Failure of arrowhead and arrowtail to respect penwidth #372 \
  Fixed also for the `normal` and `inv`
  [edge arrow shapes](https://graphviz.org/doc/info/arrows.html)
  when using the `l` or `r`
  [arrow shape modifiers](https://graphviz.org/doc/info/arrows.html#shape-modifiers). \
  Slightly improved for the `normal` and `inv`
  [edge arrow shapes](https://graphviz.org/doc/info/arrows.html)
  when not using any
  [arrow shape modifier](https://graphviz.org/doc/info/arrows.html#shape-modifiers). \
  Fixed also for the `crow` and `vee`
  [edge arrow shapes](https://graphviz.org/doc/info/arrows.html#primitive-shapes)
  and [record based nodes](https://graphviz.org/doc/info/shapes.html#record).
- Various incorrect calls to `gvprintf` have been corrected. On some platforms
  like x86-64, these problems were benign thanks to coincidences in the
  Application Binary Interface (ABI). On other platforms, these problems may
  have caused stack corruption and crashes. #2373
- The font dictionary is now initialized even if a configuration file is not
  found. Previously this situation could lead to a crash when using Graphviz
  programmatically. This problem was present as least as far back as Graphviz
  2.38.0. #1520
- **Breaking**: The `vt100` output format has been renamed to `vt`. This fixes a
  problem where it was not discoverable on macOS. #2429
- Escape sequences like `\"` are recognized in strings and double escaping
  (producing `\\"`) is avoided. #2397
- The Autotools build system no longer uses headers and libraries from the
  `--prefix` path given on the command line. This previously caused
  cross-compilation to incorrectly pick up host headers and libraries. #2442

## [8.1.0] – 2023-07-06

### Added

- On non-Windows platforms, new `-Tvt100` and `-Tvt100-24bit` output formats are
  available that do rudimentary rendering to a terminal that supports ANSI
  escape sequences.
- Some notes about the interaction with wide-oriented streams were added to the
  cgraph man page.

### Changed

- When memory allocation failures cause Graphviz to exit, information about the
  failing allocation is included in the error message.

### Fixed

- Failure of arrowhead and arrowtail to respect penwidth #372 \
  Fixed also for the `curve` and `icurve`
  [edge arrow shapes](https://graphviz.org/doc/info/arrows.html#primitive-shapes).
- Iteration calculations based on `nslimit` and/or `nslimit1` attributes are
  clamped to `[0, INT_MAX]`. That is, calculations that result in a negative
  number of iterations are rounded up to `0` and those that result in a number
  of iterations that exceeds `INT_MAX` are rounded down to `INT_MAX`. Iteration
  numbers outside this range do not have useful behavior, but could be caused
  unintentionally by users.
- Setting `xdotversion` attributes that parse as greater than 17 (`xdotversion`
  is parsed as a series of digits, ignoring all non-digits) no longer causes an
  out of bounds read when rendering to xdot. #2390
- Icon size in the macOS Graphviz.app has been fixed so icons are no longer
  invisible.
- Compiling the portable source tarball on a machine with SWIG ≥ 4.1.0 no
  longer fails due to missing PHP files. #2388
- Syntax for a loop in `gvmap.sh` has been corrected. This was a regression in
  Graphviz 2.50.0. #2404

## [8.0.5] – 2023-04-30

### Changed

- Support for versions of Pango prior to 1.22.0 has been removed.
- On Windows, the Pango plugin now uses the newer `pango_layout_get_baseline`
  API.
- `dot` no longer installs a signal handler for `SIGINT`. This means typing
  Ctrl+C while `dot` is running will no longer attempt a partial render and exit
  with 0 status. Ctrl+C will have the standard behavior, typically aborting
  `dot`.

### Fixed

- A minor inaccuracy for some cases of clipping an edge to a polygon node
  boundary has been fixed.
- A minor inaccuracy in node width and height for some cases of rendering
  polygon nodes has been fixed.
- A minor inaccuracy for some cases of calculating text height from `fontsize`
  in the GD plugin has been fixed.
- A minor vertical misalignment of text in the GD plugin has been fixed.
- Instead of using the actual font height as given by the font metrics, an
  approximation based on font size was used in the Pango plugin.
- A minor inaccuracy for some cases of calculating text width and height in the
  Pango plugin has been fixed.
- A minor vertical misalignment of text in the Pango plugin has been fixed.
- Ensure `HAVE_PANGOCAIRO` is set when using CMake and the library is available.
- A minor inaccuracy in node width and height for some cases of defining
  polygon-based nodes has been fixed.
- A minor inaccuracy for some cases of calculating margin for record-based nodes
  has been fixed.
- A minor inaccuracy in node width and height for some cases of defining
  record-based nodes has been fixed.
- On all known supported platforms except 32-bit MinGW, graphs involving small
  distance constraints no longer cause a crash during majorization. #1554

## [8.0.3] – 2023-04-16

### Added

- A pre-processor script for resolving external image references
  (`image="http…"`) is now available. This enables graphs to reference images
  from intranet or internet locations. #1664

### Changed

- The accuracy of box overlapping checks during routing has been improved.

### Fixed

- makeCompoundEdge: Assertion `bez->sflag` failed. #1879
- Graphviz.app’s export functionality has been restored. This was a regression
  in Graphviz 5.0.0. #2375

## [8.0.2] – 2023-04-10

### Changed

- The Autotools build system can now detect a MacPorts-installed libANN. #1854
- Support for versions of Cairo prior to 1.10 has been removed.
- Graphs that generate rectangles with areas in the range [2³², 2⁶⁴ - 1]
  are now supported. Previously areas greater than 2³² - 1 would be
  rejected. #2371

### Fixed

- Head and tail of `digraph` edges with `dir = both` were inverted if
  `splines = ortho` was used. The bug was only exposed on straight edges.
  Edges with at least one corner were unaffected. #144
- `_Gdtclft_Init` link errors when builting libtcldot_builtin using the
  Autotools build system have been resolved. #2365
- Incorrect string construction in the `pov` output formatter has been fixed.

## [8.0.1] – 2023-03-27

### Added

- When specifying a color in HSV format, it is now possible to give an
  additional fourth component for the alpha channel (opacity). #510

### Changed

- Graphviz will now exit when encountering a syntactically invalid HTML label
  instead of attempting to recover and continue. #1311
- **Breaking**: the `url_map_n` field in the `obj_state_t` struct is now a
  `size_t`.
- The limit of 5 unique `samehead` or `sametail` values per node has been
  removed. The maximum number of unique `samehead` or `sametail` values is now
  limited only by available memory. #452
- **Breaking**: The `size` field of the `elist` struct is now a `size_t`.
- **Breaking**: The `size` field of the `nlist` struct is now a `size_t`.
- **Breaking**: The `n_nodes` field of the `Agraphinfo_t` struct is now a
  `size_t`.
- **Breaking**: The `nspans` field of `textlabel_t.u.txt` is now a `size_t`.
- **Breaking**: The `sflag` and `eflag` fields of the `bezier` struct are now
  `uint32_t`s.
- **Breaking**: The `nvertices` field of the `stroke_t` struct is now a
  `size_t`.
- “no hard-coded metrics” warnings are now only printed once per font.
- The Autotools build system now discovers Python paths using `sysconfig`
  instead of `distutils.sysconfig`, making it compatible with Python 3.12. This
  alters the installation path of the Python Graphviz module to something more
  correct. #2332

### Fixed

- The `pic` output renderer uses PIC or troff comments where appropriate, fixing
  a problem that resulted in comments being misinterpreted by `groff` and being
  visible in the final output. #2341
- `gv2gxl` and `gxl2gv` correctly detect their mode (gv→gxl or gxl→gv) on
  Windows when called via an absolute or relative path. #2344
- Using C pre-processor line directives (`^\s*#(line )?\d+`) claiming a line
  number greater than `INT_MAX` no longer causes an integer overflow. #1318
- fdp cluster→cluster edges were correct but now drawn incorrectly. This was a
  regression in Graphviz 7.0.0. #2345
- Failure of arrowhead and arrowtail to respect penwidth #372 \
  Fixed also for the `cylinder`
  [node shape](https://graphviz.org/doc/info/shapes.html#polygon).
- Second periphery of a cylinder shaped node is not correct. #2297
- Graphs with more than 127 layers no longer cause out of bound writes. #2355
- htmltable.c assertions are no longer triggered by using HTML table cells too
  small to fit their content. #1622
- `dot2gxl -d` no longer crashes when receiving a closing `node` tag following a
  closing `graph` tag. #2094
- A buffer overflow in Smyrna when loading GVPR scripts has been corrected.
- A buffer overflow when loading a plugin with a long type string has been
  corrected.
- Graphs that involve more than 2000 stroke points during tapering calculations
  no longer cause out of bounds writes.
- Using `arrowsize=0.0` no longer triggers an assertion failure or crash during
  miter calculations. This was a regression in Graphviz 7.0.0. #2342
- When using the `beautify=true` attribute, beautification no longer confuses
  leaves and dimensions. This previously could have led to skipping calculations
  or infinite loops.
- When using the `beautify=true` attribute, the first and last nodes around a
  circular layout are no longer placed on top of each other. #2283
- Applying `concentrate=true` to duplicate edges no longer results in errors due
  to non-normal edges being found. #2087
- `splines=ortho` and `concentrate=true` when used in combination no longer
  causes crashes during spline construction. #2361
- Externally referenced SVG files with their opening `<svg` tag on the same line
  as their XML declaration are no longer ignored. #2352

### Removed

- The VML output renderer has been removed. This format has been superseded by
  SVG. #799
- Legacy man page references to `dotty` have been removed. `dotty` was removed
  in Graphviz 4.0.0.
- **Breaking**: The definition of the `elist_fastapp` macro has been removed.
- Versions of Librsvg prior to 2.36.0 are no longer supported.
- Versions of GDK prior to 2.0.0 are no longer supported.
- Versions of Glib prior to 2.36.0 are no longer supported.
- **Breaking**: The `Agnodeinfo_t.inleaf` field and its `ND_inleaf` accessor
  have been removed.
- **Breaking**: The `Agnodeinfo_t.outleaf` field and its `ND_outleaf` and
  `GD_outleaf` accessors have been removed.
- **Breaking**: The `Agraphinfo_t.has_sourcerank` field and its
  `GD_has_sourcerank` accessor has been removed.
- **Breaking**: The `Agraphinfo_t.has_sinkrank` field and its
  `GD_has_sinkrank` accessor has been removed.
- Support for the legacy Microsoft Visio VDX format has been removed.
- **Breaking**: The `arrow_at_start` and `arrow_at_end` parameters from the
  `gvrender_engine_t.beziercurve` callback have been removed.
- **Breaking**: The `GVRENDER_DOES_ARROWS` constant has been removed.
- The extra cmpnd.c code is no longer shipped in the Graphviz distribution
  tarball.
- **Breaking**: The `STROKE_CLOSED`, `STROKE_FILLED`, `STROKE_PENDOWN`, and
  `STROKE_VERTICES_ALLOCATED` constants have been removed.
- **Breaking**: The `stoke_t.flags` field has been removed.

## [7.1.0] – 2023-01-21

### Added
[--snip--]
