Fixed bug in DIB_SetImageBits_RLE8 (because 'color' var was WORD, all
COLOREFs had red part zeroed) that made plenty of cyan colors, minor
bug fixes, changes to support LR_ flags.

diff --git a/objects/dib.c b/objects/dib.c
index 9552381..a19f841 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -606,7 +606,7 @@
     BYTE length;		/* The length pf a run */
     BYTE color_index;		/* index into colors[] as read from bits */
     BYTE escape_code;		/* See enum Rle8_EscapeCodes.*/
-    WORD color;			/* value of colour[color_index] */
+    int color;			/* value of colour[color_index] */
     
     if (lines == 0)		/* Let's hope this doesn't happen. */
       return;
@@ -1539,8 +1539,11 @@
       /* Transfer color info */
     
     if (info->bmiHeader.biBitCount<=8) {
+	int colors = info->bmiHeader.biClrUsed;
+        if (!colors && (info->bmiHeader.biBitCount <= 8))
+            colors = 1 << info->bmiHeader.biBitCount;
 	palEntry = palette->logpalette.palPalEntry;
-	for (i = 0; i < info->bmiHeader.biClrUsed; i++, palEntry++)
+	for (i = 0; i < colors; i++, palEntry++)
 	{
 	    if (coloruse == DIB_RGB_COLORS)
 	    {
@@ -2110,3 +2113,68 @@
     }
 }
 
+/***********************************************************************
+ *           DIB_FixColorsToLoadflags
+ *
+ * Change color table entries when LR_LOADTRANSPARENT or LR_LOADMAP3DCOLORS
+ * are in loadflags
+ */
+void DIB_FixColorsToLoadflags(BITMAPINFO * bmi, UINT32 loadflags, BYTE pix)
+{
+  int colors;
+  COLORREF c_W, c_S, c_F, c_L, c_C;
+  int incr,i;
+  RGBQUAD *ptr;
+
+  if (bmi->bmiHeader.biBitCount > 8) return;
+  if (bmi->bmiHeader.biSize == sizeof(BITMAPINFOHEADER)) incr = 4;
+  else if (bmi->bmiHeader.biSize == sizeof(BITMAPCOREHEADER)) incr = 3;
+  else {
+    WARN(bitmap, "Wrong bitmap header size!\n");
+    return;
+  }
+  colors = bmi->bmiHeader.biClrUsed;
+  if (!colors && (bmi->bmiHeader.biBitCount <= 8))
+    colors = 1 << bmi->bmiHeader.biBitCount;
+  c_W = GetSysColor32(COLOR_WINDOW);
+  c_S = GetSysColor32(COLOR_3DSHADOW);
+  c_F = GetSysColor32(COLOR_3DFACE);
+  c_L = GetSysColor32(COLOR_3DLIGHT);
+  if (loadflags & LR_LOADTRANSPARENT) {
+    switch (bmi->bmiHeader.biBitCount) {
+      case 1: pix = pix >> 7; break;
+      case 4: pix = pix >> 4; break;
+      case 8: break;
+      default: 
+        WARN(bitmap, "(%d): Unsupported depth\n", bmi->bmiHeader.biBitCount); 
+	return;
+    }
+    if (pix >= colors) {
+      WARN(bitmap, "pixel has color index greater than biClrUsed!\n");
+      return;
+    }
+    if (loadflags & LR_LOADMAP3DCOLORS) c_W = c_F;
+    ptr = (RGBQUAD*)((char*)bmi->bmiColors+pix*incr);
+    ptr->rgbBlue = GetBValue(c_W);
+    ptr->rgbGreen = GetGValue(c_W);
+    ptr->rgbRed = GetRValue(c_W);
+  }
+  if (loadflags & LR_LOADMAP3DCOLORS)
+    for (i=0; i<colors; i++) {
+      ptr = (RGBQUAD*)((char*)bmi->bmiColors+i*incr);
+      c_C = RGB(ptr->rgbRed, ptr->rgbGreen, ptr->rgbBlue);
+      if (c_C == RGB(128, 128, 128)) { 
+	ptr->rgbRed = GetRValue(c_S);
+	ptr->rgbGreen = GetGValue(c_S);
+	ptr->rgbBlue = GetBValue(c_S);
+      } else if (c_C == RGB(192, 192, 192)) { 
+	ptr->rgbRed = GetRValue(c_F);
+	ptr->rgbGreen = GetGValue(c_F);
+	ptr->rgbBlue = GetBValue(c_F);
+      } else if (c_C == RGB(223, 223, 223)) { 
+	ptr->rgbRed = GetRValue(c_L);
+	ptr->rgbGreen = GetGValue(c_L);
+	ptr->rgbBlue = GetBValue(c_L);
+      } 
+    }
+}