From 5617af901a4269d7fe9688793135b79ed43aecd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 12 Feb 2012 15:21:08 -0500 Subject: [PATCH] libfreerdp-gdi: add PatBlt DPa operation --- client/X11/xfreerdp.c | 1 + include/freerdp/gdi/gdi.h | 1 + libfreerdp-gdi/16bpp.c | 29 +++++++++++++++++++++++++++++ libfreerdp-gdi/32bpp.c | 29 +++++++++++++++++++++++++++++ libfreerdp-gdi/8bpp.c | 29 +++++++++++++++++++++++++++++ libfreerdp-gdi/gdi.c | 28 ++++++++++++++++++++++++---- 6 files changed, 113 insertions(+), 4 deletions(-) diff --git a/client/X11/xfreerdp.c b/client/X11/xfreerdp.c index de5812272c1b..e1c312b2799b 100644 --- a/client/X11/xfreerdp.c +++ b/client/X11/xfreerdp.c @@ -481,6 +481,7 @@ boolean xf_pre_connect(freerdp* instance) settings->os_major_type = OSMAJORTYPE_UNIX; settings->os_minor_type = OSMINORTYPE_NATIVE_XSERVER; + settings->order_support[NEG_DSTBLT_INDEX] = true; settings->order_support[NEG_PATBLT_INDEX] = true; settings->order_support[NEG_SCRBLT_INDEX] = true; diff --git a/include/freerdp/gdi/gdi.h b/include/freerdp/gdi/gdi.h index feab64930110..d1b36cbf7f62 100644 --- a/include/freerdp/gdi/gdi.h +++ b/include/freerdp/gdi/gdi.h @@ -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 */ diff --git a/libfreerdp-gdi/16bpp.c b/libfreerdp-gdi/16bpp.c index 70f41caf61f6..2b6bf746c002 100644 --- a/libfreerdp-gdi/16bpp.c +++ b/libfreerdp-gdi/16bpp.c @@ -434,6 +434,31 @@ static int BitBlt_SPna_16bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth 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 @@ int PatBlt_16bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, i 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; diff --git a/libfreerdp-gdi/32bpp.c b/libfreerdp-gdi/32bpp.c index 728215ace6de..fda67901d7cf 100644 --- a/libfreerdp-gdi/32bpp.c +++ b/libfreerdp-gdi/32bpp.c @@ -487,6 +487,31 @@ static int BitBlt_DSna_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth 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 @@ int PatBlt_32bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, i 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; diff --git a/libfreerdp-gdi/8bpp.c b/libfreerdp-gdi/8bpp.c index d5a8a00543f9..40f1e740f8c7 100644 --- a/libfreerdp-gdi/8bpp.c +++ b/libfreerdp-gdi/8bpp.c @@ -339,6 +339,31 @@ static int BitBlt_SPna_8bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWidth, 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 @@ int PatBlt_8bpp(HGDI_DC hdc, int nXLeft, int nYLeft, int nWidth, int nHeight, in 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; diff --git a/libfreerdp-gdi/gdi.c b/libfreerdp-gdi/gdi.c index 77c1384604ca..ebdf4cffd038 100644 --- a/libfreerdp-gdi/gdi.c +++ b/libfreerdp-gdi/gdi.c @@ -628,7 +628,27 @@ void gdi_memblt(rdpContext* context, MEMBLT_ORDER* memblt) 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 @@ void gdi_register_update_callbacks(rdpUpdate* update) 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; }