summaryrefslogtreecommitdiffstats
path: root/libfreerdp/gdi/brush.c
diff options
context:
space:
mode:
Diffstat (limited to 'libfreerdp/gdi/brush.c')
-rw-r--r--libfreerdp/gdi/brush.c869
1 files changed, 869 insertions, 0 deletions
diff --git a/libfreerdp/gdi/brush.c b/libfreerdp/gdi/brush.c
new file mode 100644
index 0000000..28aa59d
--- /dev/null
+++ b/libfreerdp/gdi/brush.c
@@ -0,0 +1,869 @@
+/**
+ * FreeRDP: A Remote Desktop Protocol Implementation
+ * GDI Brush Functions
+ *
+ * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
+ * Copyright 2016 Armin Novak <armin.novak@thincast.com>
+ * Copyright 2016 Thincast Technologies GmbH
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/* GDI Brush Functions: http://msdn.microsoft.com/en-us/library/dd183395/ */
+
+#include <freerdp/config.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <freerdp/freerdp.h>
+#include <freerdp/gdi/gdi.h>
+#include <freerdp/gdi/region.h>
+#include <freerdp/log.h>
+
+#include "brush.h"
+#include "clipping.h"
+
+#define TAG FREERDP_TAG("gdi.brush")
+
+const char* gdi_rop_to_string(UINT32 code)
+{
+ switch (code)
+ {
+ case GDI_BLACKNESS:
+ return "0";
+
+ case GDI_DPSoon:
+ return "DPSoon";
+
+ case GDI_DPSona:
+ return "DPSona";
+
+ case GDI_PSon:
+ return "PSon";
+
+ case GDI_SDPona:
+ return "SDPona";
+
+ case GDI_DPon:
+ return "DPon";
+
+ case GDI_PDSxnon:
+ return "PDSxnon";
+
+ case GDI_PDSaon:
+ return "PDSaon";
+
+ case GDI_SDPnaa:
+ return "SDPnaa";
+
+ case GDI_PDSxon:
+ return "PDSxon";
+
+ case GDI_DPna:
+ return "DPna";
+
+ case GDI_PSDnaon:
+ return "PSDnaon";
+
+ case GDI_SPna:
+ return "SPna";
+
+ case GDI_PDSnaon:
+ return "PDSnaon";
+
+ case GDI_PDSonon:
+ return "PDSonon";
+
+ case GDI_Pn:
+ return "Pn";
+
+ case GDI_PDSona:
+ return "PDSona";
+
+ case GDI_NOTSRCERASE:
+ return "DSon";
+
+ case GDI_SDPxnon:
+ return "SDPxnon";
+
+ case GDI_SDPaon:
+ return "SDPaon";
+
+ case GDI_DPSxnon:
+ return "DPSxnon";
+
+ case GDI_DPSaon:
+ return "DPSaon";
+
+ case GDI_PSDPSanaxx:
+ return "PSDPSanaxx";
+
+ case GDI_SSPxDSxaxn:
+ return "SSPxDSxaxn";
+
+ case GDI_SPxPDxa:
+ return "SPxPDxa";
+
+ case GDI_SDPSanaxn:
+ return "SDPSanaxn";
+
+ case GDI_PDSPaox:
+ return "PDSPaox";
+
+ case GDI_SDPSxaxn:
+ return "SDPSxaxn";
+
+ case GDI_PSDPaox:
+ return "PSDPaox";
+
+ case GDI_DSPDxaxn:
+ return "DSPDxaxn";
+
+ case GDI_PDSox:
+ return "PDSox";
+
+ case GDI_PDSoan:
+ return "PDSoan";
+
+ case GDI_DPSnaa:
+ return "DPSnaa";
+
+ case GDI_SDPxon:
+ return "SDPxon";
+
+ case GDI_DSna:
+ return "DSna";
+
+ case GDI_SPDnaon:
+ return "SPDnaon";
+
+ case GDI_SPxDSxa:
+ return "SPxDSxa";
+
+ case GDI_PDSPanaxn:
+ return "PDSPanaxn";
+
+ case GDI_SDPSaox:
+ return "SDPSaox";
+
+ case GDI_SDPSxnox:
+ return "SDPSxnox";
+
+ case GDI_DPSxa:
+ return "DPSxa";
+
+ case GDI_PSDPSaoxxn:
+ return "PSDPSaoxxn";
+
+ case GDI_DPSana:
+ return "DPSana";
+
+ case GDI_SSPxPDxaxn:
+ return "SSPxPDxaxn";
+
+ case GDI_SPDSoax:
+ return "SPDSoax";
+
+ case GDI_PSDnox:
+ return "PSDnox";
+
+ case GDI_PSDPxox:
+ return "PSDPxox";
+
+ case GDI_PSDnoan:
+ return "PSDnoan";
+
+ case GDI_PSna:
+ return "PSna";
+
+ case GDI_SDPnaon:
+ return "SDPnaon";
+
+ case GDI_SDPSoox:
+ return "SDPSoox";
+
+ case GDI_NOTSRCCOPY:
+ return "Sn";
+
+ case GDI_SPDSaox:
+ return "SPDSaox";
+
+ case GDI_SPDSxnox:
+ return "SPDSxnox";
+
+ case GDI_SDPox:
+ return "SDPox";
+
+ case GDI_SDPoan:
+ return "SDPoan";
+
+ case GDI_PSDPoax:
+ return "PSDPoax";
+
+ case GDI_SPDnox:
+ return "SPDnox";
+
+ case GDI_SPDSxox:
+ return "SPDSxox";
+
+ case GDI_SPDnoan:
+ return "SPDnoan";
+
+ case GDI_PSx:
+ return "PSx";
+
+ case GDI_SPDSonox:
+ return "SPDSonox";
+
+ case GDI_SPDSnaox:
+ return "SPDSnaox";
+
+ case GDI_PSan:
+ return "PSan";
+
+ case GDI_PSDnaa:
+ return "PSDnaa";
+
+ case GDI_DPSxon:
+ return "DPSxon";
+
+ case GDI_SDxPDxa:
+ return "SDxPDxa";
+
+ case GDI_SPDSanaxn:
+ return "SPDSanaxn";
+
+ case GDI_SRCERASE:
+ return "SDna";
+
+ case GDI_DPSnaon:
+ return "DPSnaon";
+
+ case GDI_DSPDaox:
+ return "DSPDaox";
+
+ case GDI_PSDPxaxn:
+ return "PSDPxaxn";
+
+ case GDI_SDPxa:
+ return "SDPxa";
+
+ case GDI_PDSPDaoxxn:
+ return "PDSPDaoxxn";
+
+ case GDI_DPSDoax:
+ return "DPSDoax";
+
+ case GDI_PDSnox:
+ return "PDSnox";
+
+ case GDI_SDPana:
+ return "SDPana";
+
+ case GDI_SSPxDSxoxn:
+ return "SSPxDSxoxn";
+
+ case GDI_PDSPxox:
+ return "PDSPxox";
+
+ case GDI_PDSnoan:
+ return "PDSnoan";
+
+ case GDI_PDna:
+ return "PDna";
+
+ case GDI_DSPnaon:
+ return "DSPnaon";
+
+ case GDI_DPSDaox:
+ return "DPSDaox";
+
+ case GDI_SPDSxaxn:
+ return "SPDSxaxn";
+
+ case GDI_DPSonon:
+ return "DPSonon";
+
+ case GDI_DSTINVERT:
+ return "Dn";
+
+ case GDI_DPSox:
+ return "DPSox";
+
+ case GDI_DPSoan:
+ return "DPSoan";
+
+ case GDI_PDSPoax:
+ return "PDSPoax";
+
+ case GDI_DPSnox:
+ return "DPSnox";
+
+ case GDI_PATINVERT:
+ return "DPx";
+
+ case GDI_DPSDonox:
+ return "DPSDonox";
+
+ case GDI_DPSDxox:
+ return "DPSDxox";
+
+ case GDI_DPSnoan:
+ return "DPSnoan";
+
+ case GDI_DPSDnaox:
+ return "DPSDnaox";
+
+ case GDI_DPan:
+ return "DPan";
+
+ case GDI_PDSxa:
+ return "PDSxa";
+
+ case GDI_DSPDSaoxxn:
+ return "DSPDSaoxxn";
+
+ case GDI_DSPDoax:
+ return "DSPDoax";
+
+ case GDI_SDPnox:
+ return "SDPnox";
+
+ case GDI_SDPSoax:
+ return "SDPSoax";
+
+ case GDI_DSPnox:
+ return "DSPnox";
+
+ case GDI_SRCINVERT:
+ return "DSx";
+
+ case GDI_SDPSonox:
+ return "SDPSonox";
+
+ case GDI_DSPDSonoxxn:
+ return "DSPDSonoxxn";
+
+ case GDI_PDSxxn:
+ return "PDSxxn";
+
+ case GDI_DPSax:
+ return "DPSax";
+
+ case GDI_PSDPSoaxxn:
+ return "PSDPSoaxxn";
+
+ case GDI_SDPax:
+ return "SDPax";
+
+ case GDI_PDSPDoaxxn:
+ return "PDSPDoaxxn";
+
+ case GDI_SDPSnoax:
+ return "SDPSnoax";
+
+ case GDI_PDSxnan:
+ return "PDSxnan";
+
+ case GDI_PDSana:
+ return "PDSana";
+
+ case GDI_SSDxPDxaxn:
+ return "SSDxPDxaxn";
+
+ case GDI_SDPSxox:
+ return "SDPSxox";
+
+ case GDI_SDPnoan:
+ return "SDPnoan";
+
+ case GDI_DSPDxox:
+ return "DSPDxox";
+
+ case GDI_DSPnoan:
+ return "DSPnoan";
+
+ case GDI_SDPSnaox:
+ return "SDPSnaox";
+
+ case GDI_DSan:
+ return "DSan";
+
+ case GDI_PDSax:
+ return "PDSax";
+
+ case GDI_DSPDSoaxxn:
+ return "DSPDSoaxxn";
+
+ case GDI_DPSDnoax:
+ return "DPSDnoax";
+
+ case GDI_SDPxnan:
+ return "SDPxnan";
+
+ case GDI_SPDSnoax:
+ return "SPDSnoax";
+
+ case GDI_DPSxnan:
+ return "DPSxnan";
+
+ case GDI_SPxDSxo:
+ return "SPxDSxo";
+
+ case GDI_DPSaan:
+ return "DPSaan";
+
+ case GDI_DPSaa:
+ return "DPSaa";
+
+ case GDI_SPxDSxon:
+ return "SPxDSxon";
+
+ case GDI_DPSxna:
+ return "DPSxna";
+
+ case GDI_SPDSnoaxn:
+ return "SPDSnoaxn";
+
+ case GDI_SDPxna:
+ return "SDPxna";
+
+ case GDI_PDSPnoaxn:
+ return "PDSPnoaxn";
+
+ case GDI_DSPDSoaxx:
+ return "DSPDSoaxx";
+
+ case GDI_PDSaxn:
+ return "PDSaxn";
+
+ case GDI_SRCAND:
+ return "DSa";
+
+ case GDI_SDPSnaoxn:
+ return "SDPSnaoxn";
+
+ case GDI_DSPnoa:
+ return "DSPnoa";
+
+ case GDI_DSPDxoxn:
+ return "DSPDxoxn";
+
+ case GDI_SDPnoa:
+ return "SDPnoa";
+
+ case GDI_SDPSxoxn:
+ return "SDPSxoxn";
+
+ case GDI_SSDxPDxax:
+ return "SSDxPDxax";
+
+ case GDI_PDSanan:
+ return "PDSanan";
+
+ case GDI_PDSxna:
+ return "PDSxna";
+
+ case GDI_SDPSnoaxn:
+ return "SDPSnoaxn";
+
+ case GDI_DPSDPoaxx:
+ return "DPSDPoaxx";
+
+ case GDI_SPDaxn:
+ return "SPDaxn";
+
+ case GDI_PSDPSoaxx:
+ return "PSDPSoaxx";
+
+ case GDI_DPSaxn:
+ return "DPSaxn";
+
+ case GDI_DPSxx:
+ return "DPSxx";
+
+ case GDI_PSDPSonoxx:
+ return "PSDPSonoxx";
+
+ case GDI_SDPSonoxn:
+ return "SDPSonoxn";
+
+ case GDI_DSxn:
+ return "DSxn";
+
+ case GDI_DPSnax:
+ return "DPSnax";
+
+ case GDI_SDPSoaxn:
+ return "SDPSoaxn";
+
+ case GDI_SPDnax:
+ return "SPDnax";
+
+ case GDI_DSPDoaxn:
+ return "DSPDoaxn";
+
+ case GDI_DSPDSaoxx:
+ return "DSPDSaoxx";
+
+ case GDI_PDSxan:
+ return "PDSxan";
+
+ case GDI_DPa:
+ return "DPa";
+
+ case GDI_PDSPnaoxn:
+ return "PDSPnaoxn";
+
+ case GDI_DPSnoa:
+ return "DPSnoa";
+
+ case GDI_DPSDxoxn:
+ return "DPSDxoxn";
+
+ case GDI_PDSPonoxn:
+ return "PDSPonoxn";
+
+ case GDI_PDxn:
+ return "PDxn";
+
+ case GDI_DSPnax:
+ return "DSPnax";
+
+ case GDI_PDSPoaxn:
+ return "PDSPoaxn";
+
+ case GDI_DPSoa:
+ return "DPSoa";
+
+ case GDI_DPSoxn:
+ return "DPSoxn";
+
+ case GDI_DSTCOPY:
+ return "D";
+
+ case GDI_DPSono:
+ return "DPSono";
+
+ case GDI_SPDSxax:
+ return "SPDSxax";
+
+ case GDI_DPSDaoxn:
+ return "DPSDaoxn";
+
+ case GDI_DSPnao:
+ return "DSPnao";
+
+ case GDI_DPno:
+ return "DPno";
+
+ case GDI_PDSnoa:
+ return "PDSnoa";
+
+ case GDI_PDSPxoxn:
+ return "PDSPxoxn";
+
+ case GDI_SSPxDSxox:
+ return "SSPxDSxox";
+
+ case GDI_SDPanan:
+ return "SDPanan";
+
+ case GDI_PSDnax:
+ return "PSDnax";
+
+ case GDI_DPSDoaxn:
+ return "DPSDoaxn";
+
+ case GDI_DPSDPaoxx:
+ return "DPSDPaoxx";
+
+ case GDI_SDPxan:
+ return "SDPxan";
+
+ case GDI_PSDPxax:
+ return "PSDPxax";
+
+ case GDI_DSPDaoxn:
+ return "DSPDaoxn";
+
+ case GDI_DPSnao:
+ return "DPSnao";
+
+ case GDI_MERGEPAINT:
+ return "DSno";
+
+ case GDI_SPDSanax:
+ return "SPDSanax";
+
+ case GDI_SDxPDxan:
+ return "SDxPDxan";
+
+ case GDI_DPSxo:
+ return "DPSxo";
+
+ case GDI_DPSano:
+ return "DPSano";
+
+ case GDI_MERGECOPY:
+ return "PSa";
+
+ case GDI_SPDSnaoxn:
+ return "SPDSnaoxn";
+
+ case GDI_SPDSonoxn:
+ return "SPDSonoxn";
+
+ case GDI_PSxn:
+ return "PSxn";
+
+ case GDI_SPDnoa:
+ return "SPDnoa";
+
+ case GDI_SPDSxoxn:
+ return "SPDSxoxn";
+
+ case GDI_SDPnax:
+ return "SDPnax";
+
+ case GDI_PSDPoaxn:
+ return "PSDPoaxn";
+
+ case GDI_SDPoa:
+ return "SDPoa";
+
+ case GDI_SPDoxn:
+ return "SPDoxn";
+
+ case GDI_DPSDxax:
+ return "DPSDxax";
+
+ case GDI_SPDSaoxn:
+ return "SPDSaoxn";
+
+ case GDI_SRCCOPY:
+ return "S";
+
+ case GDI_SDPono:
+ return "SDPono";
+
+ case GDI_SDPnao:
+ return "SDPnao";
+
+ case GDI_SPno:
+ return "SPno";
+
+ case GDI_PSDnoa:
+ return "PSDnoa";
+
+ case GDI_PSDPxoxn:
+ return "PSDPxoxn";
+
+ case GDI_PDSnax:
+ return "PDSnax";
+
+ case GDI_SPDSoaxn:
+ return "SPDSoaxn";
+
+ case GDI_SSPxPDxax:
+ return "SSPxPDxax";
+
+ case GDI_DPSanan:
+ return "DPSanan";
+
+ case GDI_PSDPSaoxx:
+ return "PSDPSaoxx";
+
+ case GDI_DPSxan:
+ return "DPSxan";
+
+ case GDI_PDSPxax:
+ return "PDSPxax";
+
+ case GDI_SDPSaoxn:
+ return "SDPSaoxn";
+
+ case GDI_DPSDanax:
+ return "DPSDanax";
+
+ case GDI_SPxDSxan:
+ return "SPxDSxan";
+
+ case GDI_SPDnao:
+ return "SPDnao";
+
+ case GDI_SDno:
+ return "SDno";
+
+ case GDI_SDPxo:
+ return "SDPxo";
+
+ case GDI_SDPano:
+ return "SDPano";
+
+ case GDI_PDSoa:
+ return "PDSoa";
+
+ case GDI_PDSoxn:
+ return "PDSoxn";
+
+ case GDI_DSPDxax:
+ return "DSPDxax";
+
+ case GDI_PSDPaoxn:
+ return "PSDPaoxn";
+
+ case GDI_SDPSxax:
+ return "SDPSxax";
+
+ case GDI_PDSPaoxn:
+ return "PDSPaoxn";
+
+ case GDI_SDPSanax:
+ return "SDPSanax";
+
+ case GDI_SPxPDxan:
+ return "SPxPDxan";
+
+ case GDI_SSPxDSxax:
+ return "SSPxDSxax";
+
+ case GDI_DSPDSanaxxn:
+ return "DSPDSanaxxn";
+
+ case GDI_DPSao:
+ return "DPSao";
+
+ case GDI_DPSxno:
+ return "DPSxno";
+
+ case GDI_SDPao:
+ return "SDPao";
+
+ case GDI_SDPxno:
+ return "SDPxno";
+
+ case GDI_SRCPAINT:
+ return "DSo";
+
+ case GDI_SDPnoo:
+ return "SDPnoo";
+
+ case GDI_PATCOPY:
+ return "P";
+
+ case GDI_PDSono:
+ return "PDSono";
+
+ case GDI_PDSnao:
+ return "PDSnao";
+
+ case GDI_PSno:
+ return "PSno";
+
+ case GDI_PSDnao:
+ return "PSDnao";
+
+ case GDI_PDno:
+ return "PDno";
+
+ case GDI_PDSxo:
+ return "PDSxo";
+
+ case GDI_PDSano:
+ return "PDSano";
+
+ case GDI_PDSao:
+ return "PDSao";
+
+ case GDI_PDSxno:
+ return "PDSxno";
+
+ case GDI_DPo:
+ return "DPo";
+
+ case GDI_PATPAINT:
+ return "DPSnoo";
+
+ case GDI_PSo:
+ return "PSo";
+
+ case GDI_PSDnoo:
+ return "PSDnoo";
+
+ case GDI_DPSoo:
+ return "DPSoo";
+
+ case GDI_WHITENESS:
+ return "1";
+
+ case GDI_GLYPH_ORDER:
+ return "SPaDSnao";
+
+ default:
+ return "";
+ }
+}
+
+/**
+ * @brief Create a new solid brush.
+ * msdn{dd183518}
+ *
+ * @param crColor brush color
+ * @return new brush
+ */
+HGDI_BRUSH gdi_CreateSolidBrush(UINT32 crColor)
+{
+ HGDI_BRUSH hBrush = (HGDI_BRUSH)calloc(1, sizeof(GDI_BRUSH));
+
+ if (!hBrush)
+ return NULL;
+
+ hBrush->objectType = GDIOBJECT_BRUSH;
+ hBrush->style = GDI_BS_SOLID;
+ hBrush->color = crColor;
+ return hBrush;
+}
+/**
+ * @brief Create a new pattern brush.
+ * msdn{dd183508}
+ *
+ * @param hbmp pattern bitmap
+ * @return new brush
+ */
+HGDI_BRUSH gdi_CreatePatternBrush(HGDI_BITMAP hbmp)
+{
+ HGDI_BRUSH hBrush = (HGDI_BRUSH)calloc(1, sizeof(GDI_BRUSH));
+
+ if (!hBrush)
+ return NULL;
+
+ hBrush->objectType = GDIOBJECT_BRUSH;
+ hBrush->style = GDI_BS_PATTERN;
+ hBrush->pattern = hbmp;
+ return hBrush;
+}
+
+HGDI_BRUSH gdi_CreateHatchBrush(HGDI_BITMAP hbmp)
+{
+ HGDI_BRUSH hBrush = (HGDI_BRUSH)calloc(1, sizeof(GDI_BRUSH));
+
+ if (!hBrush)
+ return NULL;
+
+ hBrush->objectType = GDIOBJECT_BRUSH;
+ hBrush->style = GDI_BS_HATCHED;
+ hBrush->pattern = hbmp;
+ return hBrush;
+}