static BOOL xf_gdi_patblt(rdpContext* context, PATBLT_ORDER* patblt)
{
const rdpBrush* brush;
- UINT32 foreColor;
- UINT32 backColor;
xfContext* xfc = (xfContext*) context;
BOOL ret = FALSE;
+ XColor xfg, xbg;
- if (!xf_decode_color(context->gdi, patblt->foreColor, &foreColor, NULL))
+ if (!xf_decode_color(xfc, patblt->foreColor, &xfg))
return FALSE;
- if (!xf_decode_color(context->gdi, patblt->backColor, &backColor, NULL))
+ if (!xf_decode_color(xfc, patblt->backColor, &xbg))
return FALSE;
xf_lock_x11(xfc, FALSE);
{
case GDI_BS_SOLID:
XSetFillStyle(xfc->display, xfc->gc, FillSolid);
- XSetBackground(xfc->display, xfc->gc, backColor);
- XSetForeground(xfc->display, xfc->gc, foreColor);
+ XSetBackground(xfc->display, xfc->gc, xbg.pixel);
+ XSetForeground(xfc->display, xfc->gc, xfg.pixel);
XFillRectangle(xfc->display, xfc->drawing, xfc->gc,
patblt->nLeftRect, patblt->nTopRect, patblt->nWidth, patblt->nHeight);
break;
{
Pixmap pattern = xf_mono_bitmap_new(xfc, 8, 8,
&GDI_BS_HATCHED_PATTERNS[8 * brush->hatch]);
- XSetBackground(xfc->display, xfc->gc, backColor);
- XSetForeground(xfc->display, xfc->gc, foreColor);
+ XSetBackground(xfc->display, xfc->gc, xbg.pixel);
+ XSetForeground(xfc->display, xfc->gc, xfg.pixel);
XSetFillStyle(xfc->display, xfc->gc, FillOpaqueStippled);
XSetStipple(xfc->display, xfc->gc, pattern);
XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y);
else
{
Pixmap pattern = xf_mono_bitmap_new(xfc, 8, 8, brush->data);
- XSetBackground(xfc->display, xfc->gc, foreColor);
- XSetForeground(xfc->display, xfc->gc, backColor);
+ XSetBackground(xfc->display, xfc->gc, xfg.pixel);
+ XSetForeground(xfc->display, xfc->gc, xbg.pixel);
XSetFillStyle(xfc->display, xfc->gc, FillOpaqueStippled);
XSetStipple(xfc->display, xfc->gc, pattern);
XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y);
static BOOL xf_gdi_opaque_rect(rdpContext* context,
const OPAQUE_RECT_ORDER* opaque_rect)
{
- UINT32 color;
+ XColor color;
rdpGdi* gdi = context->gdi;
xfContext* xfc = (xfContext*) context;
BOOL ret = TRUE;
- if (!xf_decode_color(gdi, opaque_rect->color, &color, NULL))
+ if (!xf_decode_color(xfc, opaque_rect->color, &color))
return FALSE;
xf_lock_x11(xfc, FALSE);
XSetFunction(xfc->display, xfc->gc, GXcopy);
XSetFillStyle(xfc->display, xfc->gc, FillSolid);
- XSetForeground(xfc->display, xfc->gc, color);
+ XSetForeground(xfc->display, xfc->gc, color.pixel);
XFillRectangle(xfc->display, xfc->drawing, xfc->gc,
opaque_rect->nLeftRect, opaque_rect->nTopRect,
opaque_rect->nWidth, opaque_rect->nHeight);
xfContext* xfc = (xfContext*) context;
BOOL ret = TRUE;
rdpGdi* gdi = context->gdi;
- UINT32 color;
+ XColor color;
- if (!xf_decode_color(gdi, multi_opaque_rect->color, &color, NULL))
+ if (!xf_decode_color(xfc, multi_opaque_rect->color, &color))
return FALSE;
xf_lock_x11(xfc, FALSE);
XSetFunction(xfc->display, xfc->gc, GXcopy);
XSetFillStyle(xfc->display, xfc->gc, FillSolid);
- XSetForeground(xfc->display, xfc->gc, color);
+ XSetForeground(xfc->display, xfc->gc, color.pixel);
for (i = 0; i < multi_opaque_rect->numRectangles; i++)
{
static BOOL xf_gdi_line_to(rdpContext* context, const LINE_TO_ORDER* line_to)
{
- UINT32 color;
+ XColor color;
xfContext* xfc = (xfContext*) context;
BOOL ret = TRUE;
- if (!xf_decode_color(context->gdi, line_to->penColor, &color, NULL))
+ if (!xf_decode_color(xfc, line_to->penColor, &color))
return FALSE;
xf_lock_x11(xfc, FALSE);
xf_set_rop2(xfc, line_to->bRop2);
XSetFillStyle(xfc->display, xfc->gc, FillSolid);
- XSetForeground(xfc->display, xfc->gc, color);
+ XSetForeground(xfc->display, xfc->gc, color.pixel);
XDrawLine(xfc->display, xfc->drawing, xfc->gc,
line_to->nXStart, line_to->nYStart, line_to->nXEnd, line_to->nYEnd);
{
int i;
int npoints;
- UINT32 color;
+ XColor color;
XPoint* points;
xfContext* xfc = (xfContext*) context;
BOOL ret = TRUE;
- if (!xf_decode_color(context->gdi, polyline->penColor, &color, NULL))
+ if (!xf_decode_color(xfc, polyline->penColor, &color))
return FALSE;
xf_lock_x11(xfc, FALSE);
xf_set_rop2(xfc, polyline->bRop2);
XSetFillStyle(xfc->display, xfc->gc, FillSolid);
- XSetForeground(xfc->display, xfc->gc, color);
+ XSetForeground(xfc->display, xfc->gc, color.pixel);
npoints = polyline->numDeltaEntries + 1;
points = malloc(sizeof(XPoint) * npoints);
{
const rdpBrush* brush;
xfBitmap* bitmap;
- UINT32 foreColor;
- UINT32 backColor;
+ XColor foreColor;
+ XColor backColor;
Pixmap pattern = 0;
xfContext* xfc = (xfContext*) context;
BOOL ret = FALSE;
if (!xfc->display || !xfc->drawing)
return FALSE;
- if (!xf_decode_color(context->gdi, mem3blt->foreColor, &foreColor, NULL))
+ if (!xf_decode_color(xfc, mem3blt->foreColor, &foreColor))
return FALSE;
- if (!xf_decode_color(context->gdi, mem3blt->backColor, &backColor, NULL))
+ if (!xf_decode_color(xfc, mem3blt->backColor, &backColor))
return FALSE;
xf_lock_x11(xfc, FALSE);
else
{
pattern = xf_mono_bitmap_new(xfc, 8, 8, brush->data);
- XSetBackground(xfc->display, xfc->gc, backColor);
- XSetForeground(xfc->display, xfc->gc, foreColor);
+ XSetBackground(xfc->display, xfc->gc, backColor.pixel);
+ XSetForeground(xfc->display, xfc->gc, foreColor.pixel);
XSetFillStyle(xfc->display, xfc->gc, FillOpaqueStippled);
XSetStipple(xfc->display, xfc->gc, pattern);
XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y);
case GDI_BS_SOLID:
XSetFillStyle(xfc->display, xfc->gc, FillSolid);
- XSetBackground(xfc->display, xfc->gc, backColor);
- XSetForeground(xfc->display, xfc->gc, foreColor);
+ XSetBackground(xfc->display, xfc->gc, backColor.pixel);
+ XSetForeground(xfc->display, xfc->gc, foreColor.pixel);
XSetTSOrigin(xfc->display, xfc->gc, brush->x, brush->y);
break;
{
int i, npoints;
XPoint* points;
- UINT32 brush_color;
+ XColor brush_color;
xfContext* xfc = (xfContext*) context;
BOOL ret = TRUE;
- if (!xf_decode_color(context->gdi, polygon_sc->brushColor, &brush_color, NULL))
+ if (!xf_decode_color(xfc, polygon_sc->brushColor, &brush_color))
return FALSE;
xf_lock_x11(xfc, FALSE);
}
XSetFillStyle(xfc->display, xfc->gc, FillSolid);
- XSetForeground(xfc->display, xfc->gc, brush_color);
+ XSetForeground(xfc->display, xfc->gc, brush_color.pixel);
XFillPolygon(xfc->display, xfc->drawing, xfc->gc,
points, npoints, Complex, CoordModePrevious);
XPoint* points;
Pixmap pattern;
const rdpBrush* brush;
- UINT32 foreColor;
- UINT32 backColor;
+ XColor foreColor;
+ XColor backColor;
xfContext* xfc = (xfContext*) context;
BOOL ret = TRUE;
- if (!xf_decode_color(context->gdi, polygon_cb->foreColor, &foreColor, NULL))
+ if (!xf_decode_color(xfc, polygon_cb->foreColor, &foreColor))
return FALSE;
- if (!xf_decode_color(context->gdi, polygon_cb->backColor, &backColor, NULL))
+ if (!xf_decode_color(xfc, polygon_cb->backColor, &backColor))
return FALSE;
xf_lock_x11(xfc, FALSE);
else
{
pattern = xf_mono_bitmap_new(xfc, 8, 8, brush->data);
- XSetForeground(xfc->display, xfc->gc, backColor);
- XSetBackground(xfc->display, xfc->gc, foreColor);
+ XSetForeground(xfc->display, xfc->gc, backColor.pixel);
+ XSetBackground(xfc->display, xfc->gc, foreColor.pixel);
if (polygon_cb->backMode == BACKMODE_TRANSPARENT)
XSetFillStyle(xfc->display, xfc->gc, FillStippled);
#include <freerdp/log.h>
#define TAG CLIENT_TAG("x11")
-BOOL xf_decode_color(rdpGdi* gdi, const UINT32 srcColor,
- UINT32* color, UINT32* format)
+BOOL xf_decode_color(xfContext* xfc, const UINT32 srcColor, XColor* color)
{
- xfContext* xfc;
- UINT32 DstFormat;
+ rdpGdi* gdi;
+ rdpSettings* settings;
UINT32 SrcFormat;
+ BYTE r, g, b, a;
+
+ if (!xfc || !color)
+ return FALSE;
+
+ gdi = xfc->context.gdi;
- if (!gdi || !gdi->context || !gdi->context->settings)
+ if (!gdi)
return FALSE;
- xfc = (xfContext*)gdi->context;
- SrcFormat = gdi_get_pixel_format(gdi->context->settings->ColorDepth);
+ settings = xfc->context.settings;
- if (format)
- *format = SrcFormat;
+ if (!settings)
+ return FALSE;
+
+ SrcFormat = gdi_get_pixel_format(settings->ColorDepth);
+ SplitColor(srcColor, SrcFormat, &r, &g, &b, &a, &gdi->palette);
+ color->blue = (unsigned short)(b << 8);
+ color->green = (unsigned short)(g << 8);
+ color->red = (unsigned short)(r << 8);
+ color->flags = DoRed | DoGreen | DoBlue;
+
+ if (XAllocColor(xfc->display, xfc->colormap, color) == 0)
+ return FALSE;
- DstFormat = xf_get_local_color_format(xfc, FALSE);
- *color = ConvertColor(srcColor, SrcFormat,
- DstFormat, &gdi->palette);
return TRUE;
}
{
xfContext* xfc = (xfContext*) context;
XRectangle rect;
+ XColor xbgcolor, xfgcolor;
- if (!xf_decode_color(context->gdi, bgcolor, &bgcolor, NULL))
+ if (!xf_decode_color(xfc, bgcolor, &xbgcolor))
return FALSE;
- if (!xf_decode_color(context->gdi, fgcolor, &fgcolor, NULL))
+ if (!xf_decode_color(xfc, fgcolor, &xfgcolor))
return FALSE;
rect.x = x;
if (!fOpRedundant)
{
- XSetForeground(xfc->display, xfc->gc, fgcolor);
- XSetBackground(xfc->display, xfc->gc, fgcolor);
+ XSetForeground(xfc->display, xfc->gc, xfgcolor.pixel);
+ XSetBackground(xfc->display, xfc->gc, xfgcolor.pixel);
XSetFillStyle(xfc->display, xfc->gc, FillOpaqueStippled);
XFillRectangle(xfc->display, xfc->drawable, xfc->gc, x, y, width, height);
}
- XSetForeground(xfc->display, xfc->gc, bgcolor);
- XSetBackground(xfc->display, xfc->gc, fgcolor);
+ XSetForeground(xfc->display, xfc->gc, xbgcolor.pixel);
+ XSetBackground(xfc->display, xfc->gc, xfgcolor.pixel);
xf_unlock_x11(xfc, FALSE);
return TRUE;
}
{
xfContext* xfc = (xfContext*) context;
BOOL ret = TRUE;
+ XColor xfgcolor, xbgcolor;
- if (!xf_decode_color(context->gdi, bgcolor, &bgcolor, NULL))
+ if (!xf_decode_color(xfc, bgcolor, &xbgcolor))
return FALSE;
- if (!xf_decode_color(context->gdi, fgcolor, &fgcolor, NULL))
+ if (!xf_decode_color(xfc, fgcolor, &xfgcolor))
return FALSE;
if (xfc->drawing == xfc->primary)