blob: aab3538e3c4c11c40cc77ec9798da414e08dee50 [file] [log] [blame]
/*
* Copyright (C) 2021 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 com.android.systemui.monet;
import androidx.annotation.ColorInt;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.graphics.ColorUtils;
/**
* Generate sets of colors that are shades of the same color
*/
@VisibleForTesting
public class Shades {
/**
* Combining the ability to convert between relative luminance and perceptual luminance with
* contrast leads to a design system that can be based on a linear value to determine contrast,
* rather than a ratio.
*
* This codebase implements a design system that has that property, and as a result, we can
* guarantee that any shades 5 steps from each other have a contrast ratio of at least 4.5.
* 4.5 is the requirement for smaller text contrast in WCAG 2.1 and earlier.
*
* However, lstar 50 does _not_ have a contrast ratio >= 4.5 with lstar 100.
* lstar 49.6 is the smallest lstar that will lead to a contrast ratio >= 4.5 with lstar 100,
* and it also contrasts >= 4.5 with lstar 100.
*/
public static final float MIDDLE_LSTAR = 49.6f;
/**
* Generate shades of a color. Ordered in lightness _descending_.
* <p>
* The first shade will be at 95% lightness, the next at 90, 80, etc. through 0.
*
* @param hue hue in CAM16 color space
* @param chroma chroma in CAM16 color space
* @return shades of a color, as argb integers. Ordered by lightness descending.
*/
public static @ColorInt int[] of(float hue, float chroma) {
int[] shades = new int[12];
// At tone 90 and above, blue and yellow hues can reach a much higher chroma.
// To preserve a consistent appearance across all hues, use a maximum chroma of 40.
shades[0] = ColorUtils.CAMToColor(hue, Math.min(40f, chroma), 99);
shades[1] = ColorUtils.CAMToColor(hue, Math.min(40f, chroma), 95);
for (int i = 2; i < 12; i++) {
float lStar = (i == 6) ? MIDDLE_LSTAR : 100 - 10 * (i - 1);
if (lStar >= 90) {
chroma = Math.min(40f, chroma);
}
shades[i] = ColorUtils.CAMToColor(hue, chroma, lStar);
}
return shades;
}
}