source.go 1.3 KB

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