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