From b293b17ac9524cf49915de8974da1ef5c96f78a3 Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Fri, 22 Dec 2017 10:25:05 +0100 Subject: [PATCH 1/3] Added ROP to string functions for log messages. --- include/freerdp/gdi/gdi.h | 3 + libfreerdp/gdi/gdi.c | 544 ++++++++++++++++++++------------------ 2 files changed, 287 insertions(+), 260 deletions(-) diff --git a/include/freerdp/gdi/gdi.h b/include/freerdp/gdi/gdi.h index 8c2fc0079..3ab0e6873 100644 --- a/include/freerdp/gdi/gdi.h +++ b/include/freerdp/gdi/gdi.h @@ -528,6 +528,9 @@ extern "C" { #endif FREERDP_API DWORD gdi_rop3_code(BYTE code); +FREERDP_API const char* gdi_rop3_code_string(BYTE code); +FREERDP_API const char* gdi_rop3_string(DWORD rop); + FREERDP_API UINT32 gdi_get_pixel_format(UINT32 bitsPerPixel); FREERDP_API BOOL gdi_decode_color(rdpGdi* gdi, const UINT32 srcColor, UINT32* color, UINT32* format); diff --git a/libfreerdp/gdi/gdi.c b/libfreerdp/gdi/gdi.c index e747e2c95..2b0ff41d9 100644 --- a/libfreerdp/gdi/gdi.c +++ b/libfreerdp/gdi/gdi.c @@ -48,264 +48,270 @@ #define TAG FREERDP_TAG("gdi") /* Ternary Raster Operation Table */ -static const DWORD rop3_code_table[] = +typedef struct { - 0x00000042, /* 0 */ - 0x00010289, /* DPSoon */ - 0x00020C89, /* DPSona */ - 0x000300AA, /* PSon */ - 0x00040C88, /* SDPona */ - 0x000500A9, /* DPon */ - 0x00060865, /* PDSxnon */ - 0x000702C5, /* PDSaon */ - 0x00080F08, /* SDPnaa */ - 0x00090245, /* PDSxon */ - 0x000A0329, /* DPna */ - 0x000B0B2A, /* PSDnaon */ - 0x000C0324, /* SPna */ - 0x000D0B25, /* PDSnaon */ - 0x000E08A5, /* PDSonon */ - 0x000F0001, /* Pn */ - 0x00100C85, /* PDSona */ - 0x001100A6, /* DSon */ - 0x00120868, /* SDPxnon */ - 0x001302C8, /* SDPaon */ - 0x00140869, /* DPSxnon */ - 0x001502C9, /* DPSaon */ - 0x00165CCA, /* PSDPSanaxx */ - 0x00171D54, /* SSPxDSxaxn */ - 0x00180D59, /* SPxPDxa */ - 0x00191CC8, /* SDPSanaxn */ - 0x001A06C5, /* PDSPaox */ - 0x001B0768, /* SDPSxaxn */ - 0x001C06CA, /* PSDPaox */ - 0x001D0766, /* DSPDxaxn */ - 0x001E01A5, /* PDSox */ - 0x001F0385, /* PDSoan */ - 0x00200F09, /* DPSnaa */ - 0x00210248, /* SDPxon */ - 0x00220326, /* DSna */ - 0x00230B24, /* SPDnaon */ - 0x00240D55, /* SPxDSxa */ - 0x00251CC5, /* PDSPanaxn */ - 0x002606C8, /* SDPSaox */ - 0x00271868, /* SDPSxnox */ - 0x00280369, /* DPSxa */ - 0x002916CA, /* PSDPSaoxxn */ - 0x002A0CC9, /* DPSana */ - 0x002B1D58, /* SSPxPDxaxn */ - 0x002C0784, /* SPDSoax */ - 0x002D060A, /* PSDnox */ - 0x002E064A, /* PSDPxox */ - 0x002F0E2A, /* PSDnoan */ - 0x0030032A, /* PSna */ - 0x00310B28, /* SDPnaon */ - 0x00320688, /* SDPSoox */ - 0x00330008, /* Sn */ - 0x003406C4, /* SPDSaox */ - 0x00351864, /* SPDSxnox */ - 0x003601A8, /* SDPox */ - 0x00370388, /* SDPoan */ - 0x0038078A, /* PSDPoax */ - 0x00390604, /* SPDnox */ - 0x003A0644, /* SPDSxox */ - 0x003B0E24, /* SPDnoan */ - 0x003C004A, /* PSx */ - 0x003D18A4, /* SPDSonox */ - 0x003E1B24, /* SPDSnaox */ - 0x003F00EA, /* PSan */ - 0x00400F0A, /* PSDnaa */ - 0x00410249, /* DPSxon */ - 0x00420D5D, /* SDxPDxa */ - 0x00431CC4, /* SPDSanaxn */ - 0x00440328, /* SDna */ - 0x00450B29, /* DPSnaon */ - 0x004606C6, /* DSPDaox */ - 0x0047076A, /* PSDPxaxn */ - 0x00480368, /* SDPxa */ - 0x004916C5, /* PDSPDaoxxn */ - 0x004A0789, /* DPSDoax */ - 0x004B0605, /* PDSnox */ - 0x004C0CC8, /* SDPana */ - 0x004D1954, /* SSPxDSxoxn */ - 0x004E0645, /* PDSPxox */ - 0x004F0E25, /* PDSnoan */ - 0x00500325, /* PDna */ - 0x00510B26, /* DSPnaon */ - 0x005206C9, /* DPSDaox */ - 0x00530764, /* SPDSxaxn */ - 0x005408A9, /* DPSonon */ - 0x00550009, /* Dn */ - 0x005601A9, /* DPSox */ - 0x00570389, /* DPSoan */ - 0x00580785, /* PDSPoax */ - 0x00590609, /* DPSnox */ - 0x005A0049, /* DPx */ - 0x005B18A9, /* DPSDonox */ - 0x005C0649, /* DPSDxox */ - 0x005D0E29, /* DPSnoan */ - 0x005E1B29, /* DPSDnaox */ - 0x005F00E9, /* DPan */ - 0x00600365, /* PDSxa */ - 0x006116C6, /* DSPDSaoxxn */ - 0x00620786, /* DSPDoax */ - 0x00630608, /* SDPnox */ - 0x00640788, /* SDPSoax */ - 0x00650606, /* DSPnox */ - 0x00660046, /* DSx */ - 0x006718A8, /* SDPSonox */ - 0x006858A6, /* DSPDSonoxxn */ - 0x00690145, /* PDSxxn */ - 0x006A01E9, /* DPSax */ - 0x006B178A, /* PSDPSoaxxn */ - 0x006C01E8, /* SDPax */ - 0x006D1785, /* PDSPDoaxxn */ - 0x006E1E28, /* SDPSnoax */ - 0x006F0C65, /* PDSxnan */ - 0x00700CC5, /* PDSana */ - 0x00711D5C, /* SSDxPDxaxn */ - 0x00720648, /* SDPSxox */ - 0x00730E28, /* SDPnoan */ - 0x00740646, /* DSPDxox */ - 0x00750E26, /* DSPnoan */ - 0x00761B28, /* SDPSnaox */ - 0x007700E6, /* DSan */ - 0x007801E5, /* PDSax */ - 0x00791786, /* DSPDSoaxxn */ - 0x007A1E29, /* DPSDnoax */ - 0x007B0C68, /* SDPxnan */ - 0x007C1E24, /* SPDSnoax */ - 0x007D0C69, /* DPSxnan */ - 0x007E0955, /* SPxDSxo */ - 0x007F03C9, /* DPSaan */ - 0x008003E9, /* DPSaa */ - 0x00810975, /* SPxDSxon */ - 0x00820C49, /* DPSxna */ - 0x00831E04, /* SPDSnoaxn */ - 0x00840C48, /* SDPxna */ - 0x00851E05, /* PDSPnoaxn */ - 0x008617A6, /* DSPDSoaxx */ - 0x008701C5, /* PDSaxn */ - 0x008800C6, /* DSa */ - 0x00891B08, /* SDPSnaoxn */ - 0x008A0E06, /* DSPnoa */ - 0x008B0666, /* DSPDxoxn */ - 0x008C0E08, /* SDPnoa */ - 0x008D0668, /* SDPSxoxn */ - 0x008E1D7C, /* SSDxPDxax */ - 0x008F0CE5, /* PDSanan */ - 0x00900C45, /* PDSxna */ - 0x00911E08, /* SDPSnoaxn */ - 0x009217A9, /* DPSDPoaxx */ - 0x009301C4, /* SPDaxn */ - 0x009417AA, /* PSDPSoaxx */ - 0x009501C9, /* DPSaxn */ - 0x00960169, /* DPSxx */ - 0x0097588A, /* PSDPSonoxx */ - 0x00981888, /* SDPSonoxn */ - 0x00990066, /* DSxn */ - 0x009A0709, /* DPSnax */ - 0x009B07A8, /* SDPSoaxn */ - 0x009C0704, /* SPDnax */ - 0x009D07A6, /* DSPDoaxn */ - 0x009E16E6, /* DSPDSaoxx */ - 0x009F0345, /* PDSxan */ - 0x00A000C9, /* DPa */ - 0x00A11B05, /* PDSPnaoxn */ - 0x00A20E09, /* DPSnoa */ - 0x00A30669, /* DPSDxoxn */ - 0x00A41885, /* PDSPonoxn */ - 0x00A50065, /* PDxn */ - 0x00A60706, /* DSPnax */ - 0x00A707A5, /* PDSPoaxn */ - 0x00A803A9, /* DPSoa */ - 0x00A90189, /* DPSoxn */ - 0x00AA0029, /* D */ - 0x00AB0889, /* DPSono */ - 0x00AC0744, /* SPDSxax */ - 0x00AD06E9, /* DPSDaoxn */ - 0x00AE0B06, /* DSPnao */ - 0x00AF0229, /* DPno */ - 0x00B00E05, /* PDSnoa */ - 0x00B10665, /* PDSPxoxn */ - 0x00B21974, /* SSPxDSxox */ - 0x00B30CE8, /* SDPanan */ - 0x00B4070A, /* PSDnax */ - 0x00B507A9, /* DPSDoaxn */ - 0x00B616E9, /* DPSDPaoxx */ - 0x00B70348, /* SDPxan */ - 0x00B8074A, /* PSDPxax */ - 0x00B906E6, /* DSPDaoxn */ - 0x00BA0B09, /* DPSnao */ - 0x00BB0226, /* DSno */ - 0x00BC1CE4, /* SPDSanax */ - 0x00BD0D7D, /* SDxPDxan */ - 0x00BE0269, /* DPSxo */ - 0x00BF08C9, /* DPSano */ - 0x00C000CA, /* PSa */ - 0x00C11B04, /* SPDSnaoxn */ - 0x00C21884, /* SPDSonoxn */ - 0x00C3006A, /* PSxn */ - 0x00C40E04, /* SPDnoa */ - 0x00C50664, /* SPDSxoxn */ - 0x00C60708, /* SDPnax */ - 0x00C707AA, /* PSDPoaxn */ - 0x00C803A8, /* SDPoa */ - 0x00C90184, /* SPDoxn */ - 0x00CA0749, /* DPSDxax */ - 0x00CB06E4, /* SPDSaoxn */ - 0x00CC0020, /* S */ - 0x00CD0888, /* SDPono */ - 0x00CE0B08, /* SDPnao */ - 0x00CF0224, /* SPno */ - 0x00D00E0A, /* PSDnoa */ - 0x00D1066A, /* PSDPxoxn */ - 0x00D20705, /* PDSnax */ - 0x00D307A4, /* SPDSoaxn */ - 0x00D41D78, /* SSPxPDxax */ - 0x00D50CE9, /* DPSanan */ - 0x00D616EA, /* PSDPSaoxx */ - 0x00D70349, /* DPSxan */ - 0x00D80745, /* PDSPxax */ - 0x00D906E8, /* SDPSaoxn */ - 0x00DA1CE9, /* DPSDanax */ - 0x00DB0D75, /* SPxDSxan */ - 0x00DC0B04, /* SPDnao */ - 0x00DD0228, /* SDno */ - 0x00DE0268, /* SDPxo */ - 0x00DF08C8, /* SDPano */ - 0x00E003A5, /* PDSoa */ - 0x00E10185, /* PDSoxn */ - 0x00E20746, /* DSPDxax */ - 0x00E306EA, /* PSDPaoxn */ - 0x00E40748, /* SDPSxax */ - 0x00E506E5, /* PDSPaoxn */ - 0x00E61CE8, /* SDPSanax */ - 0x00E70D79, /* SPxPDxan */ - 0x00E81D74, /* SSPxDSxax */ - 0x00E95CE6, /* DSPDSanaxxn */ - 0x00EA02E9, /* DPSao */ - 0x00EB0849, /* DPSxno */ - 0x00EC02E8, /* SDPao */ - 0x00ED0848, /* SDPxno */ - 0x00EE0086, /* DSo */ - 0x00EF0A08, /* SDPnoo */ - 0x00F00021, /* P */ - 0x00F10885, /* PDSono */ - 0x00F20B05, /* PDSnao */ - 0x00F3022A, /* PSno */ - 0x00F40B0A, /* PSDnao */ - 0x00F50225, /* PDno */ - 0x00F60265, /* PDSxo */ - 0x00F708C5, /* PDSano */ - 0x00F802E5, /* PDSao */ - 0x00F90845, /* PDSxno */ - 0x00FA0089, /* DPo */ - 0x00FB0A09, /* DPSnoo */ - 0x00FC008A, /* PSo */ - 0x00FD0A0A, /* PSDnoo */ - 0x00FE02A9, /* DPSoo */ - 0x00FF0062 /* 1 */ + DWORD code; + const char* name; +} rop_table_entry; + +static const rop_table_entry rop3_code_table[] = +{ + { GDI_BLACKNESS, "0" }, + { GDI_DPSoon, "DPSoon" }, + { GDI_DPSona, "DPSona" }, + { GDI_PSon, "PSon" }, + { GDI_SDPona, "SDPona" }, + { GDI_DPon, "DPon" }, + { GDI_PDSxnon, "PDSxnon" }, + { GDI_PDSaon, "PDSaon" }, + { GDI_SDPnaa, "SDPnaa" }, + { GDI_PDSxon, "PDSxon" }, + { GDI_DPna, "DPna" }, + { GDI_PSDnaon, "PSDnaon" }, + { GDI_SPna, "SPna" }, + { GDI_PDSnaon, "PDSnaon" }, + { GDI_PDSonon, "PDSonon" }, + { GDI_Pn , "Pn" }, + { GDI_PDSona, "PDSona" }, + { GDI_NOTSRCERASE, "DSon" }, + { GDI_SDPxnon, "SDPxnon" }, + { GDI_SDPaon, "SDPaon" }, + { GDI_DPSxnon, "DPSxnon" }, + { GDI_DPSaon, "DPSaon" }, + { GDI_PSDPSanaxx, "PSDPSanaxx" }, + { GDI_SSPxDSxaxn, "SSPxDSxaxn" }, + { GDI_SPxPDxa, "SPxPDxa" }, + { GDI_SDPSanaxn, "SDPSanaxn" }, + { GDI_PDSPaox, "PDSPaox" }, + { GDI_SDPSxaxn, "SDPSxaxn" }, + { GDI_PSDPaox, "PSDPaox" }, + { GDI_DSPDxaxn, "DSPDxaxn" }, + { GDI_PDSox, "PDSox" }, + { GDI_PDSoan, "PDSoan" }, + { GDI_DPSnaa, "DPSnaa" }, + { GDI_SDPxon, "SDPxon" }, + { GDI_DSna, "DSna" }, + { GDI_SPDnaon, "SPDnaon" }, + { GDI_SPxDSxa, "SPxDSxa" }, + { GDI_PDSPanaxn, "PDSPanaxn" }, + { GDI_SDPSaox, "SDPSaox" }, + { GDI_SDPSxnox, "SDPSxnox" }, + { GDI_DPSxa, "DPSxa" }, + { GDI_PSDPSaoxxn, "PSDPSaoxxn" }, + { GDI_DPSana, "DPSana" }, + { GDI_SSPxPDxaxn, "SSPxPDxaxn" }, + { GDI_SPDSoax, "SPDSoax" }, + { GDI_PSDnox, "PSDnox" }, + { GDI_PSDPxox, "PSDPxox" }, + { GDI_PSDnoan, "PSDnoan" }, + { GDI_PSna, "PSna" }, + { GDI_SDPnaon, "SDPnaon" }, + { GDI_SDPSoox, "SDPSoox" }, + { GDI_NOTSRCCOPY, "Sn" }, + { GDI_SPDSaox, "SPDSaox" }, + { GDI_SPDSxnox, "SPDSxnox" }, + { GDI_SDPox, "SDPox" }, + { GDI_SDPoan, "SDPoan" }, + { GDI_PSDPoax, "PSDPoax" }, + { GDI_SPDnox, "SPDnox" }, + { GDI_SPDSxox, "SPDSxox" }, + { GDI_SPDnoan, "SPDnoan" }, + { GDI_PSx , "PSx" }, + { GDI_SPDSonox, "SPDSonox" }, + { GDI_SPDSnaox, "SPDSnaox" }, + { GDI_PSan, "PSan" }, + { GDI_PSDnaa, "PSDnaa" }, + { GDI_DPSxon, "DPSxon" }, + { GDI_SDxPDxa, "SDxPDxa" }, + { GDI_SPDSanaxn, "SPDSanaxn" }, + { GDI_SRCERASE, "SDna" }, + { GDI_DPSnaon, "DPSnaon" }, + { GDI_DSPDaox, "DSPDaox" }, + { GDI_PSDPxaxn, "PSDPxaxn" }, + { GDI_SDPxa, "SDPxa" }, + { GDI_PDSPDaoxxn, "PDSPDaoxxn" }, + { GDI_DPSDoax, "DPSDoax" }, + { GDI_PDSnox, "PDSnox" }, + { GDI_SDPana, "SDPana" }, + { GDI_SSPxDSxoxn, "SSPxDSxoxn" }, + { GDI_PDSPxox, "PDSPxox" }, + { GDI_PDSnoan, "PDSnoan" }, + { GDI_PDna, "PDna" }, + { GDI_DSPnaon, "DSPnaon" }, + { GDI_DPSDaox, "DPSDaox" }, + { GDI_SPDSxaxn, "SPDSxaxn" }, + { GDI_DPSonon, "DPSonon" }, + { GDI_DSTINVERT, "Dn" }, + { GDI_DPSox, "DPSox" }, + { GDI_DPSoan, "DPSoan" }, + { GDI_PDSPoax, "PDSPoax" }, + { GDI_DPSnox, "DPSnox" }, + { GDI_PATINVERT, "DPx" }, + { GDI_DPSDonox, "DPSDonox" }, + { GDI_DPSDxox, "DPSDxox" }, + { GDI_DPSnoan, "DPSnoan" }, + { GDI_DPSDnaox, "DPSDnaox" }, + { GDI_DPan, "DPan" }, + { GDI_PDSxa, "PDSxa" }, + { GDI_DSPDSaoxxn, "DSPDSaoxxn" }, + { GDI_DSPDoax, "DSPDoax" }, + { GDI_SDPnox, "SDPnox" }, + { GDI_SDPSoax, "SDPSoax" }, + { GDI_DSPnox, "DSPnox" }, + { GDI_SRCINVERT, "DSx" }, + { GDI_SDPSonox, "SDPSonox" }, + { GDI_DSPDSonoxxn, "DSPDSonoxxn" }, + { GDI_PDSxxn, "PDSxxn" }, + { GDI_DPSax, "DPSax" }, + { GDI_PSDPSoaxxn, "PSDPSoaxxn" }, + { GDI_SDPax, "SDPax" }, + { GDI_PDSPDoaxxn, "PDSPDoaxxn" }, + { GDI_SDPSnoax, "SDPSnoax" }, + { GDI_PDSxnan, "PDSxnan" }, + { GDI_PDSana, "PDSana" }, + { GDI_SSDxPDxaxn, "SSDxPDxaxn" }, + { GDI_SDPSxox, "SDPSxox" }, + { GDI_SDPnoan, "SDPnoan" }, + { GDI_DSPDxox, "DSPDxox" }, + { GDI_DSPnoan, "DSPnoan" }, + { GDI_SDPSnaox, "SDPSnaox" }, + { GDI_DSan, "DSan" }, + { GDI_PDSax, "PDSax" }, + { GDI_DSPDSoaxxn, "DSPDSoaxxn" }, + { GDI_DPSDnoax, "DPSDnoax" }, + { GDI_SDPxnan, "SDPxnan" }, + { GDI_SPDSnoax, "SPDSnoax" }, + { GDI_DPSxnan, "DPSxnan" }, + { GDI_SPxDSxo, "SPxDSxo" }, + { GDI_DPSaan, "DPSaan" }, + { GDI_DPSaa, "DPSaa" }, + { GDI_SPxDSxon, "SPxDSxon" }, + { GDI_DPSxna, "DPSxna" }, + { GDI_SPDSnoaxn, "SPDSnoaxn" }, + { GDI_SDPxna, "SDPxna" }, + { GDI_PDSPnoaxn, "PDSPnoaxn" }, + { GDI_DSPDSoaxx, "DSPDSoaxx" }, + { GDI_PDSaxn, "PDSaxn" }, + { GDI_SRCAND, "DSa" }, + { GDI_SDPSnaoxn, "SDPSnaoxn" }, + { GDI_DSPnoa, "DSPnoa" }, + { GDI_DSPDxoxn, "DSPDxoxn" }, + { GDI_SDPnoa, "SDPnoa" }, + { GDI_SDPSxoxn, "SDPSxoxn" }, + { GDI_SSDxPDxax, "SSDxPDxax" }, + { GDI_PDSanan, "PDSanan" }, + { GDI_PDSxna, "PDSxna" }, + { GDI_SDPSnoaxn, "SDPSnoaxn" }, + { GDI_DPSDPoaxx, "DPSDPoaxx" }, + { GDI_SPDaxn, "SPDaxn" }, + { GDI_PSDPSoaxx, "PSDPSoaxx" }, + { GDI_DPSaxn, "DPSaxn" }, + { GDI_DPSxx, "DPSxx" }, + { GDI_PSDPSonoxx, "PSDPSonoxx" }, + { GDI_SDPSonoxn, "SDPSonoxn" }, + { GDI_DSxn, "DSxn" }, + { GDI_DPSnax, "DPSnax" }, + { GDI_SDPSoaxn, "SDPSoaxn" }, + { GDI_SPDnax, "SPDnax" }, + { GDI_DSPDoaxn, "DSPDoaxn" }, + { GDI_DSPDSaoxx, "DSPDSaoxx" }, + { GDI_PDSxan, "PDSxan" }, + { GDI_DPa , "DPa" }, + { GDI_PDSPnaoxn, "PDSPnaoxn" }, + { GDI_DPSnoa, "DPSnoa" }, + { GDI_DPSDxoxn, "DPSDxoxn" }, + { GDI_PDSPonoxn, "PDSPonoxn" }, + { GDI_PDxn, "PDxn" }, + { GDI_DSPnax, "DSPnax" }, + { GDI_PDSPoaxn, "PDSPoaxn" }, + { GDI_DPSoa, "DPSoa" }, + { GDI_DPSoxn, "DPSoxn" }, + { GDI_DSTCOPY, "D" }, + { GDI_DPSono, "DPSono" }, + { GDI_SPDSxax, "SPDSxax" }, + { GDI_DPSDaoxn, "DPSDaoxn" }, + { GDI_DSPnao, "DSPnao" }, + { GDI_DPno, "DPno" }, + { GDI_PDSnoa, "PDSnoa" }, + { GDI_PDSPxoxn, "PDSPxoxn" }, + { GDI_SSPxDSxox, "SSPxDSxox" }, + { GDI_SDPanan, "SDPanan" }, + { GDI_PSDnax, "PSDnax" }, + { GDI_DPSDoaxn, "DPSDoaxn" }, + { GDI_DPSDPaoxx, "DPSDPaoxx" }, + { GDI_SDPxan, "SDPxan" }, + { GDI_PSDPxax, "PSDPxax" }, + { GDI_DSPDaoxn, "DSPDaoxn" }, + { GDI_DPSnao, "DPSnao" }, + { GDI_MERGEPAINT, "DSno" }, + { GDI_SPDSanax, "SPDSanax" }, + { GDI_SDxPDxan, "SDxPDxan" }, + { GDI_DPSxo, "DPSxo" }, + { GDI_DPSano, "DPSano" }, + { GDI_MERGECOPY, "PSa" }, + { GDI_SPDSnaoxn, "SPDSnaoxn" }, + { GDI_SPDSonoxn, "SPDSonoxn" }, + { GDI_PSxn, "PSxn" }, + { GDI_SPDnoa, "SPDnoa" }, + { GDI_SPDSxoxn, "SPDSxoxn" }, + { GDI_SDPnax, "SDPnax" }, + { GDI_PSDPoaxn, "PSDPoaxn" }, + { GDI_SDPoa, "SDPoa" }, + { GDI_SPDoxn, "SPDoxn" }, + { GDI_DPSDxax, "DPSDxax" }, + { GDI_SPDSaoxn, "SPDSaoxn" }, + { GDI_SRCCOPY, "S" }, + { GDI_SDPono, "SDPono" }, + { GDI_SDPnao, "SDPnao" }, + { GDI_SPno, "SPno" }, + { GDI_PSDnoa, "PSDnoa" }, + { GDI_PSDPxoxn, "PSDPxoxn" }, + { GDI_PDSnax, "PDSnax" }, + { GDI_SPDSoaxn, "SPDSoaxn" }, + { GDI_SSPxPDxax, "SSPxPDxax" }, + { GDI_DPSanan, "DPSanan" }, + { GDI_PSDPSaoxx, "PSDPSaoxx" }, + { GDI_DPSxan, "DPSxan" }, + { GDI_PDSPxax, "PDSPxax" }, + { GDI_SDPSaoxn, "SDPSaoxn" }, + { GDI_DPSDanax, "DPSDanax" }, + { GDI_SPxDSxan, "SPxDSxan" }, + { GDI_SPDnao, "SPDnao" }, + { GDI_SDno, "SDno" }, + { GDI_SDPxo, "SDPxo" }, + { GDI_SDPano, "SDPano" }, + { GDI_PDSoa, "PDSoa" }, + { GDI_PDSoxn, "PDSoxn" }, + { GDI_DSPDxax, "DSPDxax" }, + { GDI_PSDPaoxn, "PSDPaoxn" }, + { GDI_SDPSxax, "SDPSxax" }, + { GDI_PDSPaoxn, "PDSPaoxn" }, + { GDI_SDPSanax, "SDPSanax" }, + { GDI_SPxPDxan, "SPxPDxan" }, + { GDI_SSPxDSxax, "SSPxDSxax" }, + { GDI_DSPDSanaxxn, "DSPDSanaxxn" }, + { GDI_DPSao, "DPSao" }, + { GDI_DPSxno, "DPSxno" }, + { GDI_SDPao, "SDPao" }, + { GDI_SDPxno, "SDPxno" }, + { GDI_SRCPAINT, "DSo" }, + { GDI_SDPnoo, "SDPnoo" }, + { GDI_PATCOPY, "P" }, + { GDI_PDSono, "PDSono" }, + { GDI_PDSnao, "PDSnao" }, + { GDI_PSno, "PSno" }, + { GDI_PSDnao, "PSDnao" }, + { GDI_PDno, "PDno" }, + { GDI_PDSxo, "PDSxo" }, + { GDI_PDSano, "PDSano" }, + { GDI_PDSao, "PDSao" }, + { GDI_PDSxno, "PDSxno" }, + { GDI_DPo , "DPo" }, + { GDI_PATPAINT, "DPSnoo" }, + { GDI_PSo , "PSo" }, + { GDI_PSDnoo, "PSDnoo" }, + { GDI_DPSoo, "DPSoo" }, + { GDI_WHITENESS, "1" } }; /* Hatch Patterns as monochrome data */ @@ -361,9 +367,28 @@ INLINE BOOL gdi_decode_color(rdpGdi* gdi, const UINT32 srcColor, } /* GDI Helper Functions */ -INLINE DWORD gdi_rop3_code(BYTE code) +DWORD gdi_rop3_code(BYTE code) { - return rop3_code_table[code]; + return rop3_code_table[code].code; +} + +const char* gdi_rop3_code_string(BYTE code) +{ + return rop3_code_table[code].name; +} + +const char* gdi_rop3_string(DWORD rop) +{ + const size_t count = sizeof(rop3_code_table) / sizeof(rop3_code_table[0]); + size_t x; + + for (x = 0; x < count; x++) + { + if (rop3_code_table[x].code == rop) + return rop3_code_table[x].name; + } + + return "UNKNOWN"; } UINT32 gdi_get_pixel_format(UINT32 bitsPerPixel) @@ -1153,7 +1178,6 @@ static BOOL gdi_init_primary(rdpGdi* gdi, UINT32 stride, UINT32 format, goto fail_bitmap; gdi->stride = gdi->primary->bitmap->scanline; - gdi_SelectObject(gdi->primary->hdc, (HGDIOBJECT) gdi->primary->bitmap); gdi->primary->org_bitmap = NULL; gdi->primary_buffer = gdi->primary->bitmap->data; From c60c355a9d627b7d22c5836f38e73346f9d1300f Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Fri, 22 Dec 2017 10:37:04 +0100 Subject: [PATCH 2/3] Added ROP to primary order debug message. --- libfreerdp/core/orders.c | 63 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 61 insertions(+), 2 deletions(-) diff --git a/libfreerdp/core/orders.c b/libfreerdp/core/orders.c index 8427c7e7e..8acca4303 100644 --- a/libfreerdp/core/orders.c +++ b/libfreerdp/core/orders.c @@ -31,6 +31,7 @@ #include #include #include +#include #include "orders.h" @@ -2943,8 +2944,6 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) } orderInfo->deltaCoordinates = (flags & ORDER_DELTA_COORDINATES) ? TRUE : FALSE; - WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", - PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); switch (orderInfo->orderType) { @@ -2955,6 +2954,10 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, + "%s Primary Drawing Order (0x%08"PRIX32") rop=%s [0x%08"PRIx32"]", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType, + gdi_rop3_code_string(primary->dstblt.bRop), gdi_rop3_code(primary->dstblt.bRop)); IFCALL(primary->DstBlt, context, &primary->dstblt); break; @@ -2965,6 +2968,10 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, + "%s Primary Drawing Order (0x%08"PRIX32") rop=%s [0x%08"PRIx32"]", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType, + gdi_rop3_code_string(primary->patblt.bRop), gdi_rop3_code(primary->patblt.bRop)); IFCALL(primary->PatBlt, context, &primary->patblt); break; @@ -2975,6 +2982,10 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, + "%s Primary Drawing Order (0x%08"PRIX32") rop=%s [0x%08"PRIx32"]", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType, + gdi_rop3_code_string(primary->scrblt.bRop), gdi_rop3_code(primary->scrblt.bRop)); IFCALL(primary->ScrBlt, context, &primary->scrblt); break; @@ -2986,6 +2997,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->OpaqueRect, context, &primary->opaque_rect); break; @@ -2997,6 +3010,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->DrawNineGrid, context, &primary->draw_nine_grid); break; @@ -3008,6 +3023,10 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, + "%s Primary Drawing Order (0x%08"PRIX32") rop=%s [0x%08"PRIx32"]", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType, + gdi_rop3_code_string(primary->multi_dstblt.bRop), gdi_rop3_code(primary->multi_dstblt.bRop)); IFCALL(primary->MultiDstBlt, context, &primary->multi_dstblt); break; @@ -3019,6 +3038,10 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, + "%s Primary Drawing Order (0x%08"PRIX32") rop=%s [0x%08"PRIx32"]", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType, + gdi_rop3_code_string(primary->multi_patblt.bRop), gdi_rop3_code(primary->multi_patblt.bRop)); IFCALL(primary->MultiPatBlt, context, &primary->multi_patblt); break; @@ -3030,6 +3053,10 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, + "%s Primary Drawing Order (0x%08"PRIX32") rop=%s [0x%08"PRIx32"]", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType, + gdi_rop3_code_string(primary->multi_scrblt.bRop), gdi_rop3_code(primary->multi_scrblt.bRop)); IFCALL(primary->MultiScrBlt, context, &primary->multi_scrblt); break; @@ -3042,6 +3069,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->MultiOpaqueRect, context, &primary->multi_opaque_rect); break; @@ -3054,6 +3083,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->MultiDrawNineGrid, context, &primary->multi_draw_nine_grid); break; @@ -3064,6 +3095,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->LineTo, context, &primary->line_to); break; @@ -3074,6 +3107,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->Polyline, context, &primary->polyline); break; @@ -3084,6 +3119,10 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, + "%s Primary Drawing Order (0x%08"PRIX32") rop=%s [0x%08"PRIx32"]", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType, + gdi_rop3_code_string(primary->memblt.bRop), gdi_rop3_code(primary->memblt.bRop)); IFCALL(primary->MemBlt, context, &primary->memblt); break; @@ -3094,6 +3133,10 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, + "%s Primary Drawing Order (0x%08"PRIX32") rop=%s [0x%08"PRIx32"]", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType, + gdi_rop3_code_string(primary->mem3blt.bRop), gdi_rop3_code(primary->mem3blt.bRop)); IFCALL(primary->Mem3Blt, context, &primary->mem3blt); break; @@ -3105,6 +3148,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->SaveBitmap, context, &primary->save_bitmap); break; @@ -3116,6 +3161,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->GlyphIndex, context, &primary->glyph_index); break; @@ -3126,6 +3173,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->FastIndex, context, &primary->fast_index); break; @@ -3136,6 +3185,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->FastGlyph, context, &primary->fast_glyph); break; @@ -3146,6 +3197,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->PolygonSC, context, &primary->polygon_sc); break; @@ -3156,6 +3209,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->PolygonCB, context, &primary->polygon_cb); break; @@ -3166,6 +3221,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->EllipseSC, context, &primary->ellipse_sc); break; @@ -3176,6 +3233,8 @@ static BOOL update_recv_primary_order(rdpUpdate* update, wStream* s, BYTE flags) return FALSE; } + WLog_Print(update->log, WLOG_DEBUG, "%s Primary Drawing Order (0x%08"PRIX32")", + PRIMARY_DRAWING_ORDER_STRINGS[orderInfo->orderType], orderInfo->orderType); IFCALL(primary->EllipseCB, context, &primary->ellipse_cb); break; From cf899eb5bab4f28839ff48b974e790b15abf16cd Mon Sep 17 00:00:00 2001 From: Armin Novak Date: Fri, 22 Dec 2017 13:43:37 +0100 Subject: [PATCH 3/3] Fix #4299: gdi_CRgnToRect The coordinates from RDP ROP commands do not (always) have 0,0 as the origin of the drawing operation. Adjust the coordinates to our local coordinate system. --- include/freerdp/gdi/region.h | 36 ++++++++++++++++++------------------ libfreerdp/gdi/region.c | 17 +++++++++-------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/include/freerdp/gdi/region.h b/include/freerdp/gdi/region.h index 26381ef1f..ad76203d3 100644 --- a/include/freerdp/gdi/region.h +++ b/include/freerdp/gdi/region.h @@ -26,43 +26,43 @@ #include #ifdef __cplusplus - extern "C" { +extern "C" { #endif FREERDP_API HGDI_RGN gdi_CreateRectRgn(UINT32 nLeftRect, UINT32 nTopRect, - UINT32 nRightRect, UINT32 nBottomRect); + UINT32 nRightRect, UINT32 nBottomRect); FREERDP_API HGDI_RECT gdi_CreateRect(UINT32 xLeft, UINT32 yTop, - UINT32 xRight, UINT32 yBottom); + UINT32 xRight, UINT32 yBottom); FREERDP_API void gdi_RectToRgn(HGDI_RECT rect, HGDI_RGN rgn); FREERDP_API void gdi_CRectToRgn(UINT32 left, UINT32 top, - UINT32 right, UINT32 bottom, HGDI_RGN rgn); -FREERDP_API void gdi_RectToCRgn(const HGDI_RECT rect, UINT32 *x, UINT32 *y, - UINT32 *w, UINT32 *h); + UINT32 right, UINT32 bottom, HGDI_RGN rgn); +FREERDP_API void gdi_RectToCRgn(const HGDI_RECT rect, UINT32* x, UINT32* y, + UINT32* w, UINT32* h); FREERDP_API void gdi_CRectToCRgn(UINT32 left, UINT32 top, - UINT32 right, UINT32 bottom, - UINT32 *x, UINT32 *y, UINT32 *w, UINT32 *h); + UINT32 right, UINT32 bottom, + UINT32* x, UINT32* y, UINT32* w, UINT32* h); FREERDP_API void gdi_RgnToRect(HGDI_RGN rgn, HGDI_RECT rect); -FREERDP_API void gdi_CRgnToRect(UINT32 x, UINT32 y, UINT32 w, UINT32 h, HGDI_RECT rect); -FREERDP_API void gdi_RgnToCRect(HGDI_RGN rgn, UINT32 *left, - UINT32 *top, UINT32 *right, UINT32 *bottom); +FREERDP_API void gdi_CRgnToRect(INT64 x, INT64 y, UINT32 w, UINT32 h, HGDI_RECT rect); +FREERDP_API void gdi_RgnToCRect(HGDI_RGN rgn, UINT32* left, + UINT32* top, UINT32* right, UINT32* bottom); FREERDP_API void gdi_CRgnToCRect(UINT32 x, UINT32 y, UINT32 w, UINT32 h, - UINT32 *left, UINT32 *top, UINT32 *right, UINT32 *bottom); + UINT32* left, UINT32* top, UINT32* right, UINT32* bottom); FREERDP_API BOOL gdi_CopyOverlap(UINT32 x, UINT32 y, UINT32 width, UINT32 height, - UINT32 srcx, UINT32 srcy); + UINT32 srcx, UINT32 srcy); FREERDP_API BOOL gdi_SetRect(HGDI_RECT rc, UINT32 xLeft, UINT32 yTop, - UINT32 xRight, UINT32 yBottom); + UINT32 xRight, UINT32 yBottom); FREERDP_API BOOL gdi_SetRgn(HGDI_RGN hRgn, UINT32 nXLeft, UINT32 nYLeft, - UINT32 nWidth, UINT32 nHeight); + UINT32 nWidth, UINT32 nHeight); FREERDP_API BOOL gdi_SetRectRgn(HGDI_RGN hRgn, UINT32 nLeftRect, UINT32 nTopRect, - UINT32 nRightRect, UINT32 nBottomRect); + UINT32 nRightRect, UINT32 nBottomRect); FREERDP_API BOOL gdi_EqualRgn(HGDI_RGN hSrcRgn1, HGDI_RGN hSrcRgn2); FREERDP_API BOOL gdi_CopyRect(HGDI_RECT dst, HGDI_RECT src); FREERDP_API BOOL gdi_PtInRect(HGDI_RECT rc, UINT32 x, UINT32 y); FREERDP_API BOOL gdi_InvalidateRegion(HGDI_DC hdc, UINT32 x, UINT32 y, - UINT32 w, UINT32 h); + UINT32 w, UINT32 h); #ifdef __cplusplus - } +} #endif #endif /* FREERDP_GDI_REGION_H */ diff --git a/libfreerdp/gdi/region.c b/libfreerdp/gdi/region.c index 4b9a75721..fabb8c2e1 100644 --- a/libfreerdp/gdi/region.c +++ b/libfreerdp/gdi/region.c @@ -184,20 +184,21 @@ INLINE void gdi_RgnToRect(HGDI_RGN rgn, HGDI_RECT rect) * @param rect destination rectangle */ -INLINE void gdi_CRgnToRect(UINT32 x, UINT32 y, UINT32 w, UINT32 h, +INLINE void gdi_CRgnToRect(INT64 x, INT64 y, UINT32 w, UINT32 h, HGDI_RECT rect) { - memset(rect, 0, sizeof(GDI_RECT)); - rect->left = x; - rect->top = y; + const INT64 r = x + w - 1; + const INT64 b = y + h - 1; + rect->left = (x > 0) ? x : 0; + rect->top = (y > 0) ? y : 0; - if (w > 0) - rect->right = x + w - 1; + if (r > 0) + rect->right = r; else WLog_ERR(TAG, "Invalid width"); - if (h > 0) - rect->bottom = y + h - 1; + if (b > 0) + rect->bottom = b; else WLog_ERR(TAG, "Invalid height"); }