--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/colors.cpp Wed Jan 22 00:23:29 2020 +0200 @@ -0,0 +1,84 @@ +/* + * LDForge: LDraw parts authoring CAD + * Copyright (C) 2013 - 2020 Teemu Piippo + * + * 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 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 <http://www.gnu.org/licenses/>. + */ + +#include "colors.h" + +const ColorTable::ColorDefinition ColorTable::unknownColor{{}, {}, "Unknown"}; + +void ColorTable::clear() +{ + definitions = {}; +} + +Result ColorTable::load(QIODevice& device, QTextStream& errors) +{ + this->clear(); + if (device.isReadable()) + { + QTextStream stream{&device}; + QString line; + while (stream.readLineInto(&line)) + { + this->loadColorFromString(line); + } + return Success; + } + else + { + errors << "could not read colors"; + return Failure; + } +} + +const ColorTable::ColorDefinition& ColorTable::operator[](Color color) const +{ + auto it = this->definitions.find(color.index); + if (it != this->definitions.end()) + { + return *it; + } + else + { + return unknownColor; + } +} + +void ColorTable::loadColorFromString(const QString& string) +{ + const QRegExp pattern{ + R"(^\s*0 \!COLOUR\s+([^\s]+)\s+)"_q + + R"(CODE\s+(\d+)\s+)"_q + + R"(VALUE\s+(\#[0-9a-fA-F]{3,6})\s+)"_q + + R"(EDGE\s+(\#[0-9a-fA-F]{3,6}))"_q + + R"((?:\s+ALPHA\s+(\d+))?)"_q + }; + if (pattern.indexIn(string) != -1) + { + const int code = pattern.cap(2).toInt(); + ColorDefinition& definition = definitions[code]; + definition = {}; // in case there's an existing definition + definition.name = pattern.cap(1); + definition.faceColor = pattern.cap(3); + definition.edgeColor = pattern.cap(4); + if (not pattern.cap(5).isEmpty()) + { + const int alpha = pattern.cap(5).toInt(); + definition.faceColor.setAlpha(alpha); + } + } +}