Blob Blame Raw
#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