gravity_options.go 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. package options
  2. import (
  3. "fmt"
  4. )
  5. type GravityType int
  6. const (
  7. GravityUnknown GravityType = iota
  8. GravityCenter
  9. GravityNorth
  10. GravityEast
  11. GravitySouth
  12. GravityWest
  13. GravityNorthWest
  14. GravityNorthEast
  15. GravitySouthWest
  16. GravitySouthEast
  17. GravitySmart
  18. GravityFocusPoint
  19. )
  20. var gravityTypes = map[string]GravityType{
  21. "ce": GravityCenter,
  22. "no": GravityNorth,
  23. "ea": GravityEast,
  24. "so": GravitySouth,
  25. "we": GravityWest,
  26. "nowe": GravityNorthWest,
  27. "noea": GravityNorthEast,
  28. "sowe": GravitySouthWest,
  29. "soea": GravitySouthEast,
  30. "sm": GravitySmart,
  31. "fp": GravityFocusPoint,
  32. }
  33. var gravityTypesRotationMap = map[int]map[GravityType]GravityType{
  34. 90: {
  35. GravityNorth: GravityWest,
  36. GravityEast: GravityNorth,
  37. GravitySouth: GravityEast,
  38. GravityWest: GravitySouth,
  39. GravityNorthWest: GravitySouthWest,
  40. GravityNorthEast: GravityNorthWest,
  41. GravitySouthWest: GravitySouthEast,
  42. GravitySouthEast: GravityNorthEast,
  43. },
  44. 180: {
  45. GravityNorth: GravitySouth,
  46. GravityEast: GravityWest,
  47. GravitySouth: GravityNorth,
  48. GravityWest: GravityEast,
  49. GravityNorthWest: GravitySouthEast,
  50. GravityNorthEast: GravitySouthWest,
  51. GravitySouthWest: GravityNorthEast,
  52. GravitySouthEast: GravityNorthWest,
  53. },
  54. 270: {
  55. GravityNorth: GravityEast,
  56. GravityEast: GravitySouth,
  57. GravitySouth: GravityWest,
  58. GravityWest: GravityNorth,
  59. GravityNorthWest: GravityNorthEast,
  60. GravityNorthEast: GravitySouthEast,
  61. GravitySouthWest: GravityNorthWest,
  62. GravitySouthEast: GravitySouthWest,
  63. },
  64. }
  65. var gravityTypesFlipMap = map[GravityType]GravityType{
  66. GravityEast: GravityWest,
  67. GravityWest: GravityEast,
  68. GravityNorthWest: GravityNorthEast,
  69. GravityNorthEast: GravityNorthWest,
  70. GravitySouthWest: GravitySouthEast,
  71. GravitySouthEast: GravitySouthWest,
  72. }
  73. func (gt GravityType) String() string {
  74. for k, v := range gravityTypes {
  75. if v == gt {
  76. return k
  77. }
  78. }
  79. return ""
  80. }
  81. func (gt GravityType) MarshalJSON() ([]byte, error) {
  82. for k, v := range gravityTypes {
  83. if v == gt {
  84. return []byte(fmt.Sprintf("%q", k)), nil
  85. }
  86. }
  87. return []byte("null"), nil
  88. }
  89. type GravityOptions struct {
  90. Type GravityType
  91. X, Y float64
  92. }
  93. func (g *GravityOptions) RotateAndFlip(angle int, flip bool) {
  94. angle %= 360
  95. if flip {
  96. if gt, ok := gravityTypesFlipMap[g.Type]; ok {
  97. g.Type = gt
  98. }
  99. switch g.Type {
  100. case GravityCenter, GravityNorth, GravitySouth:
  101. g.X = -g.X
  102. case GravityFocusPoint:
  103. g.X = 1.0 - g.X
  104. }
  105. }
  106. if angle > 0 {
  107. if rotMap := gravityTypesRotationMap[angle]; rotMap != nil {
  108. if gt, ok := rotMap[g.Type]; ok {
  109. g.Type = gt
  110. }
  111. switch angle {
  112. case 90:
  113. switch g.Type {
  114. case GravityCenter, GravityEast, GravityWest:
  115. g.X, g.Y = g.Y, -g.X
  116. case GravityFocusPoint:
  117. g.X, g.Y = g.Y, 1.0-g.X
  118. default:
  119. g.X, g.Y = g.Y, g.X
  120. }
  121. case 180:
  122. switch g.Type {
  123. case GravityCenter:
  124. g.X, g.Y = -g.X, -g.Y
  125. case GravityNorth, GravitySouth:
  126. g.X = -g.X
  127. case GravityEast, GravityWest:
  128. g.Y = -g.Y
  129. case GravityFocusPoint:
  130. g.X, g.Y = 1.0-g.X, 1.0-g.Y
  131. }
  132. case 270:
  133. switch g.Type {
  134. case GravityCenter, GravityNorth, GravitySouth:
  135. g.X, g.Y = -g.Y, g.X
  136. case GravityFocusPoint:
  137. g.X, g.Y = 1.0-g.Y, g.X
  138. default:
  139. g.X, g.Y = g.Y, g.X
  140. }
  141. }
  142. }
  143. }
  144. }