--- deliantra/server/common/image.C 2007/07/01 05:00:17 1.26
+++ deliantra/server/common/image.C 2012/11/11 05:53:11 1.43
@@ -1,24 +1,23 @@
/*
- * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
- *
- * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
- * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
- * Copyright (©) 1992,2007 Frank Tore Johansen
- *
- * Crossfire TRT is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
+ * This file is part of Deliantra, the Roguelike Realtime MMORPG.
+ *
+ * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team
+ *
+ * Deliantra is free software: you can redistribute it and/or modify it under
+ * the terms of the Affero GNU General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
+ *
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- *
- * The authors can be reached via e-mail to
+ *
+ * You should have received a copy of the Affero GNU General Public License
+ * and the GNU General Public License along with this program. If not, see
+ * .
+ *
+ * The authors can be reached via e-mail to
*/
#include
@@ -27,49 +26,43 @@
#include "face.h"
#include "crc.h"
-faceidx blank_face, empty_face;
+faceidx blank_face, empty_face, magicmouth_face;
facehash_t facehash;
std::vector faces;
-/* the only thing this table is used for now is to
- * translate the colorname in the magicmap field of the
- * face into a numeric index that is then sent to the
- * client for magic map commands. The order of this table
- * must match that of the NDI colors in include/newclient.h.
- */
-static const char *const colorname[] = {
- "black", /* 0 */
- "white", /* 1 */
- "blue", /* 2 */
- "red", /* 3 */
- "orange", /* 4 */
- "light_blue", /* 5 */
- "dark_orange", /* 6 */
- "green", /* 7 */
- "light_green", /* 8 */
- "grey", /* 9 */
- "brown", /* 10 */
- "yellow", /* 11 */
- "khaki" /* 12 */
-};
+static std::vector faces_freelist;
-/*
- * Returns the matching color in the coloralias if found,
- * 0 otherwise. Note that 0 will actually be black, so there is no
- * way the calling function can tell if an error occurred or not
- */
-static uint8
-find_color (const char *name)
+faceidx face_alloc ()
{
- uint8 i;
+ faceidx idx;
- for (i = 0; i < sizeof (colorname) / sizeof (*colorname); i++)
- if (!strcmp (name, colorname[i]))
- return i;
+ if (!faces_freelist.empty ())
+ {
+ idx = faces_freelist.back ();
+ faces_freelist.pop_back ();
+ }
+ else
+ {
+ idx = faces.size ();
+
+ if (!idx) // skip index 0
+ idx = 1;
+
+ faces.resize (idx + 1);
+ }
+
+ return idx;
+}
+
+void
+faceinfo::unref ()
+{
+ if (--refcnt)
+ return;
+
+ refcnt = 1;
- LOG (llevError, "Unknown color: %s\n", name);
- return 0;
}
faceidx
@@ -96,10 +89,19 @@
}
facedata *
+faceinfo::data (int faceset) const
+{
+ if (!face [faceset].chksum_len)
+ faceset = 0;
+
+ return (facedata *)(face + faceset);
+}
+
+facedata *
face_data (faceidx idx, int faceset)
{
if (faceinfo *f = face_info (idx))
- return &(faceset && !f->type ? f->data64 : f->data32);
+ return f->data (faceset);
return 0;
}