Skip to content

Commit 333d541

Browse files
author
skywind3000
committed
update palette.vim
1 parent 1e02a2f commit 333d541

File tree

1 file changed

+203
-0
lines changed

1 file changed

+203
-0
lines changed

autoload/quickui/palette.vim

Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,209 @@ function! quickui#palette#blend(c1, c2, alpha)
466466
endfunc
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

Comments
 (0)