/* * Copyright (c) 2015-present, Facebook, Inc. * All rights reserved. * * This source code is licensed under the BSD-style license found in the * LICENSE file in the root directory of this source tree. An additional grant * of patent rights can be found in the PATENTS file in the same directory. */ package com.facebook.imagepipeline.animated.testing; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Rect; import com.facebook.common.references.CloseableReference; import com.facebook.imagepipeline.animated.base.AnimatedDrawableBackend; import com.facebook.imagepipeline.animated.base.AnimatedDrawableFrameInfo; import com.facebook.imagepipeline.animated.base.AnimatedImageResult; /** * Implementation of {@link AnimatedDrawableBackend} for unit tests. */ public class TestAnimatedDrawableBackend implements AnimatedDrawableBackend { private final int mWidth; private final int mHeight; private final int[] mFrameDurations; private final int[] mAccumulatedDurationsMs; private int mDropCachesCallCount; public TestAnimatedDrawableBackend(int width, int height, int[] frameDurations) { mWidth = width; mHeight = height; mFrameDurations = frameDurations; mAccumulatedDurationsMs = new int[mFrameDurations.length]; int accumulatedDurationMs = 0; for (int i = 0; i < mAccumulatedDurationsMs.length; i++) { mAccumulatedDurationsMs[i] = accumulatedDurationMs + mFrameDurations[i]; accumulatedDurationMs = mAccumulatedDurationsMs[i]; } } public static int pixelValue(int frameNumber, int x, int y) { return ((frameNumber & 0xff) << 16) | ((x & 0xff) << 8) | ((y & 0xff)); } @Override public AnimatedImageResult getAnimatedImageResult() { return null; } @Override public int getDurationMs() { return mAccumulatedDurationsMs[mAccumulatedDurationsMs.length - 1]; } @Override public int getFrameCount() { return mFrameDurations.length; } @Override public int getLoopCount() { return 0; } @Override public int getWidth() { return mWidth; } @Override public int getHeight() { return mHeight; } @Override public int getRenderedWidth() { return mWidth; } @Override public int getRenderedHeight() { return mHeight; } @Override public AnimatedDrawableFrameInfo getFrameInfo(int frameNumber) { return new AnimatedDrawableFrameInfo( frameNumber, 0, 0, mWidth, mHeight, AnimatedDrawableFrameInfo.BlendOperation.NO_BLEND, AnimatedDrawableFrameInfo.DisposalMethod.DISPOSE_DO_NOT); } @Override public void renderFrame(int frameNumber, Canvas canvas) { int[] pixels = new int[mWidth * mHeight]; for (int i = 0; i < pixels.length; i++) { // We store the frame number in the R, the x in the G, and the y in the B. int x = i % mWidth; int y = i / mWidth; pixels[i] = pixelValue(frameNumber, x, y); } Bitmap bitmap = Bitmap.createBitmap(pixels, mWidth, mHeight, Bitmap.Config.ARGB_8888); canvas.drawBitmap(bitmap, 0, 0, null); } @Override public int getFrameForTimestampMs(int timestampMs) { int accumulator = 0; for (int i = 0; i < mFrameDurations.length; i++) { if (timestampMs < accumulator + mFrameDurations[i]) { return i; } accumulator += mFrameDurations[i]; } return mFrameDurations.length - 1; } @Override public int getTimestampMsForFrame(int frameNumber) { return frameNumber == 0 ? 0 : mAccumulatedDurationsMs[frameNumber - 1]; } @Override public int getDurationMsForFrame(int frameNumber) { return mFrameDurations[frameNumber]; } @Override public int getFrameForPreview() { return 0; } @Override public AnimatedDrawableBackend forNewBounds(Rect bounds) { return this; } @Override public int getMemoryUsage() { return 0; } @Override public CloseableReference<Bitmap> getPreDecodedFrame(int frameNumber) { return null; } @Override public boolean hasPreDecodedFrame(int frameNumber) { return false; } public int getDropCachesCallCount() { return mDropCachesCallCount; } @Override public void dropCaches() { mDropCachesCallCount++; } }