Blob Blame Raw

#include <algorithm>
#include <iostream>

#include <glibmm.h>

#include "labpangorenderer.h"

#include "surface.h"
#include "log.h"

#include "freetypeview.h"


FreeTypeView::FreeTypeView() {
	params.family = "Ani";
	params.bold = false;
	params.italic = false;
	params.size = 12;

	params.matrix = Matrix().translation(Vector2(15.5, 18.4));
	params.color = Color(1, 1, 0, 1);

	params.text = "Hello World! 123456";
	
	Glib::signal_timeout().connect(
		sigc::mem_fun(*this, &FreeTypeView::on_timeout),
		20,
		Glib::PRIORITY_DEFAULT_IDLE );
}

FreeTypeView::~FreeTypeView()
	{ }

bool
FreeTypeView::on_timeout() {
	if (!is_visible()) return false;
	params.matrix.m20 += 0.01;
	update_surface();
	return true;
}
	
void
FreeTypeView::update_surface() {
	this->surface.clear();
	const int width = get_allocated_width();
	const int height = get_allocated_height();
	if (width <= 0 || height <= 0)
		return;
	
	Matrix matrix = params.matrix;
	Real det2 = matrix.m00*matrix.m11 - matrix.m01*matrix.m10;
	if (det2 <= real_precision_sqr)
		return;
	Real scale = sqrt(det2);
	matrix.row_x() /= scale;
	matrix.row_y() /= scale;
	Real size = params.size*scale;
	
	// init
	PangoFontMap *font_map = lab_pango_font_map_new(params.hinting);
	PangoContext *context = pango_font_map_create_context(font_map);
	
	// load font
	PangoFontDescription *font_desc = pango_font_description_new();
	pango_font_description_set_family(font_desc, params.family.c_str());
	pango_font_description_set_weight(font_desc, params.bold ? PANGO_WEIGHT_BOLD : PANGO_WEIGHT_NORMAL);
	pango_font_description_set_style(font_desc, params.italic ? PANGO_STYLE_ITALIC : PANGO_STYLE_NORMAL);
	pango_font_description_set_absolute_size(font_desc, size * PANGO_SCALE);
	
	PangoFont *font = pango_context_load_font(context, font_desc);
	
	// create layout
	PangoLayout *layout = pango_layout_new(context);
	pango_layout_set_font_description(layout, font_desc);
	pango_layout_set_text(layout, params.text.c_str(), (int)params.text.size());
	
	// reneder
	DataSurface surface(width, height);
	PangoRenderer *renderer = lab_pango_renderer_new();
	lab_pango_renderer_set_surface((LabPangoRenderer*)renderer, &surface);
	lab_pango_renderer_set_matrix((LabPangoRenderer*)renderer, &params.matrix);
	lab_pango_renderer_set_color((LabPangoRenderer*)renderer, &params.color);
	pango_renderer_draw_layout(renderer, layout, 0, 0);
	
	// free pango
	g_object_unref(renderer);
	pango_font_description_free(font_desc);
	g_object_unref(layout);
	g_object_unref(font);
	g_object_unref(context);
	g_object_unref(font_map);
	
	this->surface = surface.to_cairo_surface(true);
	
	queue_draw();
}

void
FreeTypeView::on_draw_view(const Cairo::RefPtr<Cairo::Context> &context) {
	if (surface) {
		context->save();
		context->transform(transform_from_pixels().to_cairo());
		context->set_source(surface, 0, 0);
		context->paint();
		context->restore();
	}
}