gravity_options.go 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  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. // Watermark gravity types
  20. GravityReplicate
  21. )
  22. var gravityTypes = map[string]GravityType{
  23. "ce": GravityCenter,
  24. "no": GravityNorth,
  25. "ea": GravityEast,
  26. "so": GravitySouth,
  27. "we": GravityWest,
  28. "nowe": GravityNorthWest,
  29. "noea": GravityNorthEast,
  30. "sowe": GravitySouthWest,
  31. "soea": GravitySouthEast,
  32. "sm": GravitySmart,
  33. "fp": GravityFocusPoint,
  34. "re": GravityReplicate,
  35. }
  36. var commonGravityTypes = []GravityType{
  37. GravityCenter,
  38. GravityNorth,
  39. GravityEast,
  40. GravitySouth,
  41. GravityWest,
  42. GravityNorthWest,
  43. GravityNorthEast,
  44. GravitySouthWest,
  45. GravitySouthEast,
  46. }
  47. var cropGravityTypes = append(
  48. []GravityType{
  49. GravitySmart,
  50. GravityFocusPoint,
  51. },
  52. commonGravityTypes...,
  53. )
  54. var extendGravityTypes = append(
  55. []GravityType{
  56. GravityFocusPoint,
  57. },
  58. commonGravityTypes...,
  59. )
  60. var watermarkGravityTypes = append(
  61. []GravityType{
  62. GravityReplicate,
  63. },
  64. commonGravityTypes...,
  65. )
  66. var gravityTypesRotationMap = map[int]map[GravityType]GravityType{
  67. 90: {
  68. GravityNorth: GravityWest,
  69. GravityEast: GravityNorth,
  70. GravitySouth: GravityEast,
  71. GravityWest: GravitySouth,
  72. GravityNorthWest: GravitySouthWest,
  73. GravityNorthEast: GravityNorthWest,
  74. GravitySouthWest: GravitySouthEast,
  75. GravitySouthEast: GravityNorthEast,
  76. },
  77. 180: {
  78. GravityNorth: GravitySouth,
  79. GravityEast: GravityWest,
  80. GravitySouth: GravityNorth,
  81. GravityWest: GravityEast,
  82. GravityNorthWest: GravitySouthEast,
  83. GravityNorthEast: GravitySouthWest,
  84. GravitySouthWest: GravityNorthEast,
  85. GravitySouthEast: GravityNorthWest,
  86. },
  87. 270: {
  88. GravityNorth: GravityEast,
  89. GravityEast: GravitySouth,
  90. GravitySouth: GravityWest,
  91. GravityWest: GravityNorth,
  92. GravityNorthWest: GravityNorthEast,
  93. GravityNorthEast: GravitySouthEast,
  94. GravitySouthWest: GravityNorthWest,
  95. GravitySouthEast: GravitySouthWest,
  96. },
  97. }
  98. var gravityTypesFlipMap = map[GravityType]GravityType{
  99. GravityEast: GravityWest,
  100. GravityWest: GravityEast,
  101. GravityNorthWest: GravityNorthEast,
  102. GravityNorthEast: GravityNorthWest,
  103. GravitySouthWest: GravitySouthEast,
  104. GravitySouthEast: GravitySouthWest,
  105. }
  106. func (gt GravityType) String() string {
  107. for k, v := range gravityTypes {
  108. if v == gt {
  109. return k
  110. }
  111. }
  112. return ""
  113. }
  114. func (gt GravityType) MarshalJSON() ([]byte, error) {
  115. for k, v := range gravityTypes {
  116. if v == gt {
  117. return []byte(fmt.Sprintf("%q", k)), nil
  118. }
  119. }
  120. return []byte("null"), nil
  121. }
  122. type GravityOptions struct {
  123. Type GravityType
  124. X, Y float64
  125. }
  126. func (g *GravityOptions) RotateAndFlip(angle int, flip bool) {
  127. angle %= 360
  128. if flip {
  129. if gt, ok := gravityTypesFlipMap[g.Type]; ok {
  130. g.Type = gt
  131. }
  132. switch g.Type {
  133. case GravityCenter, GravityNorth, GravitySouth:
  134. g.X = -g.X
  135. case GravityFocusPoint:
  136. g.X = 1.0 - g.X
  137. }
  138. }
  139. if angle > 0 {
  140. if rotMap := gravityTypesRotationMap[angle]; rotMap != nil {
  141. if gt, ok := rotMap[g.Type]; ok {
  142. g.Type = gt
  143. }
  144. switch angle {
  145. case 90:
  146. switch g.Type {
  147. case GravityCenter, GravityEast, GravityWest:
  148. g.X, g.Y = g.Y, -g.X
  149. case GravityFocusPoint:
  150. g.X, g.Y = g.Y, 1.0-g.X
  151. default:
  152. g.X, g.Y = g.Y, g.X
  153. }
  154. case 180:
  155. switch g.Type {
  156. case GravityCenter:
  157. g.X, g.Y = -g.X, -g.Y
  158. case GravityNorth, GravitySouth:
  159. g.X = -g.X
  160. case GravityEast, GravityWest:
  161. g.Y = -g.Y
  162. case GravityFocusPoint:
  163. g.X, g.Y = 1.0-g.X, 1.0-g.Y
  164. }
  165. case 270:
  166. switch g.Type {
  167. case GravityCenter, GravityNorth, GravitySouth:
  168. g.X, g.Y = -g.Y, g.X
  169. case GravityFocusPoint:
  170. g.X, g.Y = 1.0-g.Y, g.X
  171. default:
  172. g.X, g.Y = g.Y, g.X
  173. }
  174. }
  175. }
  176. }
  177. }