-/* $Id$
-
-This file is part of libmspgltk
-Copyright © 2007 Mikko Rasa, Mikkosoft Productions
-Distributed under the LGPL
-*/
-
+#include <msp/core/algorithm.h>
#include "resources.h"
#include "style.h"
namespace Msp {
namespace GLtk {
-Style::Style(Resources &r):
- font(&r.get_default_font())
-{ }
+const GL::Font &Style::get_font() const
+{
+ if(!font)
+ throw logic_error("!font");
+ return *font;
+}
+
+const GL::Color &Style::get_font_color(State s) const
+{
+ if(s>=N_STATES_)
+ throw invalid_argument("Style::get_font_color");
+
+ return font_color[s];
+}
+
+const GL::Sampler &Style::get_sampler() const
+{
+ if(!sampler)
+ throw logic_error("!sampler");
+ return *sampler;
+}
+
+const Part *Style::find_part(const string &name) const
+{
+ auto i = find_if(parts, [&name](const Part &p){ return p.get_name()==name; });
+ return (i!=parts.end() ? &*i : nullptr);
+}
+
+bool Style::compare_states(State s1, State s2) const
+{
+ if(s1>=N_STATES_ || s2>=N_STATES_)
+ throw invalid_argument("Style::compare_states");
+
+ const GL::Color &c1 = font_color[s1];
+ const GL::Color &c2 = font_color[s2];
+ if(c1.r!=c2.r || c1.g!=c2.g || c1.b!=c2.b)
+ return true;
+
+ for(const Part &p: parts)
+ if(p.get_graphic(s1)!=p.get_graphic(s2))
+ return true;
+
+ return false;
+}
Style::Loader::Loader(Style &s, Resources &r):
- style(s),
- res(r)
+ DataFile::CollectionObjectLoader<Style, Resources>(s, &r)
{
- add("font", &Style::font);
+ if(!obj.font)
+ {
+ obj.font = &get_collection().get_default_font();
+ obj.font_size = obj.font->get_native_size();
+ }
+ if(!obj.sampler)
+ obj.sampler = &get_collection().get<GL::Sampler>("linear_clamp.samp");
+
+ add("font", &Loader::font);
+ add("font_color", &Loader::font_color_normal);
add("font_color", &Loader::font_color);
+ add("font_size", &Style::font_size);
add("part", &Loader::part);
- add("special", &Loader::special);
+ add("part", &Loader::unnamed_part);
+ add("sampler", &Style::sampler);
}
-void Style::Loader::font_color(float r, float g, float b)
+void Style::Loader::font(const string &n)
{
- style.font_color=GL::Color(r, g, b);
+ obj.font = &get_collection().get<GL::Font>(n);
+ obj.font_size = obj.font->get_native_size();
}
-void Style::Loader::part()
+void Style::Loader::font_color_normal(float r, float g, float b)
{
- Part p((string()));
- load_sub(p, res);
- style.parts.push_back(p);
+ font_color(NORMAL, r, g, b);
}
-void Style::Loader::special(const string &n)
+void Style::Loader::font_color(State s, float r, float g, float b)
+{
+ for(unsigned i=0; i<N_STATES_; ++i)
+ if((i&s)==s)
+ obj.font_color[i] = GL::Color(r, g, b);
+}
+
+void Style::Loader::part(const string &n)
{
Part p(n);
- load_sub(p, res);
- style.parts.push_back(p);
+ load_sub(p, get_collection());
+ obj.parts.push_back(p);
+}
+
+void Style::Loader::unnamed_part()
+{
+ part(string());
}
} // namespace GLtk