iconvg.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. package iconvg
  5. import (
  6. "image/color"
  7. "math"
  8. "golang.org/x/image/math/f32"
  9. )
  10. const magic = "\x89IVG"
  11. var magicBytes = []byte(magic)
  12. var (
  13. negativeInfinity = math.Float32frombits(0xff800000)
  14. positiveInfinity = math.Float32frombits(0x7f800000)
  15. )
  16. func isNaNOrInfinity(f float32) bool {
  17. return math.Float32bits(f)&0x7f800000 == 0x7f800000
  18. }
  19. const (
  20. // File Format Version 0.
  21. midViewBox = 0
  22. midSuggestedPalette = 1
  23. // File Format Version 1.
  24. ffv1MIDViewBox = 8
  25. ffv1MIDSuggestedPalette = 16
  26. )
  27. var gradientShapeNames = [2]string{
  28. "linear",
  29. "radial",
  30. }
  31. var gradientSpreadNames = [4]string{
  32. "none",
  33. "pad",
  34. "reflect",
  35. "repeat",
  36. }
  37. // GradientSpread is how to spread a gradient past its nominal bounds (from
  38. // offset being 0.0 to offset being 1.0).
  39. type GradientSpread uint8
  40. const (
  41. GradientSpreadNone GradientSpread = 0
  42. GradientSpreadPad GradientSpread = 1
  43. GradientSpreadReflect GradientSpread = 2
  44. GradientSpreadRepeat GradientSpread = 3
  45. )
  46. // GradientStop is a color/offset gradient stop.
  47. type GradientStop struct {
  48. Offset float32
  49. Color color.Color
  50. }
  51. // Rectangle is defined by its minimum and maximum coordinates.
  52. type Rectangle struct {
  53. Min, Max f32.Vec2
  54. }
  55. // AspectRatio returns the Rectangle's aspect ratio. An IconVG graphic is
  56. // scalable; these dimensions do not necessarily map 1:1 to pixels.
  57. func (r *Rectangle) AspectRatio() (dx, dy float32) {
  58. return r.Max[0] - r.Min[0], r.Max[1] - r.Min[1]
  59. }
  60. // Palette is an IconVG palette.
  61. type Palette [64]color.RGBA
  62. // Metadata is an IconVG's metadata.
  63. type Metadata struct {
  64. ViewBox Rectangle
  65. // Palette is a 64 color palette. When encoding, it is the suggested
  66. // palette to place within the IconVG graphic. When decoding, it is either
  67. // the optional palette passed to Decode, or if no optional palette was
  68. // given, the suggested palette within the IconVG graphic.
  69. Palette Palette
  70. }
  71. // DefaultViewBox is the default ViewBox. Its values should not be modified.
  72. var DefaultViewBox = Rectangle{
  73. Min: f32.Vec2{-32, -32},
  74. Max: f32.Vec2{+32, +32},
  75. }
  76. // DefaultPalette is the default Palette. Its values should not be modified.
  77. var DefaultPalette = Palette{
  78. color.RGBA{0x00, 0x00, 0x00, 0xff},
  79. color.RGBA{0x00, 0x00, 0x00, 0xff},
  80. color.RGBA{0x00, 0x00, 0x00, 0xff},
  81. color.RGBA{0x00, 0x00, 0x00, 0xff},
  82. color.RGBA{0x00, 0x00, 0x00, 0xff},
  83. color.RGBA{0x00, 0x00, 0x00, 0xff},
  84. color.RGBA{0x00, 0x00, 0x00, 0xff},
  85. color.RGBA{0x00, 0x00, 0x00, 0xff},
  86. color.RGBA{0x00, 0x00, 0x00, 0xff},
  87. color.RGBA{0x00, 0x00, 0x00, 0xff},
  88. color.RGBA{0x00, 0x00, 0x00, 0xff},
  89. color.RGBA{0x00, 0x00, 0x00, 0xff},
  90. color.RGBA{0x00, 0x00, 0x00, 0xff},
  91. color.RGBA{0x00, 0x00, 0x00, 0xff},
  92. color.RGBA{0x00, 0x00, 0x00, 0xff},
  93. color.RGBA{0x00, 0x00, 0x00, 0xff},
  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. }