ansi: support 256-colors
authorPeter Ross <pross@xvid.org>
Sat, 1 Sep 2012 05:18:19 +0000 (15:18 +1000)
committerMichael Niedermayer <michaelni@gmx.at>
Sat, 1 Sep 2012 13:23:26 +0000 (15:23 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavcodec/ansi.c
tests/ref/fate/ansi

index 3cfc3af8019bbd287928e5d0c41b650e4389361d..6afd17c3ddc833b28a7ce42690de178105234fa6 100644 (file)
@@ -89,6 +89,21 @@ static av_cold int decode_init(AVCodecContext *avctx)
     return 0;
 }
 
     return 0;
 }
 
+static void set_palette(uint32_t *pal)
+{
+    int r, g, b;
+    memcpy(pal, ff_cga_palette, 16 * 4);
+    pal += 16;
+#define COLOR(x) ((x) * 40 + 55)
+    for (r = 0; r < 6; r++)
+        for (g = 0; g < 6; g++)
+            for (b = 0; b < 6; b++)
+                *pal++ = 0xFF000000 | (COLOR(r) << 16) | (COLOR(g) << 8) | COLOR(b);
+#define GRAY(x) ((x) * 10 + 8)
+    for (g = 0; g < 24; g++)
+        *pal++ = 0xFF000000 | (GRAY(g) << 16) | (GRAY(g) << 8) | GRAY(g);
+}
+
 static void hscroll(AVCodecContext *avctx)
 {
     AnsiContext *s = avctx->priv_data;
 static void hscroll(AVCodecContext *avctx)
 {
     AnsiContext *s = avctx->priv_data;
@@ -232,7 +247,7 @@ static int execute_code(AVCodecContext * avctx, int c)
             }
             s->frame.pict_type           = AV_PICTURE_TYPE_I;
             s->frame.palette_has_changed = 1;
             }
             s->frame.pict_type           = AV_PICTURE_TYPE_I;
             s->frame.palette_has_changed = 1;
-            memcpy(s->frame.data[1], ff_cga_palette, 16 * 4);
+            set_palette((uint32_t *)s->frame.data[1]);
             erase_screen(avctx);
         } else if (c == 'l') {
             erase_screen(avctx);
             erase_screen(avctx);
         } else if (c == 'l') {
             erase_screen(avctx);
@@ -280,12 +295,20 @@ static int execute_code(AVCodecContext * avctx, int c)
                 s->bg = DEFAULT_BG_COLOR;
             } else if (m == 1 || m == 2 || m == 4 || m == 5 || m == 7 || m == 8) {
                 s->attributes |= 1 << (m - 1);
                 s->bg = DEFAULT_BG_COLOR;
             } else if (m == 1 || m == 2 || m == 4 || m == 5 || m == 7 || m == 8) {
                 s->attributes |= 1 << (m - 1);
-            } else if (m >= 30 && m <= 38) {
+            } else if (m >= 30 && m <= 37) {
                 s->fg = ansi_to_cga[m - 30];
                 s->fg = ansi_to_cga[m - 30];
+            } else if (m == 38 && i + 2 < s->nb_args && s->args[i + 1] == 5 && s->args[i + 2] < 256) {
+                int index = s->args[i + 2];
+                s->fg = index < 16 ? ansi_to_cga[index] : index;
+                i += 2;
             } else if (m == 39) {
                 s->fg = ansi_to_cga[DEFAULT_FG_COLOR];
             } else if (m >= 40 && m <= 47) {
                 s->bg = ansi_to_cga[m - 40];
             } else if (m == 39) {
                 s->fg = ansi_to_cga[DEFAULT_FG_COLOR];
             } else if (m >= 40 && m <= 47) {
                 s->bg = ansi_to_cga[m - 40];
+            } else if (m == 48 && i + 2 < s->nb_args && s->args[i + 1] == 5 && s->args[i + 2] < 256) {
+                int index = s->args[i + 2];
+                s->bg = index < 16 ? ansi_to_cga[index] : index;
+                i += 2;
             } else if (m == 49) {
                 s->fg = ansi_to_cga[DEFAULT_BG_COLOR];
             } else {
             } else if (m == 49) {
                 s->fg = ansi_to_cga[DEFAULT_BG_COLOR];
             } else {
@@ -329,7 +352,7 @@ static int decode_frame(AVCodecContext *avctx,
     }
     s->frame.pict_type           = AV_PICTURE_TYPE_I;
     s->frame.palette_has_changed = 1;
     }
     s->frame.pict_type           = AV_PICTURE_TYPE_I;
     s->frame.palette_has_changed = 1;
-    memcpy(s->frame.data[1], ff_cga_palette, 16 * 4);
+    set_palette((uint32_t *)s->frame.data[1]);
 
     while(buf < buf_end) {
         switch(s->state) {
 
     while(buf < buf_end) {
         switch(s->state) {
index 56c02260959155f6955b6a17a58c07bae622e33a..6000105be9c8807515c8998eeddc33777979252b 100644 (file)
@@ -1,7 +1,7 @@
 #tb 0: 1/25
 #tb 0: 1/25
-0,          0,          0,        1,   768000, 0x3032d0de
-0,          1,          1,        1,   768000, 0xc3be5922
-0,          2,          2,        1,   768000, 0xf530c476
+0,          0,          0,        1,   768000, 0xc4865718
+0,          1,          1,        1,   768000, 0x2c7de258
+0,          2,          2,        1,   768000, 0x0d6b8dc6
 0,          3,          3,        1,   768000, 0x11c1fb8e
 0,          4,          4,        1,   768000, 0x72d12da9
 0,          5,          5,        1,   768000, 0x39c7a70d
 0,          3,          3,        1,   768000, 0x11c1fb8e
 0,          4,          4,        1,   768000, 0x72d12da9
 0,          5,          5,        1,   768000, 0x39c7a70d