void RenderJob::rerenderRectangle(RenderJob * renderJob, Rectangle * rect) { XOJ_CHECK_TYPE_OBJ(renderJob, RenderJob); PageView * view = renderJob->view; double zoom = view->xournal->getZoom(); Document * doc = view->xournal->getDocument(); doc->lock(); double pageWidth = view->page.getWidth(); double pageHeight = view->page.getHeight(); doc->unlock(); int x = rect->x * zoom; int y = rect->y * zoom; int width = rect->width * zoom; int height = rect->height * zoom; cairo_surface_t * rectBuffer = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width, height); cairo_t * crRect = cairo_create(rectBuffer); cairo_translate(crRect, -x, -y); cairo_scale(crRect, zoom, zoom); DocumentView v; v.limitArea(rect->x, rect->y, rect->width, rect->height); if (view->page.getBackgroundType() == BACKGROUND_TYPE_PDF) { int pgNo = view->page.getPdfPageNr(); XojPopplerPage * popplerPage = doc->getPdfPage(pgNo); PdfCache * cache = view->xournal->getCache(); PdfView::drawPage(cache, popplerPage, crRect, zoom, pageWidth, pageHeight); } doc->lock(); v.drawPage(view->page, crRect, false); doc->unlock(); cairo_destroy(crRect); g_mutex_lock(view->drawingMutex); cairo_t * crPageBuffer = cairo_create(view->crBuffer); cairo_set_operator(crPageBuffer, CAIRO_OPERATOR_SOURCE); cairo_set_source_surface(crPageBuffer, rectBuffer, x, y); cairo_rectangle(crPageBuffer, x, y, width, height); cairo_fill(crPageBuffer); cairo_destroy(crPageBuffer); cairo_surface_destroy(rectBuffer); g_mutex_unlock(view->drawingMutex); }