improve sh/hi levels
[picodrive.git] / pico / draw.c
index 5094e5c..3442d8f 100644 (file)
@@ -19,7 +19,7 @@
  *\r
  * since renderer always draws line in 8bit mode, there are 2 spare bits:\r
  * b \ mode: s/h             as        sonic\r
- * 00        normal          -         -\r
+ * 00        normal          -         pal index\r
  * 01        shadow          -         pal index\r
  * 10        hilight+op spr  spr       pal index\r
  * 11        shadow +op spr  -         pal index\r
@@ -1162,34 +1162,37 @@ unsigned short HighPal[0x100];
 void PicoDoHighPal555(int sh)\r
 {\r
   unsigned int *spal, *dpal;\r
-  unsigned short *pal=HighPal;\r
-  int i, t;\r
+  unsigned int t, i;\r
 \r
   Pico.m.dirtyPal = 0;\r
 \r
   spal = (void *)Pico.cram;\r
   dpal = (void *)HighPal;\r
 \r
-  for (i = 0; i < 0x40; i++) {\r
-    unsigned int t = spal[i];\r
+  for (i = 0; i < 0x40 / 2; i++) {\r
+    t = spal[i];\r
 #ifdef USE_BGR555\r
     t = ((t & 0x000e000e)<< 1) | ((t & 0x00e000e0)<<3) | ((t & 0x0e000e00)<<4);\r
 #else\r
     t = ((t & 0x000e000e)<<12) | ((t & 0x00e000e0)<<3) | ((t & 0x0e000e00)>>7);\r
 #endif\r
-    t |= (t >> 3) & 0x18e318e3;\r
+    // treat it like it was 4-bit per channel, since in s/h mode it somewhat is that.\r
+    // otherwise intensity difference between this and s/h will be wrong\r
+    t |= (t >> 4) & 0x08610861; // 0x18e318e3\r
     dpal[i] = t;\r
   }\r
 \r
+  // norm: xxx0, sh: 0xxx, hi: 0xxx + 7\r
   if (sh)\r
   {\r
     // shadowed pixels\r
-    for (i = 0x3f; i >= 0; i--)\r
-      pal[0x40|i] = pal[0xc0|i] = (unsigned short)((pal[i]>>1)&0x738e);\r
+    for (i = 0; i < 0x40 / 2; i++)\r
+      dpal[0x40/2 | i] = dpal[0xc0/2 | i] = (dpal[i] >> 1) & 0x738e738e;\r
     // hilighted pixels\r
-    for (i = 0x3f; i >= 0; i--) {\r
-      t=pal[i]&0xe71c;t+=0x4208;if(t&0x20)t|=0x1c;if(t&0x800)t|=0x700;if(t&0x10000)t|=0xe000;t&=0xe71c;\r
-      pal[0x80|i]=(unsigned short)t;\r
+    for (i = 0; i < 0x40 / 2; i++) {\r
+      t = ((dpal[i] >> 1) & 0x738e738e) + 0x738e738e; // 0x7bef7bef;\r
+      t |= (t >> 4) & 0x08610861;\r
+      dpal[0x80/2 | i] = t;\r
     }\r
   }\r
 }\r