|
-
- #include <cstring>
- #include <cstdio>
- #include <stdlib.h>
-
- #include "tiler.h"
- #include "tileset.h"
-
- /*
- * Tiler implementation class
- */
-
- static class TilerData
- {
- friend class Tiler;
-
- public:
- TilerData() :
- tilesets(0),
- ntilesets(0)
- {
- /* Nothing to do */
- }
-
- ~TilerData()
- {
- free(tilesets);
- }
-
- private:
- TileSet **tilesets;
- int ntilesets;
- }
- tilerdata;
-
- static TilerData * const data = &tilerdata;
-
- /*
- * Public Tiler class
- */
-
- int Tiler::Register(char const *path)
- {
- int id, empty = -1;
-
- /* If the tileset is already registered, remember its ID. Look for an
- * empty slot at the same time. */
- for (id = 0; id < data->ntilesets; id++)
- {
- TileSet *t = data->tilesets[id];
- if (!t)
- empty = id;
- else if (!strcasecmp(path, t->GetName()))
- break;
- }
-
- /* If this is a new tileset, create a new one. */
- if (id == data->ntilesets)
- {
- if (empty == -1)
- {
- empty = data->ntilesets++;
- data->tilesets = (TileSet **)realloc(data->tilesets,
- data->ntilesets * sizeof(TileSet *));
- }
-
- data->tilesets[empty] = new TileSet(path);
- id = empty;
- }
-
- data->tilesets[id]->Ref();
- return id + 1; /* ID 0 is for the empty tileset */
- }
-
- void Tiler::Deregister(int id)
- {
- --id; /* ID 0 is for the empty tileset */
-
- if (data->tilesets[id]->Unref() == 0)
- {
- delete data->tilesets[id];
- data->tilesets[id] = NULL;
- }
- }
-
- void Tiler::Render(uint32_t code, int x, int y)
- {
- int id = (code >> 16) - 1; /* ID 0 is for the empty tileset */
-
- data->tilesets[id]->BlitTile(code & 0xffff, x, y);
- }
|