FreeRDP
palette.c
1 
20 #include <freerdp/config.h>
21 
22 #include <stdio.h>
23 
24 #include <winpr/crt.h>
25 
26 #include <freerdp/log.h>
27 
28 #include "palette.h"
29 #include "cache.h"
30 
31 #define TAG FREERDP_TAG("cache.palette")
32 
33 static void* palette_cache_get(rdpPaletteCache* palette, UINT32 index);
34 
35 static void palette_cache_put(rdpPaletteCache* palette, UINT32 index, void* entry);
36 
37 static BOOL update_gdi_cache_color_table(rdpContext* context,
38  const CACHE_COLOR_TABLE_ORDER* cacheColorTable)
39 {
40  UINT32* colorTable = NULL;
41  rdpCache* cache = context->cache;
42  colorTable = (UINT32*)malloc(sizeof(UINT32) * 256);
43 
44  if (!colorTable)
45  return FALSE;
46 
47  CopyMemory(colorTable, cacheColorTable->colorTable, sizeof(UINT32) * 256);
48  palette_cache_put(cache->palette, cacheColorTable->cacheIndex, (void*)colorTable);
49  return TRUE;
50 }
51 
52 void* palette_cache_get(rdpPaletteCache* paletteCache, UINT32 index)
53 {
54  void* entry = NULL;
55 
56  if (index >= paletteCache->maxEntries)
57  {
58  WLog_ERR(TAG, "invalid color table index: 0x%08" PRIX32 "", index);
59  return NULL;
60  }
61 
62  entry = paletteCache->entries[index].entry;
63 
64  if (!entry)
65  {
66  WLog_ERR(TAG, "invalid color table at index: 0x%08" PRIX32 "", index);
67  return NULL;
68  }
69 
70  return entry;
71 }
72 
73 void palette_cache_put(rdpPaletteCache* paletteCache, UINT32 index, void* entry)
74 {
75  if (index >= paletteCache->maxEntries)
76  {
77  WLog_ERR(TAG, "invalid color table index: 0x%08" PRIX32 "", index);
78  free(entry);
79  return;
80  }
81 
82  free(paletteCache->entries[index].entry);
83  paletteCache->entries[index].entry = entry;
84 }
85 
86 void palette_cache_register_callbacks(rdpUpdate* update)
87 {
88  update->secondary->CacheColorTable = update_gdi_cache_color_table;
89 }
90 
91 rdpPaletteCache* palette_cache_new(rdpContext* context)
92 {
93  rdpPaletteCache* paletteCache = NULL;
94 
95  WINPR_ASSERT(context);
96 
97  paletteCache = (rdpPaletteCache*)calloc(1, sizeof(rdpPaletteCache));
98 
99  if (paletteCache)
100  {
101  paletteCache->context = context;
102  paletteCache->maxEntries = 6;
103  paletteCache->entries =
104  (PALETTE_TABLE_ENTRY*)calloc(paletteCache->maxEntries, sizeof(PALETTE_TABLE_ENTRY));
105  }
106 
107  return paletteCache;
108 }
109 
110 void palette_cache_free(rdpPaletteCache* paletteCache)
111 {
112  if (paletteCache)
113  {
114  for (UINT32 i = 0; i < paletteCache->maxEntries; i++)
115  free(paletteCache->entries[i].entry);
116 
117  free(paletteCache->entries);
118  free(paletteCache);
119  }
120 }
121 
122 void free_palette_update(rdpContext* context, PALETTE_UPDATE* pointer)
123 {
124  free(pointer);
125 }
126 
127 PALETTE_UPDATE* copy_palette_update(rdpContext* context, const PALETTE_UPDATE* pointer)
128 {
129  PALETTE_UPDATE* dst = calloc(1, sizeof(PALETTE_UPDATE));
130 
131  if (!dst || !pointer)
132  goto fail;
133 
134  *dst = *pointer;
135  return dst;
136 fail:
137  WINPR_PRAGMA_DIAG_PUSH
138  WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
139  free_palette_update(context, dst);
140  WINPR_PRAGMA_DIAG_POP
141  return NULL;
142 }
Definition: palette.h:29