author | skidd13 |
Tue, 20 Nov 2007 14:11:19 +0000 | |
changeset 8428 | f8300c908bd9 |
parent 8423 | 8453e9a0f0b5 |
child 8533 | a9b708fe4a00 |
permissions | -rw-r--r-- |
2186 | 1 |
/* $Id$ */ |
2 |
||
6977
67b989528f3d
(svn r9662) -Documentation: Doxygen corrections and @file omissions
belugas
parents:
6916
diff
changeset
|
3 |
/** @file spritecache.cpp */ |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
4 |
|
0 | 5 |
#include "stdafx.h" |
1891
92a3b0aa0946
(svn r2397) - CodeChange: rename all "ttd" files to "openttd" files.
Darkvater
parents:
1844
diff
changeset
|
6 |
#include "openttd.h" |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
7 |
#include "variables.h" |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
8 |
#include "string.h" |
1299
0a6510cc889b
(svn r1803) Move debugging stuff into files of it's own
tron
parents:
1250
diff
changeset
|
9 |
#include "debug.h" |
2163
637ec3c361f5
(svn r2673) Include functions.h directly, not globally via openttd.h
tron
parents:
2159
diff
changeset
|
10 |
#include "functions.h" |
2548
97ada3bd2702
(svn r3077) static, const, bracing, indentation, 0 -> '\0'/NULL, typos in comments, excess empty lines, minor other changes
tron
parents:
2407
diff
changeset
|
11 |
#include "macros.h" |
1349
07514c2cc6d1
(svn r1853) Move spritecache function declarations into a header of their own and use SpriteID as parameter type where appropriate
tron
parents:
1348
diff
changeset
|
12 |
#include "spritecache.h" |
1363
01d3de5d8039
(svn r1867) Include tables/sprites.h only in files which need it
tron
parents:
1361
diff
changeset
|
13 |
#include "table/sprites.h" |
0 | 14 |
#include "fileio.h" |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
15 |
#include "helpers.hpp" |
7348
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
16 |
#include "spriteloader/grf.hpp" |
7397
d371cc0fbb3c
(svn r10148) -Fix r10143: make --without-png to compile again
truelight
parents:
7392
diff
changeset
|
17 |
#ifdef WITH_PNG |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
18 |
#include "spriteloader/png.hpp" |
7397
d371cc0fbb3c
(svn r10148) -Fix r10143: make --without-png to compile again
truelight
parents:
7392
diff
changeset
|
19 |
#endif /* WITH_PNG */ |
7433
8e410e7ec0d7
(svn r10190) -Codechange: merged renderer and blitter to one single class API: blitter
truelight
parents:
7404
diff
changeset
|
20 |
#include "blitter/factory.hpp" |
7299
74e163f03bbc
(svn r10042) -Codechange: Replace hardcoded spritecache size with a configuration
peter1138
parents:
7295
diff
changeset
|
21 |
|
7348
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
22 |
/* Default of 4MB spritecache */ |
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
23 |
uint _sprite_cache_size = 4; |
0 | 24 |
|
25 |
||
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
26 |
struct SpriteCache { |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
27 |
void *ptr; |
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7585
diff
changeset
|
28 |
uint8 file_slot; |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
29 |
uint32 file_pos; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
30 |
int16 lru; |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
31 |
uint32 id; |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
32 |
const char *grf_name; |
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
33 |
}; |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
34 |
|
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
35 |
|
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
36 |
static uint _spritecache_items = 0; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
37 |
static SpriteCache *_spritecache = NULL; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
38 |
|
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
39 |
|
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
40 |
static inline SpriteCache *GetSpriteCache(uint index) |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
41 |
{ |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
42 |
return &_spritecache[index]; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
43 |
} |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
44 |
|
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
45 |
|
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
46 |
static SpriteCache *AllocateSpriteCache(uint index) |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
47 |
{ |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
48 |
if (index >= _spritecache_items) { |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
49 |
/* Add another 1024 items to the 'pool' */ |
8423
8453e9a0f0b5
(svn r11480) -Codechange: Rename the function ALIGN fitting to the naming style
skidd13
parents:
8072
diff
changeset
|
50 |
uint items = Align(index + 1, 1024); |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
51 |
|
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
52 |
DEBUG(sprite, 4, "Increasing sprite cache to %d items (%d bytes)", items, items * sizeof(*_spritecache)); |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
53 |
|
5860
7fdc9b423ba1
(svn r8066) - Codechange: MallocT(), CallocT(), ReallocT() now return the pointer to allocated memory instead of modifying the pointer given as parameter
KUDr
parents:
5838
diff
changeset
|
54 |
_spritecache = ReallocT(_spritecache, items); |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
55 |
|
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
56 |
if (_spritecache == NULL) { |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
57 |
error("Unable to allocate sprite cache of %d items (%d bytes)", items, items * sizeof(*_spritecache)); |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
58 |
} |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
59 |
|
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
60 |
/* Reset the new items and update the count */ |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
61 |
memset(_spritecache + _spritecache_items, 0, (items - _spritecache_items) * sizeof(*_spritecache)); |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
62 |
_spritecache_items = items; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
63 |
} |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
64 |
|
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
65 |
return GetSpriteCache(index); |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
66 |
} |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
67 |
|
0 | 68 |
|
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
69 |
struct MemBlock { |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
70 |
uint32 size; |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
71 |
byte data[VARARRAY_SIZE]; |
6574
e1d1a12faaf7
(svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents:
6573
diff
changeset
|
72 |
}; |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
73 |
|
0 | 74 |
static uint _sprite_lru_counter; |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
75 |
static MemBlock *_spritecache_ptr; |
0 | 76 |
static int _compact_cache_counter; |
77 |
||
6573 | 78 |
static void CompactSpriteCache(); |
0 | 79 |
|
6573 | 80 |
static bool ReadSpriteHeaderSkipData() |
0 | 81 |
{ |
2329
f68428464540
(svn r2855) Make ReadSpriteHeaderSkipData() responsible for detecting the end of a grf file instead of its callers - this simplifies the code a bit
tron
parents:
2321
diff
changeset
|
82 |
uint16 num = FioReadWord(); |
0 | 83 |
byte type; |
84 |
||
2329
f68428464540
(svn r2855) Make ReadSpriteHeaderSkipData() responsible for detecting the end of a grf file instead of its callers - this simplifies the code a bit
tron
parents:
2321
diff
changeset
|
85 |
if (num == 0) return false; |
f68428464540
(svn r2855) Make ReadSpriteHeaderSkipData() responsible for detecting the end of a grf file instead of its callers - this simplifies the code a bit
tron
parents:
2321
diff
changeset
|
86 |
|
0 | 87 |
type = FioReadByte(); |
88 |
if (type == 0xFF) { |
|
2342
c19fb4f2df30
(svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents:
2340
diff
changeset
|
89 |
FioSkipBytes(num); |
5150
247343201280
(svn r7242) -Fix: Don't load 1-byte pseudo sprites, as used in some NewGRF sets. If the sprite is ever drawn this will result in a "missing sprite" error instead of undefined misbehaviour leading to segmentation faults...
peter1138
parents:
4522
diff
changeset
|
90 |
/* Some NewGRF files have "empty" pseudo-sprites which are 1 |
247343201280
(svn r7242) -Fix: Don't load 1-byte pseudo sprites, as used in some NewGRF sets. If the sprite is ever drawn this will result in a "missing sprite" error instead of undefined misbehaviour leading to segmentation faults...
peter1138
parents:
4522
diff
changeset
|
91 |
* byte long. Catch these so the sprites won't be displayed. */ |
247343201280
(svn r7242) -Fix: Don't load 1-byte pseudo sprites, as used in some NewGRF sets. If the sprite is ever drawn this will result in a "missing sprite" error instead of undefined misbehaviour leading to segmentation faults...
peter1138
parents:
4522
diff
changeset
|
92 |
return num != 1; |
0 | 93 |
} |
184
dbeaaaf8b2bb
(svn r185) -Fix: [1016954] Cached_sprites does now work again
truelight
parents:
182
diff
changeset
|
94 |
|
0 | 95 |
FioSkipBytes(7); |
96 |
num -= 8; |
|
2329
f68428464540
(svn r2855) Make ReadSpriteHeaderSkipData() responsible for detecting the end of a grf file instead of its callers - this simplifies the code a bit
tron
parents:
2321
diff
changeset
|
97 |
if (num == 0) return true; |
0 | 98 |
|
99 |
if (type & 2) { |
|
100 |
FioSkipBytes(num); |
|
1355 | 101 |
} else { |
102 |
while (num > 0) { |
|
103 |
int8 i = FioReadByte(); |
|
104 |
if (i >= 0) { |
|
105 |
num -= i; |
|
106 |
FioSkipBytes(i); |
|
107 |
} else { |
|
108 |
i = -(i >> 3); |
|
109 |
num -= i; |
|
110 |
FioReadByte(); |
|
111 |
} |
|
0 | 112 |
} |
113 |
} |
|
2329
f68428464540
(svn r2855) Make ReadSpriteHeaderSkipData() responsible for detecting the end of a grf file instead of its callers - this simplifies the code a bit
tron
parents:
2321
diff
changeset
|
114 |
|
f68428464540
(svn r2855) Make ReadSpriteHeaderSkipData() responsible for detecting the end of a grf file instead of its callers - this simplifies the code a bit
tron
parents:
2321
diff
changeset
|
115 |
return true; |
0 | 116 |
} |
117 |
||
3565
03d870cc3dcd
(svn r4446) - Add function to determine if a Sprite ID exists.
peter1138
parents:
2548
diff
changeset
|
118 |
/* Check if the given Sprite ID exists */ |
03d870cc3dcd
(svn r4446) - Add function to determine if a Sprite ID exists.
peter1138
parents:
2548
diff
changeset
|
119 |
bool SpriteExists(SpriteID id) |
03d870cc3dcd
(svn r4446) - Add function to determine if a Sprite ID exists.
peter1138
parents:
2548
diff
changeset
|
120 |
{ |
03d870cc3dcd
(svn r4446) - Add function to determine if a Sprite ID exists.
peter1138
parents:
2548
diff
changeset
|
121 |
/* Special case for Sprite ID zero -- its position is also 0... */ |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
122 |
if (id == 0) return true; |
5953
7000c5bdd70b
(svn r8166) -Fix (r7797): Protect against out of bounds access to the sprite ptr
peter1138
parents:
5860
diff
changeset
|
123 |
if (id >= _spritecache_items) return false; |
8072
417f041eaee8
(svn r11101) -Fix r11099: the check: file_pos == 0, no longer works; adjust the check with file_slot. This solves the ? sprites with autorail (nice catch Progman)
truelight
parents:
8066
diff
changeset
|
124 |
return !(GetSpriteCache(id)->file_pos == 0 && GetSpriteCache(id)->file_slot == 0); |
3565
03d870cc3dcd
(svn r4446) - Add function to determine if a Sprite ID exists.
peter1138
parents:
2548
diff
changeset
|
125 |
} |
03d870cc3dcd
(svn r4446) - Add function to determine if a Sprite ID exists.
peter1138
parents:
2548
diff
changeset
|
126 |
|
7348
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
127 |
void* AllocSprite(size_t); |
2014
0230ed9186bc
(svn r2522) Reorganize sprite load and decompression in order to remove a special case from the sprite blitter, which decompressed certain sprites every time when blitting them
tron
parents:
1891
diff
changeset
|
128 |
|
7365
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
129 |
static void* ReadSprite(SpriteCache *sc, SpriteID id, bool real_sprite) |
0 | 130 |
{ |
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7585
diff
changeset
|
131 |
uint8 file_slot = sc->file_slot; |
7295
4af0cd4cab3d
(svn r10038) -Fix (r8634): Sprite resulting from '?' substitution was reloaded into the cache entry for SPR_IMG_QUERY instead of the original sprite cache entry. This resulted in unaccounted missing sprite cache memory, and was exacerbated because the original missing sprite was not cached, so it did it again and again and again. Slowdowns and boom. Etc.
peter1138
parents:
6977
diff
changeset
|
132 |
uint32 file_pos = sc->file_pos; |
2014
0230ed9186bc
(svn r2522) Reorganize sprite load and decompression in order to remove a special case from the sprite blitter, which decompressed certain sprites every time when blitting them
tron
parents:
1891
diff
changeset
|
133 |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5150
diff
changeset
|
134 |
DEBUG(sprite, 9, "Load sprite %d", id); |
184
dbeaaaf8b2bb
(svn r185) -Fix: [1016954] Cached_sprites does now work again
truelight
parents:
182
diff
changeset
|
135 |
|
3565
03d870cc3dcd
(svn r4446) - Add function to determine if a Sprite ID exists.
peter1138
parents:
2548
diff
changeset
|
136 |
if (!SpriteExists(id)) { |
6213
164d84e1c5b4
(svn r8634) -Codechange: replace missing sprites with a red question mark.
rubidium
parents:
5971
diff
changeset
|
137 |
DEBUG(sprite, 1, "Tried to load non-existing sprite #%d. Probable cause: Wrong/missing NewGRFs", id); |
164d84e1c5b4
(svn r8634) -Codechange: replace missing sprites with a red question mark.
rubidium
parents:
5971
diff
changeset
|
138 |
|
164d84e1c5b4
(svn r8634) -Codechange: replace missing sprites with a red question mark.
rubidium
parents:
5971
diff
changeset
|
139 |
/* SPR_IMG_QUERY is a BIG FAT RED ? */ |
164d84e1c5b4
(svn r8634) -Codechange: replace missing sprites with a red question mark.
rubidium
parents:
5971
diff
changeset
|
140 |
id = SPR_IMG_QUERY; |
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7585
diff
changeset
|
141 |
file_slot = GetSpriteCache(SPR_IMG_QUERY)->file_slot; |
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7585
diff
changeset
|
142 |
file_pos = GetSpriteCache(SPR_IMG_QUERY)->file_pos; |
1378
ebb8d52f0352
(svn r1882) Add a basic check if a non-existent sprite gets accessed.
tron
parents:
1363
diff
changeset
|
143 |
} |
ebb8d52f0352
(svn r1882) Add a basic check if a non-existent sprite gets accessed.
tron
parents:
1363
diff
changeset
|
144 |
|
7399
8e062c789dec
(svn r10150) -Fix r10148: show a message to users when using 32bpp blitter and no libpng available
truelight
parents:
7398
diff
changeset
|
145 |
if (BlitterFactoryBase::GetCurrentBlitter()->GetScreenDepth() == 32) { |
7397
d371cc0fbb3c
(svn r10148) -Fix r10143: make --without-png to compile again
truelight
parents:
7392
diff
changeset
|
146 |
#ifdef WITH_PNG |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
147 |
/* Try loading 32bpp graphics in case we are 32bpp output */ |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
148 |
SpriteLoaderPNG sprite_loader; |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
149 |
SpriteLoader::Sprite sprite; |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
150 |
|
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7585
diff
changeset
|
151 |
if (sprite_loader.LoadSprite(&sprite, sc->grf_name, 0, sc->id)) { |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
152 |
sc->ptr = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, &AllocSprite); |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
153 |
free(sprite.data); |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
154 |
|
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
155 |
return sc->ptr; |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
156 |
} |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
157 |
/* If the PNG couldn't be loaded, fall back to 8bpp grfs */ |
7399
8e062c789dec
(svn r10150) -Fix r10148: show a message to users when using 32bpp blitter and no libpng available
truelight
parents:
7398
diff
changeset
|
158 |
#else |
8e062c789dec
(svn r10150) -Fix r10148: show a message to users when using 32bpp blitter and no libpng available
truelight
parents:
7398
diff
changeset
|
159 |
static bool show_once = true; |
8e062c789dec
(svn r10150) -Fix r10148: show a message to users when using 32bpp blitter and no libpng available
truelight
parents:
7398
diff
changeset
|
160 |
if (show_once) { |
8e062c789dec
(svn r10150) -Fix r10148: show a message to users when using 32bpp blitter and no libpng available
truelight
parents:
7398
diff
changeset
|
161 |
DEBUG(misc, 0, "You are running a 32bpp blitter, but this build is without libpng support; falling back to 8bpp graphics"); |
8e062c789dec
(svn r10150) -Fix r10148: show a message to users when using 32bpp blitter and no libpng available
truelight
parents:
7398
diff
changeset
|
162 |
show_once = false; |
8e062c789dec
(svn r10150) -Fix r10148: show a message to users when using 32bpp blitter and no libpng available
truelight
parents:
7398
diff
changeset
|
163 |
} |
8e062c789dec
(svn r10150) -Fix r10148: show a message to users when using 32bpp blitter and no libpng available
truelight
parents:
7398
diff
changeset
|
164 |
#endif /* WITH_PNG */ |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
165 |
} |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
166 |
|
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7585
diff
changeset
|
167 |
FioSeekToFile(file_slot, file_pos); |
1354
5e5c89b9b169
(svn r1858) Let ReadSprite() handle the subtleties of loading a sprite, not its caller
tron
parents:
1353
diff
changeset
|
168 |
|
7348
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
169 |
/* Read the size and type */ |
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
170 |
int num = FioReadWord(); |
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
171 |
byte type = FioReadByte(); |
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
172 |
/* Type 0xFF indicates either a colormap or some other non-sprite info */ |
2014
0230ed9186bc
(svn r2522) Reorganize sprite load and decompression in order to remove a special case from the sprite blitter, which decompressed certain sprites every time when blitting them
tron
parents:
1891
diff
changeset
|
173 |
if (type == 0xFF) { |
7365
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
174 |
if (real_sprite) { |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
175 |
static byte warning_level = 0; |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
176 |
DEBUG(sprite, warning_level, "Tried to load non sprite #%d as a real sprite. Probable cause: NewGRF interference", id); |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
177 |
warning_level = 6; |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
178 |
if (id == SPR_IMG_QUERY) error("Uhm, would you be so kind not to load a NewGRF that makes the 'query' sprite a non- sprite?"); |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
179 |
return (void*)GetSprite(SPR_IMG_QUERY); |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
180 |
} |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
181 |
|
7348
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
182 |
byte *dest = (byte *)AllocSprite(num); |
2014
0230ed9186bc
(svn r2522) Reorganize sprite load and decompression in order to remove a special case from the sprite blitter, which decompressed certain sprites every time when blitting them
tron
parents:
1891
diff
changeset
|
183 |
|
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
184 |
sc->ptr = dest; |
2014
0230ed9186bc
(svn r2522) Reorganize sprite load and decompression in order to remove a special case from the sprite blitter, which decompressed certain sprites every time when blitting them
tron
parents:
1891
diff
changeset
|
185 |
FioReadBlock(dest, num); |
0230ed9186bc
(svn r2522) Reorganize sprite load and decompression in order to remove a special case from the sprite blitter, which decompressed certain sprites every time when blitting them
tron
parents:
1891
diff
changeset
|
186 |
|
7361
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
187 |
return sc->ptr; |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
188 |
} |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
189 |
/* Ugly hack to work around the problem that the old landscape |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
190 |
* generator assumes that those sprites are stored uncompressed in |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
191 |
* the memory, and they are only read directly by the code, never |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
192 |
* send to the blitter. So do not send it to the blitter (which will |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
193 |
* result in a data array in the format the blitter likes most), but |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
194 |
* read the data directly from disk and store that as sprite. |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
195 |
* Ugly: yes. Other solution: no. Blame the original author or |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
196 |
* something ;) The image should really have been a data-stream |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
197 |
* (so type = 0xFF basicly). */ |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
198 |
if (id >= 4845 && id <= 4881) { |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
199 |
uint height = FioReadByte(); |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
200 |
uint width = FioReadWord(); |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
201 |
Sprite *sprite; |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
202 |
byte *dest; |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
203 |
|
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
204 |
num = width * height; |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
205 |
sprite = (Sprite *)AllocSprite(sizeof(*sprite) + num); |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
206 |
sc->ptr = sprite; |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
207 |
sprite->height = height; |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
208 |
sprite->width = width; |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
209 |
sprite->x_offs = FioReadWord(); |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
210 |
sprite->y_offs = FioReadWord(); |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
211 |
|
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
212 |
dest = sprite->data; |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
213 |
while (num > 0) { |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
214 |
int8 i = FioReadByte(); |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
215 |
if (i >= 0) { |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
216 |
num -= i; |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
217 |
for (; i > 0; --i) *dest++ = FioReadByte(); |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
218 |
} else { |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
219 |
const byte* rel = dest - (((i & 7) << 8) | FioReadByte()); |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
220 |
i = -(i >> 3); |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
221 |
num -= i; |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
222 |
for (; i > 0; --i) *dest++ = *rel++; |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
223 |
} |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
224 |
} |
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
225 |
|
8314452833ad
(svn r10105) -Fix r10092: fix sprite 4845 till 4881 (inclusive), so they store the data as on the disk in the memory, as the old landscape generate assumes this. Talking about ugly hacks...
truelight
parents:
7352
diff
changeset
|
226 |
return sc->ptr; |
7348
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
227 |
} |
2014
0230ed9186bc
(svn r2522) Reorganize sprite load and decompression in order to remove a special case from the sprite blitter, which decompressed certain sprites every time when blitting them
tron
parents:
1891
diff
changeset
|
228 |
|
7365
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
229 |
if (!real_sprite) { |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
230 |
static byte warning_level = 0; |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
231 |
DEBUG(sprite, warning_level, "Tried to load real sprite #%d as a non sprite. Probable cause: NewGRF interference", id); |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
232 |
warning_level = 6; |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
233 |
} |
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
234 |
|
7348
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
235 |
SpriteLoaderGrf sprite_loader; |
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
236 |
SpriteLoader::Sprite sprite; |
0 | 237 |
|
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7585
diff
changeset
|
238 |
if (!sprite_loader.LoadSprite(&sprite, sc->grf_name, file_slot, file_pos)) return NULL; |
7348
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
239 |
if (id == 142) sprite.height = 10; // Compensate for a TTD bug |
7352
e2e8432018f6
(svn r10096) -Fix r10092: freetype bypassed the Blitter::Encode, making fonts look weird
truelight
parents:
7348
diff
changeset
|
240 |
sc->ptr = BlitterFactoryBase::GetCurrentBlitter()->Encode(&sprite, &AllocSprite); |
7348
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
241 |
free(sprite.data); |
184
dbeaaaf8b2bb
(svn r185) -Fix: [1016954] Cached_sprites does now work again
truelight
parents:
182
diff
changeset
|
242 |
|
7348
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
243 |
return sc->ptr; |
0 | 244 |
} |
245 |
||
246 |
||
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7585
diff
changeset
|
247 |
bool LoadNextSprite(int load_index, byte file_slot, uint file_sprite_id) |
0 | 248 |
{ |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
249 |
SpriteCache *sc; |
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7585
diff
changeset
|
250 |
uint32 file_pos = FioGetPos(); |
0 | 251 |
|
2342
c19fb4f2df30
(svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents:
2340
diff
changeset
|
252 |
if (!ReadSpriteHeaderSkipData()) return false; |
361
ad7a042ee0eb
(svn r549) -newgrf: Support for action 0xd (change a parameter (sorta variable for the GRF scripts)). Based on patch by octo, heavy changes by pasky.
darkvater
parents:
184
diff
changeset
|
253 |
|
3591
05a4b88d875f
(svn r4481) - Fix: Validate the given sprite ID when loading a sprite.
peter1138
parents:
3565
diff
changeset
|
254 |
if (load_index >= MAX_SPRITES) { |
05a4b88d875f
(svn r4481) - Fix: Validate the given sprite ID when loading a sprite.
peter1138
parents:
3565
diff
changeset
|
255 |
error("Tried to load too many sprites (#%d; max %d)", load_index, MAX_SPRITES); |
05a4b88d875f
(svn r4481) - Fix: Validate the given sprite ID when loading a sprite.
peter1138
parents:
3565
diff
changeset
|
256 |
} |
05a4b88d875f
(svn r4481) - Fix: Validate the given sprite ID when loading a sprite.
peter1138
parents:
3565
diff
changeset
|
257 |
|
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
258 |
sc = AllocateSpriteCache(load_index); |
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7585
diff
changeset
|
259 |
sc->file_slot = file_slot; |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
260 |
sc->file_pos = file_pos; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
261 |
sc->ptr = NULL; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
262 |
sc->lru = 0; |
7404
fc0559157f16
(svn r10157) -Fix: use as indentified for PNGs, the place of the image as it was in the grf, not the internal SpriteID
truelight
parents:
7399
diff
changeset
|
263 |
sc->id = file_sprite_id; |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
264 |
|
7398
4f7ae78d1212
(svn r10149) -Fix r10143: MSVC warnings... (tnx boekabart and glx)
truelight
parents:
7397
diff
changeset
|
265 |
const char *fio_grf_name = FioGetFilename(); |
4f7ae78d1212
(svn r10149) -Fix r10143: MSVC warnings... (tnx boekabart and glx)
truelight
parents:
7397
diff
changeset
|
266 |
const char *t = strrchr(fio_grf_name, PATHSEPCHAR); |
4f7ae78d1212
(svn r10149) -Fix r10143: MSVC warnings... (tnx boekabart and glx)
truelight
parents:
7397
diff
changeset
|
267 |
char *grf_name; |
4f7ae78d1212
(svn r10149) -Fix r10143: MSVC warnings... (tnx boekabart and glx)
truelight
parents:
7397
diff
changeset
|
268 |
if (t == NULL) grf_name = strdup(fio_grf_name); |
4f7ae78d1212
(svn r10149) -Fix r10143: MSVC warnings... (tnx boekabart and glx)
truelight
parents:
7397
diff
changeset
|
269 |
else grf_name = strdup(t); |
4f7ae78d1212
(svn r10149) -Fix r10143: MSVC warnings... (tnx boekabart and glx)
truelight
parents:
7397
diff
changeset
|
270 |
/* Make the string lowercase and strip extension */ |
4f7ae78d1212
(svn r10149) -Fix r10143: MSVC warnings... (tnx boekabart and glx)
truelight
parents:
7397
diff
changeset
|
271 |
char *t2 = strrchr(grf_name, '.'); |
4f7ae78d1212
(svn r10149) -Fix r10143: MSVC warnings... (tnx boekabart and glx)
truelight
parents:
7397
diff
changeset
|
272 |
if (t2 != NULL) *t2 = '\0'; |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
273 |
strtolower(grf_name); |
7398
4f7ae78d1212
(svn r10149) -Fix r10143: MSVC warnings... (tnx boekabart and glx)
truelight
parents:
7397
diff
changeset
|
274 |
|
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
275 |
free((char *)sc->grf_name); |
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
276 |
sc->grf_name = grf_name; |
0 | 277 |
|
278 |
return true; |
|
279 |
} |
|
280 |
||
2407 | 281 |
|
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
282 |
void DupSprite(SpriteID old_spr, SpriteID new_spr) |
2407 | 283 |
{ |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
284 |
SpriteCache *scold = GetSpriteCache(old_spr); |
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
285 |
SpriteCache *scnew = AllocateSpriteCache(new_spr); |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
286 |
|
8066
7acd480e05c9
(svn r11095) -Codechange: don't abuse 'file_pos' by storing the file_slot in it too, but use a nice seperate variable for it
truelight
parents:
7585
diff
changeset
|
287 |
scnew->file_slot = scold->file_slot; |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
288 |
scnew->file_pos = scold->file_pos; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
289 |
scnew->ptr = NULL; |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
290 |
scnew->id = scold->id; |
7585
9c658c22b0ec
(svn r10356) -Fix (r10143): another memory leak eliminated.
rubidium
parents:
7433
diff
changeset
|
291 |
free((char *)scnew->grf_name); |
7392
a716551b0c7f
(svn r10143) -Add: store the filename of the grfs opened and allow easy access to the name
truelight
parents:
7365
diff
changeset
|
292 |
scnew->grf_name = strdup(scold->grf_name); |
2407 | 293 |
} |
294 |
||
295 |
||
2340
0a9f3eeccb96
(svn r2866) Move all functions and tables which aren't directly involved in managing the sprite heap to a new file gfxinit.c.
tron
parents:
2339
diff
changeset
|
296 |
void SkipSprites(uint count) |
37
61bf1df68d82
(svn r38) Preliminary slopes graphics fix. Neighboring tile check not done yet
dominik
parents:
0
diff
changeset
|
297 |
{ |
2329
f68428464540
(svn r2855) Make ReadSpriteHeaderSkipData() responsible for detecting the end of a grf file instead of its callers - this simplifies the code a bit
tron
parents:
2321
diff
changeset
|
298 |
for (; count > 0; --count) { |
2342
c19fb4f2df30
(svn r2868) Change the way NewGRFs are loaded: The loading process i no longer bolted onto the normal graphics loading.
tron
parents:
2340
diff
changeset
|
299 |
if (!ReadSpriteHeaderSkipData()) return; |
37
61bf1df68d82
(svn r38) Preliminary slopes graphics fix. Neighboring tile check not done yet
dominik
parents:
0
diff
changeset
|
300 |
} |
61bf1df68d82
(svn r38) Preliminary slopes graphics fix. Neighboring tile check not done yet
dominik
parents:
0
diff
changeset
|
301 |
} |
61bf1df68d82
(svn r38) Preliminary slopes graphics fix. Neighboring tile check not done yet
dominik
parents:
0
diff
changeset
|
302 |
|
0 | 303 |
|
304 |
#define S_FREE_MASK 1 |
|
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
305 |
|
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
306 |
static inline MemBlock* NextBlock(MemBlock* block) |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
307 |
{ |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
308 |
return (MemBlock*)((byte*)block + (block->size & ~S_FREE_MASK)); |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
309 |
} |
0 | 310 |
|
6573 | 311 |
static uint32 GetSpriteCacheUsage() |
0 | 312 |
{ |
4321
b763b7007162
(svn r5974) -Codechange: added casts all around the place to make Windows 64bit happy (michi_cc)
truelight
parents:
3591
diff
changeset
|
313 |
uint32 tot_size = 0; |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
314 |
MemBlock* s; |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
315 |
|
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
316 |
for (s = _spritecache_ptr; s->size != 0; s = NextBlock(s)) |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
317 |
if (!(s->size & S_FREE_MASK)) tot_size += s->size; |
0 | 318 |
|
319 |
return tot_size; |
|
320 |
} |
|
321 |
||
322 |
||
6573 | 323 |
void IncreaseSpriteLRU() |
0 | 324 |
{ |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
325 |
/* Increase all LRU values */ |
0 | 326 |
if (_sprite_lru_counter > 16384) { |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
327 |
SpriteID i; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
328 |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5150
diff
changeset
|
329 |
DEBUG(sprite, 3, "Fixing lru %d, inuse=%d", _sprite_lru_counter, GetSpriteCacheUsage()); |
0 | 330 |
|
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
331 |
for (i = 0; i != _spritecache_items; i++) { |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
332 |
SpriteCache *sc = GetSpriteCache(i); |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
333 |
if (sc->ptr != NULL) { |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
334 |
if (sc->lru >= 0) { |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
335 |
sc->lru = -1; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
336 |
} else if (sc->lru != -32768) { |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
337 |
sc->lru--; |
0 | 338 |
} |
339 |
} |
|
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
340 |
} |
0 | 341 |
_sprite_lru_counter = 0; |
342 |
} |
|
343 |
||
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
344 |
/* Compact sprite cache every now and then. */ |
0 | 345 |
if (++_compact_cache_counter >= 740) { |
346 |
CompactSpriteCache(); |
|
347 |
_compact_cache_counter = 0; |
|
348 |
} |
|
349 |
} |
|
350 |
||
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
351 |
/** Called when holes in the sprite cache should be removed. |
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
352 |
* That is accomplished by moving the cached data. */ |
6573 | 353 |
static void CompactSpriteCache() |
0 | 354 |
{ |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
355 |
MemBlock *s; |
184
dbeaaaf8b2bb
(svn r185) -Fix: [1016954] Cached_sprites does now work again
truelight
parents:
182
diff
changeset
|
356 |
|
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5150
diff
changeset
|
357 |
DEBUG(sprite, 3, "Compacting sprite cache, inuse=%d", GetSpriteCacheUsage()); |
184
dbeaaaf8b2bb
(svn r185) -Fix: [1016954] Cached_sprites does now work again
truelight
parents:
182
diff
changeset
|
358 |
|
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
359 |
for (s = _spritecache_ptr; s->size != 0;) { |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
360 |
if (s->size & S_FREE_MASK) { |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
361 |
MemBlock* next = NextBlock(s); |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
362 |
MemBlock temp; |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
363 |
SpriteID i; |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
364 |
|
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
365 |
/* Since free blocks are automatically coalesced, this should hold true. */ |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
366 |
assert(!(next->size & S_FREE_MASK)); |
184
dbeaaaf8b2bb
(svn r185) -Fix: [1016954] Cached_sprites does now work again
truelight
parents:
182
diff
changeset
|
367 |
|
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
368 |
/* If the next block is the sentinel block, we can safely return */ |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
369 |
if (next->size == 0) |
0 | 370 |
break; |
371 |
||
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
372 |
/* Locate the sprite belonging to the next pointer. */ |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
373 |
for (i = 0; GetSpriteCache(i)->ptr != next->data; i++) { |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
374 |
assert(i != _spritecache_items); |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
375 |
} |
0 | 376 |
|
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
377 |
GetSpriteCache(i)->ptr = s->data; // Adjust sprite array entry |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
378 |
/* Swap this and the next block */ |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
379 |
temp = *s; |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
380 |
memmove(s, next, next->size); |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
381 |
s = NextBlock(s); |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
382 |
*s = temp; |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
383 |
|
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
384 |
/* Coalesce free blocks */ |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
385 |
while (NextBlock(s)->size & S_FREE_MASK) { |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
386 |
s->size += NextBlock(s)->size & ~S_FREE_MASK; |
0 | 387 |
} |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
388 |
} else { |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
389 |
s = NextBlock(s); |
0 | 390 |
} |
391 |
} |
|
392 |
} |
|
393 |
||
6573 | 394 |
static void DeleteEntryFromSpriteCache() |
0 | 395 |
{ |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
396 |
SpriteID i; |
5838
9c3129cb019b
(svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents:
5835
diff
changeset
|
397 |
uint best = UINT_MAX; |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
398 |
MemBlock* s; |
0 | 399 |
int cur_lru; |
400 |
||
5568
75f13d7bfaed
(svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents:
5150
diff
changeset
|
401 |
DEBUG(sprite, 3, "DeleteEntryFromSpriteCache, inuse=%d", GetSpriteCacheUsage()); |
0 | 402 |
|
403 |
cur_lru = 0xffff; |
|
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
404 |
for (i = 0; i != _spritecache_items; i++) { |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
405 |
SpriteCache *sc = GetSpriteCache(i); |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
406 |
if (sc->ptr != NULL && sc->lru < cur_lru) { |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
407 |
cur_lru = sc->lru; |
0 | 408 |
best = i; |
409 |
} |
|
410 |
} |
|
411 |
||
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
412 |
/* Display an error message and die, in case we found no sprite at all. |
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
413 |
* This shouldn't really happen, unless all sprites are locked. */ |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
414 |
if (best == (uint)-1) |
0 | 415 |
error("Out of sprite memory"); |
416 |
||
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
417 |
/* Mark the block as free (the block must be in use) */ |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
418 |
s = (MemBlock*)GetSpriteCache(best)->ptr - 1; |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
419 |
assert(!(s->size & S_FREE_MASK)); |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
420 |
s->size |= S_FREE_MASK; |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
421 |
GetSpriteCache(best)->ptr = NULL; |
0 | 422 |
|
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
423 |
/* And coalesce adjacent free blocks */ |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
424 |
for (s = _spritecache_ptr; s->size != 0; s = NextBlock(s)) { |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
425 |
if (s->size & S_FREE_MASK) { |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
426 |
while (NextBlock(s)->size & S_FREE_MASK) { |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
427 |
s->size += NextBlock(s)->size & ~S_FREE_MASK; |
0 | 428 |
} |
429 |
} |
|
430 |
} |
|
431 |
} |
|
432 |
||
7348
becce3f57dc7
(svn r10092) -Codechange: code-seperated the spriteloader and blitter from the rest of the code
truelight
parents:
7299
diff
changeset
|
433 |
void* AllocSprite(size_t mem_req) |
0 | 434 |
{ |
2014
0230ed9186bc
(svn r2522) Reorganize sprite load and decompression in order to remove a special case from the sprite blitter, which decompressed certain sprites every time when blitting them
tron
parents:
1891
diff
changeset
|
435 |
mem_req += sizeof(MemBlock); |
0 | 436 |
|
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
437 |
/* Align this to an uint32 boundary. This also makes sure that the 2 least |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
438 |
* bits are not used, so we could use those for other things. */ |
8423
8453e9a0f0b5
(svn r11480) -Codechange: Rename the function ALIGN fitting to the naming style
skidd13
parents:
8072
diff
changeset
|
439 |
mem_req = Align(mem_req, sizeof(uint32)); |
0 | 440 |
|
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
441 |
for (;;) { |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
442 |
MemBlock* s; |
0 | 443 |
|
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
444 |
for (s = _spritecache_ptr; s->size != 0; s = NextBlock(s)) { |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
445 |
if (s->size & S_FREE_MASK) { |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
446 |
size_t cur_size = s->size & ~S_FREE_MASK; |
0 | 447 |
|
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
448 |
/* Is the block exactly the size we need or |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
449 |
* big enough for an additional free block? */ |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
450 |
if (cur_size == mem_req || |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
451 |
cur_size >= mem_req + sizeof(MemBlock)) { |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
452 |
/* Set size and in use */ |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
453 |
s->size = mem_req; |
184
dbeaaaf8b2bb
(svn r185) -Fix: [1016954] Cached_sprites does now work again
truelight
parents:
182
diff
changeset
|
454 |
|
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
455 |
/* Do we need to inject a free block too? */ |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
456 |
if (cur_size != mem_req) { |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
457 |
NextBlock(s)->size = (cur_size - mem_req) | S_FREE_MASK; |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
458 |
} |
0 | 459 |
|
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
460 |
return s->data; |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
461 |
} |
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
462 |
} |
0 | 463 |
} |
464 |
||
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
465 |
/* Reached sentinel, but no block found yet. Delete some old entry. */ |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
466 |
DeleteEntryFromSpriteCache(); |
0 | 467 |
} |
468 |
} |
|
469 |
||
470 |
||
7365
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
471 |
const void *GetRawSprite(SpriteID sprite, bool real_sprite) |
0 | 472 |
{ |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
473 |
SpriteCache *sc; |
2014
0230ed9186bc
(svn r2522) Reorganize sprite load and decompression in order to remove a special case from the sprite blitter, which decompressed certain sprites every time when blitting them
tron
parents:
1891
diff
changeset
|
474 |
void* p; |
0 | 475 |
|
5953
7000c5bdd70b
(svn r8166) -Fix (r7797): Protect against out of bounds access to the sprite ptr
peter1138
parents:
5860
diff
changeset
|
476 |
assert(sprite < _spritecache_items); |
0 | 477 |
|
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
478 |
sc = GetSpriteCache(sprite); |
0 | 479 |
|
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
480 |
/* Update LRU */ |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
481 |
sc->lru = ++_sprite_lru_counter; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
482 |
|
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
483 |
p = sc->ptr; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
484 |
|
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
485 |
/* Load the sprite, if it is not loaded, yet */ |
7365
d484a635f91d
(svn r10109) -Fix [FS#838]: some NewGRFs use the same (unused in the "current" climate) sprite IDs. Normally this gives some artefacts, but when one NewGRF expects it to be a sprite and another NewGRF overwrites it with a non-sprite nasty things happen (drawing a non-sprite crashes OTTD).
rubidium
parents:
7361
diff
changeset
|
486 |
if (p == NULL) p = ReadSprite(sc, sprite, real_sprite); |
184
dbeaaaf8b2bb
(svn r185) -Fix: [1016954] Cached_sprites does now work again
truelight
parents:
182
diff
changeset
|
487 |
return p; |
0 | 488 |
} |
489 |
||
961 | 490 |
|
6573 | 491 |
void GfxInitSpriteMem() |
0 | 492 |
{ |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
493 |
/* initialize sprite cache heap */ |
7299
74e163f03bbc
(svn r10042) -Codechange: Replace hardcoded spritecache size with a configuration
peter1138
parents:
7295
diff
changeset
|
494 |
if (_spritecache_ptr == NULL) _spritecache_ptr = (MemBlock*)malloc(_sprite_cache_size * 1024 * 1024); |
0 | 495 |
|
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
496 |
/* A big free block */ |
7299
74e163f03bbc
(svn r10042) -Codechange: Replace hardcoded spritecache size with a configuration
peter1138
parents:
7295
diff
changeset
|
497 |
_spritecache_ptr->size = ((_sprite_cache_size * 1024 * 1024) - sizeof(MemBlock)) | S_FREE_MASK; |
6916
e87d54a598ea
(svn r9556) -Documentation: doxygen and comment-style changes. 'R', 'S'.. The end of the preliminary work is near
belugas
parents:
6574
diff
changeset
|
498 |
/* Sentinel block (identified by size == 0) */ |
1353
48b59d472641
(svn r1857) Rewrite parts of the sprite heap. It's functionally equivalent but should be easier to read and maintain.
tron
parents:
1352
diff
changeset
|
499 |
NextBlock(_spritecache_ptr)->size = 0; |
0 | 500 |
|
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
501 |
/* Reset the spritecache 'pool' */ |
7585
9c658c22b0ec
(svn r10356) -Fix (r10143): another memory leak eliminated.
rubidium
parents:
7433
diff
changeset
|
502 |
for (uint i = 0; i < _spritecache_items; i++) free((char *)_spritecache[i].grf_name); |
5755
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
503 |
free(_spritecache); |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
504 |
_spritecache_items = 0; |
5db1cb757991
(svn r7797) -Codechange: Replace static _sprite_ptr and associated arrays with dynamic array to allow variable number of sprites. This does not change the sprite limit.
peter1138
parents:
5752
diff
changeset
|
505 |
_spritecache = NULL; |
0 | 506 |
|
2340
0a9f3eeccb96
(svn r2866) Move all functions and tables which aren't directly involved in managing the sprite heap to a new file gfxinit.c.
tron
parents:
2339
diff
changeset
|
507 |
_compact_cache_counter = 0; |
0 | 508 |
} |