#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, ¶ms.matrix);
lab_pango_renderer_set_color((LabPangoRenderer*)renderer, ¶ms.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();
}
}