@@ -466,6 +466,209 @@ function! quickui#palette#blend(c1, c2, alpha)
466466endfunc
467467
468468
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+
469672" ----------------------------------------------------------------------
470673" benchmark
471674" ----------------------------------------------------------------------
0 commit comments