#ifndef LAYOUT_H
#define LAYOUT_H
#include <vector>
#include <pangomm.h>
#include "vector.h"
#include "matrix.h"
class Layout: public Shared {
public:
class Glyph {
public:
Vector2 position;
Vector2 origin;
Pair2 bounds;
Pango::Glyph glyph_index;
};
typedef std::vector<Glyph> GlyphList;
class Run {
public:
Glib::RefPtr<Pango::Font> font;
GlyphList glyphs;
};
typedef std::vector<Run> RunList;
class Line {
public:
Vector2 position;
Pair2 bounds;
Pair2 logical_bounds;
RunList runs;
};
typedef std::vector<Line> LineList;
private:
bool hinting;
bool antialiasing;
Pair2 bounds;
Pair2 logical_bounds;
LineList lines;
Layout(const Layout&) = delete;
Layout& operator=(const Layout&) = delete;
public:
explicit Layout(const Glib::RefPtr<Pango::Layout> &layout);
bool get_hinting() const
{ return hinting; }
bool get_antialiasing() const
{ return antialiasing; }
const Pair2& get_bounds() const
{ return bounds; }
const Pair2& get_logical_bounds() const
{ return logical_bounds; }
const LineList& get_lines()
{ return lines; }
static Glib::RefPtr<Pango::FontMap> create_fontmap(bool hinting, bool antialiasing);
static Glib::RefPtr<Pango::Font> load_font_file(
const Glib::RefPtr<Pango::Context> &context,
const std::string &filename,
const Pango::FontDescription &font_desc );
};
class TransformedLayout: public Shared {
public:
typedef std::vector<Pair2> LineBoundsList;
private:
RefPtr<Layout> layout;
Matrix2 spacing_matrix;
Matrix2 glyph_matrix;
Pair2 bounds;
LineBoundsList line_bounds;
public:
TransformedLayout(
const RefPtr<Layout> &layout,
const Matrix2 &spacing_matrix,
const Matrix2 &glyph_matrix );
const RefPtr<Layout>& get_layout() const
{ return layout; }
const Matrix2& get_spacing_matrix() const
{ return spacing_matrix; }
const Matrix2& get_glyph_matrix() const
{ return glyph_matrix; }
const Pair2& get_bounds() const
{ return bounds; }
const LineBoundsList& get_line_bounds() const
{ return line_bounds; }
};
#endif