~ubuntu-branches/ubuntu/vivid/emscripten/vivid

« back to all changes in this revision

Viewing changes to tests/poppler/test/gtk-cairo-test.cc

  • Committer: Package Import Robot
  • Author(s): Sylvestre Ledru
  • Date: 2013-05-02 13:11:51 UTC
  • Revision ID: package-import@ubuntu.com-20130502131151-q8dvteqr1ef2x7xz
Tags: upstream-1.4.1~20130504~adb56cb
ImportĀ upstreamĀ versionĀ 1.4.1~20130504~adb56cb

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
//========================================================================
 
2
//
 
3
// GDKSplashOutputDev.cc
 
4
//
 
5
// Copyright 2003 Glyph & Cog, LLC
 
6
// Copyright 2004 Red Hat, Inc. (GDK port)
 
7
//
 
8
//========================================================================
 
9
 
 
10
#include <config.h>
 
11
 
 
12
#ifdef USE_GCC_PRAGMAS
 
13
#pragma implementation
 
14
#endif
 
15
 
 
16
#include <math.h>
 
17
#include <gdk/gdk.h>
 
18
#include <gtk/gtk.h>
 
19
#include <poppler.h>
 
20
 
 
21
typedef struct
 
22
{
 
23
  GtkWidget *window;
 
24
  GtkWidget *sw;
 
25
  GtkWidget *drawing_area;
 
26
  GtkWidget *spin_button;
 
27
  PopplerPage *page;
 
28
  PopplerDocument *document;
 
29
  cairo_surface_t *surface;
 
30
  int *window_count;
 
31
} View;
 
32
 
 
33
static void
 
34
drawing_area_expose (GtkWidget      *drawing_area,
 
35
                     GdkEventExpose *event,
 
36
                     void           *data)
 
37
{
 
38
  View *v = (View*) data;
 
39
  cairo_t *cr;
 
40
 
 
41
  gdk_window_clear (drawing_area->window);
 
42
  cr = gdk_cairo_create (drawing_area->window);
 
43
 
 
44
  cairo_set_source_surface (cr, v->surface, 0, 0);
 
45
  cairo_paint (cr);
 
46
  cairo_destroy (cr);
 
47
}
 
48
 
 
49
static void
 
50
view_set_page (View *v, int page)
 
51
{
 
52
  int w, h;
 
53
  double width, height;
 
54
  cairo_t *cr;
 
55
 
 
56
  v->page = poppler_document_get_page (v->document, page);
 
57
  poppler_page_get_size (v->page, &width, &height);
 
58
  w = (int) ceil(width);
 
59
  h = (int) ceil(height);
 
60
  cairo_surface_destroy (v->surface);
 
61
  v->surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, w, h);
 
62
  cr = cairo_create (v->surface);
 
63
  poppler_page_render (v->page, cr);
 
64
  cairo_destroy (cr);
 
65
  gtk_widget_set_size_request (v->drawing_area, w, h);
 
66
  gtk_widget_queue_draw (v->drawing_area);
 
67
  gtk_spin_button_set_value (GTK_SPIN_BUTTON (v->spin_button), page);
 
68
}
 
69
 
 
70
static void
 
71
page_changed_callback (GtkSpinButton *button, View *v)
 
72
{
 
73
    int page;
 
74
 
 
75
    page = gtk_spin_button_get_value_as_int (button);
 
76
    view_set_page (v, page);
 
77
}
 
78
 
 
79
static void
 
80
destroy_window_callback (GtkWindow *window, View *v)
 
81
{
 
82
    if (--(*v->window_count) == 0)
 
83
        gtk_main_quit();
 
84
}
 
85
 
 
86
static View*
 
87
view_new (const char *filename, int *window_count)
 
88
{
 
89
  View *v;
 
90
  GtkWidget *window;
 
91
  GtkWidget *drawing_area;
 
92
  GtkWidget *sw;
 
93
  GtkWidget *vbox, *hbox;
 
94
  GtkWidget *spin_button;
 
95
  int n_pages;
 
96
 
 
97
  v = g_new0 (View, 1);
 
98
 
 
99
  v->document = poppler_document_new_from_file (filename, NULL, NULL);
 
100
  if (v->document == NULL)
 
101
      return NULL;
 
102
 
 
103
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
104
  vbox = gtk_vbox_new(FALSE, 5);
 
105
 
 
106
  gtk_container_add (GTK_CONTAINER (window), vbox);
 
107
  drawing_area = gtk_drawing_area_new ();
 
108
 
 
109
  sw = gtk_scrolled_window_new (NULL, NULL);
 
110
 
 
111
  gtk_box_pack_end (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
 
112
  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (sw),
 
113
                                         drawing_area);
 
114
 
 
115
  n_pages = poppler_document_get_n_pages (v->document);
 
116
  spin_button = gtk_spin_button_new_with_range  (0, n_pages - 1, 1);
 
117
  g_signal_connect (G_OBJECT (spin_button), "value-changed",
 
118
                    G_CALLBACK (page_changed_callback), v);
 
119
  hbox = gtk_hbox_new (FALSE, 5);
 
120
  gtk_box_pack_end (GTK_BOX (hbox), spin_button, FALSE, TRUE, 0);
 
121
 
 
122
  gtk_box_pack_end (GTK_BOX (vbox), hbox, FALSE, TRUE, 0);
 
123
 
 
124
  gtk_widget_show_all (window);
 
125
  gtk_widget_realize (window);
 
126
 
 
127
  v->window = window;
 
128
  v->drawing_area = drawing_area;
 
129
  v->sw = sw;
 
130
  v->window_count = window_count;
 
131
  v->spin_button = spin_button;
 
132
 
 
133
  g_signal_connect (drawing_area,
 
134
                    "expose_event",
 
135
                    G_CALLBACK (drawing_area_expose),
 
136
                    (void*) v);
 
137
  
 
138
  g_signal_connect (window,
 
139
                    "destroy",
 
140
                    G_CALLBACK (destroy_window_callback),
 
141
                    (void*) v);
 
142
 
 
143
  return v;
 
144
}
 
145
 
 
146
static int option_page = 0;
 
147
static GOptionEntry demo_options[] = {
 
148
  { "page", 0, 0, G_OPTION_ARG_INT, &option_page, "Page number", "PAGE" },
 
149
  { NULL }
 
150
};
 
151
    
 
152
int
 
153
main (int argc, char *argv [])
 
154
{
 
155
  View *v;
 
156
  int i, window_count;
 
157
  GOptionContext *ctx;
 
158
 
 
159
  ctx = g_option_context_new("FILENAME ...");
 
160
  g_option_context_add_main_entries(ctx, demo_options, "main");
 
161
  g_option_context_parse(ctx, &argc, &argv, NULL);
 
162
  g_option_context_free(ctx);
 
163
 
 
164
  gtk_init (&argc, &argv);
 
165
   
 
166
  if (argc == 1)
 
167
    {
 
168
      char *basename = g_path_get_basename (argv[0]);
 
169
      fprintf (stderr, "usage: %s PDF-FILES...\n", basename);
 
170
      g_free (basename);
 
171
      return -1;
 
172
    }
 
173
      
 
174
  window_count = 0;
 
175
  for (i = 1; i < argc; i++) {
 
176
      v = view_new (argv[i], &window_count);
 
177
      if (v == NULL) {
 
178
          g_printerr ("Error loading %s\n", argv[i]);
 
179
          continue;
 
180
      }
 
181
      
 
182
      view_set_page (v, option_page);
 
183
      window_count++;
 
184
  }
 
185
  
 
186
  if (window_count > 0)
 
187
    gtk_main ();
 
188
  
 
189
  return 0;
 
190
}