]> git.imager.perl.org - imager.git/blobdiff - iolayer.h
Removed half finished speedhack for 3ch8bit images so I can release a new version.
[imager.git] / iolayer.h
index 358de0d02d1862a267fcd2fbd8f014cbc0b75839..ac49727d40639bed77bc02865e7359427574d4ec 100644 (file)
--- a/iolayer.h
+++ b/iolayer.h
@@ -19,7 +19,7 @@
 #include <sys/types.h>
 
 /* #define BBSIZ 1096 */
-#define BBSIZ 1096
+#define BBSIZ 16384
 #define IO_FAKE_SEEK 1<<0L
 #define IO_TEMP_SEEK 1<<1L
 
@@ -32,34 +32,37 @@ typedef enum { FDSEEK, FDNOSEEK, BUFFER, CBSEEK, CBNOSEEK, BUFCHAIN } io_type;
 typedef int ssize_t;
 #endif
 
-struct _io_glue;
+struct io_glue;
 
 /* Callbacks we give out */
 
-typedef ssize_t(*readp) (struct _io_glue *ig, void *buf, size_t count);
-typedef ssize_t(*writep)(struct _io_glue *ig, const void *buf, size_t count);
-typedef off_t  (*seekp) (struct _io_glue *ig, off_t offset, int whence);
-typedef void   (*closep)(struct _io_glue *ig);
-typedef ssize_t(*sizep) (struct _io_glue *ig);
+typedef ssize_t(*readp) (struct io_glue *ig, void *buf, size_t count);
+typedef ssize_t(*writep)(struct io_glue *ig, const void *buf, size_t count);
+typedef off_t  (*seekp) (struct io_glue *ig, off_t offset, int whence);
+typedef void   (*closep)(struct io_glue *ig);
+typedef ssize_t(*sizep) (struct io_glue *ig);
 
+typedef void   (*closebufp)(void *p);
 
 
 /* Callbacks we get */
 
-typedef ssize_t(*readl) (int fd, void *buf, size_t count);
-typedef ssize_t(*writel)(int fd, const void *buf, size_t count);
-typedef off_t  (*seekl) (int fd, off_t offset, int whence);
-typedef ssize_t(*sizel) (int fd);
+typedef ssize_t(*readl) (void *p, void *buf, size_t count);
+typedef ssize_t(*writel)(void *p, const void *buf, size_t count);
+typedef off_t  (*seekl) (void *p, off_t offset, int whence);
+typedef void   (*closel)(void *p);
+typedef void   (*destroyl)(void *p);
+typedef ssize_t(*sizel) (void *p);
 
 extern char *io_type_names[];
 
 
-typedef struct _io_blink {
+typedef struct io_blink {
   char buf[BBSIZ];
   /* size_t cnt; */
   size_t len;                  /* How large is this buffer = BBZIS for now */
-  struct _io_blink *next;
-  struct _io_blink *prev;
+  struct io_blink *next;
+  struct io_blink *prev;
 } io_blink;
 
 
@@ -91,6 +94,12 @@ typedef struct {
   off_t gpos;                  /* Global position in stream */
 } io_ex_bchain;
 
+typedef struct {
+  off_t offset;                        /* Offset of the source - not used */
+  off_t cpos;                  /* Offset within the current */
+} io_ex_buffer;
+
+
 
 /* Structures to describe data sources */
 
@@ -102,8 +111,10 @@ typedef struct {
 typedef struct {
   io_type      type;           /* Must be first parameter */
   char         *name;          /* Data source name */
-  char         *c;
+  char         *data;
   size_t       len;
+  closebufp     closecb;        /* free memory mapped segment or decrement refcount */
+  void          *closedata;
 } io_buffer;
 
 typedef struct {
@@ -113,6 +124,8 @@ typedef struct {
   readl                readcb;
   writel       writecb;
   seekl                seekcb;
+  closel        closecb;
+  destroyl      destroycb;
 } io_cb;
 
 typedef union {
@@ -122,7 +135,7 @@ typedef union {
   io_cb                cb;
 } io_obj;
 
-typedef struct _io_glue {
+typedef struct io_glue {
   io_obj       source;
   int          flags;          /* Flags */
   void         *exdata;        /* Pair specific data */
@@ -133,16 +146,19 @@ typedef struct _io_glue {
   sizep                sizecb;
 } io_glue;
 
-void io_obj_setp_buffer  (io_obj *io, void *p, size_t len);
+void io_obj_setp_buffer(io_obj *io, char *p, size_t len, closebufp closecb, void *closedata);
 void io_obj_setp_cb      (io_obj *io, void *p, readl readcb, writel writecb, seekl seekcb);
+void io_obj_setp_cb2     (io_obj *io, void *p, readl readcb, writel writecb, seekl seekcb, closel closecb, destroyl destroycb);
 void io_glue_commit_types(io_glue *ig);
 void io_glue_gettypes    (io_glue *ig, int reqmeth);
 
 
 /* XS functions */
 io_glue *io_new_fd(int fd);
-io_glue *io_new_bufchain();
+io_glue *io_new_bufchain(void);
+io_glue *io_new_buffer(char *data, size_t len, closebufp closecb, void *closedata);
+io_glue *io_new_cb(void *p, readl readcb, writel writecb, seekl seekcb, closel closecb, destroyl destroycb);
 size_t   io_slurp(io_glue *ig, unsigned char **c);
-void io_glue_DESTROY(io_glue *ig);
+void     io_glue_DESTROY(io_glue *ig);
 
 #endif /* _IOLAYER_H_ */