diff options
author | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2009-03-27 13:25:04 +0100 |
---|---|---|
committer | Bjørn Lindeijer <bjorn@lindeijer.nl> | 2009-03-27 13:25:24 +0100 |
commit | dd05447445dc1766e532130318af2cb6bb72a994 (patch) | |
tree | c8b2cbac64ccf9545a39c143088b57fe2cb8e678 /src/resources/dye.cpp | |
parent | 05e753294c1a603252d2eed4b1731c3f50543a7e (diff) | |
parent | 2aab736bc5d77ffda789d7de56cef100fac207e1 (diff) | |
download | mana-dd05447445dc1766e532130318af2cb6bb72a994.tar.gz mana-dd05447445dc1766e532130318af2cb6bb72a994.tar.bz2 mana-dd05447445dc1766e532130318af2cb6bb72a994.tar.xz mana-dd05447445dc1766e532130318af2cb6bb72a994.zip |
Merge branch 'aethyra/master'
Conflicts:
src/beingmanager.cpp
src/gui/confirm_dialog.cpp
src/gui/inventorywindow.cpp
src/gui/inventorywindow.h
src/gui/label.cpp
src/gui/label.h
src/gui/popup.cpp
src/gui/popup.h
src/gui/scrollarea.cpp
src/gui/skin.cpp
src/gui/skin.h
src/gui/speechbubble.cpp
src/gui/window.cpp
src/gui/window.h
src/localplayer.h
src/main.cpp
src/net/ea/playerhandler.cpp
src/resources/ambientoverlay.h
src/resources/dye.cpp
src/resources/imagewriter.cpp
src/resources/itemdb.cpp
src/shopitem.cpp
Diffstat (limited to 'src/resources/dye.cpp')
-rw-r--r-- | src/resources/dye.cpp | 37 |
1 files changed, 29 insertions, 8 deletions
diff --git a/src/resources/dye.cpp b/src/resources/dye.cpp index 7ba6689f..aa4d6835 100644 --- a/src/resources/dye.cpp +++ b/src/resources/dye.cpp @@ -39,23 +39,35 @@ DyePalette::DyePalette(const std::string &description) int pos = 1; for (;;) { - if (pos + 6 > size) break; + if (pos + 6 > size) + break; + int v = 0; for (int i = 0; i < 6; ++i) { char c = description[pos + i]; int n; - if ('0' <= c && c <= '9') n = c - '0'; - else if ('A' <= c && c <= 'F') n = c - 'A' + 10; - else if ('a' <= c && c <= 'f') n = c - 'a' + 10; - else goto error; + + if ('0' <= c && c <= '9') + n = c - '0'; + else if ('A' <= c && c <= 'F') + n = c - 'A' + 10; + else if ('a' <= c && c <= 'f') + n = c - 'a' + 10; + else + goto error; + v = (v << 4) | n; } Color c = { { v >> 16, v >> 8, v } }; mColors.push_back(c); pos += 6; - if (pos == size) return; - if (description[pos] != ',') break; + + if (pos == size) + return; + if (description[pos] != ',') + break; + ++pos; } @@ -122,14 +134,18 @@ Dye::Dye(const std::string &description) { std::string::size_type pos = next_pos; next_pos = description.find(';', pos); + if (next_pos == std::string::npos) next_pos = length; + if (next_pos <= pos + 3 || description[pos + 1] != ':') { logger->log("Error, invalid dye: %s", description.c_str()); return; } + int i = 0; + switch (description[pos]) { case 'R': i = 0; break; @@ -143,7 +159,8 @@ Dye::Dye(const std::string &description) logger->log("Error, invalid dye: %s", description.c_str()); return; } - mDyePalettes[i] = new DyePalette(description.substr(pos + 2, next_pos - pos - 2)); + mDyePalettes[i] = new DyePalette(description.substr(pos + 2, + next_pos - pos - 2)); ++next_pos; } while (next_pos < length); @@ -180,8 +197,10 @@ void Dye::update(int color[3]) const void Dye::instantiate(std::string &target, const std::string &palettes) { std::string::size_type next_pos = target.find('|'); + if (next_pos == std::string::npos || palettes.empty()) return; + ++next_pos; std::ostringstream s; @@ -191,8 +210,10 @@ void Dye::instantiate(std::string &target, const std::string &palettes) { std::string::size_type pos = next_pos; next_pos = target.find(';', pos); + if (next_pos == std::string::npos) next_pos = last_pos; + if (next_pos == pos + 1 && pal_pos != std::string::npos) { std::string::size_type pal_next_pos = palettes.find(';', pal_pos); |