return 0;
}
-static BOOL wf_sw_end_paint(rdpContext* context)
+static BOOL wf_end_paint(rdpContext* context)
{
int i;
rdpGdi* gdi;
invalidRect.top = cinvalid[i].y;
invalidRect.right = cinvalid[i].x + cinvalid[i].w;
invalidRect.bottom = cinvalid[i].y + cinvalid[i].h;
+
region16_union_rect(&invalidRegion, &invalidRegion, &invalidRect);
}
return TRUE;
}
-static BOOL wf_hw_end_paint(rdpContext* context)
-{
- return TRUE;
-}
-
static BOOL wf_begin_paint(rdpContext* context)
{
HGDI_DC hdc;
settings->OrderSupport[NEG_LINETO_INDEX] = TRUE;
settings->OrderSupport[NEG_POLYLINE_INDEX] = TRUE;
settings->OrderSupport[NEG_MEMBLT_INDEX] = settings->BitmapCacheEnabled;
- settings->OrderSupport[NEG_MEM3BLT_INDEX] = FALSE;
+ settings->OrderSupport[NEG_MEM3BLT_INDEX] = settings->BitmapCacheEnabled;
settings->OrderSupport[NEG_MEMBLT_V2_INDEX] = settings->BitmapCacheEnabled;
- settings->OrderSupport[NEG_MEM3BLT_V2_INDEX] = FALSE;
+ settings->OrderSupport[NEG_MEM3BLT_V2_INDEX] = settings->BitmapCacheEnabled;
settings->OrderSupport[NEG_SAVEBITMAP_INDEX] = FALSE;
settings->OrderSupport[NEG_GLYPH_INDEX_INDEX] = TRUE;
settings->OrderSupport[NEG_FAST_INDEX_INDEX] = TRUE;
return FALSE;
}
+ if (!freerdp_client_load_addins(context->channels, instance->settings))
+ return -1;
+
freerdp_set_param_uint32(settings, FreeRDP_KeyboardLayout,
(int) GetKeyboardLayout(0) & 0x0000FFFF);
PubSub_SubscribeChannelConnected(instance->context->pubSub,
PubSub_OnEmbedWindow(context->pubSub, context, &e);
ShowWindow(wfc->hwnd, SW_SHOWNORMAL);
UpdateWindow(wfc->hwnd);
+
instance->update->BeginPaint = wf_begin_paint;
instance->update->DesktopResize = wf_desktop_resize;
-
- if (settings->SoftwareGdi)
- instance->update->EndPaint = wf_sw_end_paint;
- else
- instance->update->EndPaint = wf_hw_end_paint;
+ instance->update->EndPaint = wf_end_paint;
pointer_cache_register_callbacks(instance->update);
wf_register_pointer(context->graphics);
if (!wfc->keyboardThread)
return -1;
- if (!freerdp_client_load_addins(context->channels, instance->settings))
- return -1;
-
wfc->thread = CreateThread(NULL, 0, wf_client_thread, (void*) instance, 0,
&wfc->mainThreadId);
};
static BOOL wf_decode_color(wfContext* wfc, const UINT32 srcColor,
- UINT32* color, UINT32* format)
+ COLORREF* color, UINT32* format)
{
rdpGdi* gdi;
rdpSettings* settings;
return TRUE;
}
+static BOOL wf_gdi_mem3blt(rdpContext* context, MEM3BLT_ORDER* mem3blt)
+{
+ BOOL rc = FALSE;
+ HDC hdc;
+ wfBitmap* bitmap;
+ wfContext* wfc = (wfContext*)context;
+ COLORREF fgcolor, bgcolor, orgColor;
+ HBRUSH orgBrush = NULL, brush = NULL;
+
+ if (!context || !mem3blt)
+ return FALSE;
+
+ bitmap = (wfBitmap*) mem3blt->bitmap;
+
+ if (!bitmap || !wfc->drawing || !wfc->drawing->hdc)
+ return FALSE;
+
+ hdc = wfc->drawing->hdc;
+
+ if (!wf_decode_color(wfc, mem3blt->foreColor, &fgcolor, NULL))
+ return FALSE;
+
+ if (!wf_decode_color(wfc, mem3blt->backColor, &bgcolor, NULL))
+ return FALSE;
+
+ orgColor = SetTextColor(hdc, fgcolor);
+ switch(mem3blt->brush.style)
+ {
+ case GDI_BS_SOLID:
+ brush = CreateSolidBrush(fgcolor);
+ break;
+ case GDI_BS_HATCHED:
+
+ case GDI_BS_PATTERN:
+ {
+ HBITMAP bmp = CreateBitmap(8, 8, 1, mem3blt->brush.bpp, mem3blt->brush.data);
+ brush = CreatePatternBrush(bmp);
+ }
+ break;
+ default:
+ goto fail;
+ }
+
+ orgBrush = SelectObject(hdc, brush);
+ if (!BitBlt(hdc, mem3blt->nLeftRect, mem3blt->nTopRect,
+ mem3blt->nWidth, mem3blt->nHeight, bitmap->hdc,
+ mem3blt->nXSrc, mem3blt->nYSrc, gdi_rop3_code(mem3blt->bRop)))
+ goto fail;
+
+ if (wfc->drawing == wfc->primary)
+ wf_invalidate_region(wfc, mem3blt->nLeftRect, mem3blt->nTopRect, mem3blt->nWidth,
+ mem3blt->nHeight);
+
+ rc = TRUE;
+
+fail:
+ if (brush)
+ SelectObject(hdc, orgBrush);
+ SetTextColor(hdc, orgColor);
+ return rc;
+}
+
static BOOL wf_gdi_surface_frame_marker(rdpContext* context,
const SURFACE_FRAME_MARKER* surface_frame_marker)
{
primary->LineTo = wf_gdi_line_to;
primary->Polyline = wf_gdi_polyline;
primary->MemBlt = wf_gdi_memblt;
+ primary->Mem3Blt = wf_gdi_mem3blt;
update->SurfaceFrameMarker = wf_gdi_surface_frame_marker;
}