1
//========================================================================
3
// GDKSplashOutputDev.cc
5
// Copyright 2003 Glyph & Cog, LLC
6
// Copyright 2004 Red Hat, Inc. (GDK port)
8
//========================================================================
12
#ifdef USE_GCC_PRAGMAS
13
#pragma implementation
17
#include <goo/GooHash.h>
18
#include <goo/GooTimer.h>
19
#include <splash/SplashTypes.h>
20
#include <splash/SplashBitmap.h>
22
#include "ProfileData.h"
26
#include "CairoOutputDev.h"
29
#include "GlobalParams.h"
30
#include "ErrorCodes.h"
35
#include "pdf-operators.c"
51
void set_file_name (const char *file_name);
52
void load (const char *file_name);
54
void error_dialog (const char *error_message);
55
void analyze_page (int page);
58
static void on_file_activated (GtkWidget *widget, PdfInspector *inspector);
59
static void on_selection_changed (GtkTreeSelection *selection, PdfInspector *inspector);
60
static void on_analyze_clicked (GtkWidget *widget, PdfInspector *inspector);
65
CairoOutputDev *output;
70
PdfInspector::PdfInspector(void)
75
builder = gtk_builder_new ();
77
if (!gtk_builder_add_from_file (builder, "./pdf-inspector.ui", &error))
79
g_warning ("Couldn't load builder file: %s", error->message);
83
widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_file_chooser_button"));
84
g_signal_connect (widget, "selection-changed", G_CALLBACK (on_file_activated), this);
86
widget = GTK_WIDGET (gtk_builder_get_object (builder, "analyze_button"));
87
g_signal_connect (widget, "clicked", G_CALLBACK (on_analyze_clicked), this);
90
widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_tree_view"));
91
g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)),
92
"changed", G_CALLBACK (on_selection_changed), this);
93
model = (GtkTreeModel *)gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_INT,
94
G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
95
gtk_tree_view_set_model (GTK_TREE_VIEW (widget), model);
96
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
98
gtk_cell_renderer_text_new (),
102
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
104
gtk_cell_renderer_text_new (),
108
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
110
gtk_cell_renderer_text_new (),
114
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
116
gtk_cell_renderer_text_new (),
120
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
122
gtk_cell_renderer_text_new (),
126
for (int i = 0; i < N_COLUMNS; i++)
128
GtkTreeViewColumn *column;
130
column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), i);
131
gtk_tree_view_column_set_sort_column_id (column, i);
134
output = new CairoOutputDev();
135
output->setPrinting (gFalse);
137
// set up initial widgets
142
PdfInspector::set_file_name(const char *file_name)
146
widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_file_chooser_button"));
147
gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), file_name);
151
PdfInspector::on_file_activated (GtkWidget *widget, PdfInspector *inspector)
155
file_name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
157
inspector->load (file_name);
163
PdfInspector::on_selection_changed (GtkTreeSelection *selection, PdfInspector *inspector)
171
label = GTK_WIDGET (gtk_builder_get_object (inspector->builder, "description_label"));
172
gtk_label_set_markup (GTK_LABEL (label), "<i>No Description</i>");
174
if (gtk_tree_selection_get_selected (selection, &model, &iter))
176
gtk_tree_model_get (model, &iter,
185
for (i = 0; i < G_N_ELEMENTS (op_mapping); i++)
188
if (!strcmp (op, op_mapping[i].op))
191
text = g_strdup_printf ("<i>%s</i>", op_mapping[i].description);
192
gtk_label_set_markup (GTK_LABEL (label), text);
202
PdfInspector::on_analyze_clicked (GtkWidget *widget, PdfInspector *inspector)
207
spin = GTK_WIDGET (gtk_builder_get_object (inspector->builder, "pdf_spin"));
209
page = (int) gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin));
211
inspector->analyze_page (page);
216
PdfInspector::analyze_page (int page)
225
cairo_surface_t *surface;
227
label = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_total_label"));
229
output->startProfile ();
230
gtk_list_store_clear (GTK_LIST_STORE (model));
233
surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
234
doc->getPageCropWidth(page + 1),
235
doc->getPageCropHeight(page + 1));
236
cr = cairo_create (surface);
237
cairo_surface_destroy (surface);
238
output->setCairo (cr);
240
doc->displayPage (output, page + 1, 72, 72, 0, gFalse, gTrue, gFalse);
241
output->setCairo (NULL);
244
text = g_strdup_printf ("%g", timer.getElapsed ());
245
gtk_label_set_text (GTK_LABEL (label), text);
249
hash = output->endProfile ();
250
hash->startIter(&iter);
251
while (hash->getNext(&iter, &key, &p))
253
GtkTreeIter tree_iter;
254
ProfileData *data_p = (ProfileData *) p;
256
gtk_list_store_append (GTK_LIST_STORE (model), &tree_iter);
257
gtk_list_store_set (GTK_LIST_STORE (model), &tree_iter,
258
OP_STRING, key->getCString(),
259
OP_COUNT, data_p->getCount (),
260
OP_TOTAL, data_p->getTotal (),
261
OP_MIN, data_p->getMin (),
262
OP_MAX, data_p->getMax (),
265
hash->killIter(&iter);
266
deleteGooHash (hash, ProfileData);
270
PdfInspector::load(const char *file_name)
276
// kill the old PDF file
286
GooString *filename_g;
288
filename_g = new GooString (file_name);
289
doc = new PDFDoc(filename_g, 0, 0);
293
if (doc && !doc->isOk())
295
this->error_dialog ("Failed to load file.");
300
spin = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_spin"));
301
button = GTK_WIDGET (gtk_builder_get_object (builder, "analyze_button"));
302
label = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_total_label"));
303
gtk_label_set_text (GTK_LABEL (label), "");
307
gtk_widget_set_sensitive (spin, TRUE);
308
gtk_widget_set_sensitive (button, TRUE);
309
gtk_widget_set_sensitive (label, TRUE);
310
gtk_spin_button_set_range (GTK_SPIN_BUTTON (spin), 0, doc->getNumPages()-1);
311
gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0);
313
output->startDoc (doc->getXRef(), doc->getCatalog());
317
gtk_widget_set_sensitive (spin, FALSE);
318
gtk_widget_set_sensitive (button, FALSE);
319
gtk_widget_set_sensitive (label, FALSE);
324
PdfInspector::error_dialog (const char *error_message)
326
g_warning ("%s", error_message);
334
dialog = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_dialog"));
336
gtk_dialog_run (GTK_DIALOG (dialog));
342
main (int argc, char *argv [])
344
const char *file_name = NULL;
345
PdfInspector *inspector;
347
gtk_init (&argc, &argv);
349
globalParams = new GlobalParams();
350
globalParams->setProfileCommands (true);
351
globalParams->setPrintCommands (true);
357
fprintf (stderr, "usage: %s [PDF-FILE]\n", argv[0]);
361
inspector = new PdfInspector ();
364
inspector->set_file_name (file_name);