/*
 * Copyright (C) 2013 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.gallery3d.filtershow.tools;

import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.RectF;

/**
 * A factory class for producing bitmaps to use as UI icons.
 */
public class IconFactory {

    /**
     * Builds an icon with the dimensions iconWidth:iconHeight. If scale is set
     * the source image is stretched to fit within the given dimensions;
     * otherwise, the source image is cropped to the proper aspect ratio.
     *
     * @param sourceImage image to create an icon from.
     * @param iconWidth width of the icon bitmap.
     * @param iconHeight height of the icon bitmap.
     * @param scale if true, stretch sourceImage to fit the icon dimensions.
     * @return an icon bitmap with the dimensions iconWidth:iconHeight.
     */
    public static Bitmap createIcon(Bitmap sourceImage, int iconWidth, int iconHeight,
            boolean scale) {
        if (sourceImage == null) {
            throw new IllegalArgumentException("Null argument to buildIcon");
        }

        int sourceWidth = sourceImage.getWidth();
        int sourceHeight = sourceImage.getHeight();

        if (sourceWidth == 0 || sourceHeight == 0 || iconWidth == 0 || iconHeight == 0) {
            throw new IllegalArgumentException("Bitmap with dimension 0 used as input");
        }

        Bitmap icon = Bitmap.createBitmap(iconWidth, iconHeight,
                Bitmap.Config.ARGB_8888);
        drawIcon(icon, sourceImage, scale);
        return icon;
    }

    /**
     * Draws an icon in the destination bitmap. If scale is set the source image
     * is stretched to fit within the destination dimensions; otherwise, the
     * source image is cropped to the proper aspect ratio.
     *
     * @param dest bitmap into which to draw the icon.
     * @param sourceImage image to create an icon from.
     * @param scale if true, stretch sourceImage to fit the destination.
     */
    public static void drawIcon(Bitmap dest, Bitmap sourceImage, boolean scale) {
        if (dest == null || sourceImage == null) {
            throw new IllegalArgumentException("Null argument to buildIcon");
        }

        int sourceWidth = sourceImage.getWidth();
        int sourceHeight = sourceImage.getHeight();
        int iconWidth = dest.getWidth();
        int iconHeight = dest.getHeight();

        if (sourceWidth == 0 || sourceHeight == 0 || iconWidth == 0 || iconHeight == 0) {
            throw new IllegalArgumentException("Bitmap with dimension 0 used as input");
        }

        Rect destRect = new Rect(0, 0, iconWidth, iconHeight);
        Canvas canvas = new Canvas(dest);

        Rect srcRect = null;
        if (scale) {
            // scale image to fit in icon (stretches if aspect isn't the same)
            srcRect = new Rect(0, 0, sourceWidth, sourceHeight);
        } else {
            // crop image to aspect ratio iconWidth:iconHeight
            float wScale = sourceWidth / (float) iconWidth;
            float hScale = sourceHeight / (float) iconHeight;
            float s = Math.min(hScale, wScale);

            float iw = iconWidth * s;
            float ih = iconHeight * s;

            float borderW = (sourceWidth - iw) / 2.0f;
            float borderH = (sourceHeight - ih) / 2.0f;
            RectF rec = new RectF(borderW, borderH, borderW + iw, borderH + ih);
            srcRect = new Rect();
            rec.roundOut(srcRect);
        }

        canvas.drawBitmap(sourceImage, srcRect, destRect, new Paint());
    }
}
