diff --git a/objects/color.c b/objects/color.c
index 5b8c761..943b1da 100644
--- a/objects/color.c
+++ b/objects/color.c
@@ -861,7 +861,7 @@
 
     if( spec_type > 2 )
     {  
-	fprintf(stderr, "COLOR_ToPhysical : invalid RGB specifier for: %08lx\n", color);
+	dprintf_palette(stddeb, "COLOR_ToPhysical : invalid RGB specifier for: %08lx\n", color);
 	spec_type = 0;
     }
 
diff --git a/objects/dib.c b/objects/dib.c
index 29aba34..76db125 100644
--- a/objects/dib.c
+++ b/objects/dib.c
@@ -29,15 +29,18 @@
 
     switch(depth)
     {
-    case 1:  words = (width + 31) / 32; break;
-    case 4:  words = (width + 7) / 8; break;
-    case 8:  words = (width + 3) / 4; break;
-    case 15:
-    case 16: words = (width + 1) / 2; break;
-    case 24: words = width; break;
-    default:
-        fprintf(stderr, "DIB: unsupported depth %d.\n", depth );
-        exit(1);
+	case 1:  words = (width + 31) / 32; break;
+	case 4:  words = (width + 7) / 8; break;
+	case 8:  words = (width + 3) / 4; break;
+	case 15:
+	case 16: words = (width + 1) / 2; break;
+	case 24: words = (width * 3 + 3)/4; break;
+
+	default:
+        	fprintf(stderr, "DIB: unsupported depth %d.\n", depth );
+	/* fall through */
+	case 32:
+	        words = width;
     }
     return 4 * words;
 }
@@ -71,29 +74,6 @@
 
 
 /***********************************************************************
- *           DIB_DIBmpToImage
- *
- * Create an XImage pointing to the bitmap data.
- */
-static XImage *DIB_DIBmpToImage( BITMAPINFOHEADER * bmp, void * bmpData )
-{
-    extern void _XInitImageFuncPtrs( XImage* );
-    XImage * image;
-
-    image = XCreateImage(display, DefaultVisualOfScreen( screen ),
-                         bmp->biBitCount, ZPixmap, 0, bmpData,
-                         bmp->biWidth, bmp->biHeight, 32,
-                         DIB_GetImageWidthBytes(bmp->biWidth,bmp->biBitCount));
-    if (!image) return 0;
-    image->byte_order = MSBFirst;
-    image->bitmap_bit_order = MSBFirst;
-    image->bitmap_unit = 16;
-    _XInitImageFuncPtrs(image);
-    return image;
-}
-
-
-/***********************************************************************
  *           DIB_GetBitmapInfo
  *
  * Get the info from a bitmap header.
@@ -809,30 +789,95 @@
 	else ((WORD *)info->bmiColors)[i] = (WORD)i;
     }
     
-      /* Transfer the pixels (very slow...) */
-
     if (bits)
     {	
+	BYTE*	bbits = bits;
+	int	pad, yend, xend = bmp->bitmap.bmWidth;
+
+        dprintf_bitmap(stddeb, "GetDIBits: %u scanlines of (%i,%i) -> (%i,%i) starting from %u\n",
+			    lines, bmp->bitmap.bmWidth, bmp->bitmap.bmHeight,
+			    (int)info->bmiHeader.biWidth, (int)info->bmiHeader.biHeight, startscan );
+
+	/* adjust number of scanlines to copy */
+
+	if( lines > info->bmiHeader.biHeight ) lines = info->bmiHeader.biHeight;
+	yend = startscan + lines;
+	if( startscan >= bmp->bitmap.bmHeight ) 
+	    return FALSE;
+	if( yend > bmp->bitmap.bmHeight ) yend = bmp->bitmap.bmHeight;
+
+	/* adjust scanline width */
+
+	pad = info->bmiHeader.biWidth - bmp->bitmap.bmWidth;
+	if( pad < 0 ) 
+	{
+	    /* bitmap is wider than DIB, copy only a part */
+
+	    pad = 0; xend = info->bmiHeader.biWidth;
+	}
+
 	bmpImage = (XImage *)CallTo32_LargeStack( (int (*)())XGetImage, 8, 
 		               display, bmp->pixmap, 0, 0, bmp->bitmap.bmWidth,
 		               bmp->bitmap.bmHeight, AllPlanes, ZPixmap );
-	dibImage = DIB_DIBmpToImage( &info->bmiHeader, bits );
 
-	for (y = 0; y < lines; y++)
+	switch( info->bmiHeader.biBitCount )
 	{
-	    for (x = 0; x < info->bmiHeader.biWidth; x++)
-	    {
-		XPutPixel( dibImage, x, y,
-		  XGetPixel(bmpImage, x, bmp->bitmap.bmHeight-startscan-y-1) );
-		
-	    }
+	   case 8:
+
+		pad += (4 - (info->bmiHeader.biWidth & 3)) & 3;
+		for( y = yend - 1; (int)y >= (int)startscan; y-- )
+		{
+		   for( x = 0; x < xend; x++ )
+			*bbits++ = XGetPixel( bmpImage, x, y );
+		   bbits += pad;
+		}
+		break;
+
+/* add more bpp-specific shortcuts here */
+
+	   default:
+
+		dibImage = XCreateImage(display, DefaultVisualOfScreen( screen ),
+			   info->bmiHeader.biBitCount, ZPixmap, 0, bits,
+			   info->bmiHeader.biWidth, info->bmiHeader.biHeight,
+			   32, DIB_GetImageWidthBytes( info->bmiHeader.biWidth,
+                                                info->bmiHeader.biBitCount ) );
+		if( dibImage )
+		{
+		    extern void _XInitImageFuncPtrs( XImage* );
+
+		    dibImage->byte_order = MSBFirst;
+		    dibImage->bitmap_bit_order = MSBFirst;
+		    dibImage->bitmap_unit = 16;
+		    _XInitImageFuncPtrs( dibImage );
+
+		    for (y = yend - 1; (int)y >= (int)startscan; y--)
+		        for (x = 0; x < xend; x++)
+			    XPutPixel( dibImage, x, yend - y + 1, 
+				       XGetPixel( bmpImage, x, y ));
+		    dibImage->data = NULL;
+		    XDestroyImage( dibImage );
+		}
 	}
-	
-	dibImage->data = NULL;
-	XDestroyImage( dibImage );
+
 	XDestroyImage( bmpImage );
+
+	info->bmiHeader.biCompression = 0;
     }
-    info->bmiHeader.biCompression = 0;
+    else if( info->bmiHeader.biSize >= sizeof(BITMAPINFOHEADER) ) 
+    {
+	/* fill in struct members */
+	
+	info->bmiHeader.biWidth = bmp->bitmap.bmWidth;
+	info->bmiHeader.biHeight = bmp->bitmap.bmHeight;
+	info->bmiHeader.biPlanes = 1;
+	info->bmiHeader.biBitCount = bmp->bitmap.bmBitsPixel;
+	info->bmiHeader.biSizeImage = bmp->bitmap.bmHeight *
+                             DIB_GetImageWidthBytes( bmp->bitmap.bmWidth,
+                                                     bmp->bitmap.bmBitsPixel );
+	info->bmiHeader.biCompression = 0;
+    }
+
     return lines;
 }
 
diff --git a/objects/font.c b/objects/font.c
index 7912362..3ac17db 100644
--- a/objects/font.c
+++ b/objects/font.c
@@ -868,31 +868,23 @@
 BOOL16 GetCharWidth16( HDC16 hdc, UINT16 firstChar, UINT16 lastChar,
                        LPINT16 buffer )
 {
-    int i, width;
-    XFontStruct *xfont;
-    XCharStruct *cs, *def;
-
-    DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
-    if (!dc) return FALSE;
-    xfont = dc->u.x.font.fstruct;
-    
-    /* fixed font? */
-    if (xfont->per_char == NULL)
+    LPINT32	 buf32 = (LPINT32)xmalloc(sizeof(INT32)*(1 + (lastChar-firstChar)));
+    LPINT32	 obuf32;
+    BOOL32	 retVal;
+    int		 i;
+    if (!buf32)
+      return FALSE;
+    obuf32 = buf32;
+    retVal = GetCharWidth32A(hdc, firstChar, lastChar, buf32);
+    if (retVal)
     {
 	for (i = firstChar; i <= lastChar; i++)
-	    *buffer++ = xfont->max_bounds.width;
-	return TRUE;
+	{
+	    *buffer++ = *buf32++;
+	}
     }
-
-    CI_GET_DEFAULT_INFO(xfont, def);
-	
-    for (i = firstChar; i <= lastChar; i++)
-    {
-	CI_GET_CHAR_INFO( xfont, i, def, cs );
-        width = cs ? cs->width : xfont->max_bounds.width;
-        *buffer++ = MAX( width, 0 );
-    }
-    return TRUE;
+    free (obuf32);
+    return retVal;
 }
 
 
@@ -902,30 +894,17 @@
 BOOL32 GetCharWidth32A( HDC32 hdc, UINT32 firstChar, UINT32 lastChar,
                         LPINT32 buffer )
 {
-    int i, width;
-    XFontStruct *xfont;
-    XCharStruct *cs, *def;
-
-    DC *dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC);
-    if (!dc) return FALSE;
-    xfont = dc->u.x.font.fstruct;
-    
-    /* fixed font? */
-    if (xfont->per_char == NULL)
+    DC * dc = (DC *) GDI_GetObjPtr( hdc, DC_MAGIC );
+    if (!dc)
     {
-	for (i = firstChar; i <= lastChar; i++)
-	    *buffer++ = xfont->max_bounds.width;
-	return TRUE;
+	if (!(dc = (DC *)GDI_GetObjPtr( hdc, METAFILE_DC_MAGIC )))
+            return FALSE;
     }
 
-    CI_GET_DEFAULT_INFO(xfont, def);
-	
-    for (i = firstChar; i <= lastChar; i++)
-    {
-	CI_GET_CHAR_INFO( xfont, i, def, cs );
-        width = cs ? cs->width : xfont->max_bounds.width;
-        *buffer++ = MAX( width, 0 );
-    }
+    if (!dc->funcs->pGetCharWidth ||
+        !dc->funcs->pGetCharWidth( dc, firstChar, lastChar, buffer))
+        return FALSE;
+
     return TRUE;
 }
 
diff --git a/objects/metafile.c b/objects/metafile.c
index 64701e9..928411c 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -750,6 +750,17 @@
 }
 
 /******************************************************************
+ *         SetMetaFileBitsBetter   (GDI.196)
+ */
+HMETAFILE16 SetMetaFileBitsBetter( HMETAFILE16 hMeta )
+{
+   if( IsValidMetaFile( hMeta ) )
+       return (HMETAFILE16)GlobalReAlloc16( hMeta, 0, 
+			   GMEM_SHARE | GMEM_NODISCARD | GMEM_MODIFY);
+   return (HMETAFILE16)0;
+}
+
+/******************************************************************
  *         MF_WriteRecord
  *
  * Warning: this function can change the metafile handle.
