giflib I/O обратный вызов
В настоящее время я пытаюсь реализовать поддержку gif в общей библиотеке дешифрования / кодирования изображений. Там мы определили функции обратного вызова для fwrite и fread, чтобы сделать его более универсальным.
Для реализации gif я попытался использовать giflib. Теперь мне интересно, если есть возможность, установить пользовательские обратные вызовы ввода / вывода.
DGifOpen ( void *userPointer, InputFunc *func)
принимает функцию обработки ввода в качестве аргумента, но я не мог выяснить функциональность из документации. Это просто относится к заголовкам источника, там это только говорит:
/* func type to read gif data from arbitrary sources (TVT) */
typedef int (*InputFunc) (GifFileType *, GifByteType *, int);
Мой вопрос: используется ли эта функция для чтения пользовательских файлов (и если, как), или если giflib не предназначен для работы с обратными вызовами.
1 ответ
Хорошо, я просмотрел исходный код giflib и понял, что обратный вызов должен заменить fread.
typedef int (*InputFunc) (GifFileType *, GifByteType *, int);
Первый аргумент - дескриптор gif, второй - буфер назначения, а третий - длина данных, которые должны быть прочитаны. Возвращаемое значение равно количеству прочитанных байтов. Дополнительные данные могут быть переданы в userPointer при регистрации обратного вызова:
DGifOpen ( void *userPointer, InputFunc *func)
Доступ к userPointer возможен как элемент дескриптора gif (pGifHandle->userData)
Таким же образом вы можете использовать обратный вызов записи.
Зарегистрируйте свою функцию и указатель на пользовательские данные в
EGifOpen ( void *userPointer, OutputFunc *func)
где OutputFunc принимает дескриптор gif в качестве первого аргумента, буфер в качестве второго и число байтов для записи в качестве третьего. Возвращаемое значение - количество записанных байтов.