void LibJpegSourceManager::imageSourceSkipInputData()

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;
    }
  }
}