2014-06-28 28 views
2

語言 C,UI庫: GTK,渲染: poppler的如何使用poppler的放大

我在GTK/poppler的編程新手,有點卡住瞭解如何解決放大問題與poppler的。 當我使用下面的函數時,除縮放外(因此 - 滾動條),一切正常。

我試圖從here得到的想法,但現在看來,我不明白屏幕/文件是如何在所有:(渲染。

PopplerPage  *ppage_P2 = NULL; 
PopplerDocument *document_P2 = NULL; 
cairo_surface_t *surface_P2 = NULL; 

/* pdf_doc__view_page 
* page - page number; 
* zoom - floating nomber, 1.0 is 'no zoom' 
*/ 
void pdf_doc__view_page (int page, float _zoom){ 
    int err; 
    int w, h; 
    double width, height; 
    cairo_t *cr; 

    if(document_P2==NULL)/
     return; 
    ppage_P2 = poppler_document_get_page (document_P2, page); 
    if(ppage_P2==NULL) 
     return; 
    poppler_page_get_size (ppage_P2, &width, &height); 
    w = (int) ceil(width); 
    h = (int) ceil(height); 
    if(surface_P2) 
     cairo_surface_destroy (surface_P2); 
    surface_P2 = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w*zoom_P2, h*zoom_P2); 
    cr = cairo_create (surface_P2); 
    poppler_page_render (ppage_P2, cr); 
    cairo_destroy (cr); 
    if(drawarea_P2==NULL) 
     return; 
    gtk_widget_set_size_request (drawarea_P2, w*zoom_P2, h*zoom_P2); 
    gtk_widget_queue_draw (drawarea_P2); 
    // self.SetScrollbars(u, u, (self.width*self.scale)/u, (self.height*self.scale)/u) 
    update_statusbar(); 
} 

回答

0

要具有「滾動條」,你必須把觀衆的GtkScrolledWindow,我懷疑你已經做到了。

要讓他們實際上工作,一旦poppler渲染頁面,你可以問poppler的渲染大小,然後設置查看器的大小。在此之前,滾動條不知道繪圖的大小:

viewer_page = poppler_document_get_page(viewer_doc, 0); 
// add a test to see if page was rendered correctly 

poppler_page_get_size(viewer_page, &width, &height); 
gtk_widget_set_size_request(viewer.drawingarea, (int)width, (int)height); 
+0

正確^ _ ^已經做了:)但是,無論如何謝謝+也許是別人會卡住這個問題:) –

0

這就是答案。(但我仍然沒有得到如何正確地創建滾動條)。

cr = cairo_create (surface_P2); 
    cairo_scale(cr, zoom_P1 , zoom_P1); 
    cairo_set_source_rgb(cr, 1.0, 1.0, 1.0); 
    cairo_paint(cr); 
    poppler_page_render(ppage_P2, cairo); 
    cairo_destroy(cr); 
    cairo_surface_destroy(surface_P2); 
    g_object_unref(G_OBJECT(ppage_P2)); 
    if(drawarea_P2==NULL) 
     return; 
    gtk_widget_set_size_request (drawarea_P2, w, h); 
    gtk_widget_queue_draw (drawarea_P2); 
    // self.SetScrollbars(u, u, (self.width*self.scale)/u, (self.height*self.scale)/u) 
    update_statusbar(); 
    }