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