in android/src/main/cpp/spectrumjni/io/JniBitmapImageSink.cpp [57:94]
void JniBitmapImageSink::_write(const char* source, const std::size_t length) {
SPECTRUM_ERROR_CSTR_IF(!source, io::error::ImageSinkFailure, "null_source");
SPECTRUM_ERROR_CSTR_IF(
!hasSetConfiguration,
io::error::ImageSinkFailure,
"no_set_configuration");
SPECTRUM_ERROR_CSTR_IF(
currentScanline >= imageSize.height,
io::error::ImageSinkFailure,
"currentScanline_above_imageSize.height");
SPECTRUM_ERROR_CSTR_IF(
length !=
imageSize.width * image::pixel::specifications::RGBA.bytesPerPixel,
io::error::ImageSinkFailure,
"length_imageSize.width_mismatch");
facebook::jni::local_ref<jni::JBitmap> bitmap =
jOutputBitmapTarget->getBitmap();
jni::BitmapPixelsLock bmpLock(
facebook::jni::Environment::current(), bitmap.get());
uint8_t* pixelPtr = bmpLock.getPixelsPtr();
SPECTRUM_ERROR_CSTR_IF(
pixelPtr == nullptr,
io::error::ImageSinkFailure,
"failed_to_lock_bitmap");
//
// copy data
//
const std::size_t offset = currentScanline * imageSize.width *
image::pixel::specifications::RGBA.bytesPerPixel;
memcpy(pixelPtr + offset, source, length);
++currentScanline;
bmpLock.releaseLock();
}