/* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.wallpaper.util; import android.graphics.Bitmap; import android.graphics.Bitmap.Config; import android.graphics.Color; import android.graphics.Point; /** * Applies fill and stretch transformations to bitmaps. */ public class BitmapTransformer { // Suppress default constructor for noninstantiability. private BitmapTransformer() { throw new AssertionError(); } /** * Centers the provided bitmap to a new bitmap with the dimensions of fillSize and fills in any * remaining empty space with black pixels. */ public static Bitmap applyFillTransformation(Bitmap bitmap, Point fillSize) { // Initialize a new result bitmap with all black pixels. Bitmap resultBitmap = Bitmap.createBitmap(fillSize.x, fillSize.y, Config.ARGB_8888); resultBitmap.eraseColor(Color.BLACK); // Calculate horizontal and vertical offsets between the source and result bitmaps. int horizontalOffset = (bitmap.getWidth() - resultBitmap.getWidth()) / 2; int verticalOffset = (bitmap.getHeight() - resultBitmap.getHeight()) / 2; // Allocate an int array to temporarily store a buffer of the pixel color data we are copying // from the source to the final bitmap. We are only copying the portion of the source bitmap // that fits within the bounds of the result bitmap, so take the lesser of both bitmap's width // and height to calculate the size. int pixelArraySize = Math.min(resultBitmap.getWidth(), bitmap.getWidth()) * Math.min(resultBitmap.getHeight(), bitmap.getHeight()); int[] srcPixels = new int[pixelArraySize]; // Copy region of source bitmap into pixel array buffer. bitmap.getPixels( srcPixels, 0 /* offset */, bitmap.getWidth() /* stride */, Math.max(0, horizontalOffset), Math.max(0, verticalOffset), Math.min(resultBitmap.getWidth(), bitmap.getWidth()) /* width */, Math.min(resultBitmap.getHeight(), bitmap.getHeight()) /* height */); // Copy the values stored in the pixel array buffer to the result bitmap. resultBitmap.setPixels( srcPixels, 0 /* offset */, bitmap.getWidth() /* stride */, Math.max(0, -1 * horizontalOffset), Math.max(0, -1 * verticalOffset), Math.min(resultBitmap.getWidth(), bitmap.getWidth()) /* width */, Math.min(resultBitmap.getHeight(), bitmap.getHeight()) /* height */); return resultBitmap; } }