private void renderNonScalingFrames(
      Canvas canvas,
      AnimatedImageFrame frame,
      AnimatedDrawableFrameInfo frameInfo,
      @Nullable AnimatedDrawableFrameInfo previousFrameInfo) {
    if (mRenderedBounds == null || mRenderedBounds.width() <= 0 || mRenderedBounds.height() <= 0) {
      return;
    }

    float scale = (float) canvas.getWidth() / mRenderedBounds.width();

    // Clean previous frame surface if that frame was disposable
    if (previousFrameInfo != null) {
      maybeDisposeBackground(canvas, scale, scale, previousFrameInfo);
    }

    // Prepare the new frame
    int frameWidth = frame.getWidth();
    int frameHeight = frame.getHeight();
    Rect src = new Rect(0, 0, frameWidth, frameHeight);

    int resizedWidth = (int) (frameWidth * scale);
    int resizedHeight = (int) (frameHeight * scale);

    int xOffset = (int) (frame.getXOffset() * scale);
    int yOffset = (int) (frame.getYOffset() * scale);

    // Clear the canvas if this frame doesnt blend
    Rect renderDstRect =
        new Rect(xOffset, yOffset, xOffset + resizedWidth, yOffset + resizedHeight);
    if (frameInfo.blendOperation == BlendOperation.NO_BLEND) {
      canvas.drawRect(renderDstRect, mTransparentPaint);
    }
    synchronized (this) {
      // Draw canvas frame
      Bitmap bitmap = prepareTempBitmapForThisSize(frameWidth, frameHeight);
      frame.renderFrame(frameWidth, frameHeight, bitmap);
      canvas.drawBitmap(bitmap, src, renderDstRect, null);
    }
  }
An {@link AnimatedDrawableBackend} that renders {@link AnimatedImage}.
animated-base/src/main/java/com/facebook/imagepipeline/animated/impl/AnimatedDrawableBackendImpl.java