1
0

calc_position.go 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. package processing
  2. import (
  3. "math"
  4. "github.com/imgproxy/imgproxy/v3/imath"
  5. )
  6. func calcPosition(width, height, innerWidth, innerHeight int, gravity *GravityOptions, dpr float64, allowOverflow bool) (left, top int) {
  7. if gravity.Type == GravityFocusPoint {
  8. pointX := imath.ScaleToEven(width, gravity.X)
  9. pointY := imath.ScaleToEven(height, gravity.Y)
  10. left = pointX - innerWidth/2
  11. top = pointY - innerHeight/2
  12. } else {
  13. var offX, offY int
  14. if math.Abs(gravity.X) >= 1.0 {
  15. offX = imath.RoundToEven(gravity.X * dpr)
  16. } else {
  17. offX = imath.ScaleToEven(width, gravity.X)
  18. }
  19. if math.Abs(gravity.Y) >= 1.0 {
  20. offY = imath.RoundToEven(gravity.Y * dpr)
  21. } else {
  22. offY = imath.ScaleToEven(height, gravity.Y)
  23. }
  24. left = imath.ShrinkToEven(width-innerWidth+1, 2) + offX
  25. top = imath.ShrinkToEven(height-innerHeight+1, 2) + offY
  26. if gravity.Type == GravityNorth || gravity.Type == GravityNorthEast || gravity.Type == GravityNorthWest {
  27. top = 0 + offY
  28. }
  29. if gravity.Type == GravityEast || gravity.Type == GravityNorthEast || gravity.Type == GravitySouthEast {
  30. left = width - innerWidth - offX
  31. }
  32. if gravity.Type == GravitySouth || gravity.Type == GravitySouthEast || gravity.Type == GravitySouthWest {
  33. top = height - innerHeight - offY
  34. }
  35. if gravity.Type == GravityWest || gravity.Type == GravityNorthWest || gravity.Type == GravitySouthWest {
  36. left = 0 + offX
  37. }
  38. }
  39. var minX, maxX, minY, maxY int
  40. if allowOverflow {
  41. minX, maxX = -innerWidth+1, width-1
  42. minY, maxY = -innerHeight+1, height-1
  43. } else {
  44. minX, maxX = 0, width-innerWidth
  45. minY, maxY = 0, height-innerHeight
  46. }
  47. left = max(minX, min(left, maxX))
  48. top = max(minY, min(top, maxY))
  49. return
  50. }