shiny/iconvg: make SetEllipticalGradient math deterministic

Add explicit rounding in Encoder.SetEllipticalGradient to disable
fused operations. This allows the TestEncodeElliptical case to pass
on GOARCH=arm64. Otherwise, fused multiply-sub instructions are
used on GOARCH=arm64 (but not GOARCH=amd64), which results in a
slightly different real value being computed for a "Set NREG"
instruction (with a tiny delta of 7.450581e-09), and then
encoded into non-identical bytes:

	 ac            Set NREG[NSEL-4] to a real number
	-00                0
	+03 00 00 b2       -7.450581e-09

Document the IconVG design decision that the encoder aims to
produce byte-identical output on all supported platforms per
suggestion in
This should make it clear for the future—if another similar
problem is detected—that the encoder implementation should
be fixed (rather than relaxing Encode tests to allow for
non-deterministic encoding). It also allows package users
to be aware that the encoder is platform-agnostic and not
have to take additional measures themselves. (If this proves
to be truly unsustainable to maintain, it is still viable to
remove it given the "SUBJECT TO INCOMPATIBLE CHANGES" clause.)

Rename TestRasterizer to TestDecodeAndRasterize since it tests
both decoding and rasterizing. There isn't another test that
tests only the Decode function.

Fix some broken links to the material-design-icons repository.

Fixes golang/go#43219.
Updates golang/go#11811.

Change-Id: I5cf15541a4648e408c9c61689041c678c14441bf
Run-TryBot: Dmitri Shuralyov <>
TryBot-Result: Go Bot <>
Trust: Dmitri Shuralyov <>
Trust: Nigel Tao <>
Reviewed-by: Nigel Tao <>
5 files changed
tree: 7a86cc1c9f2db44204eb86e0ce12da29f5aecf79
  1. .gitattributes
  2. .gitignore
  9. apidiff/
  10. cmd/
  11. codereview.cfg
  12. ebnf/
  13. ebnflint/
  14. errors/
  15. fsnotify/
  16. go.mod
  17. go.sum
  18. inotify/
  19. io/
  20. mmap/
  21. rand/
  22. shiny/
  23. shootout/
  24. sumdb/
  25. utf8string/
  26. winfsnotify/



This subrepository holds experimental and deprecated (in the old directory) packages.

The idea for this subrepository originated as the pkg/exp directory of the main repository, but its presence there made it unavailable to users of the binary downloads of the Go installation. The subrepository has therefore been created to make it possible to go get these packages.

Warning: Packages here are experimental and unreliable. Some may one day be promoted to the main repository or other subrepository, or they may be modified arbitrarily or even disappear altogether.

In short, code in this subrepository is not subject to the Go 1 compatibility promise. (No subrepo is, but the promise is even more likely to be violated by go.exp than the others.)

Caveat emptor.