]> gitweb.factorcode.org Git - factor.git/commitdiff
colors.contrast: implement WCAG color contrast ratio
authorJohn Benediktsson <mrjbq7@gmail.com>
Wed, 3 Aug 2022 19:29:36 +0000 (12:29 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Wed, 3 Aug 2022 19:29:36 +0000 (12:29 -0700)
extra/colors/contrast/contrast-tests.factor [new file with mode: 0644]
extra/colors/contrast/contrast.factor [new file with mode: 0644]

diff --git a/extra/colors/contrast/contrast-tests.factor b/extra/colors/contrast/contrast-tests.factor
new file mode 100644 (file)
index 0000000..f6c59bf
--- /dev/null
@@ -0,0 +1,7 @@
+USING: colors colors.contrast kernel tools.test ;
+
+{ 0.0 } [ COLOR: black relative-luminance ] unit-test
+{ 1.0 } [ COLOR: white relative-luminance ] unit-test
+
+{ 1.0 } [ COLOR: blue dup contrast-ratio ] unit-test
+{ 21.0 } [ COLOR: black COLOR: white contrast-ratio ] unit-test
diff --git a/extra/colors/contrast/contrast.factor b/extra/colors/contrast/contrast.factor
new file mode 100644 (file)
index 0000000..2045c12
--- /dev/null
@@ -0,0 +1,25 @@
+! Copyright (C) 2022 John Benediktsson
+! See http://factorcode.org/license.txt for BSD license
+USING: colors kernel math math.functions ;
+IN: colors.contrast
+
+<PRIVATE
+
+: adjust-color ( u -- v )
+    dup 0.03928 <= [ 12.92 / ] [ 0.055 + 1.055 / 2.4 ^ ] if ;
+
+PRIVATE>
+
+: relative-luminance ( color -- n )
+    >rgba-components drop [ adjust-color ] tri@
+    [ 0.2126 * ] [ 0.7152 * ] [ 0.0722 * ] tri* + + ;
+
+: contrast-ratio ( color1 color2 -- n )
+    [ relative-luminance ] bi@
+    2dup < [ swap ] when [ 0.05 + ] bi@ / ;
+
+: passes-AA? ( contrast large? -- ? )
+    3.0 4.5 ? >= ;
+
+: passes-AAA? ( contrast large? -- ? )
+    4.5 7.0 ? >= ;