utils.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. package imaging
  2. import (
  3. "image"
  4. "runtime"
  5. "sync"
  6. )
  7. // parallel processes the data in separate goroutines.
  8. func parallel(start, stop int, fn func(<-chan int)) {
  9. count := stop - start
  10. if count < 1 {
  11. return
  12. }
  13. procs := runtime.GOMAXPROCS(0)
  14. if procs > count {
  15. procs = count
  16. }
  17. c := make(chan int, count)
  18. for i := start; i < stop; i++ {
  19. c <- i
  20. }
  21. close(c)
  22. var wg sync.WaitGroup
  23. for i := 0; i < procs; i++ {
  24. wg.Add(1)
  25. go func() {
  26. defer wg.Done()
  27. fn(c)
  28. }()
  29. }
  30. wg.Wait()
  31. }
  32. // absint returns the absolute value of i.
  33. func absint(i int) int {
  34. if i < 0 {
  35. return -i
  36. }
  37. return i
  38. }
  39. // clamp rounds and clamps float64 value to fit into uint8.
  40. func clamp(x float64) uint8 {
  41. v := int64(x + 0.5)
  42. if v > 255 {
  43. return 255
  44. }
  45. if v > 0 {
  46. return uint8(v)
  47. }
  48. return 0
  49. }
  50. func reverse(pix []uint8) {
  51. if len(pix) <= 4 {
  52. return
  53. }
  54. i := 0
  55. j := len(pix) - 4
  56. for i < j {
  57. pix[i+0], pix[j+0] = pix[j+0], pix[i+0]
  58. pix[i+1], pix[j+1] = pix[j+1], pix[i+1]
  59. pix[i+2], pix[j+2] = pix[j+2], pix[i+2]
  60. pix[i+3], pix[j+3] = pix[j+3], pix[i+3]
  61. i += 4
  62. j -= 4
  63. }
  64. }
  65. func toNRGBA(img image.Image) *image.NRGBA {
  66. if img, ok := img.(*image.NRGBA); ok {
  67. return &image.NRGBA{
  68. Pix: img.Pix,
  69. Stride: img.Stride,
  70. Rect: img.Rect.Sub(img.Rect.Min),
  71. }
  72. }
  73. return Clone(img)
  74. }