1// Copyright 2016 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package iconvg
6
7import (
8	"image/color"
9	"math"
10
11	"golang.org/x/image/math/f32"
12)
13
14const magic = "\x89IVG"
15
16var magicBytes = []byte(magic)
17
18var (
19	negativeInfinity = math.Float32frombits(0xff800000)
20	positiveInfinity = math.Float32frombits(0x7f800000)
21)
22
23func isNaNOrInfinity(f float32) bool {
24	return math.Float32bits(f)&0x7f800000 == 0x7f800000
25}
26
27const (
28	midViewBox          = 0
29	midSuggestedPalette = 1
30)
31
32var gradientShapeNames = [2]string{
33	"linear",
34	"radial",
35}
36
37var gradientSpreadNames = [4]string{
38	"none",
39	"pad",
40	"reflect",
41	"repeat",
42}
43
44// GradientSpread is how to spread a gradient past its nominal bounds (from
45// offset being 0.0 to offset being 1.0).
46type GradientSpread uint8
47
48const (
49	GradientSpreadNone    GradientSpread = 0
50	GradientSpreadPad     GradientSpread = 1
51	GradientSpreadReflect GradientSpread = 2
52	GradientSpreadRepeat  GradientSpread = 3
53)
54
55// GradientStop is a color/offset gradient stop.
56type GradientStop struct {
57	Offset float32
58	Color  color.Color
59}
60
61// Rectangle is defined by its minimum and maximum coordinates.
62type Rectangle struct {
63	Min, Max f32.Vec2
64}
65
66// AspectRatio returns the Rectangle's aspect ratio. An IconVG graphic is
67// scalable; these dimensions do not necessarily map 1:1 to pixels.
68func (r *Rectangle) AspectRatio() (dx, dy float32) {
69	return r.Max[0] - r.Min[0], r.Max[1] - r.Min[1]
70}
71
72// Palette is an IconVG palette.
73type Palette [64]color.RGBA
74
75// Metadata is an IconVG's metadata.
76type Metadata struct {
77	ViewBox Rectangle
78
79	// Palette is a 64 color palette. When encoding, it is the suggested
80	// palette to place within the IconVG graphic. When decoding, it is either
81	// the optional palette passed to Decode, or if no optional palette was
82	// given, the suggested palette within the IconVG graphic.
83	Palette Palette
84}
85
86// DefaultViewBox is the default ViewBox. Its values should not be modified.
87var DefaultViewBox = Rectangle{
88	Min: f32.Vec2{-32, -32},
89	Max: f32.Vec2{+32, +32},
90}
91
92// DefaultPalette is the default Palette. Its values should not be modified.
93var DefaultPalette = Palette{
94	color.RGBA{0x00, 0x00, 0x00, 0xff},
95	color.RGBA{0x00, 0x00, 0x00, 0xff},
96	color.RGBA{0x00, 0x00, 0x00, 0xff},
97	color.RGBA{0x00, 0x00, 0x00, 0xff},
98	color.RGBA{0x00, 0x00, 0x00, 0xff},
99	color.RGBA{0x00, 0x00, 0x00, 0xff},
100	color.RGBA{0x00, 0x00, 0x00, 0xff},
101	color.RGBA{0x00, 0x00, 0x00, 0xff},
102	color.RGBA{0x00, 0x00, 0x00, 0xff},
103	color.RGBA{0x00, 0x00, 0x00, 0xff},
104	color.RGBA{0x00, 0x00, 0x00, 0xff},
105	color.RGBA{0x00, 0x00, 0x00, 0xff},
106	color.RGBA{0x00, 0x00, 0x00, 0xff},
107	color.RGBA{0x00, 0x00, 0x00, 0xff},
108	color.RGBA{0x00, 0x00, 0x00, 0xff},
109	color.RGBA{0x00, 0x00, 0x00, 0xff},
110	color.RGBA{0x00, 0x00, 0x00, 0xff},
111	color.RGBA{0x00, 0x00, 0x00, 0xff},
112	color.RGBA{0x00, 0x00, 0x00, 0xff},
113	color.RGBA{0x00, 0x00, 0x00, 0xff},
114	color.RGBA{0x00, 0x00, 0x00, 0xff},
115	color.RGBA{0x00, 0x00, 0x00, 0xff},
116	color.RGBA{0x00, 0x00, 0x00, 0xff},
117	color.RGBA{0x00, 0x00, 0x00, 0xff},
118	color.RGBA{0x00, 0x00, 0x00, 0xff},
119	color.RGBA{0x00, 0x00, 0x00, 0xff},
120	color.RGBA{0x00, 0x00, 0x00, 0xff},
121	color.RGBA{0x00, 0x00, 0x00, 0xff},
122	color.RGBA{0x00, 0x00, 0x00, 0xff},
123	color.RGBA{0x00, 0x00, 0x00, 0xff},
124	color.RGBA{0x00, 0x00, 0x00, 0xff},
125	color.RGBA{0x00, 0x00, 0x00, 0xff},
126	color.RGBA{0x00, 0x00, 0x00, 0xff},
127	color.RGBA{0x00, 0x00, 0x00, 0xff},
128	color.RGBA{0x00, 0x00, 0x00, 0xff},
129	color.RGBA{0x00, 0x00, 0x00, 0xff},
130	color.RGBA{0x00, 0x00, 0x00, 0xff},
131	color.RGBA{0x00, 0x00, 0x00, 0xff},
132	color.RGBA{0x00, 0x00, 0x00, 0xff},
133	color.RGBA{0x00, 0x00, 0x00, 0xff},
134	color.RGBA{0x00, 0x00, 0x00, 0xff},
135	color.RGBA{0x00, 0x00, 0x00, 0xff},
136	color.RGBA{0x00, 0x00, 0x00, 0xff},
137	color.RGBA{0x00, 0x00, 0x00, 0xff},
138	color.RGBA{0x00, 0x00, 0x00, 0xff},
139	color.RGBA{0x00, 0x00, 0x00, 0xff},
140	color.RGBA{0x00, 0x00, 0x00, 0xff},
141	color.RGBA{0x00, 0x00, 0x00, 0xff},
142	color.RGBA{0x00, 0x00, 0x00, 0xff},
143	color.RGBA{0x00, 0x00, 0x00, 0xff},
144	color.RGBA{0x00, 0x00, 0x00, 0xff},
145	color.RGBA{0x00, 0x00, 0x00, 0xff},
146	color.RGBA{0x00, 0x00, 0x00, 0xff},
147	color.RGBA{0x00, 0x00, 0x00, 0xff},
148	color.RGBA{0x00, 0x00, 0x00, 0xff},
149	color.RGBA{0x00, 0x00, 0x00, 0xff},
150	color.RGBA{0x00, 0x00, 0x00, 0xff},
151	color.RGBA{0x00, 0x00, 0x00, 0xff},
152	color.RGBA{0x00, 0x00, 0x00, 0xff},
153	color.RGBA{0x00, 0x00, 0x00, 0xff},
154	color.RGBA{0x00, 0x00, 0x00, 0xff},
155	color.RGBA{0x00, 0x00, 0x00, 0xff},
156	color.RGBA{0x00, 0x00, 0x00, 0xff},
157	color.RGBA{0x00, 0x00, 0x00, 0xff},
158}
159