FreeRDP
Loading...
Searching...
No Matches
nine_grid.c
1
20#include <freerdp/config.h>
21
22#include <stdio.h>
23
24#include <winpr/crt.h>
25
26#include <freerdp/update.h>
27#include <freerdp/freerdp.h>
28#include <winpr/stream.h>
29
30#include "nine_grid.h"
31#include "cache.h"
32
33typedef struct
34{
35 void* entry;
36} NINE_GRID_ENTRY;
37
38struct rdp_nine_grid_cache
39{
40 pDrawNineGrid DrawNineGrid; /* 0 */
41 pMultiDrawNineGrid MultiDrawNineGrid; /* 1 */
42 UINT32 paddingA[16 - 2]; /* 2 */
43
44 UINT32 maxEntries; /* 16 */
45 UINT32 maxSize; /* 17 */
46 NINE_GRID_ENTRY* entries; /* 18 */
47 UINT32 paddingB[32 - 19]; /* 19 */
48
49 rdpContext* context;
50};
51
52static BOOL update_gdi_draw_nine_grid(rdpContext* context,
53 const DRAW_NINE_GRID_ORDER* draw_nine_grid)
54{
55 rdpCache* cache = context->cache;
56 return IFCALLRESULT(TRUE, cache->nine_grid->DrawNineGrid, context, draw_nine_grid);
57}
58
59static BOOL update_gdi_multi_draw_nine_grid(rdpContext* context,
60 const MULTI_DRAW_NINE_GRID_ORDER* multi_draw_nine_grid)
61{
62 rdpCache* cache = context->cache;
63 return IFCALLRESULT(TRUE, cache->nine_grid->MultiDrawNineGrid, context, multi_draw_nine_grid);
64}
65
66void nine_grid_cache_register_callbacks(rdpUpdate* update)
67{
68 rdpCache* cache = update->context->cache;
69
70 cache->nine_grid->DrawNineGrid = update->primary->DrawNineGrid;
71 cache->nine_grid->MultiDrawNineGrid = update->primary->MultiDrawNineGrid;
72
73 update->primary->DrawNineGrid = update_gdi_draw_nine_grid;
74 update->primary->MultiDrawNineGrid = update_gdi_multi_draw_nine_grid;
75}
76
77rdpNineGridCache* nine_grid_cache_new(rdpContext* context)
78{
79 rdpNineGridCache* nine_grid = NULL;
80 rdpSettings* settings = NULL;
81
82 WINPR_ASSERT(context);
83
84 settings = context->settings;
85 WINPR_ASSERT(settings);
86
87 nine_grid = (rdpNineGridCache*)calloc(1, sizeof(rdpNineGridCache));
88 if (!nine_grid)
89 return NULL;
90
91 nine_grid->context = context;
92
93 nine_grid->maxSize = 2560;
94 nine_grid->maxEntries = 256;
95
96 if (!freerdp_settings_set_uint32(settings, FreeRDP_DrawNineGridCacheSize, nine_grid->maxSize))
97 goto fail;
98 if (!freerdp_settings_set_uint32(settings, FreeRDP_DrawNineGridCacheEntries,
99 nine_grid->maxEntries))
100 goto fail;
101
102 nine_grid->entries = (NINE_GRID_ENTRY*)calloc(nine_grid->maxEntries, sizeof(NINE_GRID_ENTRY));
103 if (!nine_grid->entries)
104 goto fail;
105
106 return nine_grid;
107
108fail:
109 WINPR_PRAGMA_DIAG_PUSH
110 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
111 nine_grid_cache_free(nine_grid);
112 WINPR_PRAGMA_DIAG_POP
113 return NULL;
114}
115
116void nine_grid_cache_free(rdpNineGridCache* nine_grid)
117{
118 if (nine_grid != NULL)
119 {
120 if (nine_grid->entries != NULL)
121 {
122 for (size_t i = 0; i < nine_grid->maxEntries; i++)
123 free(nine_grid->entries[i].entry);
124
125 free(nine_grid->entries);
126 }
127
128 free(nine_grid);
129 }
130}
FREERDP_API BOOL freerdp_settings_set_uint32(rdpSettings *settings, FreeRDP_Settings_Keys_UInt32 id, UINT32 param)
Sets a UINT32 settings value.