forked from cyxx/f2bgl
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathspritecache.cpp
47 lines (42 loc) · 1.05 KB
/
spritecache.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/*
* Fade To Black engine rewrite
* Copyright (C) 2006-2012 Gregory Montoir ([email protected])
*/
#include "decoder.h"
#include "spritecache.h"
SpriteCache::SpriteCache() {
memset(_entries, 0, sizeof(_entries));
}
SpriteCache::~SpriteCache() {
flush();
}
void SpriteCache::flush() {
for (int i = 0; i < ARRAYSIZE(_entries); ++i) {
free(_entries[i].data);
}
memset(_entries, 0, sizeof(_entries));
}
uint8_t *SpriteCache::getData(int16_t key, const uint8_t *src) {
assert(key >= 0 && key < ARRAYSIZE(_entries));
if (_entries[key].data) {
if (src == _entries[key].src) {
return _entries[key].data;
}
warning("Invalid cache entry for key %d", key);
free(_entries[key].data);
_entries[key].data = 0;
}
const int size = READ_LE_UINT16(src); src += 2;
const int packedSize = READ_LE_UINT16(src); src += 2;
uint8_t *dst = (uint8_t *)malloc(size);
if (dst) {
if (size > packedSize) {
decodeLZSS(src, dst, size);
} else {
memcpy(dst, src, size);
}
_entries[key].src = src - 4;
_entries[key].data = dst;
}
return dst;
}