diff options
author | Justin M. Keyes <justinkz@gmail.com> | 2019-02-12 10:11:30 +0100 |
---|---|---|
committer | Justin M. Keyes <justinkz@gmail.com> | 2019-02-12 10:11:30 +0100 |
commit | e50d0b6fc19fe7555651166b73aff9c3703ef11a (patch) | |
tree | 84424f03bc722d2ce3b695132dc5a4b8a1d3b02d | |
parent | c5173230f065d68fe261443a420fc87bd633c8e8 (diff) | |
download | rneovim-e50d0b6fc19fe7555651166b73aff9c3703ef11a.tar.gz rneovim-e50d0b6fc19fe7555651166b73aff9c3703ef11a.tar.bz2 rneovim-e50d0b6fc19fe7555651166b73aff9c3703ef11a.zip |
UI: change implementation of hl_rgb2cterm_color()
Replace the implementation cargo-culted from Vim's source with something
simpler which "seems to look better" with 'pumblend'.
-rw-r--r-- | runtime/doc/ui.txt | 1 | ||||
-rw-r--r-- | src/nvim/highlight.c | 65 | ||||
-rw-r--r-- | test/functional/ui/popupmenu_spec.lua | 39 |
3 files changed, 47 insertions, 58 deletions
diff --git a/runtime/doc/ui.txt b/runtime/doc/ui.txt index 84a24ef2a1..77a829b150 100644 --- a/runtime/doc/ui.txt +++ b/runtime/doc/ui.txt @@ -160,6 +160,7 @@ the editor. 'guifontset' 'guifontwide' 'linespace' + 'pumblend' 'showtabline' 'termguicolors' "ext_*" (all |ui-ext-options|) diff --git a/src/nvim/highlight.c b/src/nvim/highlight.c index 7b1ec308dc..4c5fca6d39 100644 --- a/src/nvim/highlight.c +++ b/src/nvim/highlight.c @@ -410,58 +410,13 @@ static int cterm_blend(int ratio, int c1, int c2) } /// Converts RGB color to 8-bit color (0-255). -/// Reverse engineer the RGB value into a cterm color index. -/// First color is 1. Return 0 if no match found (default color). static int hl_rgb2cterm_color(int rgb) { - int red = (rgb & 0xFF0000) >> 16; - int green = (rgb & 0x00FF00) >> 8; - int blue = (rgb & 0x0000FF) >> 0; - - if (red == blue && red == green) { - // 24-color greyscale plus white and black. - static int cutoff[23] = { - 0x0D, 0x17, 0x21, 0x2B, 0x35, 0x3F, 0x49, 0x53, 0x5D, 0x67, - 0x71, 0x7B, 0x85, 0x8F, 0x99, 0xA3, 0xAD, 0xB7, 0xC1, 0xCB, - 0xD5, 0xDF, 0xE9}; - int i; - - if (red < 5) { - return 17; // 00/00/00 - } - if (red > 245) { // ff/ff/ff - return 232; - } - for (i = 0; i < 23; ++i) { - if (red < cutoff[i]) { - return i + 233; - } - } - return 256; - } - { - static int cutoff[5] = {0x2F, 0x73, 0x9B, 0xC3, 0xEB}; - int ri, gi, bi; + int r = (rgb & 0xFF0000) >> 16; + int g = (rgb & 0x00FF00) >> 8; + int b = (rgb & 0x0000FF) >> 0; - // 216-color cube. - for (ri = 0; ri < 5; ++ri) { - if (red < cutoff[ri]) { - break; - } - } - for (gi = 0; gi < 5; ++gi) { - if (green < cutoff[gi]) { - break; - } - } - for (bi = 0; bi < 5; ++bi) { - if (blue < cutoff[bi]) { - break; - } - } - return 17 + ri * 36 + gi * 6 + bi; - } - return 0; + return (r * 6 / 256) * 36 + (g * 6 / 256) * 6 + (b * 6 / 256); } /// Converts 8-bit color (0-255) to RGB color. @@ -496,10 +451,11 @@ static int hl_cterm2rgb_color(int nr) { 255, 255, 255, 16 } , // white }; - int r; - int g; - int b; + int r = 0; + int g = 0; + int b = 0; int idx; + // *ansi_idx = 0; if (nr < 16) { r = ansi_table[nr][0]; @@ -518,11 +474,6 @@ static int hl_cterm2rgb_color(int nr) g = grey_ramp[idx]; b = grey_ramp[idx]; // *ansi_idx = -1; - } else { - r = 0; - g = 0; - b = 0; - // *ansi_idx = 0; } return (r << 16) + (g << 8) + b; } diff --git a/test/functional/ui/popupmenu_spec.lua b/test/functional/ui/popupmenu_spec.lua index 62428c9657..9a8c5a5789 100644 --- a/test/functional/ui/popupmenu_spec.lua +++ b/test/functional/ui/popupmenu_spec.lua @@ -1273,7 +1273,7 @@ describe('builtin popupmenu', function() ]]) end) - it('works with pumblend', function() + it("'pumblend' RGB-color", function() screen:try_resize(60,14) screen:set_default_attr_ids({ [1] = {background = Screen.colors.Yellow}, @@ -1448,4 +1448,41 @@ describe('builtin popupmenu', function() {20:-- INSERT --} | ]]) end) + + it("'pumblend' 256-color (non-RGB)", function() + screen:detach() + screen = Screen.new(60, 8) + screen:attach({rgb=false, ext_popupmenu=false}) + screen:set_default_attr_ids({ + [1] = {foreground = Screen.colors.Grey0, background = tonumber('0x000007')}, + [2] = {foreground = tonumber('0x000055'), background = tonumber('0x000007')}, + [3] = {foreground = tonumber('0x00008f'), background = Screen.colors.Grey0}, + [4] = {foreground = Screen.colors.Grey0, background = tonumber('0x0000e1')}, + [5] = {foreground = tonumber('0x0000d1'), background = tonumber('0x0000e1')}, + [6] = {foreground = Screen.colors.NavyBlue, background = tonumber('0x0000f8')}, + [7] = {foreground = tonumber('0x0000a5'), background = tonumber('0x0000f8')}, + [8] = {foreground = tonumber('0x00000c')}, + [9] = {bold = true}, + [10] = {foreground = tonumber('0x000002')}, + }) + command('set notermguicolors pumblend=10') + insert([[ + Lorem ipsum dolor sit amet, consectetur + adipisicing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. + Ut enim ad minim veniam, quis nostrud + laborum.]]) + + feed('ggOdo<c-x><c-n>') + screen:expect([[ + dolor^ | + {1:dolor}{2: ipsum dol}or sit amet, consectetur | + {4:do}{5:ipisicing eli}t, sed do eiusmod tempor | + {4:dolore}{5:dunt ut l}abore et dolore magna aliqua. | + Ut enim ad minim veniam, quis nostrud | + laborum. | + {8:~ }| + {9:-- Keyword Local completion (^N^P) }{10:match 1 of 3} | + ]]) + end) end) |