in cpp/spectrum/plugins/jpeg/LibJpegSourceManager.cpp [84:120]
void LibJpegSourceManager::imageSourceSkipInputData(
j_decompress_ptr dinfo,
long pBytesToSkip) {
auto src = reinterpret_cast<LibJpegSourceManager*>(dinfo->src);
SPECTRUM_ENFORCE_IF_NOT(pBytesToSkip > 0);
std::size_t bytesToSkip = static_cast<std::size_t>(pBytesToSkip);
if (bytesToSkip > 0) {
if (src->libJpegSourceManager.bytes_in_buffer > bytesToSkip) {
// skip by advancing the buffer
src->libJpegSourceManager.next_input_byte += bytesToSkip;
src->libJpegSourceManager.bytes_in_buffer -= bytesToSkip;
} else {
// skip by advancing the buffer
bytesToSkip = bytesToSkip - src->libJpegSourceManager.bytes_in_buffer;
// and skipping the source
while (bytesToSkip > 0) {
const std::size_t bytesToRead =
std::min(bytesToSkip, src->buffer.size());
static_assert(
sizeof(JOCTET) == sizeof(char),
"JOCTET and char have different size");
std::size_t bytesSkipped = src->source.read(
reinterpret_cast<char*>(src->buffer.data()), bytesToRead);
bytesToSkip -= bytesSkipped;
SPECTRUM_ENFORCE_IF_NOT(bytesSkipped > 0);
}
src->libJpegSourceManager.next_input_byte = nullptr;
src->libJpegSourceManager.bytes_in_buffer = 0;
}
}
}