diff --git a/objects/metafile.c b/objects/metafile.c
index c40d01e34eb6cddcca93715c6f4867b05002fd7a..0f335d9e86ae9bd856b977a117d3b3fa2ba89cdf 100644
--- a/objects/metafile.c
+++ b/objects/metafile.c
@@ -907,12 +907,30 @@ void WINAPI PlayMetaFileRecord16(
 
      case META_DIBBITBLT:
         {
-         LPBITMAPINFO info = (LPBITMAPINFO) &(mr->rdParm[8]);
-         LPSTR bits = (LPSTR)info + DIB_BitmapInfoSize( info, mr->rdParm[0] );
-         StretchDIBits16(hdc,mr->rdParm[7],mr->rdParm[6],mr->rdParm[5],
-                       mr->rdParm[4],mr->rdParm[3],mr->rdParm[2],
-                       mr->rdParm[5],mr->rdParm[4],bits,info,
-                       DIB_RGB_COLORS,MAKELONG(mr->rdParm[0],mr->rdParm[1]));
+		/*In practice ive found that theres two layout for META_DIBBITBLT,
+		one (the first here) is the usual one when a src dc is actually passed
+		int, the second occurs when the src dc is passed in as NULL to
+		the creating BitBlt.
+		as the second case has no dib, a size check will suffice to distinguish.
+
+
+		Caolan.McNamara@ul.ie
+		*/
+		if (mr->rdSize > 12)
+                {
+                    LPBITMAPINFO info = (LPBITMAPINFO) &(mr->rdParm[8]);
+                    LPSTR bits = (LPSTR)info + DIB_BitmapInfoSize( info, mr->rdParm[0] );
+                    StretchDIBits16(hdc,mr->rdParm[7],mr->rdParm[6],mr->rdParm[5],
+                                    mr->rdParm[4],mr->rdParm[3],mr->rdParm[2],
+                                    mr->rdParm[5],mr->rdParm[4],bits,info,
+                                    DIB_RGB_COLORS,MAKELONG(mr->rdParm[0],mr->rdParm[1]));
+                }
+		else	/*equivalent to a PatBlt*/
+                {
+                    PatBlt16(hdc, mr->rdParm[8], mr->rdParm[7],
+                             mr->rdParm[6], mr->rdParm[5],
+                             MAKELONG(*(mr->rdParm), *(mr->rdParm + 1)));
+                }
         }
         break;