giflib I/O 回调

oto*_*ori 2 c callback gif

我目前正在尝试在通用图像解码/编码库中实现 gif 支持。在那里,我们为 fwrite 和 fread 定义了回调函数,以使其更加通用。

对于 gif 实现,我尝试使用 giflib。现在我想知道是否有可能设置自定义 I/O 回调。

DGifOpen ( void *userPointer, InputFunc *func) 
Run Code Online (Sandbox Code Playgroud)

正在将输入处理函数作为参数,但我无法从文档中找出该功能。它只是指源头,它只说:

/* func type to read gif data from arbitrary sources (TVT) */
typedef int (*InputFunc) (GifFileType *, GifByteType *, int);
Run Code Online (Sandbox Code Playgroud)

我的问题是,这个函数是否用于自定义文件读取(以及如果、如何),或者 giflib 是否未设计为与回调一起使用。

oto*_*ori 5

好吧,我浏览了 giflib 的源代码,并意识到回调应该替换 fread。

typedef int (*InputFunc) (GifFileType *, GifByteType *, int);
Run Code Online (Sandbox Code Playgroud)

第一个参数是 gif 句柄,第二个参数是目标缓冲区,第三个参数是应读取的数据长度。返回值相当于 fread,是读取的字节数。注册回调时,可以在 userPointer 中传递附加数据:

DGifOpen ( void *userPointer, InputFunc *func) 
Run Code Online (Sandbox Code Playgroud)

userPointer 可以作为 gif 句柄的成员进行访问 (pGifHandle->userData)

同样,您可以使用写入回调。

注册您的函数和指向自定义数据的指针

EGifOpen ( void *userPointer, OutputFunc *func)
Run Code Online (Sandbox Code Playgroud)

其中 OutputFunc 将 gif 句柄作为第一个参数,将缓冲区作为第二个参数,将要写入的字节数作为第三个参数。返回值是写入的字节数。