/*
 * Copyright (C) 2006 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 android.graphics;

import android.annotation.ColorInt;
import android.annotation.NonNull;

/**
 * A color filter that can be used to tint the source pixels using a single
 * color and a specific {@link PorterDuff Porter-Duff composite mode}.
 */
public class PorterDuffColorFilter extends ColorFilter {
    @ColorInt
    private int mColor;
    private PorterDuff.Mode mMode;

    /**
     * Create a color filter that uses the specified color and Porter-Duff mode.
     *
     * @param color The ARGB source color used with the specified Porter-Duff mode
     * @param mode The porter-duff mode that is applied
     *
     * @see Color
     * @see #setColor(int)
     * @see #setMode(android.graphics.PorterDuff.Mode)
     */
    public PorterDuffColorFilter(@ColorInt int color, @NonNull PorterDuff.Mode mode) {
        mColor = color;
        mMode = mode;
    }

    /**
     * Returns the ARGB color used to tint the source pixels when this filter
     * is applied.
     *
     * @see Color
     * @see #setColor(int)
     *
     * @hide
     */
    @ColorInt
    public int getColor() {
        return mColor;
    }

    /**
     * Specifies the color to tint the source pixels with when this color
     * filter is applied.
     *
     * @param color An ARGB {@link Color color}
     *
     * @see Color
     * @see #getColor()
     * @see #getMode()
     *
     * @hide
     */
    public void setColor(@ColorInt int color) {
        if (mColor != color) {
            mColor = color;
            discardNativeInstance();
        }
    }

    /**
     * Returns the Porter-Duff mode used to composite this color filter's
     * color with the source pixel when this filter is applied.
     *
     * @see PorterDuff
     * @see #setMode(android.graphics.PorterDuff.Mode)
     *
     * @hide
     */
    public PorterDuff.Mode getMode() {
        return mMode;
    }

    /**
     * Specifies the Porter-Duff mode to use when compositing this color
     * filter's color with the source pixel at draw time.
     *
     * @see PorterDuff
     * @see #getMode()
     * @see #getColor()
     *
     * @hide
     */
    public void setMode(@NonNull PorterDuff.Mode mode) {
        if (mode == null) {
            throw new IllegalArgumentException("mode must be non-null");
        }
        mMode = mode;
        discardNativeInstance();
    }

    @Override
    long createNativeInstance() {
        return native_CreatePorterDuffFilter(mColor, mMode.nativeInt);
    }

    @Override
    public boolean equals(Object object) {
        if (this == object) {
            return true;
        }
        if (object == null || getClass() != object.getClass()) {
            return false;
        }
        final PorterDuffColorFilter other = (PorterDuffColorFilter) object;
        return (mColor == other.mColor && mMode.nativeInt == other.mMode.nativeInt);
    }

    @Override
    public int hashCode() {
        return 31 *  mMode.hashCode() + mColor;
    }

    private static native long native_CreatePorterDuffFilter(int srcColor, int porterDuffMode);
}
