private IDataSource <CloseableReference <T> > SubmitFetchRequest <T>( IProducer <CloseableReference <T> > producerSequence, ImageRequest imageRequest, RequestLevel lowestPermittedRequestLevelOnSubmit, object callerContext) { IRequestListener requestListener = GetRequestListenerForRequest(imageRequest); try { RequestLevel lowestPermittedRequestLevel = RequestLevel.GetMax( imageRequest.LowestPermittedRequestLevel, lowestPermittedRequestLevelOnSubmit); SettableProducerContext settableProducerContext = new SettableProducerContext( imageRequest, GenerateUniqueFutureId(), requestListener, callerContext, lowestPermittedRequestLevel.Value, /* isPrefetch */ false, imageRequest.IsProgressiveRenderingEnabled || !UriUtil.IsNetworkUri(imageRequest.SourceUri), imageRequest.Priority); return(CloseableProducerToDataSourceAdapter <T> .Create( producerSequence, settableProducerContext, requestListener)); } catch (Exception exception) { return(DataSources.ImmediateFailedDataSource <CloseableReference <T> >(exception)); } }
private static void ValidateEncodedImageRequest(ImageRequest imageRequest) { Preconditions.CheckNotNull(imageRequest); Preconditions.CheckArgument(UriUtil.IsNetworkUri(imageRequest.SourceUri)); Preconditions.CheckArgument( imageRequest.LowestPermittedRequestLevel.Value <= RequestLevel.ENCODED_MEMORY_CACHE); }
private IProducer <CloseableReference <IPooledByteBuffer> > GetBasicEncodedImageSequence( ImageRequest imageRequest) { Preconditions.CheckNotNull(imageRequest); Uri uri = imageRequest.SourceUri; Preconditions.CheckNotNull(uri, "Uri is null."); if (UriUtil.IsNetworkUri(uri)) { lock (_gate) { if (_encodedImageProducerSequence == null) { _encodedImageProducerSequence = new RemoveImageTransformMetaDataProducer( GetBackgroundNetworkFetchToEncodedMemorySequence()); } } return(_encodedImageProducerSequence); } else if (UriUtil.IsAppDataUri(uri)) { return(GetEncodedLocalImageFileFetchSequence()); } else if (UriUtil.IsAppPackageUri(uri)) { return(GetEncodedLocalAssetFetchSequence()); } else if (UriUtil.IsAppResourceUri(uri)) { return(GetEncodedLocalResourceFetchSequence()); } else if (UriUtil.IsDataUri(uri)) { return(GetEncodedDataFetchSequence()); } else if (UriUtil.IsFileUri(uri)) { return(GetEncodedLocalImageFileFetchSequence()); } else if (UriUtil.IsFutureAccessListUri(uri)) { return(GetEncodedFutureAccessListFetchSequence()); } else { string uriString = uri.ToString(); if (uriString.Length > 30) { uriString = uriString.Substring(0, 30) + "..."; } throw new Exception("Unsupported uri scheme! Uri is: " + uriString); } }
private IProducer <CloseableReference <CloseableImage> > GetBasicDecodedImageSequence( ImageRequest imageRequest) { Preconditions.CheckNotNull(imageRequest); Uri uri = imageRequest.SourceUri; Preconditions.CheckNotNull(uri, "Uri is null."); if (UriUtil.IsNetworkUri(uri)) { return(GetNetworkFetchSequence()); } else if (UriUtil.IsAppDataUri(uri)) { if (MediaUtils.IsVideo(MediaUtils.ExtractMime(uri.ToString()))) { return(GetLocalVideoFileFetchSequence()); } else { return(GetLocalImageFileFetchSequence()); } } else if (UriUtil.IsAppPackageUri(uri)) { return(GetLocalAssetFetchSequence()); } else if (UriUtil.IsAppResourceUri(uri)) { return(GetLocalResourceFetchSequence()); } else if (UriUtil.IsDataUri(uri)) { return(GetDataFetchSequence()); } else if (UriUtil.IsFileUri(uri)) { return(GetLocalImageFileFetchSequence()); } else if (UriUtil.IsFutureAccessListUri(uri)) { return(GetFutureAccessListFetchSequence()); } else { string uriString = uri.ToString(); if (uriString.Length > 30) { uriString = uriString.Substring(0, 30) + "..."; } throw new Exception("Unsupported uri scheme! Uri is: " + uriString); } }
/// <summary> /// Instantiates the <see cref="ProgressiveDecoder"/>. /// </summary> public ProgressiveDecoder( DecodeProducer parent, IConsumer <CloseableReference <CloseableImage> > consumer, IProducerContext producerContext) : base(consumer) { _parent = parent; _producerContext = producerContext; _producerListener = producerContext.Listener; _imageDecodeOptions = producerContext.ImageRequest.ImageDecodeOptions; _isFinished = false; Func <EncodedImage, bool, Task> job = (encodedImage, isLast) => { if (encodedImage != null) { if (_parent._downsampleEnabled) { ImageRequest request = producerContext.ImageRequest; if (_parent._downsampleEnabledForNetwork || !UriUtil.IsNetworkUri(request.SourceUri)) { encodedImage.SampleSize = DownsampleUtil.DetermineSampleSize( request, encodedImage); } } return(DoDecode(encodedImage, isLast)); } return(Task.CompletedTask); }; _jobScheduler = new JobScheduler( _parent._executor, job, _imageDecodeOptions.MinDecodeIntervalMs); _producerContext.AddCallbacks( new BaseProducerContextCallbacks( () => { }, () => { }, () => { if (_producerContext.IsIntermediateResultExpected) { _jobScheduler.ScheduleJob(); } }, () => { })); }
/// <summary> /// Start producing results for given context. /// Provided consumer is notified whenever progress is made /// (new value is ready or error occurs). /// </summary> public void ProduceResults( IConsumer <CloseableReference <CloseableImage> > consumer, IProducerContext producerContext) { ImageRequest imageRequest = producerContext.ImageRequest; ProgressiveDecoder progressiveDecoder; if (!UriUtil.IsNetworkUri(imageRequest.SourceUri)) { progressiveDecoder = new LocalImagesProgressiveDecoder(this, consumer, producerContext); } else { ProgressiveJpegParser jpegParser = new ProgressiveJpegParser(_byteArrayPool); progressiveDecoder = new NetworkImagesProgressiveDecoder( this, consumer, producerContext, jpegParser, _progressiveJpegConfig); } _inputProducer.ProduceResults(progressiveDecoder, producerContext); }