1cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu/*
2cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu * Copyright (C) 2014 The Android Open Source Project
3cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu *
4cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
5cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu * in compliance with the License. You may obtain a copy of the License at
6cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu *
7cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu * http://www.apache.org/licenses/LICENSE-2.0
8cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu *
9cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu * Unless required by applicable law or agreed to in writing, software distributed under the License
10cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
11cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu * or implied. See the License for the specific language governing permissions and limitations under
12cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu * the License.
13cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu */
14cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gupackage android.support.v17.leanback.graphics;
15cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu
16cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Guimport android.graphics.Color;
17cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Guimport android.graphics.ColorFilter;
18cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Guimport android.graphics.PorterDuff;
19cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Guimport android.graphics.PorterDuffColorFilter;
20cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Guimport android.util.SparseArray;
21cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu
22cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu/**
237cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn * Cache of {@link ColorFilter}s for a given color at different alpha levels.
24cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu */
25cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gupublic final class ColorFilterCache {
26cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu
27cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    private static final SparseArray<ColorFilterCache> sColorToFiltersMap =
28cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu            new SparseArray<ColorFilterCache>();
29cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu
30cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    private final PorterDuffColorFilter[] mFilters = new PorterDuffColorFilter[0x100];
31cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu
32cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    /**
337cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn     * Get a ColorDimmer for a given color.  Only the RGB values are used; the
347cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn     * alpha channel is ignored in color. Subsequent calls to this method
357cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn     * with the same color value will return the same cache.
367cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn     *
377cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn     * @param color The color to use for the color filters.
387cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn     * @return A cache of ColorFilters at different alpha levels for the color.
39cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu     */
407cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn    public static ColorFilterCache getColorFilterCache(int color) {
417cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn        final int r = Color.red(color);
427cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn        final int g = Color.green(color);
437cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn        final int b = Color.blue(color);
447cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn        color = Color.rgb(r, g, b);
457cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn        ColorFilterCache filters = sColorToFiltersMap.get(color);
467cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn        if (filters == null) {
477cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn            filters = new ColorFilterCache(r, g, b);
487cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn            sColorToFiltersMap.put(color, filters);
49cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu        }
507cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn        return filters;
51cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    }
52cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu
53cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    private ColorFilterCache(int r, int g, int b) {
547cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn        // Pre cache all 256 filter levels
55cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu        for (int i = 0x00; i <= 0xFF; i++) {
56cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu            int color = Color.argb(i, r, g, b);
57cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu            mFilters[i] = new PorterDuffColorFilter(color, PorterDuff.Mode.SRC_ATOP);
58cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu        }
59cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    }
60cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu
61cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    /**
627cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn     * Returns a ColorFilter for a given alpha level between 0 and 1.0.
637cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn     *
647cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn     * @param level The alpha level the filter should apply.
657cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn     * @return A ColorFilter at the alpha level for the color represented by the
667cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn     *         cache.
67cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu     */
68cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    public ColorFilter getFilterForLevel(float level) {
69cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu        if (level >= 0 && level <= 1.0) {
70cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu            int filterIndex = (int) (0xFF * level);
71cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu            return mFilters[filterIndex];
72cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu        } else {
73cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu            return null;
74cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu        }
75cf94c5fa8ae8edb7e26a623133207415ceeed187Dake Gu    }
767cc1c375d3bbfeacfcc3259e77671ae24f610d33Tim Kilbourn}
77