From 2d187a02033d7980202b44d9f6b4b0a4d185a60b Mon Sep 17 00:00:00 2001
From: Takamichi Horikawa <takamichiho@gmail.com>
Date: Tue, 31 Jan 2017 23:09:30 +0900
Subject: added color palette support (ctrl-f1 - ctrl-f10)

---
 fmdsp/fmdsp.c         |  41 ++++++++++++++--
 fmdsp/fmdsp.h         |   1 +
 fmdsp/fmdsp_sprites.h | 126 +++++++++++++++++++++++++++++++++++++++++++++++++-
 3 files changed, 162 insertions(+), 6 deletions(-)

(limited to 'fmdsp')

diff --git a/fmdsp/fmdsp.c b/fmdsp/fmdsp.c
index 1da0adf..4c16f5e 100644
--- a/fmdsp/fmdsp.c
+++ b/fmdsp/fmdsp.c
@@ -46,10 +46,9 @@ static void vramblit_key(uint8_t *vram, int x, int y,
 }
 
 void fmdsp_init(struct fmdsp *fmdsp, const struct fmdsp_font *font98) {
-  for (int i = 0; i < FMDSP_PALETTE_COLORS; i++) {
-    fmdsp->palette[i*3+0] = s_palettes[0][i*3+0];
-    fmdsp->palette[i*3+1] = s_palettes[0][i*3+1];
-    fmdsp->palette[i*3+2] = s_palettes[0][i*3+2];
+  for (int i = 0; i < FMDSP_PALETTE_COLORS*3; i++) {
+    fmdsp->palette[i] = 0;//s_palettes[0][i];
+    fmdsp->target_palette[i] = s_palettes[0][i];
   }
   fmdsp->font98 = font98;
 }
@@ -181,6 +180,39 @@ void fmdsp_vram_init(struct fmdsp *fmdsp,
   }
 }
 
+enum {
+  FADEDELTA = 16
+};
+
+void fmdsp_palette_set(struct fmdsp *fmdsp, int p) {
+  if (p < 0) return;
+  if (p >= PALETTE_NUM) return;
+  for (int i = 0; i < FMDSP_PALETTE_COLORS*3; i++) {
+    fmdsp->target_palette[i] = s_palettes[p][i];
+  }
+}
+
+static void fmdsp_palette_fade(struct fmdsp *fmdsp) {
+  for (int i = 0; i < FMDSP_PALETTE_COLORS*3; i++) {
+    uint8_t p = fmdsp->palette[i];
+    uint8_t t = fmdsp->target_palette[i];
+    if (p < t) {
+      if ((p + FADEDELTA) < t) {
+        p += FADEDELTA;
+      } else {
+        p = t;
+      }
+    } else if (p > t) {
+      if (p > (t + FADEDELTA)) {
+        p -= FADEDELTA;
+      } else {
+        p = t;
+      }
+    }
+    fmdsp->palette[i] = p;
+  }
+}
+
 void fmdsp_update(struct fmdsp *fmdsp,
                   const struct fmdriver_work *work, uint8_t *vram) {
   for (int t = 0; t < 10; t++) {
@@ -220,6 +252,7 @@ void fmdsp_update(struct fmdsp *fmdsp,
     vramblit_color(vram, BAR_X+BAR_W*(track->ticks>>2), TRACK_H*t+BAR_Y,
                    s_bar, BAR_W, BAR_H, 7);
   }
+  fmdsp_palette_fade(fmdsp);
 }
 
 void fmdsp_vrampalette(struct fmdsp *fmdsp, const uint8_t *vram, uint8_t *vram32, int stride) {
diff --git a/fmdsp/fmdsp.h b/fmdsp/fmdsp.h
index a7b245a..f123138 100644
--- a/fmdsp/fmdsp.h
+++ b/fmdsp/fmdsp.h
@@ -32,6 +32,7 @@ void fmdsp_vram_init(struct fmdsp *fmdsp,
 void fmdsp_update(struct fmdsp *fmdsp, const struct fmdriver_work *work, uint8_t *vram);
 void fmdsp_vrampalette(struct fmdsp *fmdsp, const uint8_t *vram, uint8_t *vram32, int stride);
 void fmdsp_font_from_fontrom(uint8_t *font, const uint8_t *fontrom);
+void fmdsp_palette_set(struct fmdsp *fmdsp, int p);
 #ifdef __cplusplus
 }
 #endif
diff --git a/fmdsp/fmdsp_sprites.h b/fmdsp/fmdsp_sprites.h
index 1fe6c13..ded3591 100644
--- a/fmdsp/fmdsp_sprites.h
+++ b/fmdsp/fmdsp_sprites.h
@@ -37,7 +37,22 @@ enum {
   PLAYING_H = 9,
 };
 
-static const uint8_t s_palettes[1][FMDSP_PALETTE_COLORS*3] = {
+enum {
+  PALETTE_NUM = 10
+};
+
+#define LCDWR 181
+#define LCDWG 192
+#define LCDWB 12
+#define LCDBR 70
+#define LCDBG 124
+#define LCDBB 108
+#define LCD(C) \
+  (LCDWR*(C)+LCDBR*(255-C))/256, \
+  (LCDWG*(C)+LCDBG*(255-C))/256, \
+  (LCDWB*(C)+LCDBB*(255-C))/256
+
+static const uint8_t s_palettes[PALETTE_NUM][FMDSP_PALETTE_COLORS*3] = {
   {
     0, 0, 0,
     170, 170, 153,
@@ -48,9 +63,116 @@ static const uint8_t s_palettes[1][FMDSP_PALETTE_COLORS*3] = {
     136, 255, 68,
     51, 51, 238,
     0, 187, 255,
-  }
+  },
+  {
+    0, 0, 0,
+    187, 187, 170,
+    136, 170, 255,
+    85, 85, 153,
+    204, 204, 187,
+    136, 136, 119,
+    153, 255, 119,
+    102, 85, 255,
+    0, 204, 255,
+  },
+  {
+    0, 0, 0,
+    255, 102, 0,
+    255, 170, 0,
+    102, 68, 51,
+    153, 136, 102,
+    119, 85, 68,
+    255, 221, 85,
+    255, 102, 0,
+    255, 85, 0,
+  },
+  {
+    0, 0, 0,
+    170, 170, 153,
+    170, 153, 255,
+    85, 51, 102,
+    204, 204, 187,
+    102, 102, 85,
+    119, 255, 34,
+    136, 68, 221,
+    0, 187, 255,
+  },
+  {
+    0, 0, 0,
+    187, 187, 170,
+    102, 153, 255,
+    85, 68, 136,
+    255, 255, 238,
+    119, 119, 102,
+    255, 68, 0,
+    85, 85, 255,
+    255, 119, 255,
+  },
+  {
+    0, 0, 0,
+    255, 51, 119,
+    255, 187, 0,
+    85, 85, 68,
+    119, 119, 102,
+    102, 102, 102,
+    255, 221, 0,
+    255, 0, 51,
+    255, 0, 51,
+  },
+  {
+    102, 170, 238,
+    0, 17, 136,
+    0, 51, 136,
+    153, 221, 255,
+    153, 221, 255,
+    119, 187, 255,
+    0, 51, 136,
+    34, 102, 187,
+    0, 85, 204,
+  },
+  {
+    0, 0, 0,
+    170, 170, 136,
+    102, 153, 255,
+    17, 0, 51,
+    170, 170, 153,
+    51, 51, 51,
+    85, 255, 68,
+    34, 17, 255,
+    0, 170, 255,
+  },
+  {
+    LCD(255),
+    LCD(72),
+    LCD(0),
+    LCD(182),
+    LCD(0),
+    LCD(145),
+    LCD(218),
+    LCD(109),
+    LCD(218),
+  },
+  {
+    LCD(255),
+    LCD(72),
+    LCD(0),
+    LCD(182),
+    LCD(145),
+    LCD(145),
+    LCD(0),
+    LCD(109),
+    LCD(0),
+  },
 };
 
+#undef LCDWR
+#undef LCDWG
+#undef LCDWB
+#undef LCDBR
+#undef LCDBG
+#undef LCDBB
+#undef LCD
+
 static const uint8_t s_track[TNAME_W*TNAME_H] = {
   1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0,
   0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
-- 
cgit v1.2.3