Ptr<ISubtitlesItem> CPangoCairoRenderer::render(Ptr<ISubtitlesItem> i_item) { Ptr<CSubtitlesTextItem> text = i_item; if (text.isNull() || i_item->getType() != SUBTITLES_TYPE_TEXT) { return Ptr<ISubtitlesItem>(); } Ptr<CCairoSurface> surface = new CCairoSurface(m_displaySize.Height, m_displaySize.Width, SURFACE_FORMAT_ARGB32); cairo_t * cairo = cairo_create(surface->getSurface()); cairo_set_source_rgba(cairo, 0.0, 0.0, 0.0, 0.0); cairo_paint(cairo); PangoLayout * layout = pango_cairo_create_layout(cairo); pango_layout_set_width(layout, m_displaySize.Width*PANGO_SCALE); pango_layout_set_wrap(layout, PANGO_WRAP_WORD); pango_layout_set_alignment(layout, PANGO_ALIGN_CENTER); pango_layout_set_text(layout, text->getText().c_str(), -1); PangoFontDescription * font = pango_font_description_from_string(m_font.c_str()); pango_layout_set_font_description(layout, font); pango_font_description_free(font); cairo_set_source_rgb(cairo, 1.0, 1.0, 1.0); pango_cairo_update_layout(cairo, layout); pango_cairo_show_layout(cairo, layout); CValue<CRectangle> rect = getPixelRectangle(layout); cairo_destroy(cairo); g_object_unref(layout); if (rect.isValid()) { Ptr<CCairoSurface> textSurface = new CCairoSurface(*surface, rect.getValue()); CSize size = rect.getValue().Size; CPoint position = computePosition(size); CRectangle newRect(position, size); return new CSubtitlesGraphicsItem(textSurface, newRect, text->getBeginTime(), text->getEndTime()); } return Ptr<ISubtitlesItem>(); }