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