20#include <freerdp/config.h>
26#include <freerdp/log.h>
31#define TAG FREERDP_TAG("cache.palette")
33static void palette_cache_put(rdpPaletteCache* palette, UINT32 index,
void* entry);
35static BOOL update_gdi_cache_color_table(rdpContext* context,
38 UINT32* colorTable = NULL;
39 rdpCache* cache = context->cache;
40 colorTable = (UINT32*)malloc(
sizeof(UINT32) * 256);
45 CopyMemory(colorTable, cacheColorTable->colorTable,
sizeof(UINT32) * 256);
46 palette_cache_put(cache->palette, cacheColorTable->cacheIndex, (
void*)colorTable);
50void palette_cache_put(rdpPaletteCache* paletteCache, UINT32 index,
void* entry)
52 if (index >= paletteCache->maxEntries)
54 WLog_ERR(TAG,
"invalid color table index: 0x%08" PRIX32
"", index);
59 free(paletteCache->entries[index].entry);
60 paletteCache->entries[index].entry = entry;
63void palette_cache_register_callbacks(rdpUpdate* update)
66 WINPR_ASSERT(update->secondary);
67 update->secondary->CacheColorTable = update_gdi_cache_color_table;
70rdpPaletteCache* palette_cache_new(rdpContext* context)
72 rdpPaletteCache* paletteCache = NULL;
74 WINPR_ASSERT(context);
76 paletteCache = (rdpPaletteCache*)calloc(1,
sizeof(rdpPaletteCache));
80 paletteCache->context = context;
81 paletteCache->maxEntries = 6;
82 paletteCache->entries =
89void palette_cache_free(rdpPaletteCache* paletteCache)
93 for (UINT32 i = 0; i < paletteCache->maxEntries; i++)
94 free(paletteCache->entries[i].entry);
96 free(paletteCache->entries);
101void free_palette_update(WINPR_ATTR_UNUSED rdpContext* context,
PALETTE_UPDATE* pointer)
110 if (!dst || !pointer)
116 WINPR_PRAGMA_DIAG_PUSH
117 WINPR_PRAGMA_DIAG_IGNORED_MISMATCHED_DEALLOC
118 free_palette_update(context, dst);
119 WINPR_PRAGMA_DIAG_POP