--- deliantra/server/common/image.C 2007/07/01 05:00:17 1.26 +++ deliantra/server/common/image.C 2012/01/03 11:25:30 1.39 @@ -1,24 +1,23 @@ /* - * This file is part of Crossfire TRT, the Roguelike Realtime MORPG. + * This file is part of Deliantra, the Roguelike Realtime MMORPG. * - * 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 + * Copyright (©) 2005,2006,2007,2008,2009,2010,2011,2012 Marc Alexander Lehmann / Robin Redeker / the Deliantra team * - * 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. + * 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 . + * 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 + * The authors can be reached via e-mail to */ #include @@ -27,49 +26,42 @@ #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_free; -/* - * 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_free.back (); + faces_free.pop_back (); + } + else + { + idx = faces.size (); + + if (!idx) // skip index 0 + idx = 1; + + faces.resize (idx + 1); + } + + return idx; +} + +faceinfo::unref () +{ + if (--refcnt) + return; + + refcnt = 1; - LOG (llevError, "Unknown color: %s\n", name); - return 0; } faceidx @@ -96,10 +88,19 @@ } facedata * +faceinfo::data (int faceset) const +{ + if (!face [faceset].data.size ()) + 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; }