From 0aba540ad2ee89f123b029a3f54b4f494f0745c4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Thu, 13 Oct 2011 20:10:59 -0400 Subject: [PATCH] wfreerdp: fix windows build after cache refactoring --- client/Windows/wf_gdi.c | 70 ++++++------------------------- client/Windows/wf_gdi.h | 5 ++- client/Windows/wfreerdp.c | 86 ++++++++++++++++++++++++++++++++++++--- client/Windows/wfreerdp.h | 17 ++++---- 4 files changed, 105 insertions(+), 73 deletions(-) diff --git a/client/Windows/wf_gdi.c b/client/Windows/wf_gdi.c index 316f17d34..941cdcd32 100644 --- a/client/Windows/wf_gdi.c +++ b/client/Windows/wf_gdi.c @@ -98,13 +98,13 @@ HBITMAP wf_create_dib(wfInfo* wfi, int width, int height, int bpp, uint8* data) return bitmap; } -WF_IMAGE* wf_image_new(wfInfo* wfi, int width, int height, int bpp, uint8* data) +wfBitmap* wf_image_new(wfInfo* wfi, int width, int height, int bpp, uint8* data) { HDC hdc; - WF_IMAGE* image; + wfBitmap* image; hdc = GetDC(NULL); - image = (WF_IMAGE*) malloc(sizeof(WF_IMAGE)); + image = (wfBitmap*) malloc(sizeof(wfBitmap)); image->hdc = CreateCompatibleDC(hdc); if (data == NULL) @@ -118,7 +118,7 @@ WF_IMAGE* wf_image_new(wfInfo* wfi, int width, int height, int bpp, uint8* data) return image; } -void wf_image_free(WF_IMAGE* image) +void wf_image_free(wfBitmap* image) { if (image != 0) { @@ -129,14 +129,14 @@ void wf_image_free(WF_IMAGE* image) } } -WF_IMAGE* wf_glyph_new(wfInfo* wfi, GLYPH_DATA* glyph) +wfBitmap* wf_glyph_new(wfInfo* wfi, GLYPH_DATA* glyph) { - WF_IMAGE* glyph_bmp; + wfBitmap* glyph_bmp; glyph_bmp = wf_image_new(wfi, glyph->cx, glyph->cy, 1, glyph->aj); return glyph_bmp; } -void wf_glyph_free(WF_IMAGE* glyph) +void wf_glyph_free(wfBitmap* glyph) { wf_image_free(glyph); } @@ -164,7 +164,7 @@ void wf_gdi_bitmap_update(rdpUpdate* update, BITMAP_UPDATE* bitmap) { int i; rdpBitmap* bmp; - WF_IMAGE* wf_bmp; + wfBitmap* wf_bmp; wfInfo* wfi = GET_WFI(update); @@ -311,15 +311,13 @@ void wf_gdi_polyline(rdpUpdate* update, POLYLINE_ORDER* polyline) void wf_gdi_memblt(rdpUpdate* update, MEMBLT_ORDER* memblt) { - void* extra; - WF_IMAGE* wf_bmp; + wfBitmap* bitmap; wfInfo* wfi = GET_WFI(update); - bitmap_cache_get(wfi->cache->bitmap, memblt->cacheId, memblt->cacheIndex, (void**) &extra); - wf_bmp = (WF_IMAGE*) extra; + bitmap = (wfBitmap*) memblt->bitmap; BitBlt(wfi->drawing->hdc, memblt->nLeftRect, memblt->nTopRect, - memblt->nWidth, memblt->nHeight, wf_bmp->hdc, + memblt->nWidth, memblt->nHeight, bitmap->hdc, memblt->nXSrc, memblt->nYSrc, gdi_rop3_code(memblt->bRop)); if (wfi->drawing == wfi->primary) @@ -336,44 +334,6 @@ void wf_gdi_fast_index(rdpUpdate* update, FAST_INDEX_ORDER* fast_index) } -void wf_gdi_create_offscreen_bitmap(rdpUpdate* update, CREATE_OFFSCREEN_BITMAP_ORDER* create_offscreen_bitmap) -{ - WF_IMAGE* wf_bmp; - wfInfo* wfi = GET_WFI(update); - - wf_bmp = wf_image_new(wfi, create_offscreen_bitmap->cx, create_offscreen_bitmap->cy, wfi->dstBpp, NULL); - offscreen_cache_put(wfi->cache->offscreen, create_offscreen_bitmap->id, (void*) wf_bmp); -} - -void wf_gdi_switch_surface(rdpUpdate* update, SWITCH_SURFACE_ORDER* switch_surface) -{ - WF_IMAGE* wf_bmp; - wfInfo* wfi = GET_WFI(update); - - if (switch_surface->bitmapId == SCREEN_BITMAP_SURFACE) - { - wfi->drawing = (WF_IMAGE*) wfi->primary; - } - else - { - wf_bmp = (WF_IMAGE*) offscreen_cache_get(wfi->cache->offscreen, switch_surface->bitmapId); - wfi->drawing = wf_bmp; - } -} - -void wf_gdi_cache_bitmap_v2(rdpUpdate* update, CACHE_BITMAP_V2_ORDER* cache_bitmap_v2) -{ - WF_IMAGE* bitmap; - rdpBitmap* bitmap_data; - wfInfo* wfi = GET_WFI(update); - - bitmap_data = cache_bitmap_v2->bitmap_data; - bitmap = wf_image_new(wfi, bitmap_data->width, bitmap_data->height, wfi->srcBpp, bitmap_data->dstData); - - bitmap_cache_put(wfi->cache->bitmap, cache_bitmap_v2->cacheId, - cache_bitmap_v2->cacheIndex, bitmap_data, (void*) bitmap); -} - void wf_gdi_cache_color_table(rdpUpdate* update, CACHE_COLOR_TABLE_ORDER* cache_color_table) { wfInfo* wfi = GET_WFI(update); @@ -383,7 +343,7 @@ void wf_gdi_cache_color_table(rdpUpdate* update, CACHE_COLOR_TABLE_ORDER* cache_ void wf_gdi_cache_glyph(rdpUpdate* update, CACHE_GLYPH_ORDER* cache_glyph) { int i; - WF_IMAGE* wf_bmp; + wfBitmap* wf_bmp; GLYPH_DATA* glyph; wfInfo* wfi = GET_WFI(update); @@ -402,8 +362,7 @@ void wf_gdi_cache_glyph_v2(rdpUpdate* update, CACHE_GLYPH_V2_ORDER* cache_glyph_ void wf_gdi_cache_brush(rdpUpdate* update, CACHE_BRUSH_ORDER* cache_brush) { - //wfInfo* wfi = GET_WFI(update); - //brush_put(wfi->cache->brush, cache_brush->index, cache_brush->data, cache_brush->bpp); + } void wf_gdi_surface_bits(rdpUpdate* update, SURFACE_BITS_COMMAND* surface_bits_command) @@ -464,10 +423,7 @@ void wf_gdi_register_update_callbacks(rdpUpdate* update) update->PolygonCB = NULL; update->EllipseSC = NULL; update->EllipseCB = NULL; - update->CreateOffscreenBitmap = wf_gdi_create_offscreen_bitmap; - update->SwitchSurface = wf_gdi_switch_surface; - update->CacheBitmapV2 = wf_gdi_cache_bitmap_v2; update->CacheColorTable = wf_gdi_cache_color_table; update->CacheGlyph = wf_gdi_cache_glyph; update->CacheGlyphV2 = wf_gdi_cache_glyph_v2; diff --git a/client/Windows/wf_gdi.h b/client/Windows/wf_gdi.h index a0f70dbe0..c6a9d01d2 100644 --- a/client/Windows/wf_gdi.h +++ b/client/Windows/wf_gdi.h @@ -24,8 +24,9 @@ #include "wfreerdp.h" -WF_IMAGE* wf_image_new(wfInfo* wfi, int width, int height, int bpp, uint8* data); -void wf_image_free(WF_IMAGE* image); +HBITMAP wf_create_dib(wfInfo* wfi, int width, int height, int bpp, uint8* data); +wfBitmap* wf_image_new(wfInfo* wfi, int width, int height, int bpp, uint8* data); +void wf_image_free(wfBitmap* image); void wf_toggle_fullscreen(wfInfo* wfi); void wf_gdi_register_update_callbacks(rdpUpdate* update); diff --git a/client/Windows/wfreerdp.c b/client/Windows/wfreerdp.c index ab2f87dd4..cad3c4753 100644 --- a/client/Windows/wfreerdp.c +++ b/client/Windows/wfreerdp.c @@ -97,8 +97,6 @@ void wf_sw_end_paint(rdpUpdate* update) update_rect.right = x + w - 1; update_rect.bottom = y + h - 1; - //printf("InvalidateRect: x:%d y:%d w:%d h:%d\n", x, y, w, h); - InvalidateRect(wfi->hwnd, &update_rect, FALSE); } } @@ -115,6 +113,69 @@ void wf_hw_end_paint(rdpUpdate* update) } +void wf_bitmap_size(rdpUpdate* update, uint32* size) +{ + *size = sizeof(wfBitmap); +} + +void wf_bitmap_new(rdpUpdate* update, wfBitmap* bitmap) +{ + HDC hdc; + uint8* data; + rdpBitmap* _bitmap; + wfInfo* wfi = GET_WFI(update); + + hdc = GetDC(NULL); + bitmap->hdc = CreateCompatibleDC(hdc); + + _bitmap = &(bitmap->_p); + data = _bitmap->dstData; + + if (data == NULL) + bitmap->bitmap = CreateCompatibleBitmap(hdc, _bitmap->width, _bitmap->height); + else + bitmap->bitmap = wf_create_dib(wfi, _bitmap->width, _bitmap->height, _bitmap->bpp, data); + + bitmap->org_bitmap = (HBITMAP) SelectObject(bitmap->hdc, bitmap->bitmap); + ReleaseDC(NULL, hdc); +} + +void wf_offscreen_bitmap_new(rdpUpdate* update, wfBitmap* bitmap) +{ + HDC hdc; + rdpBitmap* _bitmap; + wfInfo* wfi = GET_WFI(update); + + hdc = GetDC(NULL); + bitmap->hdc = CreateCompatibleDC(hdc); + + _bitmap = &(bitmap->_p); + bitmap->bitmap = CreateCompatibleBitmap(hdc, _bitmap->width, _bitmap->height); + + bitmap->org_bitmap = (HBITMAP) SelectObject(bitmap->hdc, bitmap->bitmap); + ReleaseDC(NULL, hdc); +} + +void wf_set_surface(rdpUpdate* update, wfBitmap* bitmap, boolean primary) +{ + wfInfo* wfi = GET_WFI(update); + + if (primary) + wfi->drawing = wfi->primary; + else + wfi->drawing = bitmap; +} + +void wf_bitmap_free(rdpUpdate* update, wfBitmap* bitmap) +{ + if (bitmap != 0) + { + SelectObject(bitmap->hdc, bitmap->org_bitmap); + DeleteObject(bitmap->bitmap); + DeleteDC(bitmap->hdc); + } +} + boolean wf_pre_connect(freerdp* instance) { int i1; @@ -160,10 +221,9 @@ boolean wf_pre_connect(freerdp* instance) wfi->clrconv->alpha = 1; wfi->clrconv->palette = NULL; - if (wfi->sw_gdi) - { - wfi->cache = cache_new(instance->settings); - } + wfi->cache = cache_new(settings); + instance->cache = (void*) wfi->cache; + instance->update->cache = instance->cache; if (wfi->percentscreen > 0) { @@ -294,6 +354,20 @@ boolean wf_post_connect(freerdp* instance) instance->update->EndPaint = wf_hw_end_paint; } + if (wfi->sw_gdi != True) + { + bitmap_cache_register_callbacks(instance->update); + wfi->cache->bitmap->BitmapSize = (cbBitmapSize) wf_bitmap_size; + wfi->cache->bitmap->BitmapNew = (cbBitmapNew) wf_bitmap_new; + wfi->cache->bitmap->BitmapFree = (cbBitmapFree) wf_bitmap_free; + + offscreen_cache_register_callbacks(instance->update); + wfi->cache->offscreen->OffscreenBitmapSize = (cbOffscreenBitmapSize) wf_bitmap_size; + wfi->cache->offscreen->OffscreenBitmapNew = (cbOffscreenBitmapNew) wf_offscreen_bitmap_new; + wfi->cache->offscreen->OffscreenBitmapFree = (cbOffscreenBitmapFree) wf_bitmap_free; + wfi->cache->offscreen->SetSurface = (cbSetSurface) wf_set_surface; + } + freerdp_chanman_post_connect(GET_CHANMAN(instance), instance); return True; diff --git a/client/Windows/wfreerdp.h b/client/Windows/wfreerdp.h index 18bd155d9..4d3eab933 100644 --- a/client/Windows/wfreerdp.h +++ b/client/Windows/wfreerdp.h @@ -40,19 +40,20 @@ #include "wf_event.h" -#define SET_WFI(_instance, _wfi) (_instance)->param1 = _wfi -#define GET_WFI(_instance) ((wfInfo*) ((_instance)->param1)) +#define SET_WFI(_instance, _wfi) (_instance)->client = _wfi +#define GET_WFI(_instance) ((wfInfo*) ((_instance)->client)) -#define SET_CHANMAN(_instance, _chanman) (_instance)->param2 = _chanman -#define GET_CHANMAN(_instance) ((rdpChanMan*) ((_instance)->param2)) +#define SET_CHANMAN(_instance, _chanman) (_instance)->chanman = _chanman +#define GET_CHANMAN(_instance) ((rdpChanMan*) ((_instance)->chanman)) -struct _WF_IMAGE +struct wf_bitmap { + rdpBitmap _p; HDC hdc; HBITMAP bitmap; HBITMAP org_bitmap; }; -typedef struct _WF_IMAGE WF_IMAGE; +typedef struct wf_bitmap wfBitmap; struct wf_info { @@ -66,8 +67,8 @@ struct wf_info uint16 srcBpp; uint16 dstBpp; freerdp* instance; - WF_IMAGE* primary; - WF_IMAGE* drawing; + wfBitmap* primary; + wfBitmap* drawing; HCLRCONV clrconv; HCURSOR cursor; HBRUSH brush;