+++ /dev/null
---- fbterm-1.2/src/screen.cpp.old 2008-12-15 20:27:32.000000000 +0100
-+++ fbterm-1.2/src/screen.cpp 2008-12-15 20:31:55.000000000 +0100
-@@ -184,8 +184,6 @@ void Screen::switchVc(bool enter)
-
- void Screen::setupSysPalette(bool restore)
- {
-- if (vinfo.bits_per_pixel != 8) return;
--
- static bool palette_saved = false;
- static u16 saved_red[NR_COLORS], saved_green[NR_COLORS], saved_blue[NR_COLORS];
- fb_cmap cmap;
-@@ -212,17 +210,62 @@ void Screen::setupSysPalette(bool restor
- INIT_CMAP(saved_red, saved_green, saved_blue);
- ioctl(mFd, FBIOGETCMAP, &cmap);
- }
-+ if (finfo.visual == FB_VISUAL_DIRECTCOLOR && vinfo.bits_per_pixel != 8) {
-+ u16 *red, *green, *blue;
-+ int rcols = 1 << vinfo.red.length;
-+ int gcols = 1 << vinfo.green.length;
-+ int bcols = 1 << vinfo.blue.length;
-+
-+ /* Make our palette the length of the deepest color */
-+ int cols = (rcols > gcols ? rcols : gcols);
-+ cols = (cols > bcols ? cols : bcols);
-+
-+ red = new u16[cols];
-+ if (!red)
-+ return;
-+ for (int i = 0; i < rcols; i++)
-+ red[i] = (65535 / (rcols - 1)) * i;
-+
-+ green = new u16[cols];
-+ if (!green) {
-+ delete[] red;
-+ return;
-+ }
-+ for (int i = 0; i < gcols; i++)
-+ green[i] = (65535 / (gcols - 1)) * i;
-+
-+ blue = new u16[cols];
-+ if (!blue) {
-+ delete[] red;
-+ delete[] green;
-+ return;
-+ }
-+ for (int i = 0; i < bcols; i++)
-+ blue[i] = (65535 / (bcols - 1)) * i;
-+
-+ cmap.start = 0;
-+ cmap.len = cols;
-+ cmap.red = red;
-+ cmap.blue = blue;
-+ cmap.green = green;
-+ cmap.transp = NULL;
-+ ioctl(mFd, FBIOPUTCMAP, &cmap);
-+ delete[] red;
-+ delete[] blue;
-+ delete[] green;
-
-- u16 red[NR_COLORS], green[NR_COLORS], blue[NR_COLORS];
-+ } else {
-+ u16 red[NR_COLORS], green[NR_COLORS], blue[NR_COLORS];
-
-- for (u32 i = 0; i < NR_COLORS; i++) {
-- red[i] = palette[i].red << 8 | palette[i].red;
-- green[i] = palette[i].green << 8 | palette[i].green;
-- blue[i] = palette[i].blue << 8 | palette[i].blue;
-- }
-+ for (u32 i = 0; i < NR_COLORS; i++) {
-+ red[i] = palette[i].red << 8 | palette[i].red;
-+ green[i] = palette[i].green << 8 | palette[i].green;
-+ blue[i] = palette[i].blue << 8 | palette[i].blue;
-+ }
-
-- INIT_CMAP(red, green, blue);
-- ioctl(mFd, FBIOPUTCMAP, &cmap);
-+ INIT_CMAP(red, green, blue);
-+ ioctl(mFd, FBIOPUTCMAP, &cmap);
-+ }
- }
- }
-