source.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package vips
  2. /*
  3. #cgo pkg-config: vips
  4. #cgo CFLAGS: -O3
  5. #cgo LDFLAGS: -lm
  6. #include "source.h"
  7. #include "vips.h"
  8. */
  9. import "C"
  10. import (
  11. "io"
  12. "runtime/cgo"
  13. "unsafe"
  14. )
  15. //export closeImgproxyReader
  16. func closeImgproxyReader(handle C.uintptr_t) {
  17. h := cgo.Handle(handle)
  18. h.Delete()
  19. }
  20. // calls seek() on the async reader via it's handle from the C side
  21. //
  22. //export imgproxyReaderSeek
  23. func imgproxyReaderSeek(handle C.uintptr_t, offset C.int64_t, whence int) C.int64_t {
  24. h := cgo.Handle(handle)
  25. reader, ok := h.Value().(io.ReadSeeker)
  26. if !ok {
  27. vipsError("imgproxyReaderSeek", "failed to cast handle to io.ReadSeeker")
  28. return -1
  29. }
  30. pos, err := reader.Seek(int64(offset), whence)
  31. if err != nil {
  32. vipsError("imgproxyReaderSeek", "failed to seek: %w", err)
  33. return -1
  34. }
  35. return C.int64_t(pos)
  36. }
  37. // calls read() on the async reader via it's handle from the C side
  38. //
  39. //export imgproxyReaderRead
  40. func imgproxyReaderRead(handle C.uintptr_t, pointer unsafe.Pointer, size C.int64_t) C.int64_t {
  41. h := cgo.Handle(handle)
  42. reader, ok := h.Value().(io.ReadSeeker)
  43. if !ok {
  44. vipsError("imgproxyReaderRead", "invalid reader handle")
  45. return -1
  46. }
  47. buf := unsafe.Slice((*byte)(pointer), size)
  48. n, err := reader.Read(buf)
  49. if err == io.EOF {
  50. return 0
  51. } else if err != nil {
  52. vipsError("imgproxyReaderRead", "error reading from imgproxy source: %w", err)
  53. return -1
  54. }
  55. return C.int64_t(n)
  56. }
  57. // newVipsSource creates a new VipsAsyncSource from an io.ReadSeeker.
  58. func newVipsImgproxySource(r io.ReadSeeker) *C.VipsImgproxySource {
  59. handler := cgo.NewHandle(r)
  60. return C.vips_new_imgproxy_source(C.uintptr_t(handler))
  61. }