X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=backend%2Fdvi%2Fdvi-document.c;h=89d3189d59c303da27a5561212950b55b898308e;hb=1d6c41200f621a43e92deda5b5d682413572d2a2;hp=56d8bbb84aa7facd1553671528934244e4626676;hpb=4ce480dd80453275c10c3b99f988667c2f1bdfff;p=evince.git diff --git a/backend/dvi/dvi-document.c b/backend/dvi/dvi-document.c index 56d8bbb8..89d3189d 100644 --- a/backend/dvi/dvi-document.c +++ b/backend/dvi/dvi-document.c @@ -14,19 +14,31 @@ * * 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ +#include "config.h" + #include "dvi-document.h" -#include "ev-document-thumbnails.h" +#include "texmfcnf.h" #include "ev-document-misc.h" +#include "ev-file-exporter.h" +#include "ev-file-helpers.h" #include "mdvi.h" #include "fonts.h" +#include "color.h" #include "cairo-device.h" -#include -#include +#include +#include +#ifdef G_OS_WIN32 +# define WIFEXITED(x) ((x) != 3) +# define WEXITSTATUS(x) (x) +#else +# include +#endif +#include GMutex *dvi_context_mutex = NULL; @@ -37,12 +49,12 @@ enum { struct _DviDocumentClass { - GObjectClass parent_class; + EvDocumentClass parent_class; }; struct _DviDocument { - GObject parent_instance; + EvDocument parent_instance; DviContext *context; DviPageSpec *spec; @@ -53,25 +65,22 @@ struct _DviDocument double base_height; gchar *uri; + + /* PDF exporter */ + gchar *exporter_filename; + GString *exporter_opts; }; typedef struct _DviDocumentClass DviDocumentClass; -static void dvi_document_document_iface_init (EvDocumentIface *iface); -static void dvi_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface); -static void dvi_document_get_page_size (EvDocument *document, - int page, - double *width, - double *height); -static void dvi_document_do_color_special (DviContext *dvi, - const char *prefix, - const char *arg); - -G_DEFINE_TYPE_WITH_CODE - (DviDocument, dvi_document, G_TYPE_OBJECT, - { - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT, dvi_document_document_iface_init); - G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS, dvi_document_document_thumbnails_iface_init) +static void dvi_document_file_exporter_iface_init (EvFileExporterInterface *iface); +static void dvi_document_do_color_special (DviContext *dvi, + const char *prefix, + const char *arg); + +EV_BACKEND_REGISTER_WITH_CODE (DviDocument, dvi_document, + { + EV_BACKEND_IMPLEMENT_INTERFACE (EV_TYPE_FILE_EXPORTER, dvi_document_file_exporter_iface_init); }); static gboolean @@ -83,27 +92,22 @@ dvi_document_load (EvDocument *document, DviDocument *dvi_document = DVI_DOCUMENT(document); filename = g_filename_from_uri (uri, NULL, error); - - if (!filename) { - g_set_error (error, - EV_DOCUMENT_ERROR, - EV_DOCUMENT_ERROR_INVALID, - _("File not available")); + if (!filename) return FALSE; - } g_mutex_lock (dvi_context_mutex); if (dvi_document->context) mdvi_destroy_context (dvi_document->context); - + dvi_document->context = mdvi_init_context(dvi_document->params, dvi_document->spec, filename); g_mutex_unlock (dvi_context_mutex); + g_free (filename); if (!dvi_document->context) { - g_set_error (error, - EV_DOCUMENT_ERROR, - EV_DOCUMENT_ERROR_INVALID, - _("DVI document has incorrect format")); + g_set_error_literal (error, + EV_DOCUMENT_ERROR, + EV_DOCUMENT_ERROR_INVALID, + _("DVI document has incorrect format")); return FALSE; } @@ -143,7 +147,7 @@ dvi_document_get_n_pages (EvDocument *document) static void dvi_document_get_page_size (EvDocument *document, - int page, + EvPage *page, double *width, double *height) { @@ -170,7 +174,7 @@ dvi_document_render (EvDocument *document, */ g_mutex_lock (dvi_context_mutex); - mdvi_setpage (dvi_document->context, rc->page); + mdvi_setpage (dvi_document->context, rc->page->index); mdvi_set_shrink (dvi_document->context, (int)((dvi_document->params->hshrink - 1) / rc->scale) + 1, @@ -217,141 +221,131 @@ dvi_document_finalize (GObject *object) if (dvi_document->params) g_free (dvi_document->params); + if (dvi_document->exporter_filename) + g_free (dvi_document->exporter_filename); + + if (dvi_document->exporter_opts) + g_string_free (dvi_document->exporter_opts, TRUE); + g_free (dvi_document->uri); G_OBJECT_CLASS (dvi_document_parent_class)->finalize (object); } +static gboolean +dvi_document_support_synctex (EvDocument *document) +{ + return TRUE; +} static void dvi_document_class_init (DviDocumentClass *klass) { - GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + GObjectClass *gobject_class = G_OBJECT_CLASS (klass); + EvDocumentClass *ev_document_class = EV_DOCUMENT_CLASS (klass); + gchar *texmfcnf; gobject_class->finalize = dvi_document_finalize; - mdvi_init_kpathsea ("evince", MDVI_MFMODE, MDVI_FALLBACK_FONT, MDVI_DPI); + texmfcnf = get_texmfcnf(); + mdvi_init_kpathsea ("evince", MDVI_MFMODE, MDVI_FALLBACK_FONT, MDVI_DPI, texmfcnf); + g_free(texmfcnf); + mdvi_register_special ("Color", "color", NULL, dvi_document_do_color_special, 1); mdvi_register_fonts (); dvi_context_mutex = g_mutex_new (); -} -static gboolean -dvi_document_can_get_text (EvDocument *document) -{ - return FALSE; + ev_document_class->load = dvi_document_load; + ev_document_class->save = dvi_document_save; + ev_document_class->get_n_pages = dvi_document_get_n_pages; + ev_document_class->get_page_size = dvi_document_get_page_size; + ev_document_class->render = dvi_document_render; + ev_document_class->support_synctex = dvi_document_support_synctex; } -static EvDocumentInfo * -dvi_document_get_info (EvDocument *document) +/* EvFileExporterIface */ +static void +dvi_document_file_exporter_begin (EvFileExporter *exporter, + EvFileExporterContext *fc) { - EvDocumentInfo *info; - - info = g_new0 (EvDocumentInfo, 1); - - return info; + DviDocument *dvi_document = DVI_DOCUMENT(exporter); + + if (dvi_document->exporter_filename) + g_free (dvi_document->exporter_filename); + dvi_document->exporter_filename = g_strdup (fc->filename); + + if (dvi_document->exporter_opts) { + g_string_free (dvi_document->exporter_opts, TRUE); + } + dvi_document->exporter_opts = g_string_new ("-s "); } static void -dvi_document_document_iface_init (EvDocumentIface *iface) +dvi_document_file_exporter_do_page (EvFileExporter *exporter, + EvRenderContext *rc) { - iface->load = dvi_document_load; - iface->save = dvi_document_save; - iface->can_get_text = dvi_document_can_get_text; - iface->get_n_pages = dvi_document_get_n_pages; - iface->get_page_size = dvi_document_get_page_size; - iface->render = dvi_document_render; - iface->get_info = dvi_document_get_info; -} + DviDocument *dvi_document = DVI_DOCUMENT(exporter); -static void -dvi_document_thumbnails_get_dimensions (EvDocumentThumbnails *document, - EvRenderContext *rc, - gint *width, - gint *height) -{ - DviDocument *dvi_document = DVI_DOCUMENT (document); - gdouble page_width = dvi_document->base_width; - gdouble page_height = dvi_document->base_height; - - if (rc->rotation == 90 || rc->rotation == 270) { - *width = (gint) (page_height * rc->scale); - *height = (gint) (page_width * rc->scale); - } else { - *width = (gint) (page_width * rc->scale); - *height = (gint) (page_height * rc->scale); - } + g_string_append_printf (dvi_document->exporter_opts, "%d,", (rc->page->index) + 1); } -static GdkPixbuf * -dvi_document_thumbnails_get_thumbnail (EvDocumentThumbnails *document, - EvRenderContext *rc, - gboolean border) +static void +dvi_document_file_exporter_end (EvFileExporter *exporter) { - DviDocument *dvi_document = DVI_DOCUMENT (document); - GdkPixbuf *pixbuf; - GdkPixbuf *rotated_pixbuf; - cairo_surface_t *surface; - gint thumb_width, thumb_height; - gint proposed_width, proposed_height; - - thumb_width = (gint) (dvi_document->base_width * rc->scale); - thumb_height = (gint) (dvi_document->base_height * rc->scale); - - g_mutex_lock (dvi_context_mutex); + gchar *command_line; + gint exit_stat; + GError *err = NULL; + gboolean success; - mdvi_setpage (dvi_document->context, rc->page); - - mdvi_set_shrink (dvi_document->context, - (int)dvi_document->base_width * dvi_document->params->hshrink / thumb_width, - (int)dvi_document->base_height * dvi_document->params->vshrink / thumb_height); - - proposed_width = dvi_document->context->dvi_page_w * dvi_document->context->params.conv; - proposed_height = dvi_document->context->dvi_page_h * dvi_document->context->params.vconv; - - if (border) { - mdvi_cairo_device_set_margins (&dvi_document->context->device, - MAX (thumb_width - proposed_width, 0) / 2, - MAX (thumb_height - proposed_height, 0) / 2); - } else { - mdvi_cairo_device_set_margins (&dvi_document->context->device, - MAX (thumb_width - proposed_width - 2, 0) / 2, - MAX (thumb_height - proposed_height - 2, 0) / 2); + DviDocument *dvi_document = DVI_DOCUMENT(exporter); + + command_line = g_strdup_printf ("dvipdfm %s -o %s \"%s\"", /* dvipdfm -s 1,2,.., -o exporter_filename dvi_filename */ + dvi_document->exporter_opts->str, + dvi_document->exporter_filename, + dvi_document->context->filename); + + success = g_spawn_command_line_sync (command_line, + NULL, + NULL, + &exit_stat, + &err); + + g_free (command_line); + + if (success == FALSE) { + g_warning ("Error: %s", err->message); + } else if (!WIFEXITED(exit_stat) || WEXITSTATUS(exit_stat) != EXIT_SUCCESS){ + g_warning ("Error: dvipdfm does not end normally or exit with a failure status."); } - mdvi_cairo_device_set_scale (&dvi_document->context->device, rc->scale); - mdvi_cairo_device_render (dvi_document->context); - surface = mdvi_cairo_device_get_surface (&dvi_document->context->device); - g_mutex_unlock (dvi_context_mutex); - - pixbuf = ev_document_misc_pixbuf_from_surface (surface); - cairo_surface_destroy (surface); - - rotated_pixbuf = gdk_pixbuf_rotate_simple (pixbuf, 360 - rc->rotation); - g_object_unref (pixbuf); - - if (border) { - GdkPixbuf *tmp_pixbuf = rotated_pixbuf; - - rotated_pixbuf = ev_document_misc_get_thumbnail_frame (-1, -1, tmp_pixbuf); - g_object_unref (tmp_pixbuf); - } + if (err) + g_error_free (err); +} - return rotated_pixbuf; +static EvFileExporterCapabilities +dvi_document_file_exporter_get_capabilities (EvFileExporter *exporter) +{ + return EV_FILE_EXPORTER_CAN_PAGE_SET | + EV_FILE_EXPORTER_CAN_COPIES | + EV_FILE_EXPORTER_CAN_COLLATE | + EV_FILE_EXPORTER_CAN_REVERSE | + EV_FILE_EXPORTER_CAN_GENERATE_PDF; } static void -dvi_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface) +dvi_document_file_exporter_iface_init (EvFileExporterInterface *iface) { - iface->get_thumbnail = dvi_document_thumbnails_get_thumbnail; - iface->get_dimensions = dvi_document_thumbnails_get_dimensions; + iface->begin = dvi_document_file_exporter_begin; + iface->do_page = dvi_document_file_exporter_do_page; + iface->end = dvi_document_file_exporter_end; + iface->get_capabilities = dvi_document_file_exporter_get_capabilities; } #define RGB2ULONG(r,g,b) ((0xFF<<24)|(r<<16)|(g<<8)|(b)) static gboolean -hsb2rgb (float h, float s, float v, char *red, char *green, char *blue) +hsb2rgb (float h, float s, float v, guchar *red, guchar *green, guchar *blue) { float i, f, p, q, t, r, g, b; @@ -395,9 +389,9 @@ hsb2rgb (float h, float s, float v, char *red, char *green, char *blue) b = q; } - (*red) = (char)floor(r * 255); - (*green) = (char)floor(g * 255); - (*blue) = (char)floor(b * 255); + *red = (guchar)floor(r * 255.0); + *green = (guchar)floor(g * 255.0); + *blue = (guchar)floor(b * 255.0); return TRUE; } @@ -524,4 +518,7 @@ dvi_document_init (DviDocument *dvi_document) { dvi_document->context = NULL; dvi_document_init_params (dvi_document); + + dvi_document->exporter_filename = NULL; + dvi_document->exporter_opts = NULL; }