diff -Nru freerdp-1.0.1/debian/changelog freerdp-1.0.1/debian/changelog --- freerdp-1.0.1/debian/changelog 2012-07-13 19:20:54.000000000 +0200 +++ freerdp-1.0.1/debian/changelog 2013-01-01 17:53:54.000000000 +0100 @@ -1,3 +1,16 @@ +freerdp (1.0.1-1.1+deb7u1) testing-proposed-updates; urgency=medium + + * Non-maintainer upload. + * debian/patches/PatBlt_DPa.patch: + - Cherry-pick patch from upstream repository to implement PatBlt + operation, to fix random crash of clients when attached to RDP + sessions (Closes: #662854). + * debian/libfreerdp1.symbols: + - PatBlt operation support added new symbols, reflect this into + symbols file accordingly. + + -- Luca Falavigna Tue, 01 Jan 2013 17:52:50 +0100 + freerdp (1.0.1-1.1) unstable; urgency=low [ gregor herrmann ] diff -Nru freerdp-1.0.1/debian/libfreerdp1.symbols freerdp-1.0.1/debian/libfreerdp1.symbols --- freerdp-1.0.1/debian/libfreerdp1.symbols 2012-02-11 13:29:39.000000000 +0100 +++ freerdp-1.0.1/debian/libfreerdp1.symbols 2013-01-01 17:52:35.000000000 +0100 @@ -1079,6 +1079,8 @@ gdi_bitmap_new_ex@Base 1.0~beta5 gdi_create_bitmap@Base 1.0~beta5 gdi_dstblt@Base 1.0~beta5 + gdi_ellipse_cb@Base 1.0.1 + gdi_ellipse_sc@Base 1.0.1 gdi_free@Base 1.0~beta5 gdi_get_bitmap_pointer@Base 1.0~beta5 gdi_get_brush_pointer@Base 1.0~beta5 @@ -1096,6 +1098,8 @@ gdi_opaque_rect@Base 1.0~beta5 gdi_palette_update@Base 1.0~beta5 gdi_patblt@Base 1.0~beta5 + gdi_polygon_cb@Base 1.0.1 + gdi_polygon_sc@Base 1.0.1 gdi_polyline@Base 1.0~beta5 gdi_register_graphics@Base 1.0~beta5 gdi_register_update_callbacks@Base 1.0~beta5 diff -Nru freerdp-1.0.1/debian/patches/PatBlt_DPa.patch freerdp-1.0.1/debian/patches/PatBlt_DPa.patch --- freerdp-1.0.1/debian/patches/PatBlt_DPa.patch 1970-01-01 01:00:00.000000000 +0100 +++ freerdp-1.0.1/debian/patches/PatBlt_DPa.patch 2013-01-01 17:36:41.000000000 +0100 @@ -0,0 +1,203 @@ +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"); ++} ++ ++void gdi_polygon_sc(rdpContext* context, POLYGON_SC_ORDER* polygon_sc) ++{ ++ printf("PolygonSC\n"); ++} + ++void gdi_polygon_cb(rdpContext* context, POLYGON_CB_ORDER* polygon_cb) ++{ ++ printf("PolygonCB\n"); ++} ++ ++void gdi_ellipse_sc(rdpContext* context, ELLIPSE_SC_ORDER* ellipse_sc) ++{ ++ printf("EllipseSC\n"); ++} ++ ++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; + } diff -Nru freerdp-1.0.1/debian/patches/series freerdp-1.0.1/debian/patches/series --- freerdp-1.0.1/debian/patches/series 1970-01-01 01:00:00.000000000 +0100 +++ freerdp-1.0.1/debian/patches/series 2013-01-01 17:35:28.000000000 +0100 @@ -0,0 +1 @@ +PatBlt_DPa.patch