In next few commits AbstractFont will become plugin interface. Font
implementations are now in magnum-plugins repository. Removed all traces
of FreeType and HarfBuzz dependencies.
Makes it easier to disable parts of the code than with this. And this
would also not be future-proof:
defined(MAGNUM_TARGET_GLES) && !defined(MAGNUM_TARGET_GLES2)
Each implementation of *Application::Configuration will have different
methods tailored to feature set of the underlying toolkit. Currently
each windowed application's Configuration has only window title (except
NaClApplication) and window size. WindowlessGlxApplication has empty
class. More features will come later. Also created introductionary
documentation for Platform namespace.
If only one *Application or Windowless*Application header is included,
the class is aliased to Application or WindowlessApplication to simplify
porting.
DualQuaternion and DualComplex has now only rotation() which returns
full rotation part, rotationAngle() and rotationAxis() on Quaternion and
Complex were renamed to angle() and axis().
It seems like a bad idea, but it will:
* Improve portability, as `Int` will be always 32bit.
* Improve readability, as `std::int32_t` is just plain ugly and too
complicated to write.
* Improve consistency and reduce confusion, as it's not good to mix
`int`, `std::int32_t`, `GLint`, `khronos_int_t` and whatnot in one
codebase.
* Possibly reduce compilation time, because including all ~35k lines
worth of GL headers just for one GLfloat typedef is even worse than
now forbidden #include <iostream> in headers.
Also updated all dependent classes to follow the change, such as Color
and Rectangle. Backwards compatibility for GCC 4.6 (with lack of support
for delegating constructors) will be done as non-constexpr constructor
using operator=().
Overall architecture is simplififed with this change and also it's not
needed to use reinterpret_cast in matrix internals anymore, thus there
is no need for operator() and [][] works now always as expected without
any risk of GCC misoptimizations.
On the other side, constructing matrix from list of elements is not
possible anymore. You have to specify the elements as list of
column vectors, which might be less convenient to write, but it helps to
distinguish what is column and what is row:
Matrix<2, int> a(1, 2, // before
3, 4);
Matrix<2, int> a(Vector<2, int>(1, 2), // now
Vector<2, int>(3, 4));
For some matrix specializations (i.e. Matrix3 and Matrix4) it is
possible to use list-initialization instead of explicit type
specification:
Matrix<3, int>({1, 2, 3},
{4, 5, 6},
{7, 8, 9});
I didn't yet figure out how to properly implement the general
(constexpr) constructor to also take lists, so it's a bit ugly for now.
Matrix operations are now done column-wise, which should help with
future SIMD implementations, documentation is also updated accordingly.
I also removed forgotten remains of matrix/matrix operator*=(), which
can be confusing, as the multiplication is not commutative. Why it is
not present is explained in d9c900f076.
The library uses FreeType for glyph pre-rendering and basic glyph
geometry and HarfBuzz for text layouting (i.e. ligatures, kerning, ...).
Currently all used glyphs must be prerendered into texture atlas, other
glyphs are simply not rendered (although the layouting code handles them
like if they are there).
Text rendering supports UTF-8, although glyph pre-rendering is currently
ASCII only, as I couldn't find any working implementation of Unicode
STL function in recent GCC versions. Will be fixed later.