/
colorbank.cpp
98 lines (81 loc) · 2.91 KB
/
colorbank.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/** @file colorbank.cpp Bank of colors.
*
* @authors Copyright (c) 2013 Jaakko Keränen <jaakko.keranen@iki.fi>
*
* @par License
* GPL: http://www.gnu.org/licenses/gpl.html
*
* <small>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 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</small>
*/
#include "de/ColorBank"
#include <de/ArrayValue>
namespace de {
DENG2_PIMPL(ColorBank)
{
struct ColorSource : public ISource
{
ColorBank &bank;
String id;
ColorSource(ColorBank &b, String const &colorId) : bank(b), id(colorId) {}
Time modifiedAt() const { return bank.sourceModifiedAt(); }
Vector4d load() const
{
ArrayValue const &colorDef = bank[id].value<ArrayValue>();
// Alpha component is optional.
ddouble alpha = 1.0;
if(colorDef.size() >= 4)
{
alpha = colorDef.at(3).asNumber();
}
return Vector4d(colorDef.at(0).asNumber(),
colorDef.at(1).asNumber(),
colorDef.at(2).asNumber(),
alpha);
}
};
struct ColorData : public IData
{
Vector4d color;
ColorData(Vector4d const &c = Vector4d()) : color(c) {}
duint sizeInMemory() const { return 0; /* we don't count */ }
};
Instance(Public *i) : Base(i)
{}
};
ColorBank::ColorBank() : InfoBank(DisableHotStorage), d(new Instance(this))
{}
void ColorBank::addFromInfo(File const &file)
{
LOG_AS("ColorBank");
parse(file);
InfoBank::addFromInfo("color");
}
ColorBank::Color ColorBank::color(Path const &path) const
{
Colorf col = colorf(path);
return Color(dbyte(col.x * 255 + .5f), dbyte(col.y * 255 + .5f),
dbyte(col.z * 255 + .5f), dbyte(col.w * 255 + .5f));
}
ColorBank::Colorf ColorBank::colorf(Path const &path) const
{
Vector4d clamped = static_cast<Instance::ColorData &>(data(path)).color;
clamped = clamped.max(Vector4d(0, 0, 0, 0)).min(Vector4d(1, 1, 1, 1));
return Colorf(float(clamped.x), float(clamped.y), float(clamped.z), float(clamped.w));
}
Bank::ISource *ColorBank::newSourceFromInfo(String const &id)
{
return new Instance::ColorSource(*this, id);
}
Bank::IData *ColorBank::loadFromSource(ISource &source)
{
return new Instance::ColorData(static_cast<Instance::ColorSource &>(source).load());
}
} // namespace de