From e50d0b6fc19fe7555651166b73aff9c3703ef11a Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Tue, 12 Feb 2019 10:11:30 +0100 Subject: [PATCH] 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'. --- runtime/doc/ui.txt | 1 + src/nvim/highlight.c | 65 ++++----------------------- 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; + int r = (rgb & 0xFF0000) >> 16; + int g = (rgb & 0x00FF00) >> 8; + int b = (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; - - // 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') + 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)