shiny/iconvg: make HighResolutionCoordinates optional.

On the full Material Design icon set, the 950 or so icons take up around
40% more bytes (172K vs 123K) at high resolution.

Change-Id: I6bd59c3aa75f7fc251c4283a0b244c656f1f9b86
Reviewed-on: https://go-review.googlesource.com/31111
Reviewed-by: David Crawshaw <crawshaw@golang.org>
diff --git a/shiny/iconvg/decode_test.go b/shiny/iconvg/decode_test.go
index 2fd604b..71ee314 100644
--- a/shiny/iconvg/decode_test.go
+++ b/shiny/iconvg/decode_test.go
@@ -130,7 +130,8 @@
 	filename string
 	variants string
 }{
-	{"testdata/action-info", ""},
+	{"testdata/action-info.lores", ""},
+	{"testdata/action-info.hires", ""},
 	{"testdata/blank", ""},
 	{"testdata/lod-polygon", ";64"},
 	{"testdata/video-005.primitive", ""},
diff --git a/shiny/iconvg/encode.go b/shiny/iconvg/encode.go
index bddec5e..9b1bb88 100644
--- a/shiny/iconvg/encode.go
+++ b/shiny/iconvg/encode.go
@@ -6,6 +6,7 @@
 
 import (
 	"errors"
+	"math"
 )
 
 var (
@@ -29,6 +30,27 @@
 // Metadata for the subsequent encoded form. If Reset is not called before
 // other Encoder methods, the default metadata is implied.
 type Encoder struct {
+	// HighResolutionCoordinates is whether the encoder should encode
+	// coordinate numbers for subsequent paths at the best possible resolution
+	// afforded by the underlying graphic format.
+	//
+	// By default (false), the encoder quantizes coordinates to 1/64th of a
+	// unit if possible (the default graphic size is 64 by 64 units, so
+	// 1/4096th of the default width or height). Each such coordinate can
+	// therefore be encoded in either 1 or 2 bytes. If true, some coordinates
+	// will be encoded in 4 bytes, giving greater accuracy but larger file
+	// sizes. On the Material Design icon set, the 950 or so icons take up
+	// around 40% more bytes (172K vs 123K) at high resolution.
+	//
+	// See the package documentation for more details on the coordinate number
+	// encoding format.
+	HighResolutionCoordinates bool
+
+	// highResolutionCoordinates is a local copy, copied during StartPath, to
+	// avoid having to specify the semantics of modifying the exported field
+	// while drawing.
+	highResolutionCoordinates bool
+
 	buf      buffer
 	altBuf   buffer
 	metadata Metadata
@@ -58,6 +80,8 @@
 }
 
 // Reset resets the Encoder for the given Metadata.
+//
+// This includes setting e.HighResolutionCoordinates to false.
 func (e *Encoder) Reset(m Metadata) {
 	*e = Encoder{
 		buf:      append(e.buf[:0], magic...),
@@ -259,6 +283,7 @@
 		e.err = errInvalidSelectorAdjustment
 		return
 	}
+	e.highResolutionCoordinates = e.HighResolutionCoordinates
 	e.buf = append(e.buf, uint8(0xc0+adj))
 	e.buf.encodeCoordinate(x)
 	e.buf.encodeCoordinate(y)
@@ -357,17 +382,17 @@
 			switch e.drawOp {
 			default:
 				for j := m * int(op.nArgs); j > 0; j-- {
-					e.buf.encodeCoordinate(e.drawArgs[i])
+					e.buf.encodeCoordinate(e.quantize(e.drawArgs[i]))
 					i++
 				}
 			case 'A', 'a':
 				for j := m; j > 0; j-- {
-					e.buf.encodeCoordinate(e.drawArgs[i+0])
-					e.buf.encodeCoordinate(e.drawArgs[i+1])
+					e.buf.encodeCoordinate(e.quantize(e.drawArgs[i+0]))
+					e.buf.encodeCoordinate(e.quantize(e.drawArgs[i+1]))
 					e.buf.encodeZeroToOne(e.drawArgs[i+2])
 					e.buf.encodeNatural(uint32(e.drawArgs[i+3]))
-					e.buf.encodeCoordinate(e.drawArgs[i+4])
-					e.buf.encodeCoordinate(e.drawArgs[i+5])
+					e.buf.encodeCoordinate(e.quantize(e.drawArgs[i+4]))
+					e.buf.encodeCoordinate(e.quantize(e.drawArgs[i+5]))
 					i += 6
 				}
 			}
@@ -380,6 +405,14 @@
 	e.drawArgs = e.drawArgs[:0]
 }
 
+func (e *Encoder) quantize(coord float32) float32 {
+	if !e.highResolutionCoordinates && (-128 <= coord && coord < 128) {
+		x := math.Floor(float64(coord*64 + 0.5))
+		return float32(x) / 64
+	}
+	return coord
+}
+
 var drawOps = [256]struct {
 	opcodeBase  byte
 	maxRepCount uint8
diff --git a/shiny/iconvg/encode_test.go b/shiny/iconvg/encode_test.go
index 00e0e31..7d28cdd 100644
--- a/shiny/iconvg/encode_test.go
+++ b/shiny/iconvg/encode_test.go
@@ -54,33 +54,36 @@
 }
 
 func TestEncodeActionInfo(t *testing.T) {
-	var e Encoder
-	e.Reset(Metadata{
-		ViewBox: Rectangle{
-			Min: f32.Vec2{-24, -24},
-			Max: f32.Vec2{+24, +24},
-		},
-		Palette: DefaultPalette,
-	})
+	for _, res := range []string{"lores", "hires"} {
+		var e Encoder
+		e.Reset(Metadata{
+			ViewBox: Rectangle{
+				Min: f32.Vec2{-24, -24},
+				Max: f32.Vec2{+24, +24},
+			},
+			Palette: DefaultPalette,
+		})
+		e.HighResolutionCoordinates = res == "hires"
 
-	e.StartPath(0, 0, -20)
-	e.AbsCubeTo(-11.05, -20, -20, -11.05, -20, 0)
-	e.RelSmoothCubeTo(8.95, 20, 20, 20)
-	e.RelSmoothCubeTo(20, -8.95, 20, -20)
-	e.AbsSmoothCubeTo(11.05, -20, 0, -20)
-	e.ClosePathRelMoveTo(2, 30)
-	e.RelHLineTo(-4)
-	e.AbsVLineTo(-2)
-	e.RelHLineTo(4)
-	e.RelVLineTo(12)
-	e.ClosePathRelMoveTo(0, -16)
-	e.RelHLineTo(-4)
-	e.RelVLineTo(-4)
-	e.RelHLineTo(4)
-	e.RelVLineTo(4)
-	e.ClosePathEndPath()
+		e.StartPath(0, 0, -20)
+		e.AbsCubeTo(-11.05, -20, -20, -11.05, -20, 0)
+		e.RelSmoothCubeTo(8.95, 20, 20, 20)
+		e.RelSmoothCubeTo(20, -8.95, 20, -20)
+		e.AbsSmoothCubeTo(11.05, -20, 0, -20)
+		e.ClosePathRelMoveTo(2, 30)
+		e.RelHLineTo(-4)
+		e.AbsVLineTo(-2)
+		e.RelHLineTo(4)
+		e.RelVLineTo(12)
+		e.ClosePathRelMoveTo(0, -16)
+		e.RelHLineTo(-4)
+		e.RelVLineTo(-4)
+		e.RelHLineTo(4)
+		e.RelVLineTo(4)
+		e.ClosePathEndPath()
 
-	testEncode(t, &e, "testdata/action-info.ivg")
+		testEncode(t, &e, "testdata/action-info."+res+".ivg")
+	}
 }
 
 var video005PrimitiveSVGData = []struct {
diff --git a/shiny/iconvg/example_test.go b/shiny/iconvg/example_test.go
index 06346c8..879a1d0 100644
--- a/shiny/iconvg/example_test.go
+++ b/shiny/iconvg/example_test.go
@@ -16,7 +16,7 @@
 )
 
 func Example() {
-	ivgData, err := ioutil.ReadFile(filepath.FromSlash("testdata/action-info.ivg"))
+	ivgData, err := ioutil.ReadFile(filepath.FromSlash("testdata/action-info.lores.ivg"))
 	if err != nil {
 		log.Fatal(err)
 	}
diff --git a/shiny/iconvg/testdata/README b/shiny/iconvg/testdata/README
index 663f256..67eb33c 100644
--- a/shiny/iconvg/testdata/README
+++ b/shiny/iconvg/testdata/README
@@ -2,11 +2,16 @@
 action/svg/production/ic_info_48px.svg in the
 github.com/google/material-design-icons repository.
 
-action-info.ivg is an IconVG version of action-info.svg.
+action-info.{lo,hi}res.ivg are low- and high-resolution IconVG versions of
+action-info.svg. Low resolution means that coordinates are quantized to 1/64th
+of a unit; the graphic's size is 48 by 48 units. High resolution means that
+coordinates are represented by all but the 2 least significant bits of a
+float32. Each low resolution coordinate is encoded in either 1 or 2 bytes. Each
+high resolution coordinate is encoded in either 1, 2 or 4 bytes.
 
-action-info.ivg.disassembly is a disassembly of that IconVG file.
+action-info.{lo,hi}res.ivg.disassembly are disassemblies of those IconVG files.
 
-action-info.png is a rendering of that IconVG file.
+action-info.{lo,hi}res.png are renderings of those IconVG files.
 
 
 
diff --git a/shiny/iconvg/testdata/action-info.ivg b/shiny/iconvg/testdata/action-info.hires.ivg
similarity index 100%
rename from shiny/iconvg/testdata/action-info.ivg
rename to shiny/iconvg/testdata/action-info.hires.ivg
Binary files differ
diff --git a/shiny/iconvg/testdata/action-info.ivg.disassembly b/shiny/iconvg/testdata/action-info.hires.ivg.disassembly
similarity index 100%
rename from shiny/iconvg/testdata/action-info.ivg.disassembly
rename to shiny/iconvg/testdata/action-info.hires.ivg.disassembly
diff --git a/shiny/iconvg/testdata/action-info.png b/shiny/iconvg/testdata/action-info.hires.png
similarity index 100%
rename from shiny/iconvg/testdata/action-info.png
rename to shiny/iconvg/testdata/action-info.hires.png
Binary files differ
diff --git a/shiny/iconvg/testdata/action-info.lores.ivg b/shiny/iconvg/testdata/action-info.lores.ivg
new file mode 100644
index 0000000..73589fe
--- /dev/null
+++ b/shiny/iconvg/testdata/action-info.lores.ivg
Binary files differ
diff --git a/shiny/iconvg/testdata/action-info.lores.ivg.disassembly b/shiny/iconvg/testdata/action-info.lores.ivg.disassembly
new file mode 100644
index 0000000..0624e7c
--- /dev/null
+++ b/shiny/iconvg/testdata/action-info.lores.ivg.disassembly
@@ -0,0 +1,56 @@
+89 49 56 47   IconVG Magic identifier
+02            Number of metadata chunks: 1
+0a            Metadata chunk length: 5
+00            Metadata Identifier: 0 (viewBox)
+50                -24
+50                -24
+b0                +24
+b0                +24
+c0            Start path, filled with CREG[CSEL-0]; M (absolute moveTo)
+80                +0
+58                -20
+a0            C (absolute cubeTo), 1 reps
+f5 74             -11.046875
+58                -20
+58                -20
+f5 74             -11.046875
+58                -20
+80                +0
+91            s (relative smooth cubeTo), 2 reps
+f5 88             +8.953125
+a8                +20
+a8                +20
+a8                +20
+              s (relative smooth cubeTo), implicit
+a8                +20
+0d 77             -8.953125
+a8                +20
+58                -20
+80            S (absolute smooth cubeTo), 1 reps
+0d 8b             +11.046875
+58                -20
+80                +0
+58                -20
+e3            z (closePath); m (relative moveTo)
+84                +2
+bc                +30
+e7            h (relative horizontal lineTo)
+78                -4
+e8            V (absolute vertical lineTo)
+7c                -2
+e7            h (relative horizontal lineTo)
+88                +4
+e9            v (relative vertical lineTo)
+98                +12
+e3            z (closePath); m (relative moveTo)
+80                +0
+60                -16
+e7            h (relative horizontal lineTo)
+78                -4
+e9            v (relative vertical lineTo)
+78                -4
+e7            h (relative horizontal lineTo)
+88                +4
+e9            v (relative vertical lineTo)
+88                +4
+e1            z (closePath); end path
diff --git a/shiny/iconvg/testdata/action-info.lores.png b/shiny/iconvg/testdata/action-info.lores.png
new file mode 100644
index 0000000..33911f2
--- /dev/null
+++ b/shiny/iconvg/testdata/action-info.lores.png
Binary files differ
diff --git a/shiny/iconvg/testdata/lod-polygon.64.png b/shiny/iconvg/testdata/lod-polygon.64.png
index 0a13565..02812f5 100644
--- a/shiny/iconvg/testdata/lod-polygon.64.png
+++ b/shiny/iconvg/testdata/lod-polygon.64.png
Binary files differ
diff --git a/shiny/iconvg/testdata/lod-polygon.ivg b/shiny/iconvg/testdata/lod-polygon.ivg
index 86a1c1c..a128b5d 100644
--- a/shiny/iconvg/testdata/lod-polygon.ivg
+++ b/shiny/iconvg/testdata/lod-polygon.ivg
Binary files differ
diff --git a/shiny/iconvg/testdata/lod-polygon.ivg.disassembly b/shiny/iconvg/testdata/lod-polygon.ivg.disassembly
index 32267b3..a61bb71 100644
--- a/shiny/iconvg/testdata/lod-polygon.ivg.disassembly
+++ b/shiny/iconvg/testdata/lod-polygon.ivg.disassembly
@@ -16,10 +16,10 @@
 80                +0
 01            L (absolute lineTo), 2 reps
 64                -14
-5f fd c1 41       +24.24871
+41 98             +24.25
               L (absolute lineTo), implicit
 64                -14
-5f fd c1 c1       -24.24871
+c1 67             -24.25
 e1            z (closePath); end path
 c7            Set LOD
 a0                +80
@@ -28,17 +28,17 @@
 b8                +28
 80                +0
 03            L (absolute lineTo), 4 reps
-8f 70 0a 41       +8.652477
-67 09 d5 41       +26.629585
+a9 88             +8.65625
+a1 9a             +26.625
               L (absolute lineTo), implicit
-47 38 b5 c1       -22.652473
-f7 a9 83 41       +16.457985
+59 69             -22.65625
+75 90             +16.453125
               L (absolute lineTo), implicit
-47 38 b5 c1       -22.652473
-f7 a9 83 c1       -16.457985
+59 69             -22.65625
+8d 6f             -16.453125
               L (absolute lineTo), implicit
-8f 70 0a 41       +8.652477
-67 09 d5 c1       -26.629585
+a9 88             +8.65625
+61 65             -26.625
 e1            z (closePath); end path
 c7            Set LOD
 00                +0
diff --git a/shiny/iconvg/testdata/lod-polygon.png b/shiny/iconvg/testdata/lod-polygon.png
index 30af4e7..530a41c 100644
--- a/shiny/iconvg/testdata/lod-polygon.png
+++ b/shiny/iconvg/testdata/lod-polygon.png
Binary files differ
diff --git a/shiny/materialdesign/icons/data.go b/shiny/materialdesign/icons/data.go
index 5e64630..20c88d3 100644
--- a/shiny/materialdesign/icons/data.go
+++ b/shiny/materialdesign/icons/data.go
@@ -4,84 +4,71 @@
 
 var ToggleCheckBox = []byte{
 	0x89, 0x49, 0x56, 0x47, 0x02, 0x0a, 0x00, 0x50, 0x50, 0xb0, 0xb0, 0xc0, 0x9c, 0x5c, 0xe6, 0x64,
-	0xb0, 0xa7, 0x70, 0x0d, 0xc0, 0x80, 0x78, 0xbb, 0x1e, 0xe5, 0x3f, 0x78, 0x88, 0xe9, 0xb8, 0xb0,
-	0x80, 0xa7, 0x70, 0x0d, 0x40, 0xbb, 0x1e, 0xe5, 0x3f, 0x88, 0x88, 0x88, 0xe7, 0xb8, 0xb0, 0xa7,
-	0x70, 0x0d, 0x40, 0x80, 0x88, 0xbb, 0x1e, 0xe5, 0xbf, 0x88, 0x78, 0xe8, 0x64, 0xb0, 0x80, 0xa7,
-	0x70, 0x0d, 0xc0, 0xbb, 0x1e, 0xe5, 0xbf, 0x78, 0x78, 0x78, 0xe2, 0x78, 0x94, 0x00, 0x64, 0x80,
-	0x20, 0xbb, 0x1e, 0x35, 0x40, 0xbb, 0x1e, 0x35, 0xc0, 0x00, 0x78, 0x4b, 0xe1, 0x8a, 0x40, 0x20,
-	0x57, 0xb8, 0x72, 0x41, 0x57, 0xb8, 0x72, 0xc1, 0x01, 0x9c, 0x70, 0x78, 0x94, 0xe1,
+	0xb0, 0xcd, 0x7d, 0x80, 0x78, 0xcd, 0x81, 0x78, 0x88, 0xe9, 0xb8, 0xb0, 0x80, 0x35, 0x82, 0xcd,
+	0x81, 0x88, 0x88, 0x88, 0xe7, 0xb8, 0xb0, 0x35, 0x82, 0x80, 0x88, 0x35, 0x7e, 0x88, 0x78, 0xe8,
+	0x64, 0xb0, 0x80, 0xcd, 0x7d, 0x35, 0x7e, 0x78, 0x78, 0x78, 0xe2, 0x78, 0x94, 0x00, 0x64, 0x80,
+	0x20, 0xd5, 0x82, 0x2d, 0x7d, 0x00, 0x78, 0x59, 0x84, 0x20, 0x2d, 0x8f, 0xd5, 0x70, 0x01, 0x9c,
+	0x70, 0x78, 0x94, 0xe1,
 }
 
 var ToggleCheckBoxOutlineBlank = []byte{
 	0x89, 0x49, 0x56, 0x47, 0x02, 0x0a, 0x00, 0x50, 0x50, 0xb0, 0xb0, 0xc0, 0x9c, 0x64, 0xe9, 0xb8,
-	0xe6, 0x64, 0xe8, 0x64, 0xe7, 0xb8, 0xe3, 0x80, 0x78, 0xe6, 0x64, 0xb0, 0xa7, 0x70, 0x0d, 0xc0,
-	0x80, 0x78, 0xbb, 0x1e, 0xe5, 0x3f, 0x78, 0x88, 0xe9, 0xb8, 0xb0, 0x80, 0xa7, 0x70, 0x0d, 0x40,
-	0xbb, 0x1e, 0xe5, 0x3f, 0x88, 0x88, 0x88, 0xe7, 0xb8, 0xb0, 0xa7, 0x70, 0x0d, 0x40, 0x80, 0x88,
-	0xbb, 0x1e, 0xe5, 0xbf, 0x88, 0x78, 0xe8, 0x64, 0xb0, 0x80, 0xa7, 0x70, 0x0d, 0xc0, 0xbb, 0x1e,
-	0xe5, 0xbf, 0x78, 0x78, 0x78, 0xe1,
+	0xe6, 0x64, 0xe8, 0x64, 0xe7, 0xb8, 0xe3, 0x80, 0x78, 0xe6, 0x64, 0xb0, 0xcd, 0x7d, 0x80, 0x78,
+	0xcd, 0x81, 0x78, 0x88, 0xe9, 0xb8, 0xb0, 0x80, 0x35, 0x82, 0xcd, 0x81, 0x88, 0x88, 0x88, 0xe7,
+	0xb8, 0xb0, 0x35, 0x82, 0x80, 0x88, 0x35, 0x7e, 0x88, 0x78, 0xe8, 0x64, 0xb0, 0x80, 0xcd, 0x7d,
+	0x35, 0x7e, 0x78, 0x78, 0x78, 0xe1,
 }
 
 var ToggleIndeterminateCheckBox = []byte{
 	0x89, 0x49, 0x56, 0x47, 0x02, 0x0a, 0x00, 0x50, 0x50, 0xb0, 0xb0, 0xc0, 0x9c, 0x5c, 0xe6, 0x64,
-	0xb0, 0xcf, 0xcc, 0x0c, 0xc0, 0x80, 0x78, 0x6b, 0x66, 0xe6, 0x3f, 0x78, 0x88, 0xe9, 0xb8, 0xb0,
-	0x80, 0xcf, 0xcc, 0x0c, 0x40, 0x6b, 0x66, 0xe6, 0x3f, 0x88, 0x88, 0x88, 0xe7, 0xb8, 0xb0, 0xcf,
-	0xcc, 0x0c, 0x40, 0x80, 0x88, 0x6b, 0x66, 0xe6, 0xbf, 0x88, 0x78, 0xe8, 0x64, 0xb0, 0x80, 0xcf,
-	0xcc, 0x0c, 0xc0, 0x6b, 0x66, 0xe6, 0xbf, 0x78, 0x78, 0x78, 0xe3, 0x78, 0xa8, 0xe6, 0x6c, 0xe9,
+	0xb0, 0xcd, 0x7d, 0x80, 0x78, 0xcd, 0x81, 0x78, 0x88, 0xe9, 0xb8, 0xb0, 0x80, 0x35, 0x82, 0xcd,
+	0x81, 0x88, 0x88, 0x88, 0xe7, 0xb8, 0xb0, 0x35, 0x82, 0x80, 0x88, 0x35, 0x7e, 0x88, 0x78, 0xe8,
+	0x64, 0xb0, 0x80, 0xcd, 0x7d, 0x35, 0x7e, 0x78, 0x78, 0x78, 0xe3, 0x78, 0xa8, 0xe6, 0x6c, 0xe9,
 	0x78, 0xe7, 0xa8, 0xe9, 0x88, 0xe1,
 }
 
 var ToggleRadioButtonChecked = []byte{
-	0x89, 0x49, 0x56, 0x47, 0x02, 0x0a, 0x00, 0x50, 0x50, 0xb0, 0xb0, 0xc0, 0x80, 0x6c, 0xb0, 0xdb,
-	0xa3, 0xb0, 0xc0, 0x80, 0x6c, 0x2b, 0x5c, 0x8f, 0x40, 0x6c, 0x94, 0x92, 0x2b, 0x5c, 0x8f, 0x40,
-	0x94, 0x94, 0x94, 0x94, 0x2b, 0x5c, 0x8f, 0xc0, 0x94, 0x6c, 0x2b, 0x5c, 0x8f, 0xc0, 0x6c, 0x6c,
-	0x6c, 0xe3, 0x80, 0x6c, 0xa0, 0xcf, 0xcc, 0x30, 0xc1, 0x58, 0x58, 0xcf, 0xcc, 0x30, 0xc1, 0x58,
-	0x80, 0x91, 0x37, 0x33, 0x0f, 0x41, 0xa8, 0xa8, 0xa8, 0xa8, 0x37, 0x33, 0x0f, 0xc1, 0xa8, 0x58,
-	0x80, 0xcf, 0xcc, 0x30, 0x41, 0x58, 0x80, 0x58, 0xe3, 0x80, 0xc8, 0xb0, 0xa7, 0x70, 0x0d, 0xc1,
-	0x80, 0x60, 0xbb, 0x1e, 0xe5, 0xc0, 0x60, 0x60, 0x80, 0xa7, 0x70, 0x0d, 0xc1, 0x60, 0x80, 0x60,
-	0x91, 0xa0, 0xbb, 0x1e, 0xe5, 0x40, 0xa0, 0xa0, 0xbb, 0x1e, 0xe5, 0xc0, 0xa0, 0x60, 0xa0, 0xe1,
+	0x89, 0x49, 0x56, 0x47, 0x02, 0x0a, 0x00, 0x50, 0x50, 0xb0, 0xb0, 0xc0, 0x80, 0x6c, 0xb0, 0x7d,
+	0x7a, 0x80, 0x6c, 0x7d, 0x84, 0x6c, 0x94, 0x92, 0x7d, 0x84, 0x94, 0x94, 0x94, 0x94, 0x85, 0x7b,
+	0x94, 0x6c, 0x85, 0x7b, 0x6c, 0x6c, 0x6c, 0xe3, 0x80, 0x6c, 0xa0, 0xf5, 0x74, 0x58, 0x58, 0xf5,
+	0x74, 0x58, 0x80, 0x91, 0xf5, 0x88, 0xa8, 0xa8, 0xa8, 0xa8, 0x0d, 0x77, 0xa8, 0x58, 0x80, 0x0d,
+	0x8b, 0x58, 0x80, 0x58, 0xe3, 0x80, 0xc8, 0xb0, 0x29, 0x77, 0x80, 0x60, 0xd9, 0x78, 0x60, 0x60,
+	0x80, 0x29, 0x77, 0x60, 0x80, 0x60, 0x91, 0xa0, 0x29, 0x87, 0xa0, 0xa0, 0xd9, 0x78, 0xa0, 0x60,
+	0xa0, 0xe1,
 }
 
 var ToggleRadioButtonUnchecked = []byte{
-	0x89, 0x49, 0x56, 0x47, 0x02, 0x0a, 0x00, 0x50, 0x50, 0xb0, 0xb0, 0xc0, 0x80, 0x58, 0xa0, 0xcf,
-	0xcc, 0x30, 0xc1, 0x58, 0x58, 0xcf, 0xcc, 0x30, 0xc1, 0x58, 0x80, 0x91, 0x37, 0x33, 0x0f, 0x41,
-	0xa8, 0xa8, 0xa8, 0xa8, 0x37, 0x33, 0x0f, 0xc1, 0xa8, 0x58, 0x80, 0xcf, 0xcc, 0x30, 0x41, 0x58,
-	0x80, 0x58, 0xe3, 0x80, 0xc8, 0xb0, 0xa7, 0x70, 0x0d, 0xc1, 0x80, 0x60, 0xbb, 0x1e, 0xe5, 0xc0,
-	0x60, 0x60, 0x80, 0xa7, 0x70, 0x0d, 0xc1, 0x60, 0x80, 0x60, 0x91, 0xa0, 0xbb, 0x1e, 0xe5, 0x40,
-	0xa0, 0xa0, 0xbb, 0x1e, 0xe5, 0xc0, 0xa0, 0x60, 0xa0, 0xe1,
+	0x89, 0x49, 0x56, 0x47, 0x02, 0x0a, 0x00, 0x50, 0x50, 0xb0, 0xb0, 0xc0, 0x80, 0x58, 0xa0, 0xf5,
+	0x74, 0x58, 0x58, 0xf5, 0x74, 0x58, 0x80, 0x91, 0xf5, 0x88, 0xa8, 0xa8, 0xa8, 0xa8, 0x0d, 0x77,
+	0xa8, 0x58, 0x80, 0x0d, 0x8b, 0x58, 0x80, 0x58, 0xe3, 0x80, 0xc8, 0xb0, 0x29, 0x77, 0x80, 0x60,
+	0xd9, 0x78, 0x60, 0x60, 0x80, 0x29, 0x77, 0x60, 0x80, 0x60, 0x91, 0xa0, 0x29, 0x87, 0xa0, 0xa0,
+	0xd9, 0x78, 0xa0, 0x60, 0xa0, 0xe1,
 }
 
 var ToggleStar = []byte{
 	0x89, 0x49, 0x56, 0x47, 0x02, 0x0a, 0x00, 0x50, 0x50, 0xb0, 0xb0, 0xc0, 0x80, 0xdb, 0xa3, 0x28,
-	0x41, 0x00, 0x93, 0xc2, 0x45, 0x41, 0xa4, 0x20, 0x87, 0xeb, 0x51, 0xc0, 0xc7, 0xf5, 0x60, 0xc1,
-	0x00, 0xa8, 0xdb, 0xa3, 0xb0, 0xc0, 0x20, 0x7f, 0x14, 0x66, 0xc1, 0xfb, 0x28, 0x9c, 0xbf, 0x02,
-	0x80, 0x58, 0x0f, 0xd7, 0xb3, 0xc0, 0x17, 0xae, 0xd7, 0xc0, 0x58, 0xdb, 0xa3, 0xb0, 0xc0, 0x20,
-	0x57, 0xb8, 0x2e, 0x41, 0x2b, 0x5c, 0x17, 0x41, 0x00, 0x93, 0xc2, 0x45, 0xc1, 0xa4, 0xe1,
+	0x41, 0x00, 0x5d, 0x8c, 0xa4, 0x20, 0xb9, 0x7c, 0xf1, 0x71, 0x00, 0xa8, 0x7d, 0x7a, 0x20, 0xa1,
+	0x71, 0xc9, 0x7e, 0x02, 0x80, 0x58, 0x61, 0x7a, 0x45, 0x79, 0x58, 0x7d, 0x7a, 0x20, 0xed, 0x8a,
+	0x75, 0x89, 0x00, 0xa5, 0x73, 0xa4, 0xe1,
 }
 
 var ToggleStarBorder = []byte{
 	0x89, 0x49, 0x56, 0x47, 0x02, 0x0a, 0x00, 0x50, 0x50, 0xb0, 0xb0, 0xc0, 0xa8, 0xdb, 0xa3, 0xb0,
-	0xc0, 0x20, 0x7f, 0x14, 0x66, 0xc1, 0x57, 0xb8, 0x9e, 0xbf, 0x02, 0x80, 0x58, 0x0f, 0xd7, 0xb3,
-	0xc0, 0x17, 0xae, 0xd7, 0xc0, 0x58, 0xdb, 0xa3, 0xb0, 0xc0, 0x20, 0x57, 0xb8, 0x2e, 0x41, 0x2b,
-	0x5c, 0x17, 0x41, 0x02, 0x93, 0xc2, 0x45, 0xc1, 0xa4, 0x80, 0xdb, 0xa3, 0x28, 0x41, 0x93, 0xc2,
-	0x45, 0x41, 0xa4, 0x20, 0xdb, 0xa3, 0x50, 0xc0, 0xc7, 0xf5, 0x60, 0xc1, 0x00, 0xa8, 0xdb, 0xa3,
-	0xb0, 0xc0, 0xe2, 0x80, 0x9b, 0x99, 0xd9, 0x40, 0x23, 0xdb, 0xa3, 0xf0, 0xc0, 0xb3, 0x47, 0x91,
-	0x40, 0x84, 0xc7, 0xf5, 0x08, 0xc1, 0xe3, 0x7a, 0xd4, 0xc0, 0xef, 0x51, 0xb8, 0xc0, 0xfb, 0x28,
-	0x0c, 0x41, 0x5f, 0x8f, 0x42, 0xbf, 0x00, 0x80, 0xcf, 0xcc, 0x3c, 0xc1, 0x23, 0x4b, 0xe1, 0x5a,
-	0x40, 0xb3, 0x47, 0x01, 0x41, 0xfb, 0x28, 0x0c, 0x41, 0x5f, 0x8f, 0x42, 0x3f, 0xe3, 0x7a, 0xd4,
-	0xc0, 0xef, 0x51, 0xb8, 0x40, 0x84, 0xc7, 0xf5, 0x08, 0x41, 0x00, 0x80, 0x9b, 0x99, 0xd9, 0x40,
-	0xe1,
+	0xc0, 0x20, 0xa1, 0x71, 0xc5, 0x7e, 0x02, 0x80, 0x58, 0x61, 0x7a, 0x45, 0x79, 0x58, 0x7d, 0x7a,
+	0x20, 0xed, 0x8a, 0x75, 0x89, 0x02, 0xa5, 0x73, 0xa4, 0x80, 0x8d, 0x8a, 0x5d, 0x8c, 0xa4, 0x20,
+	0xbd, 0x7c, 0xf1, 0x71, 0x00, 0xa8, 0x7d, 0x7a, 0xe2, 0x80, 0xcd, 0x86, 0x23, 0x7d, 0x78, 0x8d,
+	0x84, 0x84, 0x71, 0x77, 0x5d, 0x79, 0x3d, 0x7a, 0xc5, 0x88, 0x3d, 0x7f, 0x00, 0x80, 0x35, 0x74,
+	0x23, 0x6d, 0x83, 0x15, 0x88, 0xc5, 0x88, 0xc5, 0x80, 0x5d, 0x79, 0xc5, 0x85, 0x84, 0x91, 0x88,
+	0x00, 0x80, 0xcd, 0x86, 0xe1,
 }
 
 var ToggleStarHalf = []byte{
 	0x89, 0x49, 0x56, 0x47, 0x02, 0x0a, 0x00, 0x50, 0x50, 0xb0, 0xb0, 0xc0, 0xa8, 0xdb, 0xa3, 0xb0,
-	0xc0, 0x20, 0x7f, 0x14, 0x66, 0xc1, 0x57, 0xb8, 0x9e, 0xbf, 0x00, 0x80, 0x58, 0x20, 0x0f, 0xd7,
-	0xb3, 0xc0, 0xfb, 0x28, 0x54, 0x41, 0x00, 0x58, 0xdb, 0xa3, 0xb0, 0xc0, 0x20, 0x57, 0xb8, 0x2e,
-	0x41, 0x2b, 0x5c, 0x17, 0x41, 0x04, 0x93, 0xc2, 0x45, 0xc1, 0xa4, 0x80, 0xdb, 0xa3, 0x28, 0x41,
-	0x93, 0xc2, 0x45, 0x41, 0xa4, 0x9b, 0x99, 0x11, 0x41, 0xfb, 0x28, 0x7c, 0x40, 0xa8, 0xdb, 0xa3,
-	0xb0, 0xc0, 0xe2, 0x80, 0x9b, 0x99, 0xd9, 0x40, 0xe8, 0xcf, 0xcc, 0x3c, 0xc1, 0x23, 0x4b, 0xe1,
-	0x5a, 0x40, 0xb3, 0x47, 0x01, 0x41, 0xfb, 0x28, 0x0c, 0x41, 0x5f, 0x8f, 0x42, 0x3f, 0xe3, 0x7a,
-	0xd4, 0xc0, 0xef, 0x51, 0xb8, 0x40, 0x84, 0xc7, 0xf5, 0x08, 0x41, 0x00, 0x80, 0x9b, 0x99, 0xd9,
-	0x40, 0xe1,
+	0xc0, 0x20, 0xa1, 0x71, 0xc5, 0x7e, 0x00, 0x80, 0x58, 0x20, 0x61, 0x7a, 0x45, 0x8d, 0x00, 0x58,
+	0x7d, 0x7a, 0x20, 0xed, 0x8a, 0x75, 0x89, 0x04, 0xa5, 0x73, 0xa4, 0x80, 0x8d, 0x8a, 0x5d, 0x8c,
+	0xa4, 0x19, 0x89, 0xf1, 0x83, 0xa8, 0x7d, 0x7a, 0xe2, 0x80, 0xcd, 0x86, 0xe8, 0x35, 0x74, 0x23,
+	0x6d, 0x83, 0x15, 0x88, 0xc5, 0x88, 0xc5, 0x80, 0x5d, 0x79, 0xc5, 0x85, 0x84, 0x91, 0x88, 0x00,
+	0x80, 0xcd, 0x86, 0xe1,
 }
 
-// In total, 1958 SVG bytes in 8 files (1957 PNG bytes at 24px * 24px, 2776 PNG bytes at 48px * 48px) converted to 870 IconVG bytes.
+// In total, 1958 SVG bytes in 8 files (1957 PNG bytes at 24px * 24px, 2776 PNG bytes at 48px * 48px) converted to 632 IconVG bytes.