Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
	}
}
Esempio n. 3
0
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);
    }
}
Esempio n. 4
0
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);
}
Esempio n. 5
0
        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;
    }
Esempio n. 6
0
File: doc.c Progetto: arsane/vipdf
/* 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;
}
Esempio n. 7
0
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;
}
Esempio n. 8
0
/* 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;
}
Esempio n. 9
0
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);
}
Esempio n. 10
0
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);
}
Esempio n. 11
0
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);
}
Esempio n. 12
0
File: view.c Progetto: N8Fear/adwc
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));
}
Esempio n. 13
0
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);
}
Esempio n. 14
0
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);
}
Esempio n. 15
0
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;
}
Esempio n. 16
0
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);
}
Esempio n. 17
0
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);
}
Esempio n. 18
0
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;
}
Esempio n. 19
0
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;
}
Esempio n. 20
0
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;
}
Esempio n. 21
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;
}
Esempio n. 22
0
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;
}
Esempio n. 23
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);
}
Esempio n. 24
0
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;
}
Esempio n. 25
0
static VALUE
page_render(VALUE self, VALUE cairo)
{
    poppler_page_render(SELF(self), RVAL2CRCONTEXT(cairo));
    return Qnil;
}
Esempio n. 26
0
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);
}
Esempio n. 27
0
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);
}