Added temp fix for world transform bug in SetWindowOrgEx handler.
Added handlers for EMR_SETTEXTJUSTIFICATION and EMR_SETLAYOUT.

diff --git a/include/wingdi.h b/include/wingdi.h
index 24a15d5..f90dea9 100644
--- a/include/wingdi.h
+++ b/include/wingdi.h
@@ -2495,6 +2495,12 @@
   BYTE  Data[1];
 } EMRGLSBOUNDEDRECORD, *PEMRGLSBOUNDEDRECORD;
 
+typedef struct {
+	EMR   emr;
+	INT   nBreakExtra;
+	INT	  nBreakCount;
+} EMRSETTEXTJUSTIFICATION, *PEMRSETTEXTJUSTIFICATION;
+
 typedef INT (CALLBACK *ENHMFENUMPROC)(HDC, LPHANDLETABLE,
 					  LPENHMETARECORD, INT, LPVOID);
 
@@ -2601,9 +2607,27 @@
 #define EMR_GLSRECORD	102
 #define EMR_GLSBOUNDEDRECORD	103
 #define EMR_PIXELFORMAT 104
+#define EMR_DRAWESCAPE 	105
+#define EMR_EXTESCAPE	106
+#define EMR_STARTDOC	107
+#define EMR_SMALLTEXTOUT	108
+#define EMR_FORCEUFIMAPPING	109
+#define EMR_NAMEDESCAPE	110
+#define EMR_COLORCORRECTPALETTE	111
+#define EMR_SETICMPROFILEA	112
+#define EMR_SETICMPROFILEW	113
+#define EMR_ALPHABLEND	114
+#define EMR_SETLAYOUT	115
+#define EMR_TRANSPARENTBLT	116
+#define EMR_RESERVED_117	117
+#define EMR_GRADIENTFILL	118
+#define EMR_SETLINKEDUFI	119
+#define EMR_SETTEXTJUSTIFICATION	120
+#define EMR_COLORMATCHTOTARGETW	121
+#define EMR_CREATECOLORSPACEW	122
 
 #define EMR_MIN 1
-#define EMR_MAX 104
+#define EMR_MAX 122
 
 #define ENHMETA_SIGNATURE	1179469088
 #define ENHMETA_STOCK_OBJECT	0x80000000
diff --git a/objects/enhmetafile.c b/objects/enhmetafile.c
index 671cad5..eea443c 100644
--- a/objects/enhmetafile.c
+++ b/objects/enhmetafile.c
@@ -416,16 +416,18 @@
       }
     case EMR_SETWINDOWORGEX:
       {
-          /*
-           * FIXME: The call to SetWindowOrgEx prevents EMFs from being scrolled
-           *        by an application. This is very BAD!!!
-           */
-#if 0
-	PEMRSETWINDOWORGEX pSetWindowOrgEx = (PEMRSETWINDOWORGEX) mr;
-	SetWindowOrgEx(hdc, pSetWindowOrgEx->ptlOrigin.x,
-		       pSetWindowOrgEx->ptlOrigin.y, NULL);
-#endif
-	break;
+		XFORM xform;
+		PEMRSETWINDOWORGEX pSetWindowOrgEx = (PEMRSETWINDOWORGEX) mr;
+
+		xform.eM11 = 1;
+		xform.eM12 = 0;
+		xform.eM21 = 0;
+		xform.eM22 = 1;
+		xform.eDx = -pSetWindowOrgEx->ptlOrigin.x;
+		xform.eDy = -pSetWindowOrgEx->ptlOrigin.y;
+
+		ModifyWorldTransform(hdc, &xform, MWT_LEFTMULTIPLY);
+		break;
       }
     case EMR_SETWINDOWEXTEX:
       {
@@ -1181,7 +1183,7 @@
 	PEMRBITBLT pBitBlt = (PEMRBITBLT)mr;
 	HDC hdcSrc = CreateCompatibleDC(hdc);
 	HBRUSH hBrush, hBrushOld;
-	HBITMAP hBmp, hBmpOld;
+	HBITMAP hBmp = 0, hBmpOld = 0;
 	BITMAPINFO *pbi = (BITMAPINFO *)((BYTE *)mr + pBitBlt->offBmiSrc);
 
 	SetWorldTransform(hdcSrc, &pBitBlt->xformSrc);
@@ -1194,9 +1196,13 @@
 	SelectObject(hdcSrc, hBrushOld);
 	DeleteObject(hBrush);
 
-	hBmp = CreateDIBitmap(0, (BITMAPINFOHEADER *)pbi, CBM_INIT,
-			      (BYTE *)mr + pBitBlt->offBitsSrc, pbi, pBitBlt->iUsageSrc);
-	hBmpOld = SelectObject(hdcSrc, hBmp);
+	if (pBitBlt->offBmiSrc > 0)
+	{
+		hBmp = CreateDIBitmap(0, (BITMAPINFOHEADER *)pbi, CBM_INIT,
+					  (BYTE *)mr + pBitBlt->offBitsSrc, pbi, pBitBlt->iUsageSrc);
+		hBmpOld = SelectObject(hdcSrc, hBmp);
+	}
+
 	BitBlt(hdc,
 	       pBitBlt->xDest,
 	       pBitBlt->yDest,
@@ -1206,8 +1212,12 @@
 	       pBitBlt->xSrc,
 	       pBitBlt->ySrc,
 	       pBitBlt->dwRop);
-	SelectObject(hdcSrc, hBmpOld);
-	DeleteObject(hBmp);
+
+	if (pBitBlt->offBmiSrc > 0)
+	{
+		SelectObject(hdcSrc, hBmpOld);
+		DeleteObject(hBmp);
+	}
 	DeleteDC(hdcSrc);
 	break;
     }
@@ -1217,7 +1227,7 @@
 	PEMRSTRETCHBLT pStretchBlt= (PEMRSTRETCHBLT)mr;
 	HDC hdcSrc = CreateCompatibleDC(hdc);
 	HBRUSH hBrush, hBrushOld;
-	HBITMAP hBmp, hBmpOld;
+	HBITMAP hBmp = 0, hBmpOld = 0;
 	BITMAPINFO *pbi = (BITMAPINFO *)((BYTE *)mr + pStretchBlt->offBmiSrc);
 
 	SetWorldTransform(hdcSrc, &pStretchBlt->xformSrc);
@@ -1230,9 +1240,13 @@
 	SelectObject(hdcSrc, hBrushOld);
 	DeleteObject(hBrush);
 
-	hBmp = CreateDIBitmap(0, (BITMAPINFOHEADER *)pbi, CBM_INIT,
-			      (BYTE *)mr + pStretchBlt->offBitsSrc, pbi, pStretchBlt->iUsageSrc);
-	hBmpOld = SelectObject(hdcSrc, hBmp);
+	if (pStretchBlt->offBmiSrc)
+	{
+		hBmp = CreateDIBitmap(0, (BITMAPINFOHEADER *)pbi, CBM_INIT,
+					  (BYTE *)mr + pStretchBlt->offBitsSrc, pbi, pStretchBlt->iUsageSrc);
+		hBmpOld = SelectObject(hdcSrc, hBmp);
+	}
+
 	StretchBlt(hdc,
 	       pStretchBlt->xDest,
 	       pStretchBlt->yDest,
@@ -1244,8 +1258,14 @@
 	       pStretchBlt->cxSrc,
 	       pStretchBlt->cySrc,
 	       pStretchBlt->dwRop);
-	SelectObject(hdcSrc, hBmpOld);
-	DeleteObject(hBmp);
+
+
+	if (pStretchBlt->offBmiSrc)
+	{
+		SelectObject(hdcSrc, hBmpOld);
+		DeleteObject(hBmp);
+	}
+
 	DeleteDC(hdcSrc);
 	break;
     }
@@ -1486,9 +1506,39 @@
 	break;
     }
 
+    case EMR_SETTEXTJUSTIFICATION:
+    {
+	PEMRSETTEXTJUSTIFICATION pSetTextJust = (PEMRSETTEXTJUSTIFICATION)mr;
+	SetTextJustification(hdc, pSetTextJust->nBreakExtra, pSetTextJust->nBreakCount);
+	break;
+    }
+
+    case EMR_SETLAYOUT:
+    {
+	PEMRSETLAYOUT pSetLayout = (PEMRSETLAYOUT)mr;
+	SetLayout(hdc, pSetLayout->iMode);
+	break;
+    }
+
     case EMR_POLYDRAW16:
     case EMR_GLSRECORD:
     case EMR_GLSBOUNDEDRECORD:
+	case EMR_DRAWESCAPE :
+	case EMR_EXTESCAPE:
+	case EMR_STARTDOC:
+	case EMR_SMALLTEXTOUT:
+	case EMR_FORCEUFIMAPPING:
+	case EMR_NAMEDESCAPE:
+	case EMR_COLORCORRECTPALETTE:
+	case EMR_SETICMPROFILEA:
+	case EMR_SETICMPROFILEW:
+	case EMR_ALPHABLEND:
+	case EMR_TRANSPARENTBLT:
+	case EMR_GRADIENTFILL:
+	case EMR_SETLINKEDUFI:
+	case EMR_COLORMATCHTOTARGETW:
+	case EMR_CREATECOLORSPACEW:
+
     default:
       /* From docs: If PlayEnhMetaFileRecord doesn't recognize a
                     record then ignore and return TRUE. */