1c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes/* 2c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Copyright 2015 The Android Open Source Project 3c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * 4c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Licensed under the Apache License, Version 2.0 (the "License"); 5c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * you may not use this file except in compliance with the License. 6c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * You may obtain a copy of the License at 7c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * 8c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * http://www.apache.org/licenses/LICENSE-2.0 9c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * 10c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Unless required by applicable law or agreed to in writing, software 11c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * distributed under the License is distributed on an "AS IS" BASIS, 12c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * See the License for the specific language governing permissions and 14c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * limitations under the License. 15c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 16c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 17c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banespackage android.support.v7.graphics; 18c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 19c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banesimport android.support.annotation.FloatRange; 20c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 21c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes/** 22c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * A class which allows custom selection of colors in a {@link Palette}'s generation. Instances 23c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * can be created via the {@link Builder} class. 24c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * 25c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * <p>To use the target, use the {@link Palette.Builder#addTarget(Target)} API when building a 26c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Palette.</p> 27c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 28c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banespublic final class Target { 29c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 30c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float TARGET_DARK_LUMA = 0.26f; 31c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float MAX_DARK_LUMA = 0.45f; 32c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 33c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float MIN_LIGHT_LUMA = 0.55f; 34c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float TARGET_LIGHT_LUMA = 0.74f; 35c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 36c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float MIN_NORMAL_LUMA = 0.3f; 37c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float TARGET_NORMAL_LUMA = 0.5f; 38c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float MAX_NORMAL_LUMA = 0.7f; 39c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 40c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float TARGET_MUTED_SATURATION = 0.3f; 41c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float MAX_MUTED_SATURATION = 0.4f; 42c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 43c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float TARGET_VIBRANT_SATURATION = 1f; 44c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float MIN_VIBRANT_SATURATION = 0.35f; 45c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 46c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float WEIGHT_SATURATION = 0.24f; 47c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float WEIGHT_LUMA = 0.52f; 48c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final float WEIGHT_POPULATION = 0.24f; 49c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 50c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final int INDEX_MIN = 0; 51c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final int INDEX_TARGET = 1; 52c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final int INDEX_MAX = 2; 53c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 54c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final int INDEX_WEIGHT_SAT = 0; 55c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final int INDEX_WEIGHT_LUMA = 1; 56c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static final int INDEX_WEIGHT_POP = 2; 57c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 58c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 59c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * A target which has the characteristics of a vibrant color which is light in luminance. 60c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 61c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public static final Target LIGHT_VIBRANT; 62c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 63c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 64c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * A target which has the characteristics of a vibrant color which is neither light or dark. 65c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 66c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public static final Target VIBRANT; 67c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 68c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 69c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * A target which has the characteristics of a vibrant color which is dark in luminance. 70c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 71c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public static final Target DARK_VIBRANT; 72c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 73c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 74c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * A target which has the characteristics of a muted color which is light in luminance. 75c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 76c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public static final Target LIGHT_MUTED; 77c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 78c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 79c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * A target which has the characteristics of a muted color which is neither light or dark. 80c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 81c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public static final Target MUTED; 82c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 83c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 84c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * A target which has the characteristics of a muted color which is dark in luminance. 85c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 86c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public static final Target DARK_MUTED; 87c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 88c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes static { 89c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes LIGHT_VIBRANT = new Target(); 90c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultLightLightnessValues(LIGHT_VIBRANT); 91c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultVibrantSaturationValues(LIGHT_VIBRANT); 92c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 93c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes VIBRANT = new Target(); 94c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultNormalLightnessValues(VIBRANT); 95c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultVibrantSaturationValues(VIBRANT); 96c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 97c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes DARK_VIBRANT = new Target(); 98c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultDarkLightnessValues(DARK_VIBRANT); 99c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultVibrantSaturationValues(DARK_VIBRANT); 100c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 101c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes LIGHT_MUTED = new Target(); 102c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultLightLightnessValues(LIGHT_MUTED); 103c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultMutedSaturationValues(LIGHT_MUTED); 104c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 105c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes MUTED = new Target(); 106c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultNormalLightnessValues(MUTED); 107c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultMutedSaturationValues(MUTED); 108c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 109c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes DARK_MUTED = new Target(); 110c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultDarkLightnessValues(DARK_MUTED); 111c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultMutedSaturationValues(DARK_MUTED); 112c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 113c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 114c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private final float[] mSaturationTargets = new float[3]; 115c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private final float[] mLightnessTargets = new float[3]; 116c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private final float[] mWeights = new float[3]; 117c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private boolean mIsExclusive = true; // default to true 118c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 119c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private Target() { 120c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setTargetDefaultValues(mSaturationTargets); 121c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setTargetDefaultValues(mLightnessTargets); 122c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes setDefaultWeights(); 123c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 124c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 125c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private Target(Target from) { 126c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes System.arraycopy(from.mSaturationTargets, 0, mSaturationTargets, 0, 127c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mSaturationTargets.length); 128c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes System.arraycopy(from.mLightnessTargets, 0, mLightnessTargets, 0, 129c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mLightnessTargets.length); 130c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes System.arraycopy(from.mWeights, 0, mWeights, 0, mWeights.length); 131c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 132c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 133c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 134c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * The minimum saturation value for this target. 135c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 136c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes @FloatRange(from = 0, to = 1) 137c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public float getMinimumSaturation() { 138c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return mSaturationTargets[INDEX_MIN]; 139c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 140c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 141c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 142c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * The target saturation value for this target. 143c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 144c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes @FloatRange(from = 0, to = 1) 145c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public float getTargetSaturation() { 146c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return mSaturationTargets[INDEX_TARGET]; 147c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 148c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 149c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 150c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * The maximum saturation value for this target. 151c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 152c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes @FloatRange(from = 0, to = 1) 153c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public float getMaximumSaturation() { 154c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return mSaturationTargets[INDEX_MAX]; 155c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 156c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 157c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 158c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * The minimum lightness value for this target. 159c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 160c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes @FloatRange(from = 0, to = 1) 161c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public float getMinimumLightness() { 162c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return mLightnessTargets[INDEX_MIN]; 163c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 164c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 165c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 166c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * The target lightness value for this target. 167c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 168c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes @FloatRange(from = 0, to = 1) 169c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public float getTargetLightness() { 170c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return mLightnessTargets[INDEX_TARGET]; 171c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 172c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 173c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 174c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * The maximum lightness value for this target. 175c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 176c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes @FloatRange(from = 0, to = 1) 177c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public float getMaximumLightness() { 178c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return mLightnessTargets[INDEX_MAX]; 179c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 180c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 181c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 182b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * Returns the weight of importance that this target places on a color's saturation within 183b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * the image. 184b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 185b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * <p>The larger the weight, relative to the other weights, the more important that a color 186b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * being close to the target value has on selection.</p> 187b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 188b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * @see #getTargetSaturation() 189c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 190c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public float getSaturationWeight() { 191c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return mWeights[INDEX_WEIGHT_SAT]; 192c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 193c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 194c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 195b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * Returns the weight of importance that this target places on a color's lightness within 196b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * the image. 197b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 198b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * <p>The larger the weight, relative to the other weights, the more important that a color 199b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * being close to the target value has on selection.</p> 200b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 201b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * @see #getTargetLightness() 202c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 203c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public float getLightnessWeight() { 204c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return mWeights[INDEX_WEIGHT_LUMA]; 205c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 206c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 207c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 208b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * Returns the weight of importance that this target places on a color's population within 209b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * the image. 210b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 211b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * <p>The larger the weight, relative to the other weights, the more important that a 212b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * color's population being close to the most populous has on selection.</p> 213c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 214c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public float getPopulationWeight() { 215c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return mWeights[INDEX_WEIGHT_POP]; 216c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 217c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 218c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 219c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Returns whether any color selected for this target is exclusive for this target only. 220c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * 221c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * <p>If false, then the color can be selected for other targets.</p> 222c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 223c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public boolean isExclusive() { 224c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return mIsExclusive; 225c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 226c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 227c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static void setTargetDefaultValues(final float[] values) { 228c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes values[INDEX_MIN] = 0f; 229c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes values[INDEX_TARGET] = 0.5f; 230c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes values[INDEX_MAX] = 1f; 231c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 232c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 233c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private void setDefaultWeights() { 234c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mWeights[INDEX_WEIGHT_SAT] = WEIGHT_SATURATION; 235c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mWeights[INDEX_WEIGHT_LUMA] = WEIGHT_LUMA; 236c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mWeights[INDEX_WEIGHT_POP] = WEIGHT_POPULATION; 237c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 238c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 239c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes void normalizeWeights() { 240c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes float sum = 0; 241c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes for (int i = 0, z = mWeights.length; i < z; i++) { 242c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes float weight = mWeights[i]; 243c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes if (weight > 0) { 244c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes sum += weight; 245c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 246c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 247c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes if (sum != 0) { 248c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes for (int i = 0, z = mWeights.length; i < z; i++) { 249c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes if (mWeights[i] > 0) { 250c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mWeights[i] /= sum; 251c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 252c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 253c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 254c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 255c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 256c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static void setDefaultDarkLightnessValues(Target target) { 257c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes target.mLightnessTargets[INDEX_TARGET] = TARGET_DARK_LUMA; 258c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes target.mLightnessTargets[INDEX_MAX] = MAX_DARK_LUMA; 259c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 260c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 261c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static void setDefaultNormalLightnessValues(Target target) { 262c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes target.mLightnessTargets[INDEX_MIN] = MIN_NORMAL_LUMA; 263c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes target.mLightnessTargets[INDEX_TARGET] = TARGET_NORMAL_LUMA; 264c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes target.mLightnessTargets[INDEX_MAX] = MAX_NORMAL_LUMA; 265c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 266c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 267c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static void setDefaultLightLightnessValues(Target target) { 268c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes target.mLightnessTargets[INDEX_MIN] = MIN_LIGHT_LUMA; 269c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes target.mLightnessTargets[INDEX_TARGET] = TARGET_LIGHT_LUMA; 270c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 271c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 272c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static void setDefaultVibrantSaturationValues(Target target) { 273c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes target.mSaturationTargets[INDEX_MIN] = MIN_VIBRANT_SATURATION; 274c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes target.mSaturationTargets[INDEX_TARGET] = TARGET_VIBRANT_SATURATION; 275c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 276c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 277c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private static void setDefaultMutedSaturationValues(Target target) { 278c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes target.mSaturationTargets[INDEX_TARGET] = TARGET_MUTED_SATURATION; 279c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes target.mSaturationTargets[INDEX_MAX] = MAX_MUTED_SATURATION; 280c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 281c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 282c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 283c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Builder class for generating custom {@link Target} instances. 284c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 285c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public final static class Builder { 286c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes private final Target mTarget; 287c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 288c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 289c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Create a new {@link Target} builder from scratch. 290c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 291c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder() { 292c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget = new Target(); 293c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 294c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 295c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 296c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Create a new builder based on an existing {@link Target}. 297c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 298c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder(Target target) { 299c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget = new Target(target); 300c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 301c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 302c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 303c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Set the minimum saturation value for this target. 304c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 305c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder setMinimumSaturation(@FloatRange(from = 0, to = 1) float value) { 306c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget.mSaturationTargets[INDEX_MIN] = value; 307c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return this; 308c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 309c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 310c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 311c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Set the target/ideal saturation value for this target. 312c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 313c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder setTargetSaturation(@FloatRange(from = 0, to = 1) float value) { 314c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget.mSaturationTargets[INDEX_TARGET] = value; 315c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return this; 316c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 317c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 318c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 319c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Set the maximum saturation value for this target. 320c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 321c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder setMaximumSaturation(@FloatRange(from = 0, to = 1) float value) { 322c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget.mSaturationTargets[INDEX_MAX] = value; 323c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return this; 324c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 325c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 326c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 327c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Set the minimum lightness value for this target. 328c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 329c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder setMinimumLightness(@FloatRange(from = 0, to = 1) float value) { 330c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget.mLightnessTargets[INDEX_MIN] = value; 331c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return this; 332c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 333c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 334c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 335c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Set the target/ideal lightness value for this target. 336c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 337c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder setTargetLightness(@FloatRange(from = 0, to = 1) float value) { 338c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget.mLightnessTargets[INDEX_TARGET] = value; 339c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return this; 340c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 341c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 342c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 343c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Set the maximum lightness value for this target. 344c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 345c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder setMaximumLightness(@FloatRange(from = 0, to = 1) float value) { 346c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget.mLightnessTargets[INDEX_MAX] = value; 347c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return this; 348c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 349c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 350c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 351b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * Set the weight of importance that this target will place on saturation values. 352b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 353b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * <p>The larger the weight, relative to the other weights, the more important that a color 354b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * being close to the target value has on selection.</p> 355b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 356b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * <p>A weight of 0 means that it has no weight, and thus has no 357b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * bearing on the selection.</p> 358b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 359b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * @see #setTargetSaturation(float) 360c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 361c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder setSaturationWeight(@FloatRange(from = 0) float weight) { 362c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget.mWeights[INDEX_WEIGHT_SAT] = weight; 363c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return this; 364c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 365c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 366c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 367b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * Set the weight of importance that this target will place on lightness values. 368b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 369b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * <p>The larger the weight, relative to the other weights, the more important that a color 370b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * being close to the target value has on selection.</p> 371b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 372b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * <p>A weight of 0 means that it has no weight, and thus has no 373b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * bearing on the selection.</p> 374b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 375b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * @see #setTargetLightness(float) 376c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 377c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder setLightnessWeight(@FloatRange(from = 0) float weight) { 378c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget.mWeights[INDEX_WEIGHT_LUMA] = weight; 379c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return this; 380c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 381c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 382c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 383b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * Set the weight of importance that this target will place on a color's population within 384b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * the image. 385b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 386b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * <p>The larger the weight, relative to the other weights, the more important that a 387b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * color's population being close to the most populous has on selection.</p> 388b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * 389b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * <p>A weight of 0 means that it has no weight, and thus has no 390b3479fa775143ef50dfed1d34a8f0bc4c9dc499eChris Banes * bearing on the selection.</p> 391c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 392c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder setPopulationWeight(@FloatRange(from = 0) float weight) { 393c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget.mWeights[INDEX_WEIGHT_POP] = weight; 394c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return this; 395c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 396c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 397c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 398c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Set whether any color selected for this target is exclusive to this target only. 399c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Defaults to true. 400c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * 401c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * @param exclusive true if any the color is exclusive to this target, or false is the 402c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * color can be selected for other targets. 403c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 404c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Builder setExclusive(boolean exclusive) { 405c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes mTarget.mIsExclusive = exclusive; 406c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return this; 407c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 408c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 409c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes /** 410c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes * Builds and returns the resulting {@link Target}. 411c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes */ 412c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes public Target build() { 413c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes return mTarget; 414c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 415c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes } 416c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes 417c5f1ad7670d601b806b2d1e5e4fa1ae7efd7fc69Chris Banes}