/******************************************************************************* * font_cache_create ******************************************************************************/ void font_cache_create( struct font_cache* fcache, void *buf, int buf_size, int bitmap_bytes_size) { int font_cache_entry_size = sizeof(struct font_cache_entry) + bitmap_bytes_size; /* make sure font cache entries are a multiple of 16 bits */ if (font_cache_entry_size % 2 != 0) font_cache_entry_size++; int cache_size = buf_size / (font_cache_entry_size + LRU_SLOT_OVERHEAD + sizeof(short)); fcache->_size = 1; fcache->_capacity = cache_size; fcache->_prev_result = 0; fcache->_prev_char_code = 0; /* set up index */ fcache->_index = buf; /* set up lru list */ unsigned char* lru_buf = buf; lru_buf += sizeof(short) * cache_size; lru_create(&fcache->_lru, lru_buf, cache_size, font_cache_entry_size); /* initialise cache */ lru_traverse(&fcache->_lru, font_cache_lru_init); short i; for (i = 0; i < cache_size; i++) fcache->_index[i] = i; /* small cheat here */ }
END_TEST START_TEST(eject_one) { lru_t *lru; int ejected = 0; lru = lru_create(); lru_insert(lru, "one", 3, "one", 3, NULL); lru_insert(lru, "two", 3, "two", 3, NULL); lru_insert(lru, "three", 5, "three", 5, NULL); ejected = lru_eject_by_size(lru, 3, NULL, NULL); dprintf("ejected %d\n", ejected); fail_unless(ejected > 0); }
END_TEST START_TEST(touch) { lru_t *lru; lru_item_t * one; lru = lru_create(); one = lru_insert(lru, "one", 3, "one", 3, NULL); lru_insert(lru, "two", 3, "two", 3, NULL); lru_insert(lru, "three", 5, "three", 5, NULL); lru_touch(lru, one); fail_unless(one == (lru_item_t*)lru->list->head->data); lru_destroy(lru); }
END_TEST START_TEST(eject_multiple) { lru_t *lru; int ejected = 0; lru_item_t *three; mark_point(); lru = lru_create(); mark_point(); lru_insert(lru, "one", 3, "one", 3, NULL); lru_insert(lru, "two", 3, "two", 3, NULL); three = lru_insert(lru, "three", 5, "three", 5, NULL); ejected = lru_eject_by_size(lru, 12, NULL, NULL); dprintf("test ejected %d\n", ejected); fail_unless((lru_item_t*)lru->list->head->data == three); fail_unless(ejected == 12); lru_destroy(lru); }