static unsigned outline_hash(void *key, size_t key_size) { OutlineHashKey *k = key; switch (k->type) { case OUTLINE_GLYPH: return glyph_hash(&k->u, key_size); case OUTLINE_DRAWING: return drawing_hash(&k->u, key_size); default: return 0; } }
/** * \brief Get a glyph from glyph cache. * \param key hash key * \return requested hash val or 0 if not found */ glyph_hash_val_t* cache_find_glyph(glyph_hash_key_t* key) { unsigned hash = glyph_hash(key); glyph_hash_item_t* item = glyph_hash_root[hash % GLYPH_HASH_SIZE]; while (item) { if (glyph_compare(key, &(item->key))) { return &(item->val); } item = item->next; } return 0; }
/** * \brief Add a glyph to glyph cache. * \param key hash key * \param val hash val: 2 bitmap glyphs + some additional info */ void cache_add_glyph(glyph_hash_key_t* key, glyph_hash_val_t* val) { unsigned hash = glyph_hash(key); glyph_hash_item_t** next = glyph_hash_root + (hash % GLYPH_HASH_SIZE); while (*next) { if (glyph_compare(key, &((*next)->key))) return; next = &((*next)->next); assert(next); } (*next) = (glyph_hash_item_t*)malloc(sizeof(glyph_hash_item_t)); // (*next)->desc = glyph_key_copy(key, &((*next)->key)); memcpy(&((*next)->key), key, sizeof(glyph_hash_key_t)); memcpy(&((*next)->val), val, sizeof(glyph_hash_val_t)); (*next)->next = 0; glyph_hash_size ++; /* if (glyph_hash_size && (glyph_hash_size % 25 == 0)) { printf("\nGlyph cache: %d entries, %d bytes\n", glyph_hash_size, glyph_hash_size * sizeof(glyph_hash_item_t)); } */ }