예제 #1
0
        /// <summary>
        /// bitmap cache get ->
        /// background thread hand-off -> bitmap cache -> decode ->
        /// resize and rotate -> (webp transcode) -> data fetch.
        /// </summary>
        private IProducer <CloseableReference <CloseableImage> > GetDataFetchSequence()
        {
            lock (_gate)
            {
                if (_dataFetchSequence == null)
                {
                    IProducer <EncodedImage> inputProducer = _producerFactory.NewDataFetchProducer();
                    inputProducer = ProducerFactory.NewAddImageTransformMetaDataProducer(inputProducer);
                    if (!_downsampleEnabled)
                    {
                        inputProducer = _producerFactory.NewResizeAndRotateProducer(inputProducer);
                    }

                    _dataFetchSequence = NewBitmapCacheGetToDecodeSequence(inputProducer);
                }

                return(_dataFetchSequence);
            }
        }
예제 #2
0
        /// <summary>
        /// Branch on separate images
        ///   -> thumbnail resize and rotate -> thumbnail producers as provided
        ///   -> local image resize and rotate -> add meta data producer
        /// </summary>
        /// <param name="inputProducer">
        /// Producer providing the input to add meta data producer.
        /// </param>
        /// <param name="thumbnailProducers">
        /// The thumbnail producers from which to request the image before
        /// falling back to the full image producer sequence.
        /// </param>
        /// <returns>Local transformations sequence.</returns>
        private IProducer <EncodedImage> NewLocalTransformationsSequence(
            IProducer <EncodedImage> inputProducer,
            IThumbnailProducer <EncodedImage>[] thumbnailProducers)
        {
            IProducer <EncodedImage> localImageProducer =
                ProducerFactory.NewAddImageTransformMetaDataProducer(inputProducer);

            if (!_downsampleEnabled)
            {
                localImageProducer = _producerFactory.NewResizeAndRotateProducer(localImageProducer);
            }

            ThrottlingProducer <EncodedImage> localImageThrottlingProducer =
                _producerFactory.NewThrottlingProducer(
                    _throttlingMaxSimultaneousRequests,
                    localImageProducer);

            return(ProducerFactory.NewBranchOnSeparateImagesProducer(
                       NewLocalThumbnailProducer(thumbnailProducers),
                       localImageThrottlingProducer));
        }
예제 #3
0
        /// <summary>
        /// multiplex -> encoded cache -> disk cache -> (webp transcode) ->
        /// network fetch.
        /// </summary>
        private IProducer <EncodedImage> GetCommonNetworkFetchToEncodedMemorySequence()
        {
            lock (_gate)
            {
                if (_commonNetworkFetchToEncodedMemorySequence == null)
                {
                    IProducer <EncodedImage> inputProducer =
                        NewEncodedCacheMultiplexToTranscodeSequence(
                            _producerFactory.NewNetworkFetchProducer(_networkFetcher));

                    _commonNetworkFetchToEncodedMemorySequence =
                        ProducerFactory.NewAddImageTransformMetaDataProducer(inputProducer);

                    if (_resizeAndRotateEnabledForNetwork && !_downsampleEnabled)
                    {
                        _commonNetworkFetchToEncodedMemorySequence =
                            _producerFactory.NewResizeAndRotateProducer(
                                _commonNetworkFetchToEncodedMemorySequence);
                    }
                }

                return(_commonNetworkFetchToEncodedMemorySequence);
            }
        }