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 в качестве первого аргумента, буфер в качестве второго и число байтов для записи в качестве третьего. Возвращаемое значение - количество записанных байтов.

Другие вопросы по тегам