123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package vips
- /*
- #cgo pkg-config: vips
- #cgo CFLAGS: -O3
- #cgo LDFLAGS: -lm
- #include "source.h"
- #include "vips.h"
- */
- import "C"
- import (
- "fmt"
- "io"
- "runtime/cgo"
- "unsafe"
- )
- //export closeImgproxyReader
- func closeImgproxyReader(handle C.uintptr_t) {
- h := cgo.Handle(handle)
- h.Delete()
- }
- // calls seek() on the async reader via it's handle from the C side
- //
- //export imgproxyReaderSeek
- func imgproxyReaderSeek(handle C.uintptr_t, offset C.int64_t, whence int) C.int64_t {
- h := cgo.Handle(handle)
- reader, ok := h.Value().(io.ReadSeeker)
- if !ok {
- C.vips_error_go(cachedCString("imgproxyReaderSeek"), cachedCString("failed to cast handle to io.ReadSeeker"))
- return -1
- }
- pos, err := reader.Seek(int64(offset), whence)
- if err != nil {
- C.vips_error_go(cachedCString("imgproxyReaderSeek"), cachedCString("failed to seek"))
- return -1
- }
- return C.int64_t(pos)
- }
- // calls read() on the async reader via it's handle from the C side
- //
- //export imgproxyReaderRead
- func imgproxyReaderRead(handle C.uintptr_t, pointer unsafe.Pointer, size C.int64_t) C.int64_t {
- h := cgo.Handle(handle)
- reader, ok := h.Value().(io.ReadSeeker)
- if !ok {
- C.vips_error_go(cachedCString("imgproxyReaderRead"), cachedCString("invalid reader handle"))
- return -1
- }
- buf := unsafe.Slice((*byte)(pointer), size)
- n, err := reader.Read(buf)
- if err == io.EOF {
- return 0
- } else if err != nil {
- msg := fmt.Sprintf("error reading from imgproxy source: %v", err)
- C.vips_error_go(cachedCString("imgproxyReaderRead"), cachedCString(msg))
- return -1
- }
- return C.int64_t(n)
- }
- // newVipsSource creates a new VipsAsyncSource from an io.ReadSeeker.
- func newVipsImgproxySource(r io.ReadSeeker) *C.VipsImgproxySource {
- handler := cgo.NewHandle(r)
- return C.vips_new_imgproxy_source(C.uintptr_t(handler))
- }
|