static void ease_pdf_actor_draw_page (EasePdfActor* self) { #line 415 "ease-pdf-actor.c" PopplerPage* page; double width; double height; cairo_t* cr; GError * _inner_error_ = NULL; #line 58 "ease-pdf-actor.vala" g_return_if_fail (self != NULL); #line 61 "ease-pdf-actor.vala" page = _g_object_ref0 (poppler_document_get_page (self->priv->doc, self->priv->current_page)); #line 62 "ease-pdf-actor.vala" width = (double) 0; #line 62 "ease-pdf-actor.vala" height = (double) 0; #line 63 "ease-pdf-actor.vala" poppler_page_get_size (page, &width, &height); #line 66 "ease-pdf-actor.vala" if (self->priv->texture == NULL) { #line 433 "ease-pdf-actor.c" ClutterCairoTexture* _tmp0_; ClutterActor* _tmp1_; #line 68 "ease-pdf-actor.vala" self->priv->texture = (_tmp0_ = g_object_ref_sink ((ClutterCairoTexture*) clutter_cairo_texture_new ((guint) ((gint) width), (guint) ((gint) height))), _g_object_unref0 (self->priv->texture), _tmp0_); #line 69 "ease-pdf-actor.vala" clutter_container_add_actor ((ClutterContainer*) (_tmp1_ = ((EaseActor*) self)->contents, CLUTTER_IS_GROUP (_tmp1_) ? ((ClutterGroup*) _tmp1_) : NULL), (ClutterActor*) self->priv->texture); #line 71 "ease-pdf-actor.vala" clutter_actor_set_width ((ClutterActor*) self->priv->texture, clutter_actor_get_width (((EaseActor*) self)->contents)); #line 72 "ease-pdf-actor.vala" clutter_actor_set_height ((ClutterActor*) self->priv->texture, clutter_actor_get_height (((EaseActor*) self)->contents)); #line 74 "ease-pdf-actor.vala" g_signal_connect_object ((GObject*) ((EaseActor*) self)->contents, "notify::width", (GCallback) __lambda53__g_object_notify, self, 0); #line 78 "ease-pdf-actor.vala" g_signal_connect_object ((GObject*) ((EaseActor*) self)->contents, "notify::height", (GCallback) __lambda54__g_object_notify, self, 0); #line 448 "ease-pdf-actor.c" } else { #line 86 "ease-pdf-actor.vala" clutter_cairo_texture_set_surface_size (self->priv->texture, (guint) ((gint) width), (guint) ((gint) height)); #line 452 "ease-pdf-actor.c" } #line 90 "ease-pdf-actor.vala" clutter_cairo_texture_clear (self->priv->texture); #line 91 "ease-pdf-actor.vala" cr = clutter_cairo_texture_create (self->priv->texture); #line 92 "ease-pdf-actor.vala" ease_background_cairo_render (self->priv->pdf_element->background, cr, (gint) width, (gint) height, ease_document_get_path (ease_slide_get_parent (ease_element_get_parent (((EaseActor*) self)->element))), &_inner_error_); #line 460 "ease-pdf-actor.c" if (_inner_error_ != NULL) { _cairo_destroy0 (cr); _g_object_unref0 (page); g_critical ("file %s: line %d: uncaught error: %s (%s, %d)", __FILE__, __LINE__, _inner_error_->message, g_quark_to_string (_inner_error_->domain), _inner_error_->code); g_clear_error (&_inner_error_); return; } #line 94 "ease-pdf-actor.vala" poppler_page_render (page, cr); #line 470 "ease-pdf-actor.c" _cairo_destroy0 (cr); _g_object_unref0 (page); }
static void draw_page(SDL_Surface * dst, cairo_t * cr, PopplerDocument * document, int page_num) { cairo_status_t status; PopplerPage *page; /* Create a cairo drawing context, normalize it and draw a clock. */ SDL_LockSurface(dst); { page = poppler_document_get_page(document, page_num - 1); if (page == NULL) { printf("poppler fail: page not found\n"); return; } cairo_save(cr); poppler_page_render(page, cr); cairo_restore(cr); g_object_unref(page); status = cairo_status(cr); } SDL_UnlockSurface(dst); /* Nasty nasty error handling. */ if (status != CAIRO_STATUS_SUCCESS) { fprintf(stderr, "Unable to create or draw with a cairo context " "for the screen: %s\n", cairo_status_to_string(status)); exit(1); } }
static void gvloadimage_poppler_cairo(GVJ_t * job, usershape_t *us, boxf b, boolean filled) { PopplerDocument* document = gvloadimage_poppler_load(job, us); PopplerPage* page; cairo_t *cr = (cairo_t *) job->context; /* target context */ cairo_surface_t *surface; /* source surface */ if (document) { // already done this once, so no err checking page = poppler_document_get_page (document, 0); cairo_save(cr); // FIXME #define IMAGE_DPI 72 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, IMAGE_DPI*(us->w)/72.0, IMAGE_DPI*(us->h)/72.0); cairo_surface_reference(surface); cairo_set_source_surface(cr, surface, 0, 0); cairo_translate(cr, ROUND(b.LL.x), ROUND(-b.UR.y)); cairo_scale(cr, (b.UR.x - b.LL.x) / us->w, (b.UR.y - b.LL.y) / us->h); poppler_page_render (page, cr); cairo_paint (cr); cairo_restore(cr); } }
static void zoom_rect(int x1, int y1, int x2, int y2) { cairo_t *ctx; cairo_surface_t *buf, *t; t = cairo_xlib_surface_create(dpy, wshow, vis, sw, sh); buf = cairo_surface_create_similar(t, CAIRO_CONTENT_COLOR, sw, sh); ctx = cairo_create(buf); cairo_surface_destroy(t); PopplerDocument *pdf; pdf = poppler_document_new_from_file(show->uri, NULL, NULL); PopplerPage *page = poppler_document_get_page(pdf, show->cur); double pdfw, pdfh; poppler_page_get_size(page, &pdfw, &pdfh); cairo_set_source_rgba(ctx, 1, 1, 1, 1); cairo_paint(ctx); double scx = show->w / pdfw, scy = show->h / pdfh; double dx = 0.0, dy = 0.0; if (conf.lock_aspect) { if (scx > scy) dx = (show->w - pdfw * (scx=scy)) / 2.0; else dy = (show->h - pdfh * (scy=scx)) / 2.0; } cairo_scale(ctx, scx * show->w /(double) (x2-x1), scy * show->h /(double) (y2-y1)); cairo_translate(ctx, (dx - x1)/scx, (dy - y1)/scy); poppler_page_render(page, ctx); cairo_set_source_surface(show->target[0].ctx, buf, 0, 0); int i; for (i = conf.fade; i; i--) { cairo_paint_with_alpha(show->target[0].ctx, 1/(float)i); XFlush(dpy); usleep(5000); } cairo_destroy(ctx); cairo_surface_destroy(buf); }
virtual bool page(int pageNum) { if (!_doc) return false; if (pageNum<0 || pageNum>=getNumOfPages()) return false; PopplerPage* page = poppler_document_get_page(_doc, pageNum); if(!page) return false; _pageNum = pageNum; double w = 0.0f; double h = 0.0f; poppler_page_get_size(page, &w, &h); _cairoImage->create((unsigned int)(w*2.0),(unsigned int)(h*2.0)); osg::clearImageToColor(this, _backgroundColor); cairo_save(_cairoImage->getContext()); cairo_scale(_cairoImage->getContext(), double(s())/w, double(t())/h); poppler_page_render(page, _cairoImage->getContext()); cairo_restore(_cairoImage->getContext()); g_object_unref (page); dirty(); return true; }
/* operations for page */ static cairo_surface_t * xv_doc_get_surface(struct xv_page_t *page, PgdRenderMode mode, double scale) { cairo_t *cr; if (mode != page->mode || page->scale != scale) { if (page->surface) { xv_page_paint_free (page); } page->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, page->width * scale, page->height * scale); cr = cairo_create(page->surface); cairo_save(cr); if (scale != 1.0) { cairo_scale (cr, scale, scale); } poppler_page_render (page->page, cr); cairo_restore(cr); cairo_set_operator(cr, CAIRO_OPERATOR_DEST_OVER); cairo_set_source_rgb(cr, 1, 1, 1); cairo_paint(cr); cairo_destroy(cr); page->scale = scale; page->mode = mode; } return page->surface; }
static cairo_surface_t * pgd_find_render_page (PgdFindDemo *demo) { cairo_t *cr; PopplerPage *page; gdouble width, height; cairo_surface_t *surface = NULL; page = poppler_document_get_page (demo->doc, demo->selected_page); if (!page) return NULL; poppler_page_get_size (page, &width, &height); gtk_widget_set_size_request (demo->darea, width, height); surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); cr = cairo_create (surface); cairo_save (cr); cairo_set_source_rgb (cr, 1, 1, 1); cairo_rectangle (cr, 0, 0, width, height); cairo_fill (cr); cairo_restore (cr); cairo_save (cr); poppler_page_render (page, cr); cairo_restore (cr); cairo_destroy (cr); g_object_unref (page); return surface; }
/* adapted from pdf2png.c */ static const char * _poppler_render_page (const char *filename, const char *page_label, cairo_surface_t **surface_out) { PopplerDocument *document; PopplerPage *page; double width, height; GError *error = NULL; gchar *absolute, *uri; cairo_surface_t *surface; cairo_t *cr; cairo_status_t status; if (g_path_is_absolute (filename)) { absolute = g_strdup (filename); } else { gchar *dir = g_get_current_dir (); absolute = g_build_filename (dir, filename, (gchar *) 0); g_free (dir); } uri = g_filename_to_uri (absolute, NULL, &error); g_free (absolute); if (uri == NULL) return error->message; /* XXX g_error_free (error) */ document = poppler_document_new_from_file (uri, NULL, &error); g_free (uri); if (document == NULL) return error->message; /* XXX g_error_free (error) */ page = poppler_document_get_page_by_label (document, page_label); g_object_unref (document); if (page == NULL) return "page not found"; poppler_page_get_size (page, &width, &height); surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, width, height); cr = cairo_create (surface); cairo_set_source_rgb (cr, 1., 1., 1.); cairo_paint (cr); poppler_page_render (page, cr); g_object_unref (page); status = cairo_status (cr); cairo_destroy (cr); if (status) { cairo_surface_destroy (surface); return cairo_status_to_string (status); } *surface_out = surface; return NULL; }
void zoom(const char *arg) { if (show.rendered < show.count - 1) { /* ensure rendering is done */ warn(); return; } XDefineCursor(dpy,win,XCreateFontCursor(dpy,130)); XEvent ev; int x1,y1,x2=-1,y2; while ( !XNextEvent(dpy,&ev) && ev.type!=ButtonPress && ev.type!=KeyPress ); if (ev.type == KeyPress) { XPutBackEvent(dpy,&ev); XDefineCursor(dpy,win,invisible_cursor); return; } XGrabPointer(dpy,ev.xbutton.window,True, PointerMotionMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync,None,None,CurrentTime); x1 = ev.xbutton.x; y1 = ev.xbutton.y; while (!XNextEvent(dpy,&ev) && ev.type != ButtonRelease && ev.type!=KeyPress) { XCopyArea(dpy,show.slide[show.num],win,gc,0,0, aspx*sw,aspy*sh,(sw-aspx*sw)/2,(sh-aspy*sh)/2); XDrawRectangle(dpy,win,hgc,x1,y1,ev.xbutton.x-x1,ev.xbutton.y-y1); XSync(dpy,True); } if (ev.type == KeyPress) { XPutBackEvent(dpy,&ev); XDefineCursor(dpy,win,invisible_cursor); return; } x2 = ev.xbutton.x; y2 = ev.xbutton.y; mute("black"); white_muted = True; Pixmap region = XCreatePixmap(dpy,root,sw,sh,DefaultDepth(dpy,scr)); XFillRectangle(dpy,region,wgc,0,0,sw,sh); PopplerPage *page = poppler_document_get_page(pdf,show.num); cairo_surface_t *target = cairo_xlib_surface_create( dpy, region, DefaultVisual(dpy,scr), sw, sh); cairo_t *cairo = cairo_create(target); double xscale = show.scale * sw/ (x2-x1); double yscale = show.scale * sh/ (y2-y1); if (arg) { if (xscale > yscale) xscale = yscale; else yscale = xscale; } double xoff = ((sw-aspx*sw)/2 - x1)/show.scale*xscale; double yoff = ((sh-aspy*sh)/2 - y1)/show.scale*yscale; cairo_translate(cairo,xoff,yoff); cairo_scale(cairo,xscale,yscale); poppler_page_render(page,cairo); cairo_surface_destroy(target); cairo_destroy(cairo); XCopyArea(dpy,region,win,gc,0,0,sw,sh,0,0); XFreePixmap(dpy,region); XDefineCursor(dpy,win,invisible_cursor); XFlush(dpy); }
static gboolean render_page(GtkWidget *widget) { /* GtkDrawingAreaにPDFを描画 */ static cairo_surface_t *surface = NULL; cairo_t *cr; double width,height; PopplerPage *page; GdkWindow *window; if (doc == NULL) { return FALSE; } if (surface != NULL) { cairo_surface_destroy(surface); surface = NULL; } /* PDFの1ページ目を表示する。第2引数を変えればそのページを表示 */ page = poppler_document_get_page(doc,0); /* PDFページのサイズを取得 */ poppler_page_get_size(page, &width, &height); /* DrawingAreaをPDFページのサイズに設定=等倍 */ gtk_widget_set_size_request(widget,(int)width,(int)height); /* cairo surface作成 */ surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, width,height); cr = cairo_create(surface); cairo_save(cr); /* スケールを等倍 */ cairo_scale(cr,1.0,1.0); /* surfaceにページを描画 */ poppler_page_render(page,cr); cairo_restore(cr); cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER); cairo_set_source_rgb (cr, 1., 1., 1.); cairo_paint (cr); cairo_destroy (cr); /* DrawingAreaのGdkWindowを取得 */ window = gtk_widget_get_window(widget); if (window != NULL) { /* GdkWindowにsurfaceを設定 */ cr = gdk_cairo_create(window); cairo_set_source_surface(cr,surface,0,0); cairo_paint(cr); cairo_destroy(cr); } g_object_unref(page); }
static void page_render(cairo_t *c, page_info_t *i) { PopplerPage *p = i->page; /* render background */ cairo_rectangle(c, 0, 0, i->rectangle->width, i->rectangle->height); cairo_set_source_rgb(c, 1, 1, 1); cairo_fill(c); /* render page */ poppler_page_render(p, c); }
static void redraw_handler(struct widget *widget, void *data) { struct view *view = data; struct rectangle allocation; cairo_surface_t *surface; cairo_t *cr; PopplerPage *page; double width, height, doc_aspect, window_aspect, scale; widget_get_allocation(view->widget, &allocation); surface = window_get_surface(view->window); cr = cairo_create(surface); cairo_rectangle(cr, allocation.x, allocation.y, allocation.width, allocation.height); cairo_clip(cr); cairo_set_source_rgba(cr, 0, 0, 0, 0.8); cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE); cairo_paint(cr); if(!view->document) { cairo_destroy(cr); cairo_surface_destroy(surface); window_flush(view->window); return; } page = poppler_document_get_page(view->document, view->page); poppler_page_get_size(page, &width, &height); doc_aspect = width / height; window_aspect = (double) allocation.width / allocation.height; if (doc_aspect < window_aspect) scale = allocation.height / height; else scale = allocation.width / width; cairo_translate(cr, allocation.x, allocation.y); cairo_scale(cr, scale, scale); cairo_translate(cr, (allocation.width - width * scale) / 2 / scale, (allocation.height - height * scale) / 2 / scale); cairo_rectangle(cr, 0, 0, width, height); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); cairo_set_source_rgb(cr, 1, 1, 1); cairo_fill(cr); poppler_page_render(page, cr); cairo_destroy(cr); cairo_surface_destroy(surface); g_object_unref(G_OBJECT(page)); }
void DocumentView::drawTexImage(cairo_t* cr, TexImage* texImage) { XOJ_CHECK_TYPE(DocumentView); cairo_matrix_t defaultMatrix = { 0 }; cairo_get_matrix(cr, &defaultMatrix); PopplerDocument* pdf = texImage->getPdf(); cairo_surface_t* img = texImage->getImage(); if (pdf != nullptr) { if (poppler_document_get_n_pages(pdf) < 1) { g_warning("Got latex PDf without pages!: %s", texImage->getText().c_str()); return; } PopplerPage* page = poppler_document_get_page(pdf, 0); double pageWidth = 0; double pageHeight = 0; poppler_page_get_size(page, &pageWidth, &pageHeight); double xFactor = texImage->getElementWidth() / pageWidth; double yFactor = texImage->getElementHeight() / pageHeight; cairo_translate(cr, texImage->getX(), texImage->getY()); cairo_scale(cr, xFactor, yFactor); poppler_page_render(page, cr); } else if (img != nullptr) { int width = cairo_image_surface_get_width(img); int height = cairo_image_surface_get_height(img); cairo_set_operator(cr, CAIRO_OPERATOR_OVER); double xFactor = texImage->getElementWidth() / width; double yFactor = texImage->getElementHeight() / height; cairo_scale(cr, xFactor, yFactor); cairo_set_source_surface(cr, img, texImage->getX() / xFactor, texImage->getY() / yFactor); cairo_paint(cr); } cairo_set_matrix(cr, &defaultMatrix); }
static void render_pdf_page( PopplerDocument* doc, int n_page, cairo_surface_t* surface, int width, int height ) { PopplerPage* page = poppler_document_get_page(doc, n_page); cairo_t* cr = cairo_create(surface); cairo_rectangle(cr, 0, 0, width, height); cairo_set_source_rgb(cr, 1, 1, 1); cairo_fill(cr); cairo_paint(cr); poppler_page_render(page, cr); g_object_unref(page); cairo_destroy(cr); }
zathura_error_t pdf_page_render_cairo(zathura_page_t* page, PopplerPage* poppler_page, cairo_t* cairo, bool printing) { if (page == NULL || poppler_page == NULL || cairo == NULL) { return ZATHURA_ERROR_INVALID_ARGUMENTS; } if (printing == false) { poppler_page_render(poppler_page, cairo); } else { poppler_page_render_for_printing(poppler_page, cairo); } return ZATHURA_ERROR_OK; }
static void pgd_selections_render (GtkButton *button, PgdSelectionsDemo *demo) { gdouble page_width, page_height; cairo_t *cr; if (!demo->page) demo->page = poppler_document_get_page (demo->doc, demo->page_index); if (!demo->page) return; pgd_selections_clear_selections (demo); pgd_selections_update_selection_region (demo); gtk_widget_set_sensitive (demo->copy_button, FALSE); if (demo->surface) cairo_surface_destroy (demo->surface); demo->surface = NULL; poppler_page_get_size (demo->page, &page_width, &page_height); page_width *= demo->scale; page_height *= demo->scale; demo->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, page_width, page_height); cr = cairo_create (demo->surface); cairo_save (cr); if (demo->scale != 1.0) cairo_scale (cr, demo->scale, demo->scale); poppler_page_render (demo->page, cr); cairo_restore (cr); cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER); cairo_set_source_rgb (cr, 1., 1., 1.); cairo_paint (cr); cairo_destroy (cr); gtk_widget_set_size_request (demo->darea, page_width, page_height); gtk_widget_queue_draw (demo->darea); }
void render_page(page_t *page_meta, PopplerPage *page) {; cairo_t *cairoctx; cairo_surface_t *surface; double width, height; char outfilename[NAME_MAX]; poppler_page_get_size(page, &width, &height); snprintf(outfilename, sizeof outfilename - 1, "img-%d.svg", page_meta->pagenum); surface = cairo_svg_surface_create(outfilename, width, height); cairoctx = cairo_create(surface); if (cairoctx == NULL) ERROR("Cannot create a Cairo buffer"); poppler_page_render(page, cairoctx); cairo_surface_show_page(surface); cairo_surface_destroy(surface); cairo_destroy(cairoctx); }
static gboolean draw_page (ClutterCanvas *canvas, cairo_t *cr, int width, int height, gpointer data) { struct CkdDrawData *draw_data = data; cairo_save (cr); cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR); cairo_paint (cr); cairo_restore (cr); cairo_set_operator (cr, CAIRO_OPERATOR_OVER); /* @begin: 绘制白色背景 */ cairo_rectangle (cr, 0, 0, width, height); cairo_set_source_rgba (cr, 1.0, 1.0, 1.0, 1.0); cairo_fill (cr); /* @end */ cairo_scale (cr, draw_data->scale, draw_data->scale); poppler_page_render (POPPLER_PAGE(draw_data->page), cr); return TRUE; }
Window *render_create_sorter(Window win) { int i; PopplerPage *page; double pdfw, pdfh, scale; cairo_surface_t *pix_s; cairo_t *pix_c; XSetWindowAttributes wa; wa.backing_store = Always; wa.event_mask = ButtonPress | ExposureMask | PointerMotionMask; Window *wins = malloc((_pdf[0].npage + 1) * sizeof(Window)); Pixmap pix; int ww, wh; for (i = 0; i < _pdf[0].npage; ++i) { page = poppler_document_get_page(_pdf[0].doc, i); poppler_page_get_size(page, &pdfw, &pdfh); scale = get_d(presH) / (6 * pdfh); ww = scale * pdfw; wh = scale * pdfh; wins[i] = XCreateWindow(dpy, win, 0, 0, ww, wh, 1, DefaultDepth(dpy,scr), InputOutput, DefaultVisual(dpy,scr), CWBackingStore | CWEventMask, &wa); XDefineCursor(dpy, wins[i], XCreateFontCursor(dpy, 68)); pix = XCreatePixmap(dpy, wins[i], ww, wh, DefaultDepth(dpy,scr)); pix_s = cairo_xlib_surface_create(dpy, pix, DefaultVisual(dpy,scr), ww, wh); pix_c = cairo_create(pix_s); cairo_surface_destroy(pix_s); cairo_set_source_rgb(pix_c, 1, 1, 1); cairo_paint(pix_c); cairo_scale(pix_c, scale, scale); poppler_page_render(page, pix_c); cairo_destroy(pix_c); XSetWindowBackgroundPixmap(dpy, wins[i], pix); XFreePixmap(dpy, pix); g_object_unref(page); } wins[_pdf[0].npage] = None; return wins; }
int main (int argc, char *argv[]) { PopplerDocument *document; PopplerPage *page; double width, height; const char *filename = argv[1]; const char *output_filename = argv[2]; const char *page_label = argv[3]; gchar *absolute, *uri; cairo_surface_t *surface; cairo_t *cr; cairo_status_t status; GError *error = NULL; if (argc != 4) FAIL ("usage: pdf2png input_file.pdf output_file.png page"); g_type_init (); if (g_path_is_absolute(filename)) { absolute = g_strdup (filename); } else { gchar *dir = g_get_current_dir (); absolute = g_build_filename (dir, filename, (gchar *) 0); g_free (dir); } uri = g_filename_to_uri (absolute, NULL, &error); g_free (absolute); if (uri == NULL) FAIL (error->message); document = poppler_document_new_from_file (uri, NULL, &error); if (document == NULL) FAIL (error->message); page = poppler_document_get_page_by_label (document, page_label); if (page == NULL) FAIL ("page not found"); poppler_page_get_size (page, &width, &height); surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); cr = cairo_create (surface); cairo_surface_destroy (surface); poppler_page_render (page, cr); g_object_unref (page); cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER); cairo_set_source_rgb (cr, 1., 1., 1.); cairo_paint (cr); status = cairo_surface_write_to_png (cairo_get_target (cr), output_filename); cairo_destroy (cr); if (status) FAIL (cairo_status_to_string (status)); return 0; }
static gboolean onCanvasDraw(GtkWidget *widget, cairo_t *cr, struct viewport *pp) { (void)widget; int mypage_i, myfitmode = -1; gdouble w = 0, h = 0; gchar *title = NULL; gdouble popwidth, popheight; gdouble tx, ty; gdouble screen_ratio, page_ratio, scale; PopplerPage *page = NULL; /* no valid target size? */ if (pp->width <= 0 || pp->height <= 0) return TRUE; /* decide which page to render - if any */ mypage_i = pagenumForPort(pp); if (mypage_i < 0 || mypage_i >= doc_n_pages) { /* We don't do any drawing and set the frame's title to "X". * Thus, we'll end up with an "empty" frame. */ if (pp->frame != NULL) gtk_frame_set_label(GTK_FRAME(pp->frame), "X"); return TRUE; } else { /* update frame title */ if (pp->frame != NULL) { title = g_strdup_printf("Slide %d / %d", mypage_i + 1, doc_n_pages); gtk_frame_set_label(GTK_FRAME(pp->frame), title); g_free(title); } } /* if note-control is active, print current page number if on * "main" frame. (don't do this on the beamer because it could be * locked.) * this allows you to attach any kind of other program or script * which can show notes for a specific slide. simply pipe the * output of pdfpres to your other tool. */ if (pp->offset == 0 && !pp->isBeamer) { printNote(doc_page + 1); if (runpref.do_notectrl) { printf("%d\n", doc_page + 1); fflush(stdout); } } /* Get the page and it's size from the document. */ page = poppler_document_get_page(doc, mypage_i); poppler_page_get_size(page, &popwidth, &popheight); /* Set page number */ if (pp->isBeamer) { gtk_label_set_text(GTK_LABEL(curPageLabel), g_strdup_printf("%s/%d", poppler_page_get_label(page), doc_last_page)); } /* Select fit mode. */ page_ratio = popwidth / popheight; screen_ratio = (double)pp->width / (double)pp->height; if (runpref.fit_mode == FIT_PAGE) { /* That's it: Compare screen and page ratio. This * will cover all 4 cases that could happen. */ if (screen_ratio > page_ratio) myfitmode = FIT_HEIGHT; else myfitmode = FIT_WIDTH; } else myfitmode = runpref.fit_mode; switch (myfitmode) { case FIT_HEIGHT: /* Fit size. */ h = pp->height; w = h * page_ratio; scale = h / popheight; /* Center page. */ tx = (pp->width - popwidth * scale) * 0.5; ty = 0; break; case FIT_WIDTH: w = pp->width; h = w / page_ratio; scale = w / popwidth; tx = 0; ty = (pp->height - popheight * scale) * 0.5; break; } /* A black background on beamer frame. Push and pop cairo contexts, so we have a * clean state afterwards. */ if (pp->isBeamer) { cairo_save(cr); cairo_set_source_rgb(cr, 0, 0, 0); cairo_rectangle(cr, 0, 0, pp->width, pp->height); cairo_fill(cr); cairo_restore(cr); /* center page on beamer */ cairo_translate(cr, tx, ty); } else { cairo_translate(cr, tx, 0); } /* Render the page */ cairo_scale(cr, scale, scale); poppler_page_render(page, cr); /* We no longer need that page. */ g_object_unref(G_OBJECT(page)); /* Nobody else draws to this widget. */ return TRUE; }
int render_pdf_page(int pdf, int pg, Window win, bool fixed) { if (pg >= _pdf[pdf].npage) return 1; cairo_t *ctx; cairo_surface_t *s, *img; double pdfw, pdfh, scx, scy; int ig; unsigned int uig, ww, wh; /* get page size and scale to window */ PopplerPage *page = poppler_document_get_page(_pdf[pdf].doc, pg); poppler_page_get_size(page, &pdfw, &pdfh); XGetGeometry(dpy, win, (Window *) &ig, &ig, &ig, &ww, &wh, &uig, &uig); scx = ww / pdfw; scy = wh / pdfh; //if (pdf == 0) { _ww = ww; _wh = wh; } if (fixed) { /* adjust window size for fixed aspect ratio */ scx = (scx < scy ? (scy=scx) : scy); ww = scx * pdfw + 0.5; wh = scy * pdfh + 0.5; XResizeWindow(dpy, win, ww, wh); } /* create background pixmap and render page to it */ Pixmap pix = XCreatePixmap(dpy, win, ww, wh, DefaultDepth(dpy,scr)); s = cairo_xlib_surface_create(dpy, pix, DefaultVisual(dpy,scr), ww, wh); ctx = cairo_create(s); cairo_surface_destroy(s); cairo_scale(ctx, scx, scy); cairo_set_source_rgb(ctx, 1, 1, 1); cairo_paint(ctx); poppler_page_render(page, ctx); cairo_destroy(ctx); /* if this is the fader window, fade in */ if (win == _fade_win) { /* hide cursor for fade transitions */ #ifdef module_cursor bool pre = cursor_visible(query); cursor_visible(false); #endif /* get image, set up context, and render page */ img = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, ww, wh); ctx = cairo_create(img); cairo_scale(ctx, scx, scy); cairo_set_source_rgb(ctx, 1, 1, 1); cairo_paint(ctx); poppler_page_render(page, ctx); cairo_destroy(ctx); /* get window surface, reset context to draw img to window */ s = cairo_xlib_surface_create(dpy, win, DefaultVisual(dpy,scr), ww, wh); ctx = cairo_create(s); cairo_surface_destroy(s); cairo_set_source_surface(ctx, img, 0, 0); // memory leak?! /* fade in */ for (ig = _fade_steps; ig; --ig) { cairo_paint_with_alpha(ctx, 1 / (float) ig); // memory leak?! //XFlush(dpy); usleep(200); } /* clean up */ cairo_destroy(ctx); cairo_surface_destroy(img); #ifdef module_cursor cursor_visible(pre); #endif } g_object_unref(page); /* set the pixmap to be the window background */ XSetWindowBackgroundPixmap(dpy, win, pix); XFreePixmap(dpy, pix); XClearWindow(dpy, win); #ifdef module_cursor if (pdf == 0) cursor_draw(-1, -1); #endif return 0; }
static void pgd_render_start (GtkButton *button, PgdRenderDemo *demo) { PopplerPage *page; gdouble page_width, page_height; gdouble width, height; gint x, y; gchar *str; GTimer *timer; cairo_t *cr; page = poppler_document_get_page (demo->doc, demo->page); if (!page) return; if (demo->surface) cairo_surface_destroy (demo->surface); demo->surface = NULL; poppler_page_get_size (page, &page_width, &page_height); if (demo->rotate == 0 || demo->rotate == 180) { width = demo->slice.width * demo->scale; height = demo->slice.height * demo->scale; x = demo->slice.x * demo->scale; y = demo->slice.y * demo->scale; } else { width = demo->slice.height * demo->scale; height = demo->slice.width * demo->scale; x = demo->slice.y * demo->scale; y = demo->slice.x * demo->scale; } timer = g_timer_new (); demo->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height); cr = cairo_create (demo->surface); cairo_save (cr); switch (demo->rotate) { case 90: cairo_translate (cr, x + width, -y); break; case 180: cairo_translate (cr, x + width, y + height); break; case 270: cairo_translate (cr, -x, y + height); break; default: cairo_translate (cr, -x, -y); } if (demo->scale != 1.0) cairo_scale (cr, demo->scale, demo->scale); if (demo->rotate != 0) cairo_rotate (cr, demo->rotate * G_PI / 180.0); if (demo->printing) poppler_page_render_for_printing (page, cr); else poppler_page_render (page, cr); cairo_restore (cr); cairo_set_operator (cr, CAIRO_OPERATOR_DEST_OVER); cairo_set_source_rgb (cr, 1., 1., 1.); cairo_paint (cr); g_timer_stop (timer); cairo_destroy (cr); g_object_unref (page); str = g_strdup_printf ("<i>Page rendered in %.4f seconds</i>", g_timer_elapsed (timer, NULL)); gtk_label_set_markup (GTK_LABEL (demo->timer_label), str); g_free (str); g_timer_destroy (timer); gtk_widget_set_size_request (demo->darea, width, height); gtk_widget_queue_draw (demo->darea); }
void *render_threaded(void *arg) { Show *show = (Show *) arg; int i, j, n, x, y, grid = 0; int sw = show->w, sh = show->h; Pixmap thumb = 0x0; /* open pdf and create Show */ PopplerDocument *pdf = poppler_document_new_from_file(show->uri,NULL,NULL); if (!pdf) die("\"%s\" is not a pdf file\n",show->uri); show->count = poppler_document_get_n_pages(pdf); show->slide = (Pixmap *) calloc(show->count, sizeof(Pixmap)); show->flag = (int *) calloc(show->count, sizeof(int)); /* scaling calculations */ double pdfw, pdfh; PopplerPage *page = poppler_document_get_page(pdf,0); poppler_page_get_size(page,&pdfw,&pdfh); float hsc = show->w/pdfw, vsc = show->h/pdfh; if (hsc > vsc) { show->scale = vsc; show->w = pdfw * show->scale; show->x = (sw - show->w)/2; } else { show->scale = hsc; show->h = pdfh * show->scale; show->y = (sh - show->h)/2; } /* create sorter */ if (show->sorter) { /* scaling calculations sorter */ show->sorter->count = 1; show->sorter->slide = (Pixmap *) calloc(1, sizeof(Pixmap)); show->sorter->flag = (int *) calloc(1,sizeof(int)); grid = (int) ceil(sqrt(show->count)) ; vsc = ( (sh-10)/grid - 10) / pdfh; hsc = ( (sw-10)/grid - 10) / pdfw; show->sorter->flag[0] = grid; show->sorter->scale = (vsc > hsc ? hsc : vsc); show->sorter->h = pdfh * show->sorter->scale; show->sorter->w = pdfw * show->sorter->scale; show->sorter->x = (sw - (show->sorter->w+10)*grid + 10)/2; show->sorter->y = (sh - (show->sorter->h+10)*grid + 10)/2; /* create empty sorter frame */ thumb = XCreatePixmap(dpy,root,show->sorter->w, show->sorter->h,DefaultDepth(dpy,scr)); show->sorter->slide[0] = XCreatePixmap(dpy,root,sw,sh, DefaultDepth(dpy,scr)); XFillRectangle(dpy,show->sorter->slide[0],bgc,0,0,sw,sh); n = 0; y = show->sorter->y; for (i = 0; i < grid; i++, y += show->sorter->h + 10) { x = show->sorter->x; for (j = 0; j < grid; j++, x+= show->sorter->w + 10) { if (++n > show->count) break; XFillRectangle(dpy,show->sorter->slide[0],egc,x+2,y+2, show->sorter->w-5,show->sorter->h-5); } } } /* render pages */ cairo_surface_t *target; cairo_t *cairo; n = 0; x = (show->sorter ? show->sorter->x : 0); y = (show->sorter ? show->sorter->y : 0); for (i = 0; i < show->count && !(show->flag[0] & STOP_RENDER); i++) { show->slide[i] = XCreatePixmap(dpy,root,show->w,show->h, DefaultDepth(dpy,scr)); XFillRectangle(dpy,show->slide[i],sgc,0,0,show->w,show->h); page = poppler_document_get_page(pdf,i); target = cairo_xlib_surface_create(dpy,show->slide[i], DefaultVisual(dpy,scr),show->w,show->h); cairo = cairo_create(target); cairo_scale(cairo,show->scale,show->scale); poppler_page_render(page,cairo); cairo_surface_destroy(target); cairo_destroy(cairo); show->flag[i] |= RENDERED; if (show->sorter) { XFillRectangle(dpy,thumb,sgc,0,0,show->sorter->w,show->sorter->h); target = cairo_xlib_surface_create(dpy,thumb,DefaultVisual(dpy,scr), show->sorter->w,show->sorter->h); cairo = cairo_create(target); cairo_scale(cairo,show->sorter->scale,show->sorter->scale); poppler_page_render(page,cairo); cairo_surface_destroy(target); XCopyArea(dpy,thumb,show->sorter->slide[0],sgc,0,0,show->sorter->w, show->sorter->h,x,y); x += show->sorter->w + 10; if (++n == grid) { n = 0; x = show->sorter->x; y += show->sorter->h + 10; } } } if (show->sorter) XFreePixmap(dpy,thumb); return NULL; }
static VALUE page_render(VALUE self, VALUE cairo) { poppler_page_render(SELF(self), RVAL2CRCONTEXT(cairo)); return Qnil; }
void *render_all(void *arg) { /* render_all runs as an independent thread and quits when it is done */ /* initalize data elements */ pdf = poppler_document_new_from_file((char *)uri,NULL,NULL); if (!pdf) die("%s is not a recognizable pdf file\n",uri); show.count = poppler_document_get_n_pages(pdf); show.slide = (Pixmap *) calloc(show.count,sizeof(Pixmap)); PopplerPage *page; cairo_surface_t *target; cairo_t *cairo; /* calculations for overview/sorter mode */ page = poppler_document_get_page(pdf,0); double pdfw,pdfh; poppler_page_get_size(page,&pdfw,&pdfh); float vsc,hsc; vsc = sh / pdfh; hsc = sw / pdfw; show.scale = (vsc > hsc ? hsc : vsc); float aspw = sh/pdfh * pdfw; float asph = sw/pdfw * pdfh; if (aspw < sw) aspx=aspw/sw; else aspy=asph/sh; sorter.grid = (int) sqrt(show.count) + 1; vsc = ((aspy*sh-10)/sorter.grid - 10) * show.scale / sh; hsc = ((aspx*sw-10)/sorter.grid - 10) * show.scale / sw; sorter.scale = (vsc > hsc ? vsc : hsc); sorter.w = aspx*sw*sorter.scale/show.scale; sorter.h = aspy*sh*sorter.scale/show.scale; Pixmap thumbnail = XCreatePixmap(dpy,root,sorter.w,sorter.h, DefaultDepth(dpy,scr)); if (presenter_mode) { fprintf(stdout,"SLIDER START (%dx%d) win=%lu slides=%d\n", (int) (aspx*sw),(int) (aspy*sh), win, show.count); fflush(stdout); } /* create empty overview frame in sorter.view (dotted outlines for slides) */ XFillRectangle(dpy,sorter.view,gc,0,0,sw,sh); int i,j, n=0, x=(sw-sorter.grid*(sorter.w+10))/2, y=10; for (i = 0; i < sorter.grid; i++, y += sorter.h + 10) { for (j = 0; j < sorter.grid; j++, x += sorter.w + 10) { if (++n > show.count) break; XDrawRectangle(dpy,sorter.view,lgc,x+2,y+2,sorter.w-5,sorter.h-5); } x = (sw-sorter.grid*(sorter.w+10))/2; } /* create show.slide[] renderings and update sorter.view with each page */ n = 0; x = (sw-sorter.grid*(sorter.w+10))/2; y = 10; for (i = 0; i < show.count; i++) { /* show.slide[i] creation and rendering */ show.slide[i] = XCreatePixmap(dpy,root,aspx*sw,aspy*sh, DefaultDepth(dpy,scr)); XFillRectangle(dpy,show.slide[i],wgc,0,0,aspx*sw,aspy*sh); page = poppler_document_get_page(pdf,i); target = cairo_xlib_surface_create(dpy, show.slide[i], DefaultVisual(dpy,scr), aspx*sw, aspy*sh); cairo = cairo_create(target); cairo_scale(cairo,show.scale,show.scale); poppler_page_render(page,cairo); cairo_surface_destroy(target); cairo_destroy(cairo); /* sorter.view updating */ XFillRectangle(dpy,thumbnail,wgc,0,0,sorter.w,sorter.h); target = cairo_xlib_surface_create( dpy,thumbnail, DefaultVisual(dpy,scr),sorter.w, sorter.h); cairo = cairo_create(target); cairo_scale(cairo,sorter.scale,sorter.scale); poppler_page_render(page,cairo); cairo_surface_destroy(target); cairo_destroy(cairo); XCopyArea(dpy,thumbnail,sorter.view,gc,0,0,sorter.w,sorter.h,x,y); /* increment show.rendered and calculate coordinates for next loop */ show.rendered = i; first_page_rendered = True; if (cancel_render) break; x += sorter.w + 10; if (++n == sorter.grid) { n = 0; x = (sw-sorter.grid*(sorter.w+10))/2; y += sorter.h + 10; } } XFreePixmap(dpy,thumbnail); }
static void emPdfRender(const char * args) { unsigned char * buf, * ps, * pt, * pe; PopplerPage * page; cairo_surface_t * surface; cairo_t * cr; emPdfInst * inst; FILE * f; double srcX, srcY, srcW, srcH; int instId, pageIndex, outW, outH; unsigned int v; if ( sscanf( args,"%d %d %lg %lg %lg %lg %d %d", &instId,&pageIndex,&srcX,&srcY,&srcW,&srcH,&outW,&outH )!=8 || instId<0 || instId>=emPdfInstArraySize || !emPdfInstArray[instId] || pageIndex<0 || pageIndex>=emPdfInstArray[instId]->pageCount || srcW<=0.0 || srcH<=0.0 || outW<=0 || outH<=0 ) { printf("error: emPdfRender: illegal arguments.\n"); return; } inst=emPdfInstArray[instId]; buf=(unsigned char*)malloc(outW*outH*4); memset(buf,0xff,outW*outH*4); surface=cairo_image_surface_create_for_data( buf, CAIRO_FORMAT_RGB24, outW, outH, outW*4 ); if (cairo_surface_status(surface)!=CAIRO_STATUS_SUCCESS) { printf( "error: PDF rendering failed (bad surface status: %d).\n", (int)cairo_surface_status(surface) ); free(buf); return; } cr=cairo_create(surface); if (cairo_status(cr)!=CAIRO_STATUS_SUCCESS) { printf( "error: PDF rendering failed (bad context status: %d).\n", (int)cairo_status(cr) ); cairo_surface_destroy(surface); free(buf); return; } cairo_scale(cr,outW/srcW,outH/srcH); cairo_translate(cr,-srcX,-srcY); page = poppler_document_get_page(inst->doc,pageIndex); if (page) { poppler_page_render(page,cr); g_object_unref(page); } else { memset(buf,0x88,outW*outH*4); } cairo_destroy(cr); cairo_surface_destroy(surface); #if defined(EM_PDF_DEBUG_RENDER_TO_FILE) f=fopen("/tmp/emPdfTest.ppm","wb"); #else f=stdout; #endif fprintf(f,"P6\n%d\n%d\n255\n",outW,outH); ps=buf; pt=buf; pe=buf+outW*outH*4; while (ps<pe) { v=*(unsigned int*)ps; pt[0]=(unsigned char)(v>>16); pt[1]=(unsigned char)(v>>8); pt[2]=(unsigned char)v; ps+=4; pt+=3; } fwrite(buf,outW*outH,3,f); if (f!=stdout) fclose(f); free(buf); }