--- deliantra/server/common/image.C 2007/04/12 14:18:04 1.23 +++ deliantra/server/common/image.C 2012/10/29 23:55:52 1.41 @@ -1,25 +1,23 @@ /* - * CrossFire, A Multiplayer game - * - * Copyright (C) 2005, 2006, 2007 Marc Lehmann & Crossfire+ Development Team - * Copyright (C) 2002 Mark Wedel & Crossfire Development Team - * Copyright (C) 1992 Frank Tore Johansen - * - * This program 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 2 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 + * 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, write to the Free Software - * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * - * The maintainer of this code can be reached at + * 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 @@ -28,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 @@ -97,10 +89,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->data32 : f->data64); + return f->data (faceset); return 0; }