Description: add PatBlt DPa operation
Author: Marc-André Moreau

Index: freerdp-1.0.1/include/freerdp/gdi/gdi.h
===================================================================
--- freerdp-1.0.1.orig/include/freerdp/gdi/gdi.h	2012-02-10 20:15:05.000000000 +0100
+++ freerdp-1.0.1/include/freerdp/gdi/gdi.h	2013-01-01 17:35:46.331759945 +0100
@@ -65,6 +65,7 @@
 #define GDI_DSPDxax			0x00E20746 /* D = (S & P) | (~S & D) */
 #define GDI_SPna			0x000C0324 /* D = S & ~P */
 #define GDI_DSna			0x00220326 /* D = D & ~S */
+#define GDI_DPa				0x00A000C9 /* D = D & P */
 #define GDI_PDxn			0x00A50065 /* D = D ^ ~P */
 
 /* Brush Styles */
Index: freerdp-1.0.1/libfreerdp-gdi/16bpp.c
===================================================================
--- freerdp-1.0.1.orig/libfreerdp-gdi/16bpp.c	2012-02-10 20:15:05.000000000 +0100
+++ freerdp-1.0.1/libfreerdp-gdi/16bpp.c	2013-01-01 17:35:46.331759945 +0100
@@ -434,6 +434,31 @@
 	return 0;
 }
 
+static int BitBlt_DPa_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+	int x, y;
+	uint16* dstp;
+	uint16* patp;
+
+	for (y = 0; y < nHeight; y++)
+	{
+		dstp = (uint16*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+		if (dstp != 0)
+		{
+			for (x = 0; x < nWidth; x++)
+			{
+				patp = (uint16*) gdi_get_brush_pointer(hdcDest, x, y);
+
+				*dstp = *dstp & *patp;
+				dstp++;
+			}
+		}
+	}
+
+	return 0;
+}
+
 static int BitBlt_PDxn_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
 {
 	int x, y;
@@ -778,6 +803,10 @@
 			return BitBlt_WHITENESS_16bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
 			break;
 
+		case GDI_DPa:
+			return BitBlt_DPa_16bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+			break;
+
 		case GDI_PDxn:
 			return BitBlt_PDxn_16bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
 			break;
Index: freerdp-1.0.1/libfreerdp-gdi/32bpp.c
===================================================================
--- freerdp-1.0.1.orig/libfreerdp-gdi/32bpp.c	2012-02-10 20:15:05.000000000 +0100
+++ freerdp-1.0.1/libfreerdp-gdi/32bpp.c	2013-01-01 17:35:46.331759945 +0100
@@ -487,6 +487,31 @@
 	return 0;
 }
 
+static int BitBlt_DPa_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+	int x, y;
+	uint32* dstp;
+	uint32* patp;
+
+	for (y = 0; y < nHeight; y++)
+	{
+		dstp = (uint32*) gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+		if (dstp != 0)
+		{
+			for (x = 0; x < nWidth; x++)
+			{
+				patp = (uint32*) gdi_get_brush_pointer(hdcDest, x, y);
+
+				*dstp = *dstp & *patp;
+				dstp++;
+			}
+		}
+	}
+
+	return 0;
+}
+
 static int BitBlt_PDxn_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
 {
 	int x, y;
@@ -807,6 +832,10 @@
 			return BitBlt_WHITENESS_32bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
 			break;
 
+		case GDI_DPa:
+			return BitBlt_DPa_32bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+			break;
+
 		case GDI_PDxn:
 			return BitBlt_PDxn_32bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
 			break;
Index: freerdp-1.0.1/libfreerdp-gdi/8bpp.c
===================================================================
--- freerdp-1.0.1.orig/libfreerdp-gdi/8bpp.c	2012-02-10 20:15:05.000000000 +0100
+++ freerdp-1.0.1/libfreerdp-gdi/8bpp.c	2013-01-01 17:35:46.331759945 +0100
@@ -339,6 +339,31 @@
 	return 0;
 }
 
+static int BitBlt_DPa_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
+{
+	int x, y;
+	uint8* dstp;
+	uint8* patp;
+
+	for (y = 0; y < nHeight; y++)
+	{
+		dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y);
+
+		if (dstp != 0)
+		{
+			for (x = 0; x < nWidth; x++)
+			{
+				patp = gdi_get_brush_pointer(hdcDest, x, y);
+
+				*dstp = *dstp & *patp;
+				dstp++;
+			}
+		}
+	}
+
+	return 0;
+}
+
 static int BitBlt_PDxn_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, int nHeight)
 {
 	int x, y;
@@ -688,6 +713,10 @@
 			return BitBlt_WHITENESS_8bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
 			break;
 
+		case GDI_DPa:
+			return BitBlt_DPa_8bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
+			break;
+
 		case GDI_PDxn:
 			return BitBlt_PDxn_8bpp(hdc, nXLeft, nYLeft, nWidth, nHeight);
 			break;
Index: freerdp-1.0.1/libfreerdp-gdi/gdi.c
===================================================================
--- freerdp-1.0.1.orig/libfreerdp-gdi/gdi.c	2012-02-10 20:15:05.000000000 +0100
+++ freerdp-1.0.1/libfreerdp-gdi/gdi.c	2013-01-01 17:35:46.331759945 +0100
@@ -628,7 +628,27 @@
 
 void gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt)
 {
+	printf("Mem3Blt\n");
+}
+
+static void gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc)
+{
+	printf("PolygonSC\n");
+}
 
+static void gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb)
+{
+	printf("PolygonCB\n");
+}
+
+static void gdi_ellipse_sc(rdpContext* context, ELLIPSE_SC_ORDER* ellipse_sc)
+{
+	printf("EllipseSC\n");
+}
+
+static void gdi_ellipse_cb(rdpContext* context, ELLIPSE_CB_ORDER* ellipse_cb)
+{
+	printf("EllipseCB\n");
 }
 
 int tilenum = 0;
@@ -776,10 +796,10 @@
 	primary->GlyphIndex = NULL;
 	primary->FastIndex = NULL;
 	primary->FastGlyph = NULL;
-	primary->PolygonSC = NULL;
-	primary->PolygonCB = NULL;
-	primary->EllipseSC = NULL;
-	primary->EllipseCB = NULL;
+	primary->PolygonSC = gdi_polygon_sc;
+	primary->PolygonCB = gdi_polygon_cb;
+	primary->EllipseSC = gdi_ellipse_sc;
+	primary->EllipseCB = gdi_ellipse_cb;
 
 	update->SurfaceBits = gdi_surface_bits;
 }
