Index: viewport.c
===================================================================
--- viewport.c	(revision 836)
+++ viewport.c	(working copy)
@@ -1070,7 +1070,6 @@
 	dp.height >>= zoom;
 
 	do {
-
 		if (ss->width != 0) {
 			int x, y, w, bottom;
 			
@@ -1087,12 +1086,29 @@
 				w -= 3;
 			}
 
-			DrawFrameRect(x,y, x+w, bottom, ss->color, 0);
+			DrawFrameRect(x,y, x+w, bottom, ss->color, (_display_opt & DO_TRANS_BUILDINGS) ? 0 : 0x9);
 		}
 
 		SET_DPARAM32(0, ss->params[0]);
 		SET_DPARAM32(1, ss->params[1]);
-		DrawString(ss->x >> zoom, (ss->y >> zoom) - (ss->width&0x8000?2:0), ss->string, 0);
+		if (!(_display_opt & DO_TRANS_BUILDINGS) && ss->width != 0) {
+			/* This is such a frustrating mess - I need to convert
+			 * from real color codes to string color codes and guess
+			 * what, they are completely different. --pasky */
+			static const byte ci2sci[17] = {
+				/*  0 */ 16, /*  1 */  0, /*  2 */  5,
+				/*  3X*/  2, /*  4 */  8, /*  5 */  3,
+				/*  6X*/ 14, /*  7 */  7, /*  8 */  9,
+				/*  9 */ 13, /* 10 */ 10, /* 11 */ 15,
+				/* 12 */  4, /* 13 */  6, /* 14 */ 11,
+				/* 15 */  1, /* 16 */ 12
+			};
+			byte color = ci2sci[ss->color + 1];
+
+			DrawString(ss->x >> zoom, (ss->y >> zoom) - (ss->width&0x8000?2:0), ss->string, color);
+		} else {
+			DrawString(ss->x >> zoom, (ss->y >> zoom) - (ss->width&0x8000?2:0), ss->string, 16);
+		}
 	} while ( (ss = ss->next) != NULL);
 
 	_cur_dpi = dpi;
Index: gfx.c
===================================================================
--- gfx.c	(revision 836)
+++ gfx.c	(working copy)
@@ -475,6 +475,9 @@
 					flags&0x40 ? color_interior : color_3);
 			}
 		}
+	} else if (flags & 0x1) {
+		// transparency
+		GfxFillRect(left, top, right, bottom, 0x4322);
 	} else {
 		GfxFillRect(left, top, right, bottom, color_interior);
 	}
