RasterImage::GetImageContainer(LayerManager* aManager, uint32_t aFlags) { MOZ_ASSERT(NS_IsMainThread()); MOZ_ASSERT(aManager); MOZ_ASSERT((aFlags & ~(FLAG_SYNC_DECODE | FLAG_SYNC_DECODE_IF_FAST | FLAG_ASYNC_NOTIFY)) == FLAG_NONE, "Unsupported flag passed to GetImageContainer"); int32_t maxTextureSize = aManager->GetMaxTextureSize(); if (!mHasSize || mSize.width > maxTextureSize || mSize.height > maxTextureSize) { return nullptr; } if (IsUnlocked() && mProgressTracker) { mProgressTracker->OnUnlockedDraw(); } RefPtr<layers::ImageContainer> container = mImageContainer.get(); bool mustRedecode = (aFlags & (FLAG_SYNC_DECODE | FLAG_SYNC_DECODE_IF_FAST)) && mLastImageContainerDrawResult != DrawResult::SUCCESS && mLastImageContainerDrawResult != DrawResult::BAD_IMAGE; if (container && !mustRedecode) { return container.forget(); } // We need a new ImageContainer, so create one. container = LayerManager::CreateImageContainer(); DrawResult drawResult; RefPtr<layers::Image> image; Tie(drawResult, image) = GetCurrentImage(container, aFlags); if (!image) { return nullptr; } // |image| holds a reference to a SourceSurface which in turn holds a lock on // the current frame's VolatileBuffer, ensuring that it doesn't get freed as // long as the layer system keeps this ImageContainer alive. AutoTArray<ImageContainer::NonOwningImage, 1> imageList; imageList.AppendElement(ImageContainer::NonOwningImage(image, TimeStamp(), mLastFrameID++, mImageProducerID)); container->SetCurrentImagesInTransaction(imageList); mLastImageContainerDrawResult = drawResult; mImageContainer = container; return container.forget(); }
jbyteArray JNICALL Java_ardrone_ARDrone_getCurrentImage(JNIEnv *env, jclass cls) { //TODO Does not work ... try to find a way to convert byte* to jbyteArray _int8* imageBytes = GetCurrentImage(); jbyteArray resultingArray = env->NewByteArray(sizeof(imageBytes)); jbyte *bytes = env->GetByteArrayElements(resultingArray, 0); for ( int i = 0; i < sizeof(imageBytes); i++ ) { bytes[i] = imageBytes[i]; } env->SetByteArrayRegion(resultingArray, 0, sizeof(imageBytes), bytes); return resultingArray; }
void RasterImage::UpdateImageContainer() { MOZ_ASSERT(NS_IsMainThread()); RefPtr<layers::ImageContainer> container = mImageContainer.get(); if (!container) { return; } DrawResult drawResult; RefPtr<layers::Image> image; Tie(drawResult, image) = GetCurrentImage(container, FLAG_NONE); if (!image) { return; } mLastImageContainerDrawResult = drawResult; AutoTArray<ImageContainer::NonOwningImage, 1> imageList; imageList.AppendElement(ImageContainer::NonOwningImage(image, TimeStamp(), mLastFrameID++, mImageProducerID)); container->SetCurrentImages(imageList); }