blob: 99eaac2201f70aa430c8cedbbe3c61a8be4476bc [file] [log] [blame]
// Copyright 2016 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package iconvg
import (
"image/color"
"math"
"golang.org/x/image/math/f32"
)
const magic = "\x89IVG"
var magicBytes = []byte(magic)
var (
negativeInfinity = math.Float32frombits(0xff800000)
positiveInfinity = math.Float32frombits(0x7f800000)
)
func isNaNOrInfinity(f float32) bool {
return math.Float32bits(f)&0x7f800000 == 0x7f800000
}
const (
// File Format Version 0.
midViewBox = 0
midSuggestedPalette = 1
// File Format Version 1.
ffv1MIDViewBox = 8
ffv1MIDSuggestedPalette = 16
)
var gradientShapeNames = [2]string{
"linear",
"radial",
}
var gradientSpreadNames = [4]string{
"none",
"pad",
"reflect",
"repeat",
}
// GradientSpread is how to spread a gradient past its nominal bounds (from
// offset being 0.0 to offset being 1.0).
type GradientSpread uint8
const (
GradientSpreadNone GradientSpread = 0
GradientSpreadPad GradientSpread = 1
GradientSpreadReflect GradientSpread = 2
GradientSpreadRepeat GradientSpread = 3
)
// GradientStop is a color/offset gradient stop.
type GradientStop struct {
Offset float32
Color color.Color
}
// Rectangle is defined by its minimum and maximum coordinates.
type Rectangle struct {
Min, Max f32.Vec2
}
// AspectRatio returns the Rectangle's aspect ratio. An IconVG graphic is
// scalable; these dimensions do not necessarily map 1:1 to pixels.
func (r *Rectangle) AspectRatio() (dx, dy float32) {
return r.Max[0] - r.Min[0], r.Max[1] - r.Min[1]
}
// Palette is an IconVG palette.
type Palette [64]color.RGBA
// Metadata is an IconVG's metadata.
type Metadata struct {
ViewBox Rectangle
// Palette is a 64 color palette. When encoding, it is the suggested
// palette to place within the IconVG graphic. When decoding, it is either
// the optional palette passed to Decode, or if no optional palette was
// given, the suggested palette within the IconVG graphic.
Palette Palette
}
// DefaultViewBox is the default ViewBox. Its values should not be modified.
var DefaultViewBox = Rectangle{
Min: f32.Vec2{-32, -32},
Max: f32.Vec2{+32, +32},
}
// DefaultPalette is the default Palette. Its values should not be modified.
var DefaultPalette = Palette{
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
color.RGBA{0x00, 0x00, 0x00, 0xff},
}