From 25d0366fe69e12bddbcd61c9af5b09a45ed35c11 Mon Sep 17 00:00:00 2001
From: Sam Hocevar <sam@hocevar.net>
Date: Sat, 11 Nov 2006 08:44:14 +0000
Subject: [PATCH]   * Get rid of _cucul_attr_to_ansi4[fb]g() and replace all
 calls with     the now official cucul_attr_to_ansi_[fb]g().

---
 caca/driver_slang.c | 10 ++++++++--
 caca/driver_win32.c |  7 ++++---
 cucul/attr.c        | 20 --------------------
 cucul/export.c      | 28 +++++++++++++++-------------
 4 files changed, 27 insertions(+), 38 deletions(-)

diff --git a/caca/driver_slang.c b/caca/driver_slang.c
index 189e920..93e31fe 100644
--- a/caca/driver_slang.c
+++ b/caca/driver_slang.c
@@ -217,8 +217,14 @@ static void slang_display(caca_display_t *dp)
              * here for, and in cases where SLang does not render
              * bright backgrounds, it's just fucked up. */
 #if 0
-            uint8_t fgcolor = _cucul_attr_to_ansi4fg(*attrs);
-            uint8_t bgcolor = _cucul_attr_to_ansi4bg(*attrs);
+            uint8_t fgcolor = cucul_attr_to_ansi_fg(*attrs);
+            uint8_t bgcolor = cucul_attr_to_ansi_bg(*attrs);
+
+            if(fgcolor >= 0x10)
+                fgcolor = CUCUL_LIGHTGRAY;
+
+            if(bgcolor >= 0x10)
+                bgcolor = CUCUL_BLACK; /* FIXME: handle transparency */
 
             if(fgcolor == bgcolor)
             {
diff --git a/caca/driver_win32.c b/caca/driver_win32.c
index e4b6cb0..fca0d1c 100644
--- a/caca/driver_win32.c
+++ b/caca/driver_win32.c
@@ -198,6 +198,8 @@ static void win32_display(caca_display_t *dp)
     for(n = dp->cv->height * dp->cv->width; n--; )
     {
         uint32_t ch = *chars++;
+        uint8_t fg = cucul_attr_to_ansi_fg(*attrs);
+        uint8_t bg = cucul_attr_to_ansi_bg(*attrs);
 
 #if 0
         if(ch > 0x00000020 && ch < 0x00000080)
@@ -213,9 +215,8 @@ static void win32_display(caca_display_t *dp)
             buffer->Char.UnicodeChar = (uint16_t)' ';
 #endif
 
-        buffer->Attributes =
-                win32_fg_palette[_cucul_attr_to_ansi4fg(*attrs)]
-                 | win32_bg_palette[_cucul_attr_to_ansi4bg(*attrs)];
+        buffer->Attributes = win32_fg_palette[fg < 0x10 ? fg : CUCUL_LIGHTGRAY]
+                              | win32_bg_palette[bg < 0x10 ? bg : CUCUL_BLACK];
         attrs++;
         buffer++;
     }
diff --git a/cucul/attr.c b/cucul/attr.c
index 4f0ed0b..1f67887 100644
--- a/cucul/attr.c
+++ b/cucul/attr.c
@@ -350,26 +350,6 @@ uint8_t _cucul_attr_to_ansi8(uint32_t attr)
     return fg | (bg << 4);
 }
 
-uint8_t _cucul_attr_to_ansi4fg(uint32_t attr)
-{
-    uint8_t c = nearest_ansi((attr >> 4) & 0x3fff);
-
-    if(c == CUCUL_DEFAULT || c == CUCUL_TRANSPARENT)
-        return CUCUL_LIGHTGRAY;
-
-    return c;
-}
-
-uint8_t _cucul_attr_to_ansi4bg(uint32_t attr)
-{
-    uint8_t c = nearest_ansi(attr >> 18);
-
-    if(c == CUCUL_DEFAULT || c == CUCUL_TRANSPARENT)
-        return CUCUL_BLACK;
-
-    return c;
-}
-
 uint16_t _cucul_attr_to_rgb12fg(uint32_t attr)
 {
     uint16_t fg = (attr >> 4) & 0x3fff;
diff --git a/cucul/export.c b/cucul/export.c
index 3a35be4..ebbf080 100644
--- a/cucul/export.c
+++ b/cucul/export.c
@@ -288,15 +288,16 @@ static void *export_utf8(cucul_canvas_t *cv, unsigned long int *bytes, int cr)
         {
             uint32_t attr = lineattr[x];
             uint32_t ch = linechar[x];
-            uint8_t fg, bg;
+            uint8_t ansifg, ansibg, fg, bg;
 
             if(ch == CUCUL_MAGIC_FULLWIDTH)
                 continue;
 
-            fg = (((attr >> 4) & 0x3fff) == (CUCUL_DEFAULT | 0x40)) ?
-                     0x10 : palette[_cucul_attr_to_ansi4fg(attr)];
-            bg = (((attr >> 18) & 0x3fff) == (CUCUL_TRANSPARENT | 0x40)) ?
-                     0x10 : palette[_cucul_attr_to_ansi4bg(attr)];
+            ansifg = cucul_attr_to_ansi_fg(attr);
+            ansibg = cucul_attr_to_ansi_bg(attr);
+
+            fg = ansifg < 0x10 ? palette[ansifg] : 0x10;
+            bg = ansibg < 0x10 ? palette[ansibg] : 0x10;
 
             /* TODO: the [0 could be omitted in some cases */
             if(fg != prevfg || bg != prevbg)
@@ -363,8 +364,10 @@ static void *export_ansi(cucul_canvas_t *cv, unsigned long int *bytes)
 
         for(x = 0; x < cv->width; x++)
         {
-            uint8_t fg = palette[_cucul_attr_to_ansi4fg(lineattr[x])];
-            uint8_t bg = palette[_cucul_attr_to_ansi4bg(lineattr[x])];
+            uint8_t ansifg = cucul_attr_to_ansi_fg(lineattr[x]);
+            uint8_t ansibg = cucul_attr_to_ansi_bg(lineattr[x]);
+            uint8_t fg = ansifg < 0x10 ? palette[ansifg] : CUCUL_LIGHTGRAY;
+            uint8_t bg = ansibg < 0x10 ? palette[ansibg] : CUCUL_BLACK;
             uint32_t ch = linechar[x];
 
             if(ch == CUCUL_MAGIC_FULLWIDTH)
@@ -614,18 +617,17 @@ static void *export_irc(cucul_canvas_t *cv, unsigned long int *bytes)
         for(x = 0; x < cv->width; x++)
         {
             uint32_t attr = lineattr[x];
-            uint8_t fg = palette[_cucul_attr_to_ansi4fg(attr)];
-            uint8_t bg = palette[_cucul_attr_to_ansi4bg(attr)];
             uint32_t ch = linechar[x];
+            uint8_t ansifg, ansibg, fg, bg;
 
             if(ch == CUCUL_MAGIC_FULLWIDTH)
                 continue;
 
-            if(((attr >> 4) & 0x3fff) == (CUCUL_DEFAULT | 0x40))
-                fg = 0x10;
+            ansifg = cucul_attr_to_ansi_fg(attr);
+            ansibg = cucul_attr_to_ansi_bg(attr);
 
-            if(((attr >> 18) & 0x3fff) == (CUCUL_TRANSPARENT | 0x40))
-                bg = 0x10;
+            fg = ansifg < 0x10 ? palette[ansifg] : 0x10;
+            bg = ansibg < 0x10 ? palette[ansibg] : 0x10;
 
             /* TODO: optimise series of same fg / same bg
              *       don't change fg value if ch == ' '