std::size_t JniBitmapImageSource::read()

in android/src/main/cpp/spectrumjni/io/JniBitmapImageSource.cpp [70:113]


std::size_t JniBitmapImageSource::read(
    char* const destination,
    const std::size_t length) {
  SPECTRUM_ERROR_CSTR_IF(
      !destination, io::error::ImageSourceFailure, "null_destination");

  //
  // prepare bitmap
  //

  AndroidBitmapInfo bitmapInfo;
  const int rc = AndroidBitmap_getInfo(
      facebook::jni::Environment::current(), _jInputBitmap.get(), &bitmapInfo);
  SPECTRUM_ERROR_FORMAT_IF(
      rc != ANDROID_BITMAP_RESULT_SUCCESS,
      io::error::ImageSourceFailure,
      "AndroidBitmap_getInfo_returned_%d",
      rc);

  jni::BitmapPixelsLock bmpLock(
      facebook::jni::Environment::current(), _jInputBitmap.get());
  uint8_t* pixelPtr = bmpLock.getPixelsPtr();
  SPECTRUM_ERROR_CSTR_IF(
      pixelPtr == nullptr,
      io::error::ImageSourceFailure,
      "failed_to_lock_bitmap");

  //
  // copy data
  //

  const std::size_t bitmapLengthBytes = bitmapInfo.height * bitmapInfo.stride;

  assert(bitmapLengthBytes >= _offsetBytes);
  const std::size_t bitmapRemainingBytes = bitmapLengthBytes - _offsetBytes;

  const auto bytesToCopy = std::min(length, bitmapRemainingBytes);
  memcpy(destination, pixelPtr + _offsetBytes, bytesToCopy);
  _offsetBytes += bytesToCopy;

  bmpLock.releaseLock();

  return bytesToCopy;
}