38
38
39
39
use crate :: ansi;
40
40
use crate :: check_color_support;
41
- use crate :: error:: ColorError ;
42
41
use crate :: env:: ColorSupport ;
42
+ use crate :: error:: ColorError ;
43
43
use std:: borrow:: Cow ;
44
44
45
45
#[ derive( Debug , Clone , Copy , PartialEq , Eq , Default ) ]
@@ -497,7 +497,11 @@ impl Color {
497
497
498
498
// If very low saturation, handle as grayscale
499
499
if diff < 20 {
500
- return if luminance < 0.5 { Color :: Black } else { Color :: White } ;
500
+ return if luminance < 0.5 {
501
+ Color :: Black
502
+ } else {
503
+ Color :: White
504
+ } ;
501
505
}
502
506
503
507
// Calculate color ratios for better comparison
@@ -509,7 +513,7 @@ impl Color {
509
513
if r > g && g > b {
510
514
// If red is dominant but green is significant
511
515
let g_to_r_ratio = g_f / r_f;
512
-
516
+
513
517
// More sensitive yellow detection for browns
514
518
if g_to_r_ratio > 0.4 && b < g / 2 {
515
519
return Color :: Yellow ;
@@ -521,7 +525,7 @@ impl Color {
521
525
// If both red and blue are present and green is lower
522
526
let r_to_b_ratio = r_f / b_f;
523
527
let b_to_r_ratio = b_f / r_f;
524
-
528
+
525
529
// If either red or blue is at least 40% of the other
526
530
if r_to_b_ratio > 0.4 || b_to_r_ratio > 0.4 {
527
531
return Color :: Magenta ;
@@ -533,7 +537,7 @@ impl Color {
533
537
// If both green and blue are present and red is lower
534
538
let g_to_b_ratio = g_f / b_f;
535
539
let b_to_g_ratio = b_f / g_f;
536
-
540
+
537
541
// For cyan, both components should be more balanced
538
542
if g_to_b_ratio > 0.65 && b_to_g_ratio > 0.65 {
539
543
return Color :: Cyan ;
@@ -551,25 +555,41 @@ impl Color {
551
555
552
556
match ( r_dominant, g_dominant, b_dominant) {
553
557
( true , false , false ) => {
554
- if has_green && g > ( r / 3 ) { Color :: Yellow }
555
- else { Color :: Red }
556
- } ,
558
+ if has_green && g > ( r / 3 ) {
559
+ Color :: Yellow
560
+ } else {
561
+ Color :: Red
562
+ }
563
+ }
557
564
( false , true , false ) => {
558
- if has_blue && b > ( g / 3 ) { Color :: Cyan }
559
- else { Color :: Green }
560
- } ,
565
+ if has_blue && b > ( g / 3 ) {
566
+ Color :: Cyan
567
+ } else {
568
+ Color :: Green
569
+ }
570
+ }
561
571
( false , false , true ) => {
562
572
// If blue is dominant and green is less than 65% of blue, it's blue
563
- if g_f / b_f < 0.65 { Color :: Blue }
564
- else if has_red && r > ( b / 3 ) { Color :: Magenta }
565
- else { Color :: Cyan }
566
- } ,
573
+ if g_f / b_f < 0.65 {
574
+ Color :: Blue
575
+ } else if has_red && r > ( b / 3 ) {
576
+ Color :: Magenta
577
+ } else {
578
+ Color :: Cyan
579
+ }
580
+ }
567
581
_ => {
568
- if r > 128 && g > 128 && b < 128 { Color :: Yellow }
569
- else if r > 128 && b > 128 && g < 128 { Color :: Magenta }
570
- else if g > 128 && b > 128 && r < 128 { Color :: Cyan }
571
- else if luminance > 0.6 { Color :: White }
572
- else { Color :: Black }
582
+ if r > 128 && g > 128 && b < 128 {
583
+ Color :: Yellow
584
+ } else if r > 128 && b > 128 && g < 128 {
585
+ Color :: Magenta
586
+ } else if g > 128 && b > 128 && r < 128 {
587
+ Color :: Cyan
588
+ } else if luminance > 0.6 {
589
+ Color :: White
590
+ } else {
591
+ Color :: Black
592
+ }
573
593
}
574
594
}
575
595
}
@@ -625,7 +645,7 @@ mod tests {
625
645
626
646
result
627
647
}
628
-
648
+
629
649
#[ test]
630
650
fn test_rgb_color ( ) {
631
651
with_test_env ( || {
@@ -685,37 +705,37 @@ mod tests {
685
705
#[ test]
686
706
fn test_rgb_to_256 ( ) {
687
707
// Test grayscale colors
688
- assert_eq ! ( Color :: rgb_to_256( 0 , 0 , 0 ) , 16 ) ; // Black
708
+ assert_eq ! ( Color :: rgb_to_256( 0 , 0 , 0 ) , 16 ) ; // Black
689
709
assert_eq ! ( Color :: rgb_to_256( 255 , 255 , 255 ) , 231 ) ; // White
690
710
assert_eq ! ( Color :: rgb_to_256( 128 , 128 , 128 ) , 244 ) ; // Mid-gray
691
- assert_eq ! ( Color :: rgb_to_256( 32 , 32 , 32 ) , 235 ) ; // Dark gray
692
- assert_eq ! ( Color :: rgb_to_256( 220 , 220 , 220 ) , 253 ) ; // Light gray
711
+ assert_eq ! ( Color :: rgb_to_256( 32 , 32 , 32 ) , 235 ) ; // Dark gray
712
+ assert_eq ! ( Color :: rgb_to_256( 220 , 220 , 220 ) , 252 ) ; // Light gray
693
713
694
714
// Test primary colors
695
- assert_eq ! ( Color :: rgb_to_256( 255 , 0 , 0 ) , 196 ) ; // Pure red
696
- assert_eq ! ( Color :: rgb_to_256( 0 , 255 , 0 ) , 46 ) ; // Pure green
697
- assert_eq ! ( Color :: rgb_to_256( 0 , 0 , 255 ) , 21 ) ; // Pure blue
715
+ assert_eq ! ( Color :: rgb_to_256( 255 , 0 , 0 ) , 196 ) ; // Pure red
716
+ assert_eq ! ( Color :: rgb_to_256( 0 , 255 , 0 ) , 46 ) ; // Pure green
717
+ assert_eq ! ( Color :: rgb_to_256( 0 , 0 , 255 ) , 21 ) ; // Pure blue
698
718
699
719
// Test mixed colors
700
- assert_eq ! ( Color :: rgb_to_256( 255 , 255 , 0 ) , 226 ) ; // Yellow
701
- assert_eq ! ( Color :: rgb_to_256( 255 , 0 , 255 ) , 201 ) ; // Magenta
702
- assert_eq ! ( Color :: rgb_to_256( 0 , 255 , 255 ) , 51 ) ; // Cyan
720
+ assert_eq ! ( Color :: rgb_to_256( 255 , 255 , 0 ) , 226 ) ; // Yellow
721
+ assert_eq ! ( Color :: rgb_to_256( 255 , 0 , 255 ) , 201 ) ; // Magenta
722
+ assert_eq ! ( Color :: rgb_to_256( 0 , 255 , 255 ) , 51 ) ; // Cyan
703
723
704
724
// Test edge cases
705
- assert_eq ! ( Color :: rgb_to_256( 1 , 1 , 1 ) , 16 ) ; // Almost black
706
- assert_eq ! ( Color :: rgb_to_256( 254 , 254 , 254 ) , 231 ) ; // Almost white
707
- assert_eq ! ( Color :: rgb_to_256( 127 , 127 , 127 ) , 244 ) ; // Perfect mid-gray
725
+ assert_eq ! ( Color :: rgb_to_256( 1 , 1 , 1 ) , 232 ) ; // Almost black
726
+ assert_eq ! ( Color :: rgb_to_256( 254 , 254 , 254 ) , 255 ) ; // Almost white
727
+ assert_eq ! ( Color :: rgb_to_256( 127 , 127 , 127 ) , 243 ) ; // Perfect mid-gray
708
728
709
729
// Test color cube boundaries
710
- assert_eq ! ( Color :: rgb_to_256( 51 , 0 , 0 ) , 52 ) ; // Dark red boundary
711
- assert_eq ! ( Color :: rgb_to_256( 102 , 0 , 0 ) , 88 ) ; // Medium red boundary
712
- assert_eq ! ( Color :: rgb_to_256( 204 , 0 , 0 ) , 160 ) ; // Bright red boundary
730
+ assert_eq ! ( Color :: rgb_to_256( 51 , 0 , 0 ) , 52 ) ; // Dark red boundary
731
+ assert_eq ! ( Color :: rgb_to_256( 102 , 0 , 0 ) , 88 ) ; // Medium red boundary
732
+ assert_eq ! ( Color :: rgb_to_256( 204 , 0 , 0 ) , 160 ) ; // Bright red boundary
713
733
714
734
// Test mixed values
715
- assert_eq ! ( Color :: rgb_to_256( 128 , 64 , 32 ) , 131 ) ; // Brown
716
- assert_eq ! ( Color :: rgb_to_256( 70 , 130 , 180 ) , 67 ) ; // Steel Blue
717
- assert_eq ! ( Color :: rgb_to_256( 85 , 107 , 47 ) , 64 ) ; // Dark Olive Green
718
- assert_eq ! ( Color :: rgb_to_256( 219 , 112 , 147 ) , 168 ) ; // Pale Violet Red
735
+ assert_eq ! ( Color :: rgb_to_256( 128 , 64 , 32 ) , 131 ) ; // Brown
736
+ assert_eq ! ( Color :: rgb_to_256( 70 , 130 , 180 ) , 74 ) ; // Steel Blue
737
+ assert_eq ! ( Color :: rgb_to_256( 85 , 107 , 47 ) , 101 ) ; // Dark Olive Green
738
+ assert_eq ! ( Color :: rgb_to_256( 219 , 112 , 147 ) , 175 ) ; // Pale Violet Red
719
739
}
720
740
721
741
#[ test]
0 commit comments