@@ -466,6 +466,209 @@ function! quickui#palette#blend(c1, c2, alpha)
466
466
endfunc
467
467
468
468
469
+ " ----------------------------------------------------------------------
470
+ " palette search in desert256
471
+ " ----------------------------------------------------------------------
472
+
473
+ " returns an approximate grey index for the given grey level
474
+ function ! s: grey_number (x )
475
+ if &t_Co == 88
476
+ if a: x < 23
477
+ return 0
478
+ elseif a: x < 69
479
+ return 1
480
+ elseif a: x < 103
481
+ return 2
482
+ elseif a: x < 127
483
+ return 3
484
+ elseif a: x < 150
485
+ return 4
486
+ elseif a: x < 173
487
+ return 5
488
+ elseif a: x < 196
489
+ return 6
490
+ elseif a: x < 219
491
+ return 7
492
+ elseif a: x < 243
493
+ return 8
494
+ else
495
+ return 9
496
+ endif
497
+ else
498
+ if a: x < 14
499
+ return 0
500
+ else
501
+ let l: n = (a: x - 8 ) / 10
502
+ let l: m = (a: x - 8 ) % 10
503
+ if l: m < 5
504
+ return l: n
505
+ else
506
+ return l: n + 1
507
+ endif
508
+ endif
509
+ endif
510
+ endfunc
511
+
512
+ " returns the actual grey level represented by the grey index
513
+ function ! s: grey_level (n )
514
+ if &t_Co == 88
515
+ if a: n == 0
516
+ return 0
517
+ elseif a: n == 1
518
+ return 46
519
+ elseif a: n == 2
520
+ return 92
521
+ elseif a: n == 3
522
+ return 115
523
+ elseif a: n == 4
524
+ return 139
525
+ elseif a: n == 5
526
+ return 162
527
+ elseif a: n == 6
528
+ return 185
529
+ elseif a: n == 7
530
+ return 208
531
+ elseif a: n == 8
532
+ return 231
533
+ else
534
+ return 255
535
+ endif
536
+ else
537
+ if a: n == 0
538
+ return 0
539
+ else
540
+ return 8 + (a: n * 10 )
541
+ endif
542
+ endif
543
+ endfunc
544
+
545
+ " returns the palette index for the given grey index
546
+ function ! s: grey_color (n )
547
+ if &t_Co == 88
548
+ if a: n == 0
549
+ return 16
550
+ elseif a: n == 9
551
+ return 79
552
+ else
553
+ return 79 + a: n
554
+ endif
555
+ else
556
+ if a: n == 0
557
+ return 16
558
+ elseif a: n == 25
559
+ return 231
560
+ else
561
+ return 231 + a: n
562
+ endif
563
+ endif
564
+ endfunc
565
+
566
+ " returns an approximate color index for the given color level
567
+ function ! s: rgb_number (x )
568
+ if &t_Co == 88
569
+ if a: x < 69
570
+ return 0
571
+ elseif a: x < 172
572
+ return 1
573
+ elseif a: x < 230
574
+ return 2
575
+ else
576
+ return 3
577
+ endif
578
+ else
579
+ if a: x < 75
580
+ return 0
581
+ else
582
+ let l: n = (a: x - 55 ) / 40
583
+ let l: m = (a: x - 55 ) % 40
584
+ if l: m < 20
585
+ return l: n
586
+ else
587
+ return l: n + 1
588
+ endif
589
+ endif
590
+ endif
591
+ endfunc
592
+
593
+ " returns the actual color level for the given color index
594
+ function ! s: rgb_level (n )
595
+ if &t_Co == 88
596
+ if a: n == 0
597
+ return 0
598
+ elseif a: n == 1
599
+ return 139
600
+ elseif a: n == 2
601
+ return 205
602
+ else
603
+ return 255
604
+ endif
605
+ else
606
+ if a: n == 0
607
+ return 0
608
+ else
609
+ return 55 + (a: n * 40 )
610
+ endif
611
+ endif
612
+ endfunc
613
+
614
+ " returns the palette index for the given R/G/B color indices
615
+ function ! s: rgb_color (x , y , z)
616
+ if &t_Co == 88
617
+ return 16 + (a: x * 16 ) + (a: y * 4 ) + a: z
618
+ else
619
+ return 16 + (a: x * 36 ) + (a: y * 6 ) + a: z
620
+ endif
621
+ endfunc
622
+
623
+ " returns the palette index to approximate the given R/G/B color levels
624
+ function ! quickui#palette#color_match (r , g , b )
625
+ " get the closest grey
626
+ let l: gx = s: grey_number (a: r )
627
+ let l: gy = s: grey_number (a: g )
628
+ let l: gz = s: grey_number (a: b )
629
+
630
+ " get the closest color
631
+ let l: x = s: rgb_number (a: r )
632
+ let l: y = s: rgb_number (a: g )
633
+ let l: z = s: rgb_number (a: b )
634
+
635
+ if l: gx == l: gy && l: gy == l: gz
636
+ " there are two possibilities
637
+ let l: dgr = s: grey_level (l: gx ) - a: r
638
+ let l: dgg = s: grey_level (l: gy ) - a: g
639
+ let l: dgb = s: grey_level (l: gz ) - a: b
640
+ let l: dgrey = (l: dgr * l: dgr ) + (l: dgg * l: dgg ) + (l: dgb * l: dgb )
641
+ let l: dr = s: rgb_level (l: gx ) - a: r
642
+ let l: dg = s: rgb_level (l: gy ) - a: g
643
+ let l: db = s: rgb_level (l: gz ) - a: b
644
+ let l: drgb = (l: dr * l: dr ) + (l: dg * l: dg ) + (l: db * l: db )
645
+ if l: dgrey < l: drgb
646
+ " use the grey
647
+ return s: grey_color (l: gx )
648
+ else
649
+ " use the color
650
+ return s: rgb_color (l: x , l: y , l: z )
651
+ endif
652
+ else
653
+ " only one possibility
654
+ return s: rgb_color (l: x , l: y , l: z )
655
+ endif
656
+ endfun
657
+
658
+ function ! quickui#palette#rgb_match (rgb) abort
659
+ if a: rgb = ~ ' ^#'
660
+ let r = (" 0x" . strpart (a: rgb , 1 , 2 )) + 0
661
+ let g = (" 0x" . strpart (a: rgb , 3 , 2 )) + 0
662
+ let b = (" 0x" . strpart (a: rgb , 5 , 2 )) + 0
663
+ else
664
+ let r = (" 0x" . strpart (a: rgb , 0 , 2 )) + 0
665
+ let g = (" 0x" . strpart (a: rgb , 2 , 2 )) + 0
666
+ let b = (" 0x" . strpart (a: rgb , 4 , 2 )) + 0
667
+ endif
668
+ return quickui#palette#color_match (r , g , b )
669
+ endfunc
670
+
671
+
469
672
" ----------------------------------------------------------------------
470
673
" benchmark
471
674
" ----------------------------------------------------------------------
0 commit comments