summaryrefslogtreecommitdiff
path: root/Build/source/libs/poppler/poppler-0.12.4/test/pdf-inspector.cc
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/poppler/poppler-0.12.4/test/pdf-inspector.cc')
-rw-r--r--Build/source/libs/poppler/poppler-0.12.4/test/pdf-inspector.cc373
1 files changed, 373 insertions, 0 deletions
diff --git a/Build/source/libs/poppler/poppler-0.12.4/test/pdf-inspector.cc b/Build/source/libs/poppler/poppler-0.12.4/test/pdf-inspector.cc
new file mode 100644
index 00000000000..24bebbd61b7
--- /dev/null
+++ b/Build/source/libs/poppler/poppler-0.12.4/test/pdf-inspector.cc
@@ -0,0 +1,373 @@
+//========================================================================
+//
+// GDKSplashOutputDev.cc
+//
+// Copyright 2003 Glyph & Cog, LLC
+// Copyright 2004 Red Hat, Inc. (GDK port)
+//
+//========================================================================
+
+#include <config.h>
+
+#ifdef USE_GCC_PRAGMAS
+#pragma implementation
+#endif
+
+#include <goo/gmem.h>
+#include <goo/GooHash.h>
+#include <goo/GooTimer.h>
+#include <splash/SplashTypes.h>
+#include <splash/SplashBitmap.h>
+#include "Object.h"
+#include "ProfileData.h"
+#include "GfxState.h"
+
+#include <gdk/gdk.h>
+#include "CairoOutputDev.h"
+
+#include "PDFDoc.h"
+#include "GlobalParams.h"
+#include "ErrorCodes.h"
+#include <gtk/gtk.h>
+
+
+// Mapping
+#include "pdf-operators.c"
+
+enum {
+ OP_STRING,
+ OP_COUNT,
+ OP_TOTAL,
+ OP_MIN,
+ OP_MAX,
+ N_COLUMNS
+};
+
+class PdfInspector {
+public:
+
+ PdfInspector(void);
+
+ void set_file_name (const char *file_name);
+ void load (const char *file_name);
+ void run (void);
+ void error_dialog (const char *error_message);
+ void analyze_page (int page);
+
+private:
+ static void on_file_activated (GtkWidget *widget, PdfInspector *inspector);
+ static void on_selection_changed (GtkTreeSelection *selection, PdfInspector *inspector);
+ static void on_analyze_clicked (GtkWidget *widget, PdfInspector *inspector);
+
+ GtkBuilder* builder;
+ GtkTreeModel *model;
+ PDFDoc *doc;
+ CairoOutputDev *output;
+};
+
+
+
+PdfInspector::PdfInspector(void)
+{
+ GtkWidget *widget;
+ GError* error = NULL;
+
+ builder = gtk_builder_new ();
+
+ if (!gtk_builder_add_from_file (builder, "./pdf-inspector.ui", &error))
+ {
+ g_warning ("Couldn't load builder file: %s", error->message);
+ g_error_free (error);
+ }
+
+ widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_file_chooser_button"));
+ g_signal_connect (widget, "selection-changed", G_CALLBACK (on_file_activated), this);
+
+ widget = GTK_WIDGET (gtk_builder_get_object (builder, "analyze_button"));
+ g_signal_connect (widget, "clicked", G_CALLBACK (on_analyze_clicked), this);
+
+ // setup the TreeView
+ widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_tree_view"));
+ g_signal_connect (gtk_tree_view_get_selection (GTK_TREE_VIEW (widget)),
+ "changed", G_CALLBACK (on_selection_changed), this);
+ model = (GtkTreeModel *)gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_INT,
+ G_TYPE_DOUBLE, G_TYPE_DOUBLE, G_TYPE_DOUBLE);
+ gtk_tree_view_set_model (GTK_TREE_VIEW (widget), model);
+ gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
+ 0, "Operation",
+ gtk_cell_renderer_text_new (),
+ "text", OP_STRING,
+ NULL);
+
+ gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
+ 1, "Count",
+ gtk_cell_renderer_text_new (),
+ "text", OP_COUNT,
+ NULL);
+
+ gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
+ 2, "Elapsed",
+ gtk_cell_renderer_text_new (),
+ "text", OP_TOTAL,
+ NULL);
+
+ gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
+ 3, "Min",
+ gtk_cell_renderer_text_new (),
+ "text", OP_MIN,
+ NULL);
+
+ gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (widget),
+ 4, "Max",
+ gtk_cell_renderer_text_new (),
+ "text", OP_MAX,
+ NULL);
+
+ for (int i = 0; i < N_COLUMNS; i++)
+ {
+ GtkTreeViewColumn *column;
+
+ column = gtk_tree_view_get_column (GTK_TREE_VIEW (widget), i);
+ gtk_tree_view_column_set_sort_column_id (column, i);
+ }
+ doc = NULL;
+ output = new CairoOutputDev();
+
+ // set up initial widgets
+ load (NULL);
+}
+
+void
+PdfInspector::set_file_name(const char *file_name)
+{
+ GtkWidget *widget;
+
+ widget = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_file_chooser_button"));
+ gtk_file_chooser_set_filename (GTK_FILE_CHOOSER (widget), file_name);
+}
+
+void
+PdfInspector::on_file_activated (GtkWidget *widget, PdfInspector *inspector)
+{
+ gchar *file_name;
+
+ file_name = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (widget));
+ if (file_name)
+ inspector->load (file_name);
+
+ g_free (file_name);
+}
+
+void
+PdfInspector::on_selection_changed (GtkTreeSelection *selection, PdfInspector *inspector)
+{
+ GtkWidget *label;
+ size_t i;
+ GtkTreeModel *model;
+ GtkTreeIter iter;
+ gchar *op = NULL;
+
+ label = GTK_WIDGET (gtk_builder_get_object (inspector->builder, "description_label"));
+ gtk_label_set_markup (GTK_LABEL (label), "<i>No Description</i>");
+
+ if (gtk_tree_selection_get_selected (selection, &model, &iter))
+ {
+ gtk_tree_model_get (model, &iter,
+ OP_STRING, &op,
+ -1);
+
+ }
+
+ if (op == NULL)
+ return;
+
+ for (i = 0; i < G_N_ELEMENTS (op_mapping); i++)
+ {
+
+ if (!strcmp (op, op_mapping[i].op))
+ {
+ gchar *text;
+ text = g_strdup_printf ("<i>%s</i>", op_mapping[i].description);
+ gtk_label_set_markup (GTK_LABEL (label), text);
+ g_free (text);
+ break;
+ }
+ }
+
+ g_free (op);
+}
+
+void
+PdfInspector::on_analyze_clicked (GtkWidget *widget, PdfInspector *inspector)
+{
+ GtkWidget *spin;
+ int page;
+
+ spin = GTK_WIDGET (gtk_builder_get_object (inspector->builder, "pdf_spin"));
+
+ page = (int) gtk_spin_button_get_value (GTK_SPIN_BUTTON (spin));
+
+ inspector->analyze_page (page);
+
+}
+
+void
+PdfInspector::analyze_page (int page)
+{
+ GooHashIter *iter;
+ GooHash *hash;
+ GooString *key;
+ void *p;
+ GtkWidget *label;
+ char *text;
+ cairo_t *cr;
+ cairo_surface_t *surface;
+
+ label = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_total_label"));
+
+ output->startProfile ();
+ gtk_list_store_clear (GTK_LIST_STORE (model));
+
+ GooTimer timer;
+ surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
+ doc->getPageCropWidth(page + 1),
+ doc->getPageCropHeight(page + 1));
+ cr = cairo_create (surface);
+ cairo_surface_destroy (surface);
+ output->setCairo (cr);
+ cairo_destroy (cr);
+ doc->displayPage (output, page + 1, 72, 72, 0, gFalse, gTrue, gTrue);
+ output->setCairo (NULL);
+
+ // Total time;
+ text = g_strdup_printf ("%g", timer.getElapsed ());
+ gtk_label_set_text (GTK_LABEL (label), text);
+ g_free (text);
+
+ // Individual times;
+ hash = output->endProfile ();
+ hash->startIter(&iter);
+ while (hash->getNext(&iter, &key, &p))
+ {
+ GtkTreeIter tree_iter;
+ ProfileData *data_p = (ProfileData *) p;
+
+ gtk_list_store_append (GTK_LIST_STORE (model), &tree_iter);
+ gtk_list_store_set (GTK_LIST_STORE (model), &tree_iter,
+ OP_STRING, key->getCString(),
+ OP_COUNT, data_p->getCount (),
+ OP_TOTAL, data_p->getTotal (),
+ OP_MIN, data_p->getMin (),
+ OP_MAX, data_p->getMax (),
+ -1);
+ }
+ hash->killIter(&iter);
+ deleteGooHash (hash, ProfileData);
+}
+
+void
+PdfInspector::load(const char *file_name)
+{
+ GtkWidget *spin;
+ GtkWidget *button;
+ GtkWidget *label;
+
+ // kill the old PDF file
+ if (doc != NULL)
+ {
+ delete doc;
+ doc = NULL;
+ }
+
+ // load the new file
+ if (file_name)
+ {
+ GooString *filename_g;
+
+ filename_g = new GooString (file_name);
+ doc = new PDFDoc(filename_g, 0, 0);
+ delete filename_g;
+ }
+
+ if (doc && !doc->isOk())
+ {
+ this->error_dialog ("Failed to load file.");
+ delete doc;
+ doc = NULL;
+ }
+
+ spin = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_spin"));
+ button = GTK_WIDGET (gtk_builder_get_object (builder, "analyze_button"));
+ label = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_total_label"));
+ gtk_label_set_text (GTK_LABEL (label), "");
+
+ if (doc)
+ {
+ gtk_widget_set_sensitive (spin, TRUE);
+ gtk_widget_set_sensitive (button, TRUE);
+ gtk_widget_set_sensitive (label, TRUE);
+ gtk_spin_button_set_range (GTK_SPIN_BUTTON (spin), 0, doc->getNumPages()-1);
+ gtk_spin_button_set_value (GTK_SPIN_BUTTON (spin), 0);
+
+ output->startDoc (doc->getXRef(), doc->getCatalog());
+ }
+ else
+ {
+ gtk_widget_set_sensitive (spin, FALSE);
+ gtk_widget_set_sensitive (button, FALSE);
+ gtk_widget_set_sensitive (label, FALSE);
+ }
+}
+
+void
+PdfInspector::error_dialog (const char *error_message)
+{
+ g_warning ("%s", error_message);
+}
+
+void
+PdfInspector::run()
+{
+ GtkWidget *dialog;
+
+ dialog = GTK_WIDGET (gtk_builder_get_object (builder, "pdf_dialog"));
+
+ gtk_dialog_run (GTK_DIALOG (dialog));
+}
+
+
+
+int
+main (int argc, char *argv [])
+{
+ const char *file_name = NULL;
+ PdfInspector *inspector;
+
+ gtk_init (&argc, &argv);
+
+ globalParams = new GlobalParams();
+ globalParams->setProfileCommands (true);
+ globalParams->setPrintCommands (true);
+
+ if (argc == 2)
+ file_name = argv[1];
+ else if (argc > 2)
+ {
+ fprintf (stderr, "usage: %s [PDF-FILE]\n", argv[0]);
+ return -1;
+ }
+
+ inspector = new PdfInspector ();
+
+ if (file_name)
+ inspector->set_file_name (file_name);
+
+ inspector->run ();
+
+ delete inspector;
+ delete globalParams;
+
+ return 0;
+}
+
+