aboutsummaryrefslogtreecommitdiff
path: root/dynamiccolor/ContrastCurve.java
diff options
context:
space:
mode:
Diffstat (limited to 'dynamiccolor/ContrastCurve.java')
-rw-r--r--dynamiccolor/ContrastCurve.java77
1 files changed, 77 insertions, 0 deletions
diff --git a/dynamiccolor/ContrastCurve.java b/dynamiccolor/ContrastCurve.java
new file mode 100644
index 0000000..a055019
--- /dev/null
+++ b/dynamiccolor/ContrastCurve.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright 2023 Google LLC
+ *
+ * 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.google.ux.material.libmonet.dynamiccolor;
+
+import androidx.annotation.NonNull;
+import com.google.ux.material.libmonet.utils.MathUtils;
+
+/**
+ * A class containing the contrast curve for a dynamic color on its background.
+ *
+ * <p>The four values correspond to contrast requirements for contrast levels -1.0, 0.0, 0.5, and
+ * 1.0, respectively.
+ */
+public final class ContrastCurve {
+ /** Contrast requirement for contrast level -1.0 */
+ private final double low;
+
+ /** Contrast requirement for contrast level 0.0 */
+ private final double normal;
+
+ /** Contrast requirement for contrast level 0.5 */
+ private final double medium;
+
+ /** Contrast requirement for contrast level 1.0 */
+ private final double high;
+
+ /**
+ * Creates a `ContrastCurve` object.
+ *
+ * @param low Contrast requirement for contrast level -1.0
+ * @param normal Contrast requirement for contrast level 0.0
+ * @param medium Contrast requirement for contrast level 0.5
+ * @param high Contrast requirement for contrast level 1.0
+ */
+ public ContrastCurve(double low, double normal, double medium, double high) {
+ this.low = low;
+ this.normal = normal;
+ this.medium = medium;
+ this.high = high;
+ }
+
+ /**
+ * Returns the contrast ratio at a given contrast level.
+ *
+ * @param contrastLevel The contrast level. 0.0 is the default (normal); -1.0 is the lowest; 1.0
+ * is the highest.
+ * @return The contrast ratio, a number between 1.0 and 21.0.
+ */
+ @NonNull
+ public double getContrast(double contrastLevel) {
+ if (contrastLevel <= -1.0) {
+ return this.low;
+ } else if (contrastLevel < 0.0) {
+ return MathUtils.lerp(this.low, this.normal, (contrastLevel - -1) / 1);
+ } else if (contrastLevel < 0.5) {
+ return MathUtils.lerp(this.normal, this.medium, (contrastLevel - 0) / 0.5);
+ } else if (contrastLevel < 1.0) {
+ return MathUtils.lerp(this.medium, this.high, (contrastLevel - 0.5) / 0.5);
+ } else {
+ return this.high;
+ }
+ }
+}