[vte] widget: Make dim color handling more xterm-like



commit 2e64b768924ab7cdbd263e2141086652c6128740
Author: Egmont Koblinger <egmont gmail com>
Date:   Mon Aug 25 22:33:41 2014 +0200

    widget: Make dim color handling more xterm-like
    
    https://bugzilla.gnome.org/show_bug.cgi?id=735245

 doc/reference/vte-sections.txt |    1 -
 perf/256test.sh                |   73 +++++++++++++++++++++++++++++++++++
 perf/Makefile.am               |    1 +
 src/vte-private.h              |    8 +++-
 src/vte.c                      |   83 +++++++++-------------------------------
 src/vterowdata.h               |   11 ++---
 src/vteseq.c                   |    6 +--
 src/vteterminal.h              |    2 -
 8 files changed, 105 insertions(+), 80 deletions(-)
---
diff --git a/doc/reference/vte-sections.txt b/doc/reference/vte-sections.txt
index 0f8e39c..1633aa2 100644
--- a/doc/reference/vte-sections.txt
+++ b/doc/reference/vte-sections.txt
@@ -33,7 +33,6 @@ vte_terminal_get_rewrap_on_resize
 vte_terminal_set_color_bold
 vte_terminal_set_color_foreground
 vte_terminal_set_color_background
-vte_terminal_set_color_dim
 vte_terminal_set_color_cursor
 vte_terminal_set_color_highlight
 vte_terminal_set_color_highlight_foreground
diff --git a/perf/256test.sh b/perf/256test.sh
new file mode 100755
index 0000000..53b8d7f
--- /dev/null
+++ b/perf/256test.sh
@@ -0,0 +1,73 @@
+#!/usr/bin/env bash
+
+# Test 256 color support along with bold and dim attributes.
+# Copyright (C) 2014  Egmont Koblinger
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+format_number() {
+  local c=$'\u254F'
+  if [ $1 -lt 10 ]; then
+    printf "$c %d" $1
+  else
+    printf "$c%02d" $(($1%100))
+  fi
+}
+
+somecolors() {
+  local from="$1"
+  local to="$2"
+  local prefix="$3"
+  local line
+
+  for line in \
+      "\e[2mdim      " \
+      "normal   " \
+      "\e[1mbold     " \
+      "\e[1;2mbold+dim "; do
+    echo -ne "$line"
+    i=$from
+    while [ $i -le $to ]; do
+      echo -ne "\e[$prefix${i}m"
+      format_number $i
+      i=$((i+1))
+    done
+    echo $'\e[0m\e[K'
+  done
+}
+
+allcolors() {
+  echo "-- 8 standard colors: SGR ${1}0..${1}7 --"
+  somecolors 0 7 "$1"
+  echo
+  echo "-- 8 bright colors: SGR ${2}0..${2}7 --"
+  somecolors 0 7 "$2"
+  echo
+  echo "-- 256 colors: SGR ${1}8;5;0..255 --"
+  somecolors 0 15 "${1}8;5;"
+  echo
+  somecolors  16  51 "${1}8;5;"
+  somecolors  52  87 "${1}8;5;"
+  somecolors  88 123 "${1}8;5;"
+  somecolors 124 159 "${1}8;5;"
+  somecolors 160 195 "${1}8;5;"
+  somecolors 196 231 "${1}8;5;"
+  echo
+  somecolors 232 255 "${1}8;5;"
+}
+
+allcolors 3 9
+echo
+allcolors 4 10
diff --git a/perf/Makefile.am b/perf/Makefile.am
index 35ba00d..a5d6843 100644
--- a/perf/Makefile.am
+++ b/perf/Makefile.am
@@ -1,4 +1,5 @@
 EXTRA_DIST = \
+       256test.sh \
        UTF-8-demo.txt \
        img.sh \
        inc.sh \
diff --git a/src/vte-private.h b/src/vte-private.h
index fc6a570..a53cbee 100644
--- a/src/vte-private.h
+++ b/src/vte-private.h
@@ -63,7 +63,7 @@ G_BEGIN_DECLS
  *   Colors set by SGR 256-color extension (38/48;5;index).
  *   These are direct indices into the color palette.
  *
- * 256 .. VTE_PALETTE_SIZE - 1 (262):
+ * 256 .. VTE_PALETTE_SIZE - 1 (261):
  *   Special values, such as default colors.
  *   These are direct indices into the color palette.
  *
@@ -71,6 +71,10 @@ G_BEGIN_DECLS
  *   Colors set by legacy escapes (30..37/40..47, 90..97/100..107).
  *   These are translated to 0 .. 15 before looking up in the palette, taking bold into account.
  *
+ * VTE_DIM_COLORS (2^10) .. :
+ *   Dimmed version of the above, for foreground colors.
+ *   Cell attributes can't have these colors.
+ *
  * VTE_RGB_COLOR (2^24) .. VTE_RGB_COLOR + 16Mi - 1 (2^25 - 1):
  *   Colors set by SGR truecolor extension (38/48;2;red;green;blue)
  *   These are direct RGB values.
@@ -80,7 +84,7 @@ G_BEGIN_DECLS
 #define VTE_LEGACY_FULL_COLOR_SET_SIZE 16
 #define VTE_COLOR_PLAIN_OFFSET         0
 #define VTE_COLOR_BRIGHT_OFFSET                8
-#define VTE_COLOR_DIM_OFFSET           16
+#define VTE_DIM_COLOR                  (1 << 10)
 #define VTE_RGB_COLOR                  (1 << 24)
 /* More color defines in vterowdata.h */
 
diff --git a/src/vte.c b/src/vte.c
index 2183ce7..ede3a93 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -289,10 +289,6 @@ G_DEFINE_TYPE_WITH_CODE(VteTerminal, vte_terminal, GTK_TYPE_WIDGET,
                         G_IMPLEMENT_INTERFACE(GTK_TYPE_SCROLLABLE, NULL))
 #endif
 
-/* Indexes in the "palette" color array for the dim colors.
- * Only the first %VTE_LEGACY_COLOR_SET_SIZE colors have dim versions.  */
-static const guchar corresponding_dim_index[] = {16,88,28,100,18,90,30,102};
-
 static void
 vte_g_array_fill(GArray *array, gconstpointer item, guint final_size)
 {
@@ -2389,23 +2385,6 @@ _vte_terminal_set_color_bold(VteTerminal *terminal,
 }
 
 /*
- * _vte_terminal_set_color_dim:
- * @terminal: a #VteTerminal
- * @dim: the new dim color
- *
- * Sets the color used to draw dim text in the default foreground color.
- */
-static void
-_vte_terminal_set_color_dim(VteTerminal *terminal,
-                            const PangoColor *dim)
-{
-       _vte_debug_print(VTE_DEBUG_MISC,
-                       "Set dim color to (%04x,%04x,%04x).\n",
-                       dim->red, dim->green, dim->blue);
-       _vte_terminal_set_color_internal(terminal, VTE_DIM_FG, VTE_COLOR_SOURCE_API, dim);
-}
-
-/*
  * _vte_terminal_set_color_foreground:
  * @terminal: a #VteTerminal
  * @foreground: the new foreground color
@@ -2642,12 +2621,6 @@ _vte_terminal_set_colors(VteTerminal *terminal,
                                                           1.8,
                                                           &color);
                                break;
-                       case VTE_DIM_FG:
-                               vte_terminal_generate_bold(_vte_terminal_get_color(terminal, VTE_DEFAULT_FG),
-                                                          _vte_terminal_get_color(terminal, VTE_DEFAULT_BG),
-                                                          0.5,
-                                                          &color);
-                               break;
                        case VTE_HIGHLIGHT_BG:
                                unset = TRUE;
                                break;
@@ -2715,37 +2688,6 @@ vte_terminal_set_color_bold(VteTerminal *terminal,
 }
 
 /**
- * vte_terminal_set_color_dim:
- * @terminal: a #VteTerminal
- * @dim: (allow-none): the new dim color or %NULL
- *
- * Sets the color used to draw dim text in the default foreground color.
- * If @dim is %NULL then the default color is used.
- */
-void
-vte_terminal_set_color_dim(VteTerminal *terminal,
-                                const GdkRGBA *dim)
-{
-       PangoColor color;
-
-        g_return_if_fail(VTE_IS_TERMINAL(terminal));
-
-       if (dim == NULL)
-       {
-               vte_terminal_generate_bold(_vte_terminal_get_color(terminal, VTE_DEFAULT_FG),
-                                          _vte_terminal_get_color(terminal, VTE_DEFAULT_BG),
-                                          0.5,
-                                          &color);
-       }
-       else
-       {
-               _pango_color_from_rgba(&color, dim);
-       }
-
-       _vte_terminal_set_color_dim(terminal, &color);
-}
-
-/**
  * vte_terminal_set_color_foreground:
  * @terminal: a #VteTerminal
  * @foreground: the new foreground color
@@ -5904,10 +5846,22 @@ vte_terminal_copy_cb(GtkClipboard *clipboard, GtkSelectionData *data,
 static void
 vte_terminal_get_rgb_from_index(const VteTerminal *terminal, guint index, PangoColor *color)
 {
+        gboolean dim = FALSE;
+        if (!(index & VTE_RGB_COLOR) && (index & VTE_DIM_COLOR)) {
+                index &= ~VTE_DIM_COLOR;
+                dim = TRUE;
+        }
+
        if (index >= VTE_LEGACY_COLORS_OFFSET && index < VTE_LEGACY_COLORS_OFFSET + 
VTE_LEGACY_FULL_COLOR_SET_SIZE)
                index -= VTE_LEGACY_COLORS_OFFSET;
        if (index < VTE_PALETTE_SIZE) {
                memcpy(color, _vte_terminal_get_color(terminal, index), sizeof(PangoColor));
+                if (dim) {
+                        /* magic formula taken from xterm */
+                        color->red = color->red * 2 / 3;
+                        color->green = color->green * 2 / 3;
+                        color->blue = color->blue * 2 / 3;
+                }
        } else if (index & VTE_RGB_COLOR) {
                color->red = ((index >> 16) & 0xFF) * 257;
                color->green = ((index >> 8) & 0xFF) * 257;
@@ -8729,13 +8683,12 @@ vte_terminal_determine_colors_internal(VteTerminal *terminal,
                }
        }
 
-       /* Handle half similarly */
-       if (cell->attr.half) {
-               if (fore == VTE_DEFAULT_FG)
-                       fore = VTE_DIM_FG;
-               else if (fore >= VTE_LEGACY_COLORS_OFFSET && fore < VTE_LEGACY_COLORS_OFFSET + 
VTE_LEGACY_COLOR_SET_SIZE)
-                       fore = corresponding_dim_index[fore - VTE_LEGACY_COLORS_OFFSET];
-       }
+        /* Handle dim colors.  Only apply to palette colors, dimming direct RGB wouldn't make sense.
+         * Apply to the foreground color only, but do this before handling reverse/highlight so that
+         * those can be used to dim the background instead. */
+        if (cell->attr.dim && !(fore & VTE_RGB_COLOR)) {
+               fore |= VTE_DIM_COLOR;
+        }
 
        /* Reverse cell? */
        if (cell->attr.reverse) {
diff --git a/src/vterowdata.h b/src/vterowdata.h
index aed9412..7c58066 100644
--- a/src/vterowdata.h
+++ b/src/vterowdata.h
@@ -32,11 +32,10 @@ G_BEGIN_DECLS
 #define VTE_DEFAULT_FG                 256
 #define VTE_DEFAULT_BG                 257
 #define VTE_BOLD_FG                    258
-#define VTE_DIM_FG                     259
-#define VTE_HIGHLIGHT_FG               260
-#define VTE_HIGHLIGHT_BG               261
-#define VTE_CURSOR_BG                  262
-#define VTE_PALETTE_SIZE               263
+#define VTE_HIGHLIGHT_FG               259
+#define VTE_HIGHLIGHT_BG               260
+#define VTE_CURSOR_BG                  261
+#define VTE_PALETTE_SIZE               262
 
 /*
  * VteCellAttr: A single cell style attributes
@@ -64,7 +63,7 @@ typedef struct _VteCellAttr {
 
        guint64 reverse: 1;
        guint64 blink: 1;
-       guint64 half: 1;
+       guint64 dim: 1;         /* also known as faint, half intensity etc. */
 
        guint64 invisible: 1;
         /* 1 bit unused */
diff --git a/src/vteseq.c b/src/vteseq.c
index c354cfc..3f7b598 100644
--- a/src/vteseq.c
+++ b/src/vteseq.c
@@ -1974,11 +1974,9 @@ vte_sequence_handler_character_attributes (VteTerminal *terminal, GValueArray *p
                        break;
                case 1:
                        terminal->pvt->screen->defaults.attr.bold = 1;
-                       terminal->pvt->screen->defaults.attr.half = 0;
                        break;
                case 2:
-                       terminal->pvt->screen->defaults.attr.half = 1;
-                       terminal->pvt->screen->defaults.attr.bold = 0;
+                       terminal->pvt->screen->defaults.attr.dim = 1;
                        break;
                case 3:
                        terminal->pvt->screen->defaults.attr.italic = 1;
@@ -2001,7 +1999,7 @@ vte_sequence_handler_character_attributes (VteTerminal *terminal, GValueArray *p
                case 21: /* Error in old versions of linux console. */
                case 22: /* ECMA 48. */
                        terminal->pvt->screen->defaults.attr.bold = 0;
-                       terminal->pvt->screen->defaults.attr.half = 0;
+                       terminal->pvt->screen->defaults.attr.dim = 0;
                        break;
                case 23:
                        terminal->pvt->screen->defaults.attr.italic = 0;
diff --git a/src/vteterminal.h b/src/vteterminal.h
index 8ec803c..7e36708 100644
--- a/src/vteterminal.h
+++ b/src/vteterminal.h
@@ -197,8 +197,6 @@ gboolean vte_terminal_get_rewrap_on_resize(VteTerminal *terminal) _VTE_GNUC_NONN
 /* Set the color scheme. */
 void vte_terminal_set_color_bold(VteTerminal *terminal,
                                  const GdkRGBA *bold) _VTE_GNUC_NONNULL(1);
-void vte_terminal_set_color_dim(VteTerminal *terminal,
-                                const GdkRGBA *dim) _VTE_GNUC_NONNULL(1);
 void vte_terminal_set_color_foreground(VteTerminal *terminal,
                                        const GdkRGBA *foreground) _VTE_GNUC_NONNULL(1) _VTE_GNUC_NONNULL(2);
 void vte_terminal_set_color_background(VteTerminal *terminal,


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]