From e22023cc7680bd385c35c2fc372ab489eeba7eb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 12 Feb 2012 20:29:33 -0500 Subject: [PATCH] libfreerdp-cache: start NineGrid cache --- include/freerdp/cache/cache.h | 2 + include/freerdp/cache/nine_grid.h | 63 +++++++++++++++ libfreerdp-cache/CMakeLists.txt | 1 + libfreerdp-cache/cache.c | 2 + libfreerdp-cache/nine_grid.c | 130 ++++++++++++++++++++++++++++++ libfreerdp-core/capabilities.c | 2 +- 6 files changed, 199 insertions(+), 1 deletion(-) create mode 100644 include/freerdp/cache/nine_grid.h create mode 100644 libfreerdp-cache/nine_grid.c diff --git a/include/freerdp/cache/cache.h b/include/freerdp/cache/cache.h index aea19a1ce..6aa436032 100644 --- a/include/freerdp/cache/cache.h +++ b/include/freerdp/cache/cache.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include @@ -40,6 +41,7 @@ struct rdp_cache rdpBitmapCache* bitmap; /* 3 */ rdpOffscreenCache* offscreen; /* 4 */ rdpPaletteCache* palette; /* 5 */ + rdpNineGridCache* nine_grid; /* 6 */ /* internal */ diff --git a/include/freerdp/cache/nine_grid.h b/include/freerdp/cache/nine_grid.h new file mode 100644 index 000000000..55d2a2b13 --- /dev/null +++ b/include/freerdp/cache/nine_grid.h @@ -0,0 +1,63 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * NineGrid Cache + * + * Copyright 2012 Marc-Andre Moreau + * + * 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. + */ + +#ifndef __NINE_GRID_CACHE_H +#define __NINE_GRID_CACHE_H + +#include +#include +#include +#include +#include + +typedef struct _NINE_GRID_ENTRY NINE_GRID_ENTRY; +typedef struct rdp_nine_grid_cache rdpNineGridCache; + +#include + +struct _NINE_GRID_ENTRY +{ + void* entry; +}; + +struct rdp_nine_grid_cache +{ + pDrawNineGrid DrawNineGrid; /* 0 */ + pMultiDrawNineGrid MultiDrawNineGrid; /* 1 */ + uint32 paddingA[16 - 2]; /* 2 */ + + uint32 maxEntries; /* 16 */ + uint32 maxSize; /* 17 */ + NINE_GRID_ENTRY* entries; /* 18 */ + uint32 paddingB[32 - 19]; /* 19 */ + + /* internal */ + + rdpSettings* settings; +}; + +FREERDP_API void* nine_grid_cache_get(rdpNineGridCache* nine_grid, uint32 index); +FREERDP_API void nine_grid_cache_put(rdpNineGridCache* nine_grid, uint32 index, void* entry); + +FREERDP_API void nine_grid_cache_register_callbacks(rdpUpdate* update); + +FREERDP_API rdpNineGridCache* nine_grid_cache_new(rdpSettings* settings); +FREERDP_API void nine_grid_cache_free(rdpNineGridCache* nine_grid); + +#endif /* __NINE_GRID_CACHE_H */ diff --git a/libfreerdp-cache/CMakeLists.txt b/libfreerdp-cache/CMakeLists.txt index 17769e3ef..25e0b7727 100644 --- a/libfreerdp-cache/CMakeLists.txt +++ b/libfreerdp-cache/CMakeLists.txt @@ -21,6 +21,7 @@ set(FREERDP_CACHE_SRCS brush.c pointer.c bitmap.c + nine_grid.c offscreen.c palette.c glyph.c diff --git a/libfreerdp-cache/cache.c b/libfreerdp-cache/cache.c index 375676548..a3462526a 100644 --- a/libfreerdp-cache/cache.c +++ b/libfreerdp-cache/cache.c @@ -37,6 +37,7 @@ rdpCache* cache_new(rdpSettings* settings) cache->bitmap = bitmap_cache_new(settings); cache->offscreen = offscreen_cache_new(settings); cache->palette = palette_cache_new(settings); + cache->nine_grid = nine_grid_cache_new(settings); } return cache; @@ -52,6 +53,7 @@ void cache_free(rdpCache* cache) bitmap_cache_free(cache->bitmap); offscreen_cache_free(cache->offscreen); palette_cache_free(cache->palette); + nine_grid_cache_free(cache->nine_grid); xfree(cache); } } diff --git a/libfreerdp-cache/nine_grid.c b/libfreerdp-cache/nine_grid.c new file mode 100644 index 000000000..177041ced --- /dev/null +++ b/libfreerdp-cache/nine_grid.c @@ -0,0 +1,130 @@ +/** + * FreeRDP: A Remote Desktop Protocol Client + * NineGrid Cache + * + * Copyright 2012 Marc-Andre Moreau + * + * 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. + */ + +#include +#include +#include +#include + +#include + +void update_gdi_draw_nine_grid(rdpContext* context, DRAW_NINE_GRID_ORDER* draw_nine_grid) +{ + rdpCache* cache = context->cache; + IFCALL(cache->nine_grid->DrawNineGrid, context, draw_nine_grid); +} + +void update_gdi_multi_draw_nine_grid(rdpContext* context, MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid) +{ + rdpCache* cache = context->cache; + IFCALL(cache->nine_grid->MultiDrawNineGrid, context, multi_draw_nine_grid); +} + +void nine_grid_cache_register_callbacks(rdpUpdate* update) +{ + rdpCache* cache = update->context->cache; + + cache->nine_grid->DrawNineGrid = update->primary->DrawNineGrid; + cache->nine_grid->MultiDrawNineGrid = update->primary->MultiDrawNineGrid; + + update->primary->DrawNineGrid = update_gdi_draw_nine_grid; + update->primary->MultiDrawNineGrid = update_gdi_multi_draw_nine_grid; +} + +void* nine_grid_cache_get(rdpNineGridCache* nine_grid, uint32 index) +{ + void* entry; + + if (index > nine_grid->maxEntries) + { + printf("invalid NineGrid index: 0x%04X\n", index); + return NULL; + } + + entry = nine_grid->entries[index].entry; + + if (entry == NULL) + { + printf("invalid NineGrid at index: 0x%04X\n", index); + return NULL; + } + + return entry; +} + +void nine_grid_cache_put(rdpNineGridCache* nine_grid, uint32 index, void* entry) +{ + void* prevEntry; + + if (index > nine_grid->maxEntries) + { + printf("invalid NineGrid index: 0x%04X\n", index); + return; + } + + prevEntry = nine_grid->entries[index].entry; + + if (prevEntry != NULL) + xfree(prevEntry); + + nine_grid->entries[index].entry = entry; +} + +rdpNineGridCache* nine_grid_cache_new(rdpSettings* settings) +{ + rdpNineGridCache* nine_grid; + + nine_grid = (rdpNineGridCache*) xzalloc(sizeof(rdpNineGridCache)); + + if (nine_grid != NULL) + { + nine_grid->settings = settings; + + nine_grid->maxSize = 2560; + nine_grid->maxEntries = 256; + + nine_grid->settings->draw_nine_grid_cache_size = nine_grid->maxSize; + nine_grid->settings->draw_nine_grid_cache_entries = nine_grid->maxEntries; + + nine_grid->entries = (NINE_GRID_ENTRY*) xzalloc(sizeof(NINE_GRID_ENTRY) * nine_grid->maxEntries); + } + + return nine_grid; +} + +void nine_grid_cache_free(rdpNineGridCache* nine_grid) +{ + int i; + + if (nine_grid != NULL) + { + if (nine_grid->entries != NULL) + { + for (i = 0; i < (int) nine_grid->maxEntries; i++) + { + if (nine_grid->entries[i].entry != NULL) + xfree(nine_grid->entries[i].entry); + } + + xfree(nine_grid->entries); + } + + xfree(nine_grid); + } +} diff --git a/libfreerdp-core/capabilities.c b/libfreerdp-core/capabilities.c index 5d2d72565..146b7e15c 100644 --- a/libfreerdp-core/capabilities.c +++ b/libfreerdp-core/capabilities.c @@ -1110,7 +1110,7 @@ void rdp_write_draw_nine_grid_cache_capability_set(STREAM* s, rdpSettings* setti header = rdp_capability_set_start(s); - drawNineGridSupportLevel = (settings->draw_nine_grid) ? DRAW_NINEGRID_SUPPORTED : DRAW_NINEGRID_NO_SUPPORT; + drawNineGridSupportLevel = (settings->draw_nine_grid) ? DRAW_NINEGRID_SUPPORTED_V2 : DRAW_NINEGRID_NO_SUPPORT; stream_write_uint32(s, drawNineGridSupportLevel); /* drawNineGridSupportLevel (4 bytes) */ stream_write_uint16(s, settings->draw_nine_grid_cache_size); /* drawNineGridCacheSize (2 bytes) */