aboutsummaryrefslogtreecommitdiff
path: root/tests/poppler/glib/demo/fonts.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/poppler/glib/demo/fonts.c')
-rw-r--r--tests/poppler/glib/demo/fonts.c276
1 files changed, 276 insertions, 0 deletions
diff --git a/tests/poppler/glib/demo/fonts.c b/tests/poppler/glib/demo/fonts.c
new file mode 100644
index 00000000..07ea5899
--- /dev/null
+++ b/tests/poppler/glib/demo/fonts.c
@@ -0,0 +1,276 @@
+/*
+ * Copyright (C) 2007 Carlos Garcia Campos <carlosgc@gnome.org>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+
+#include "fonts.h"
+
+enum {
+ FONTS_NAME_COLUMN,
+ FONTS_DETAILS_COLUMN,
+ N_COLUMNS
+};
+
+typedef struct {
+ PopplerDocument *doc;
+
+ GtkWidget *treeview;
+ GtkWidget *progress;
+
+ guint idle_id;
+} PgdFontsDemo;
+
+static void
+pgd_fonts_free (PgdFontsDemo *demo)
+{
+ if (!demo)
+ return;
+
+ if (demo->idle_id > 0) {
+ g_source_remove (demo->idle_id);
+ demo->idle_id = 0;
+ }
+
+ if (demo->doc) {
+ g_object_unref (demo->doc);
+ demo->doc = NULL;
+ }
+
+ g_free (demo);
+}
+
+static void
+pdg_fonts_cell_data_func (GtkTreeViewColumn *col,
+ GtkCellRenderer *renderer,
+ GtkTreeModel *model,
+ GtkTreeIter *iter,
+ gpointer user_data)
+{
+ char *name;
+ char *details;
+ char *markup;
+
+ gtk_tree_model_get (model, iter,
+ FONTS_NAME_COLUMN, &name,
+ FONTS_DETAILS_COLUMN, &details,
+ -1);
+
+ if (details) {
+ markup = g_strdup_printf ("<b><big>%s</big></b>\n<small>%s</small>",
+ name, details);
+ } else {
+ markup = g_strdup_printf ("<b><big>%s</big></b>", name);
+ }
+
+ g_object_set (renderer, "markup", markup, NULL);
+
+ g_free (markup);
+ g_free (details);
+ g_free (name);
+}
+
+static const gchar *
+font_type_to_string (PopplerFontType type)
+{
+ switch (type) {
+ case POPPLER_FONT_TYPE_TYPE1:
+ return "Type 1";
+ case POPPLER_FONT_TYPE_TYPE1C:
+ return "Type 1C";
+ case POPPLER_FONT_TYPE_TYPE3:
+ return "Type 3";
+ case POPPLER_FONT_TYPE_TRUETYPE:
+ return "TrueType";
+ case POPPLER_FONT_TYPE_CID_TYPE0:
+ return "Type 1 (CID)";
+ case POPPLER_FONT_TYPE_CID_TYPE0C:
+ return "Type 1C (CID)";
+ case POPPLER_FONT_TYPE_CID_TYPE2:
+ return "TrueType (CID)";
+ default:
+ return "Unknown font type";
+ }
+}
+
+static void
+pgd_fonts_update_progress (PgdFontsDemo *demo,
+ gint n_pages,
+ gint scanned)
+{
+ gchar *str;
+
+ str = g_strdup_printf ("Scanning fonts (%d%%)",
+ MIN (scanned * 100 / n_pages, 100));
+ gtk_progress_bar_set_text (GTK_PROGRESS_BAR (demo->progress), str);
+ gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (demo->progress),
+ MIN ((gdouble)scanned / n_pages, 1.0));
+ g_free (str);
+}
+
+static gboolean
+pgd_fonts_fill_model (PgdFontsDemo *demo)
+{
+ GtkTreeModel *model;
+ PopplerFontInfo *font_info;
+ PopplerFontsIter *fonts_iter;
+ gint n_pages, scanned = 0;
+
+ n_pages = poppler_document_get_n_pages (demo->doc);
+
+ model = gtk_tree_view_get_model (GTK_TREE_VIEW (demo->treeview));
+ g_object_ref (model);
+
+ gtk_list_store_clear (GTK_LIST_STORE (model));
+
+ font_info = poppler_font_info_new (demo->doc);
+
+ while (poppler_font_info_scan (font_info, 20, &fonts_iter)) {
+ pgd_fonts_update_progress (demo, n_pages, scanned);
+
+ while (gtk_events_pending ())
+ gtk_main_iteration ();
+
+ scanned += 20;
+
+ if (!fonts_iter)
+ continue;
+
+ do {
+ GtkTreeIter iter;
+ const gchar *name;
+ const gchar *type;
+ const gchar *embedded;
+ const gchar *filename;
+ gchar *details;
+
+ name = poppler_fonts_iter_get_name (fonts_iter);
+ if (!name)
+ name = "No name";
+
+ type = font_type_to_string (poppler_fonts_iter_get_font_type (fonts_iter));
+
+ if (poppler_fonts_iter_is_embedded (fonts_iter)) {
+ if (poppler_fonts_iter_is_subset (fonts_iter))
+ embedded = "Embedded subset";
+ else
+ embedded = "Embedded";
+ } else {
+ embedded = "Not embedded";
+ }
+
+ filename = poppler_fonts_iter_get_file_name (fonts_iter);
+
+ if (filename)
+ details = g_markup_printf_escaped ("%s\n%s (%s)", type, embedded, filename);
+ else
+ details = g_markup_printf_escaped ("%s\n%s", type, embedded);
+
+ gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+ gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+ FONTS_NAME_COLUMN, name,
+ FONTS_DETAILS_COLUMN, details,
+ -1);
+
+ g_free (details);
+ } while (poppler_fonts_iter_next (fonts_iter));
+ poppler_fonts_iter_free (fonts_iter);
+ }
+
+ pgd_fonts_update_progress (demo, n_pages, scanned);
+
+ g_object_unref (font_info);
+ g_object_unref (model);
+
+ return FALSE;
+}
+
+static void
+pgd_fonts_scan_button_clicked (GtkButton *button,
+ PgdFontsDemo *demo)
+{
+ demo->idle_id = g_idle_add ((GSourceFunc)pgd_fonts_fill_model, demo);
+}
+
+GtkWidget *
+pgd_fonts_create_widget (PopplerDocument *document)
+{
+ PgdFontsDemo *demo;
+ GtkWidget *vbox;
+ GtkListStore *model;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+ GtkWidget *swindow;
+ GtkWidget *hbox, *button;
+
+ demo = g_new0 (PgdFontsDemo, 1);
+
+ demo->doc = g_object_ref (document);
+
+ vbox = gtk_vbox_new (FALSE, 12);
+
+ hbox = gtk_hbox_new (FALSE, 6);
+
+ demo->progress = gtk_progress_bar_new ();
+ gtk_progress_bar_set_ellipsize (GTK_PROGRESS_BAR (demo->progress),
+ PANGO_ELLIPSIZE_END);
+ gtk_box_pack_start (GTK_BOX (hbox), demo->progress, TRUE, TRUE, 0);
+ gtk_widget_show (demo->progress);
+
+ button = gtk_button_new_with_label ("Scan");
+ g_signal_connect (G_OBJECT (button), "clicked",
+ G_CALLBACK (pgd_fonts_scan_button_clicked),
+ (gpointer)demo);
+ gtk_box_pack_end (GTK_BOX (hbox), button, FALSE, FALSE, 0);
+ gtk_widget_show (button);
+
+ gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, TRUE, 6);
+ gtk_widget_show (hbox);
+
+ swindow = gtk_scrolled_window_new (NULL, NULL);
+ gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+ model = gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_STRING);
+ demo->treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (model));
+ gtk_tree_view_set_headers_visible (GTK_TREE_VIEW (demo->treeview), FALSE);
+ gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (demo->treeview), TRUE);
+ gtk_tree_selection_set_mode (gtk_tree_view_get_selection (GTK_TREE_VIEW (demo->treeview)),
+ GTK_SELECTION_NONE);
+ g_object_unref (model);
+
+ column = gtk_tree_view_column_new ();
+ gtk_tree_view_append_column (GTK_TREE_VIEW (demo->treeview), column);
+
+ renderer = gtk_cell_renderer_text_new ();
+ gtk_tree_view_column_pack_start (GTK_TREE_VIEW_COLUMN (column), renderer, FALSE);
+ gtk_tree_view_column_set_cell_data_func (column, renderer,
+ pdg_fonts_cell_data_func,
+ NULL, NULL);
+
+ gtk_container_add (GTK_CONTAINER (swindow), demo->treeview);
+ gtk_widget_show (demo->treeview);
+
+ gtk_box_pack_start (GTK_BOX (vbox), swindow, TRUE, TRUE, 0);
+ gtk_widget_show (swindow);
+
+ g_object_weak_ref (G_OBJECT (swindow),
+ (GWeakNotify)pgd_fonts_free,
+ (gpointer)demo);
+
+ return vbox;
+}