+ GError *err = NULL;
+
+ retval = klass->load (document, uri, &err);
+ if (!retval) {
+ if (err) {
+ g_propagate_error (error, err);
+ } else {
+ g_warning ("%s::EvDocument::load returned FALSE but did not fill in @error; fix the backend!\n",
+ G_OBJECT_TYPE_NAME (document));
+
+ /* So upper layers don't crash */
+ g_set_error_literal (error,
+ EV_DOCUMENT_ERROR,
+ EV_DOCUMENT_ERROR_INVALID,
+ "Internal error in backend");
+ }
+ } else {
+ gint i;
+ EvDocumentPrivate *priv = document->priv;
+
+ /* Cache some info about the document to avoid
+ * going to the backends since it requires locks
+ */
+ priv->uri = g_strdup (uri);
+ priv->n_pages = _ev_document_get_n_pages (document);
+ priv->info = _ev_document_get_info (document);
+
+ for (i = 0; i < priv->n_pages; i++) {
+ EvPage *page = ev_document_get_page (document, i);
+ gdouble page_width = 0;
+ gdouble page_height = 0;
+ EvPageSize *page_size;
+ gchar *page_label;
+
+ _ev_document_get_page_size (document, page, &page_width, &page_height);
+
+ if (i == 0) {
+ priv->uniform_width = page_width;
+ priv->uniform_height = page_height;
+ priv->max_width = priv->uniform_width;
+ priv->max_height = priv->uniform_height;
+ } else if (priv->uniform &&
+ (priv->uniform_width != page_width ||
+ priv->uniform_height != page_height)) {
+ /* It's a different page size. Backfill the array. */
+ int j;
+
+ priv->page_sizes = g_new0 (EvPageSize, priv->n_pages);
+
+ for (j = 0; j < i; j++) {
+ page_size = &(priv->page_sizes[j]);
+ page_size->width = priv->uniform_width;
+ page_size->height = priv->uniform_height;
+ }
+ priv->uniform = FALSE;
+ }
+ if (!priv->uniform) {
+ page_size = &(priv->page_sizes[i]);
+
+ page_size->width = page_width;
+ page_size->height = page_height;
+
+ if (page_width > priv->max_width)
+ priv->max_width = page_width;
+
+ if (page_height > priv->max_height)
+ priv->max_height = page_height;
+ }
+
+ page_label = _ev_document_get_page_label (document, page);
+ if (page_label) {
+ if (priv->page_labels) {
+ priv->page_labels[i] = page_label;
+ } else {
+ gchar *numeric_label;
+
+ numeric_label = g_strdup_printf ("%d", i + 1);
+ if (strcmp (numeric_label, page_label) != 0) {
+ priv->page_labels = g_new0 (gchar *, priv->n_pages);
+ priv->page_labels[i] = page_label;
+ }
+ g_free (numeric_label);
+ }
+ priv->max_label = MAX (priv->max_label,
+ g_utf8_strlen (page_label, 256));
+ }
+
+ g_object_unref (page);
+ }
+ }