Added ROP to string functions for log messages.
authorArmin Novak <armin.novak@thincast.com>
Fri, 22 Dec 2017 09:25:05 +0000 (10:25 +0100)
committerArmin Novak <armin.novak@thincast.com>
Fri, 22 Dec 2017 09:25:05 +0000 (10:25 +0100)
include/freerdp/gdi/gdi.h
libfreerdp/gdi/gdi.c

index 8c2fc00..3ab0e68 100644 (file)
@@ -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);
index e747e2c..2b0ff41 100644 (file)
 #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;