void JniBitmapImageSink::_write()

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