mirror of
https://github.com/imgproxy/imgproxy.git
synced 2025-10-11 04:32:29 +02:00
87 lines
2.6 KiB
C
87 lines
2.6 KiB
C
#include "source.h"
|
|
|
|
// define glib subtype for vips async source
|
|
#define VIPS_TYPE_IMGPROXY_SOURCE (vips_imgproxy_source_get_type())
|
|
G_DEFINE_FINAL_TYPE(VipsImgproxySource, vips_imgproxy_source, VIPS_TYPE_SOURCE)
|
|
|
|
extern void closeImgproxyReader(uintptr_t handle);
|
|
extern gint64 imgproxyReaderSeek(uintptr_t handle, gint64 offset, int whence);
|
|
extern gint64 imgproxyReaderRead(uintptr_t handle, gpointer buffer, gint64 size);
|
|
|
|
// dereferences source
|
|
void
|
|
unref_imgproxy_source(VipsImgproxySource *source)
|
|
{
|
|
VIPS_UNREF(source);
|
|
}
|
|
|
|
// read function for vips imgproxy source
|
|
static gint64
|
|
vips_imgproxy_source_read(VipsSource *source, void *buffer, size_t length)
|
|
{
|
|
VipsImgproxySource *self = (VipsImgproxySource *) source;
|
|
|
|
gint64 read_length = imgproxyReaderRead(self->readerHandle, buffer, length);
|
|
if (read_length < 0) {
|
|
vips_error("vips_imgproxy_source_read", "failed to read from imgproxy source");
|
|
}
|
|
return read_length;
|
|
}
|
|
|
|
// seek function for vips imgproxy source. whence can be SEEK_SET (0), SEEK_CUR (1), or SEEK_END (2).
|
|
static gint64
|
|
vips_imgproxy_source_seek(VipsSource *source, gint64 offset, int whence)
|
|
{
|
|
VipsImgproxySource *self = (VipsImgproxySource *) source;
|
|
|
|
gint64 actual_offset = imgproxyReaderSeek(self->readerHandle, offset, whence);
|
|
|
|
if (actual_offset < 0) {
|
|
vips_error("vips_imgproxy_source_seek", "failed to seek in imgproxy source");
|
|
}
|
|
|
|
return actual_offset;
|
|
}
|
|
|
|
static void
|
|
vips_imgproxy_source_dispose(GObject *gobject)
|
|
{
|
|
VipsImgproxySource *source = (VipsImgproxySource *) gobject;
|
|
|
|
closeImgproxyReader(source->readerHandle);
|
|
|
|
G_OBJECT_CLASS(vips_imgproxy_source_parent_class)->dispose(gobject);
|
|
}
|
|
|
|
// attaches seek/read handlers to the imgproxy source class
|
|
static void
|
|
vips_imgproxy_source_class_init(VipsImgproxySourceClass *klass)
|
|
{
|
|
GObjectClass *gobject_class = G_OBJECT_CLASS(klass);
|
|
VipsObjectClass *object_class = VIPS_OBJECT_CLASS(klass);
|
|
VipsSourceClass *source_class = VIPS_SOURCE_CLASS(klass);
|
|
|
|
object_class->nickname = "imgproxy_source";
|
|
object_class->description = "imgproxy input source";
|
|
|
|
gobject_class->dispose = vips_imgproxy_source_dispose;
|
|
|
|
source_class->read = vips_imgproxy_source_read;
|
|
source_class->seek = vips_imgproxy_source_seek;
|
|
}
|
|
|
|
// initializes the imgproxy source (nothing to do here yet)
|
|
static void
|
|
vips_imgproxy_source_init(VipsImgproxySource *source)
|
|
{
|
|
}
|
|
|
|
// creates a new imgproxy source with the given reader handle
|
|
VipsImgproxySource *
|
|
vips_new_imgproxy_source(uintptr_t readerHandle)
|
|
{
|
|
VipsImgproxySource *source = g_object_new(VIPS_TYPE_IMGPROXY_SOURCE, NULL);
|
|
source->readerHandle = readerHandle;
|
|
return source;
|
|
}
|