bool AP_UnixApp::makePngPreview(const char * pszInFile, const char * pszPNGFile, UT_sint32 iWidth, UT_sint32 iHeight) { cairo_surface_t *surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, iWidth, iHeight); cairo_t *cr = cairo_create (surface); GR_UnixCairoAllocInfo ai(NULL, false); GR_CairoGraphics * pG = static_cast<GR_CairoGraphics*>(GR_UnixCairoGraphics::graphicsAllocator(ai)); pG->setCairo(cr); pG->beginPaint(); // needed to avoid cairo reference loss UT_Error error = UT_OK; PD_Document * pNewDoc = new PD_Document(); error = pNewDoc->readFromFile(pszInFile,IEFT_Unknown, NULL); if (error != UT_OK) { return false; } AP_Preview_Abi * pPrevAbi = new AP_Preview_Abi(pG,iWidth,iHeight,NULL, PREVIEW_ZOOMED,pNewDoc); dg_DrawArgs da; memset(&da, 0, sizeof(da)); da.pG = pG; GR_Painter * pPaint = new GR_Painter(pG); pPaint->clearArea(0,0,pG->tlu(iWidth),pG->tlu(iHeight)); pPrevAbi->getView()->draw(0, &da); pG->endPaint(); cairo_destroy(cr); DELETEP(pPaint); cairo_surface_write_to_png(surface, pszPNGFile); cairo_surface_destroy(surface); DELETEP(pG); DELETEP(pPrevAbi); // This deletes pNewDoc return true; }
void GOComponentView::render(UT_Rect & rec) { UT_return_if_fail (component); if (rec.width == 0 || rec.height == 0) // Nothing to render return; GR_CairoGraphics *pUGG = static_cast<GR_CairoGraphics*>(m_pGOMan->getGraphics()); UT_sint32 myWidth = pUGG->tdu(rec.width); UT_sint32 myHeight = pUGG->tdu(rec.height); UT_sint32 x = pUGG->tdu(rec.left), y; if ((width != rec.width || ascent + descent != rec.height) && go_component_is_resizable (component)) { double _ascent, _descent; go_component_set_size (component, (double) rec.width / UT_LAYOUT_RESOLUTION, (double) rec.height / UT_LAYOUT_RESOLUTION); g_object_get (G_OBJECT (component), "ascent", &_ascent, "descent", &_descent, NULL); ascent = (UT_sint32) rint (_ascent * UT_LAYOUT_RESOLUTION); descent = (UT_sint32) rint (_descent * UT_LAYOUT_RESOLUTION); } y = pUGG->tdu(rec.top - ascent); pUGG->beginPaint(); cairo_t *cr = pUGG->getCairo (); cairo_save (cr); cairo_translate (cr, x, y); go_component_render (component, cr, myWidth, myHeight); cairo_new_path (cr); // just in case a path has not been ended cairo_restore (cr); pUGG->endPaint(); }