/* static */ already_AddRefed<Decoder> DecoderFactory::CreateDecoder(DecoderType aType, RasterImage* aImage, SourceBuffer* aSourceBuffer, const Maybe<IntSize>& aTargetSize, uint32_t aFlags, bool aIsRedecode, bool aImageIsTransient, bool aImageIsLocked) { if (aType == DecoderType::UNKNOWN) { return nullptr; } nsRefPtr<Decoder> decoder = GetDecoder(aType, aImage, aIsRedecode); MOZ_ASSERT(decoder, "Should have a decoder now"); // Initialize the decoder. decoder->SetMetadataDecode(false); decoder->SetIterator(aSourceBuffer->Iterator()); decoder->SetFlags(aFlags); decoder->SetSendPartialInvalidations(!aIsRedecode); decoder->SetImageIsTransient(aImageIsTransient); if (aImageIsLocked) { decoder->SetImageIsLocked(); } // Set a target size for downscale-during-decode if applicable. if (aTargetSize) { DebugOnly<nsresult> rv = decoder->SetTargetSize(*aTargetSize); MOZ_ASSERT(nsresult(rv) != NS_ERROR_NOT_AVAILABLE, "We're downscale-during-decode but decoder doesn't support it?"); MOZ_ASSERT(NS_SUCCEEDED(rv), "Bad downscale-during-decode target size?"); } decoder->Init(); if (NS_FAILED(decoder->GetDecoderError())) { return nullptr; } return decoder.forget(); }
/* static */ already_AddRefed<Decoder> DecoderFactory::CreateDecoder(DecoderType aType, RasterImage* aImage, SourceBuffer* aSourceBuffer, const Maybe<IntSize>& aTargetSize, DecoderFlags aDecoderFlags, SurfaceFlags aSurfaceFlags, int aSampleSize, const IntSize& aResolution) { if (aType == DecoderType::UNKNOWN) { return nullptr; } nsRefPtr<Decoder> decoder = GetDecoder(aType, aImage, bool(aDecoderFlags & DecoderFlags::IS_REDECODE)); MOZ_ASSERT(decoder, "Should have a decoder now"); // Initialize the decoder. decoder->SetMetadataDecode(false); decoder->SetIterator(aSourceBuffer->Iterator()); decoder->SetDecoderFlags(aDecoderFlags | DecoderFlags::FIRST_FRAME_ONLY); decoder->SetSurfaceFlags(aSurfaceFlags); decoder->SetSampleSize(aSampleSize); decoder->SetResolution(aResolution); // Set a target size for downscale-during-decode if applicable. if (aTargetSize) { DebugOnly<nsresult> rv = decoder->SetTargetSize(*aTargetSize); MOZ_ASSERT(nsresult(rv) != NS_ERROR_NOT_AVAILABLE, "We're downscale-during-decode but decoder doesn't support it?"); MOZ_ASSERT(NS_SUCCEEDED(rv), "Bad downscale-during-decode target size?"); } decoder->Init(); if (NS_FAILED(decoder->GetDecoderError())) { return nullptr; } return decoder.forget(); }