ColorMatrixColorFilter.java revision 8a6ad4a89d1b9ed61d3ec6f5bc12d479bc8d9f3b
1/*
2 * Copyright (C) 2007 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.graphics;
18
19import android.annotation.NonNull;
20import android.annotation.Nullable;
21
22/**
23 * A color filter that transforms colors through a 4x5 color matrix. This filter
24 * can be used to change the saturation of pixels, convert from YUV to RGB, etc.
25 *
26 * @see ColorMatrix
27 */
28public class ColorMatrixColorFilter extends ColorFilter {
29    private final ColorMatrix mMatrix = new ColorMatrix();
30
31    /**
32     * Create a color filter that transforms colors through a 4x5 color matrix.
33     *
34     * @param matrix 4x5 matrix used to transform colors. It is copied into
35     *               the filter, so changes made to the matrix after the filter
36     *               is constructed will not be reflected in the filter.
37     */
38    public ColorMatrixColorFilter(@NonNull ColorMatrix matrix) {
39        mMatrix.set(matrix);
40    }
41
42    /**
43     * Create a color filter that transforms colors through a 4x5 color matrix.
44     *
45     * @param array Array of floats used to transform colors, treated as a 4x5
46     *              matrix. The first 20 entries of the array are copied into
47     *              the filter. See ColorMatrix.
48     */
49    public ColorMatrixColorFilter(@NonNull float[] array) {
50        if (array.length < 20) {
51            throw new ArrayIndexOutOfBoundsException();
52        }
53        mMatrix.set(array);
54    }
55
56    /**
57     * Copies the ColorMatrix from the filter into the passed ColorMatrix.
58     *
59     * @param colorMatrix Set to the current value of the filter's ColorMatrix.
60     */
61    public void getColorMatrix(ColorMatrix colorMatrix) {
62        colorMatrix.set(mMatrix);
63    }
64
65    /**
66     * Copies the provided color matrix to be used by this filter.
67     *
68     * If the specified color matrix is null, this filter's color matrix will be reset to the
69     * identity matrix.
70     *
71     * @param matrix A {@link ColorMatrix} or null
72     *
73     * @see #getColorMatrix(ColorMatrix)
74     * @see #setColorMatrixArray(float[])
75     * @see ColorMatrix#reset()
76     *
77     * @hide
78     */
79    public void setColorMatrix(@Nullable ColorMatrix matrix) {
80        discardNativeInstance();
81        if (matrix == null) {
82            mMatrix.reset();
83        } else {
84            mMatrix.set(matrix);
85        }
86    }
87
88    /**
89     * Copies the provided color matrix to be used by this filter.
90     *
91     * If the specified color matrix is null, this filter's color matrix will be reset to the
92     * identity matrix.
93     *
94     * @param array Array of floats used to transform colors, treated as a 4x5
95     *              matrix. The first 20 entries of the array are copied into
96     *              the filter. See {@link ColorMatrix}.
97     *
98     * @see #getColorMatrix(ColorMatrix)
99     * @see #setColorMatrix(ColorMatrix)
100     * @see ColorMatrix#reset()
101     *
102     * @throws ArrayIndexOutOfBoundsException if the specified array's
103     *         length is < 20
104     *
105     * @hide
106     */
107    public void setColorMatrixArray(@Nullable float[] array) {
108        // called '...Array' so that passing null isn't ambiguous
109        discardNativeInstance();
110        if (array == null) {
111            mMatrix.reset();
112        } else {
113            if (array.length < 20) {
114                throw new ArrayIndexOutOfBoundsException();
115            }
116            mMatrix.set(array);
117        }
118    }
119
120    @Override
121    long createNativeInstance() {
122        return nativeColorMatrixFilter(mMatrix.getArray());
123    }
124
125    private static native long nativeColorMatrixFilter(float[] array);
126}
127