/** Gets the {@code DrawableParent} for index. */
 public DrawableParent getDrawableParentForIndex(int index) {
   Preconditions.checkArgument(index >= 0);
   Preconditions.checkArgument(index < mDrawableParents.length);
   if (mDrawableParents[index] == null) {
     mDrawableParents[index] = createDrawableParentForIndex(index);
   }
   return mDrawableParents[index];
 }
 public PostprocessorProducer(
     Producer<CloseableReference<CloseableImage>> inputProducer,
     PlatformBitmapFactory platformBitmapFactory,
     Executor executor) {
   mInputProducer = Preconditions.checkNotNull(inputProducer);
   mBitmapFactory = platformBitmapFactory;
   mExecutor = Preconditions.checkNotNull(executor);
 }
 public ThrottlingProducer(
     int maxSimultaneousRequests, Executor executor, final Producer<T> inputProducer) {
   mMaxSimultaneousRequests = maxSimultaneousRequests;
   mExecutor = Preconditions.checkNotNull(executor);
   mInputProducer = Preconditions.checkNotNull(inputProducer);
   mPendingRequests = new ConcurrentLinkedQueue<Pair<Consumer<T>, ProducerContext>>();
   mNumCurrentRequests = 0;
 }
 public NetworkImagesProgressiveDecoder(
     final Consumer<CloseableReference<CloseableImage>> consumer,
     final ProducerContext producerContext,
     final ProgressiveJpegParser progressiveJpegParser,
     final ProgressiveJpegConfig progressiveJpegConfig) {
   super(consumer, producerContext);
   mProgressiveJpegParser = Preconditions.checkNotNull(progressiveJpegParser);
   mProgressiveJpegConfig = Preconditions.checkNotNull(progressiveJpegConfig);
   mLastScheduledScanNumber = 0;
 }
 /** Validates the parameters before building a controller. */
 protected void validate() {
   Preconditions.checkState(
       (mMultiImageRequests == null) || (mImageRequest == null),
       "Cannot specify both ImageRequest and FirstAvailableImageRequests!");
   Preconditions.checkState(
       (mDataSourceSupplier == null)
           || (mMultiImageRequests == null
               && mImageRequest == null
               && mLowResImageRequest == null),
       "Cannot specify DataSourceSupplier with other ImageRequests! Use one or the other.");
 }
 public DecodeProducer(
     final ByteArrayPool byteArrayPool,
     final Executor executor,
     final ImageDecoder imageDecoder,
     final ProgressiveJpegConfig progressiveJpegConfig,
     final Producer<CloseableReference<PooledByteBuffer>> nextProducer) {
   mByteArrayPool = Preconditions.checkNotNull(byteArrayPool);
   mExecutor = Preconditions.checkNotNull(executor);
   mImageDecoder = Preconditions.checkNotNull(imageDecoder);
   mProgressiveJpegConfig = Preconditions.checkNotNull(progressiveJpegConfig);
   mNextProducer = Preconditions.checkNotNull(nextProducer);
 }
 /**
  * Creates a new inputstream instance over the specific memory chunk.
  *
  * @param nativeMemoryChunk the native memory chunk
  * @param startOffset start offset within the memory chunk
  * @param length length of subchunk
  */
 public NativeMemoryChunkInputStream(
     NativeMemoryChunk nativeMemoryChunk, int startOffset, int length) {
   super();
   Preconditions.checkState(startOffset >= 0);
   Preconditions.checkState(length >= 0);
   mMemoryChunk = Preconditions.checkNotNull(nativeMemoryChunk);
   mStartOffset = startOffset;
   mEndOffset =
       startOffset + length > nativeMemoryChunk.getSize()
           ? nativeMemoryChunk.getSize()
           : startOffset + length;
   mOffset = startOffset;
   mMark = startOffset;
 }
Beispiel #8
0
 /** Wraps the parent's child with a ScaleTypeDrawable. */
 static ScaleTypeDrawable wrapChildWithScaleType(DrawableParent parent, ScaleType scaleType) {
   Drawable child = parent.setDrawable(sEmptyDrawable);
   child = maybeWrapWithScaleType(child, scaleType);
   parent.setDrawable(child);
   Preconditions.checkNotNull(child, "Parent has no child drawable!");
   return (ScaleTypeDrawable) child;
 }
  private CloseableReference<Bitmap> decodeStaticImageFromStream(
      InputStream inputStream, BitmapFactory.Options options) {
    Preconditions.checkNotNull(inputStream);
    int sizeInBytes =
        BitmapUtil.getSizeInByteForBitmap(
            options.outWidth, options.outHeight, options.inPreferredConfig);
    final Bitmap bitmapToReuse = mBitmapPool.get(sizeInBytes);
    if (bitmapToReuse == null) {
      throw new NullPointerException("BitmapPool.get returned null");
    }
    options.inBitmap = bitmapToReuse;

    Bitmap decodedBitmap;
    ByteBuffer byteBuffer = mDecodeBuffers.acquire();
    if (byteBuffer == null) {
      byteBuffer = ByteBuffer.allocate(DECODE_BUFFER_SIZE);
    }
    try {
      options.inTempStorage = byteBuffer.array();
      decodedBitmap = BitmapFactory.decodeStream(inputStream, null, options);
    } catch (RuntimeException re) {
      mBitmapPool.release(bitmapToReuse);
      throw re;
    } finally {
      mDecodeBuffers.release(byteBuffer);
    }

    if (bitmapToReuse != decodedBitmap) {
      mBitmapPool.release(bitmapToReuse);
      decodedBitmap.recycle();
      throw new IllegalStateException();
    }

    return CloseableReference.of(decodedBitmap, mBitmapPool);
  }
 private void doPostprocessing(
     CloseableReference<CloseableImage> sourceImageRef, boolean isLast) {
   Preconditions.checkArgument(CloseableReference.isValid(sourceImageRef));
   if (!shouldPostprocess(sourceImageRef.get())) {
     maybeNotifyOnNewResult(sourceImageRef, isLast);
     return;
   }
   mListener.onProducerStart(mRequestId, NAME);
   CloseableReference<CloseableImage> destImageRef = null;
   try {
     try {
       destImageRef = postprocessInternal(sourceImageRef.get());
     } catch (Exception e) {
       mListener.onProducerFinishWithFailure(
           mRequestId, NAME, e, getExtraMap(mListener, mRequestId, mPostprocessor));
       maybeNotifyOnFailure(e);
       return;
     }
     mListener.onProducerFinishWithSuccess(
         mRequestId, NAME, getExtraMap(mListener, mRequestId, mPostprocessor));
     maybeNotifyOnNewResult(destImageRef, isLast);
   } finally {
     CloseableReference.closeSafely(destImageRef);
   }
 }
  /**
   * Creates a bitmap from encoded JPEG bytes. Supports a partial JPEG image.
   *
   * @param encodedImage the encoded image with reference to the encoded bytes
   * @param bitmapConfig the {@link android.graphics.Bitmap.Config} used to create the decoded
   *     Bitmap
   * @param length the number of encoded bytes in the buffer
   * @return the bitmap
   * @exception java.lang.OutOfMemoryError if the Bitmap cannot be allocated
   */
  @Override
  public CloseableReference<Bitmap> decodeJPEGFromEncodedImage(
      EncodedImage encodedImage, Bitmap.Config bitmapConfig, int length) {
    boolean isJpegComplete = encodedImage.isCompleteAt(length);
    final BitmapFactory.Options options = getDecodeOptionsForStream(encodedImage, bitmapConfig);

    InputStream jpegDataStream = encodedImage.getInputStream();
    // At this point the InputStream from the encoded image should not be null since in the
    // pipeline,this comes from a call stack where this was checked before. Also this method needs
    // the InputStream to decode the image so this can't be null.
    Preconditions.checkNotNull(jpegDataStream);
    if (encodedImage.getSize() > length) {
      jpegDataStream = new LimitedInputStream(jpegDataStream, length);
    }
    if (!isJpegComplete) {
      jpegDataStream = new TailAppendingInputStream(jpegDataStream, EOI_TAIL);
    }
    boolean retryOnFail = options.inPreferredConfig != Bitmap.Config.ARGB_8888;
    try {
      return decodeStaticImageFromStream(jpegDataStream, options);
    } catch (RuntimeException re) {
      if (retryOnFail) {
        return decodeFromEncodedImage(encodedImage, Bitmap.Config.ARGB_8888);
      }
      throw re;
    }
  }
 public DecodeProducer(
     final ByteArrayPool byteArrayPool,
     final Executor executor,
     final ImageDecoder imageDecoder,
     final ProgressiveJpegConfig progressiveJpegConfig,
     final boolean downsampleEnabled,
     final boolean downsampleEnabledForNetwork,
     final Producer<EncodedImage> inputProducer) {
   mByteArrayPool = Preconditions.checkNotNull(byteArrayPool);
   mExecutor = Preconditions.checkNotNull(executor);
   mImageDecoder = Preconditions.checkNotNull(imageDecoder);
   mProgressiveJpegConfig = Preconditions.checkNotNull(progressiveJpegConfig);
   mDownsampleEnabled = downsampleEnabled;
   mDownsampleEnabledForNetwork = downsampleEnabledForNetwork;
   mInputProducer = Preconditions.checkNotNull(inputProducer);
 }
 /**
  * Constructs a new layer drawable.
  *
  * @param layers the layers that this drawable displays
  */
 public ArrayDrawable(Drawable[] layers) {
   Preconditions.checkNotNull(layers);
   mLayers = layers;
   for (int i = 0; i < mLayers.length; i++) {
     DrawableUtils.setCallbacks(mLayers[i], this, this);
   }
   mDrawableParents = new DrawableParent[mLayers.length];
 }
Beispiel #14
0
  /**
   * Creates a {@link WebPImage} from the specified encoded data. This will throw if it fails to
   * create. This is meant to be called on a worker thread.
   *
   * @param source the data to the image (a copy will be made)
   */
  public static WebPImage create(byte[] source) {
    ensure();
    Preconditions.checkNotNull(source);

    ByteBuffer byteBuffer = ByteBuffer.allocateDirect(source.length);
    byteBuffer.put(source);
    byteBuffer.rewind();

    return nativeCreateFromDirectByteBuffer(byteBuffer);
  }
  /** Sets a new drawable at the specified index, and return the previous drawable, if any. */
  @Nullable
  public Drawable setDrawable(int index, @Nullable Drawable drawable) {
    Preconditions.checkArgument(index >= 0);
    Preconditions.checkArgument(index < mLayers.length);
    final Drawable oldDrawable = mLayers[index];
    if (drawable != oldDrawable) {
      if (drawable != null && mIsMutated) {
        drawable.mutate();
      }

      DrawableUtils.setCallbacks(mLayers[index], null, null);
      DrawableUtils.setCallbacks(drawable, null, null);
      DrawableUtils.setDrawableProperties(drawable, mDrawableProperties);
      DrawableUtils.copyProperties(drawable, this);
      DrawableUtils.setCallbacks(drawable, this, this);
      mIsStatefulCalculated = false;
      mLayers[index] = drawable;
      invalidateSelf();
    }
    return oldDrawable;
  }
 public SerialDelegatingExecutor(Executor delegate) {
   mDelegate = Preconditions.checkNotNull(delegate);
   mExecutionInProgress = false;
   mCommands = new LinkedList<Runnable>();
   mRunnable =
       new Runnable() {
         @Override
         public void run() {
           executeSingleCommand();
         }
       };
 }
 public BitmapMemoryCacheKey(
     String sourceString,
     @Nullable ResizeOptions resizeOptions,
     boolean autoRotated,
     ImageDecodeOptions imageDecodeOptions) {
   mSourceString = Preconditions.checkNotNull(sourceString);
   mResizeOptions = resizeOptions;
   mAutoRotated = autoRotated;
   mImageDecodeOptions = imageDecodeOptions;
   mHash =
       HashCodeUtil.hashCode(
           sourceString.hashCode(),
           (resizeOptions != null) ? resizeOptions.hashCode() : 0,
           autoRotated ? Boolean.TRUE.hashCode() : Boolean.FALSE.hashCode(),
           mImageDecodeOptions);
 }
Beispiel #18
0
 /**
  * Submits a request for execution and returns a DataSource representing the pending encoded
  * image(s).
  *
  * <p>The ResizeOptions in the imageRequest will be ignored for this fetch
  *
  * <p>The returned DataSource must be closed once the client has finished with it.
  *
  * @param imageRequest the request to submit
  * @return a DataSource representing the pending encoded image(s)
  */
 public DataSource<CloseableReference<PooledByteBuffer>> fetchEncodedImage(
     ImageRequest imageRequest, Object callerContext) {
   Preconditions.checkNotNull(imageRequest.getSourceUri());
   try {
     Producer<CloseableReference<PooledByteBuffer>> producerSequence =
         mProducerSequenceFactory.getEncodedImageProducerSequence(imageRequest);
     // The resize options are used to determine whether images are going to be downsampled during
     // decode or not. For the case where the image has to be downsampled and it's a local image it
     // will be kept as a FileInputStream until decoding instead of reading it in memory. Since
     // this method returns an encoded image, it should always be read into memory. Therefore, the
     // resize options are ignored to avoid treating the image as if it was to be downsampled
     // during decode.
     if (imageRequest.getResizeOptions() != null) {
       imageRequest = ImageRequestBuilder.fromRequest(imageRequest).setResizeOptions(null).build();
     }
     return submitFetchRequest(
         producerSequence, imageRequest, ImageRequest.RequestLevel.FULL_FETCH, callerContext);
   } catch (Exception exception) {
     return DataSources.immediateFailedDataSource(exception);
   }
 }
 /**
  * Gets the drawable at the specified index.
  *
  * @param index index of drawable to get
  * @return drawable at the specified index
  */
 @Nullable
 public Drawable getDrawable(int index) {
   Preconditions.checkArgument(index >= 0);
   Preconditions.checkArgument(index < mLayers.length);
   return mLayers[index];
 }
 public SimpleCacheKey(String s) {
   mKey = (String) Preconditions.checkNotNull(s);
 }
Beispiel #21
0
 public static WebPImage create(long nativePtr, int sizeInBytes) {
   ensure();
   Preconditions.checkArgument(nativePtr != 0);
   return nativeCreateFromNativeMemory(nativePtr, sizeInBytes);
 }
 public ImageUrlsRequestBuilder(final String endpointUrl) {
   mEndpointUrl = Preconditions.checkNotNull(endpointUrl);
   mRequestedImageFormats = new HashMap<>();
 }