X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=backend%2Ftiff%2Ftiff-document.c;h=d8bee9e529c0654d105011669dee450f59cf64c9;hb=3e9c324a5f8be62b6e360cfc358bbd3d24986e22;hp=8247c2a269b9751bc222f07c7447f4d7ab4d05e8;hpb=217797d63b2d3b1c9a7a0511af1bbf3d99f0d482;p=evince.git diff --git a/backend/tiff/tiff-document.c b/backend/tiff/tiff-document.c index 8247c2a2..d8bee9e5 100644 --- a/backend/tiff/tiff-document.c +++ b/backend/tiff/tiff-document.c @@ -20,8 +20,12 @@ /* FIXME: Should probably buffer calls to libtiff with TIFFSetWarningHandler */ +#include "config.h" + +#include #include #include +#include #include "tiffio.h" #include "tiff2ps.h" @@ -29,6 +33,7 @@ #include "ev-document-misc.h" #include "ev-document-thumbnails.h" #include "ev-file-exporter.h" +#include "ev-file-helpers.h" struct _TiffDocumentClass { @@ -52,9 +57,8 @@ static void tiff_document_document_iface_init (EvDocumentIface *iface); static void tiff_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface); static void tiff_document_document_file_exporter_iface_init (EvFileExporterIface *iface); -G_DEFINE_TYPE_WITH_CODE (TiffDocument, tiff_document, G_TYPE_OBJECT, - { G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT, - tiff_document_document_iface_init); +EV_BACKEND_REGISTER_WITH_CODE (TiffDocument, tiff_document, + { G_IMPLEMENT_INTERFACE (EV_TYPE_DOCUMENT_THUMBNAILS, tiff_document_document_thumbnails_iface_init); G_IMPLEMENT_INTERFACE (EV_TYPE_FILE_EXPORTER, @@ -210,9 +214,7 @@ tiff_document_render (EvDocument *document, float x_res, y_res; gint rowstride, bytes; guchar *pixels = NULL; - GdkPixbuf *pixbuf; - GdkPixbuf *scaled_pixbuf; - GdkPixbuf *rotated_pixbuf; + guchar *p; cairo_surface_t *surface; cairo_surface_t *rotated_surface; static const cairo_user_data_key_t key; @@ -259,7 +261,7 @@ tiff_document_render (EvDocument *document, return NULL; surface = cairo_image_surface_create_for_data (pixels, - CAIRO_FORMAT_ARGB32, + CAIRO_FORMAT_RGB24, width, height, rowstride); cairo_surface_set_user_data (surface, &key, @@ -271,6 +273,23 @@ tiff_document_render (EvDocument *document, ORIENTATION_TOPLEFT, 1); pop_handlers (); + /* Convert the format returned by libtiff to + * what cairo expects + */ + p = pixels; + while (p < pixels + bytes) { + uint32 pixel = *(uint32 *)p; + int r = TIFFGetR(pixel); + int g = TIFFGetG(pixel); + int b = TIFFGetB(pixel); + int a = TIFFGetA(pixel); + + *p++ = b; + *p++ = g; + *p++ = r; + *p++ = a; + } + rotated_surface = ev_document_misc_surface_rotate_and_scale (surface, (width * rc->scale) + 0.5, (height * rc->scale * (x_res / y_res)) + 0.5, @@ -373,12 +392,6 @@ tiff_document_class_init (TiffDocumentClass *klass) gobject_class->finalize = tiff_document_finalize; } -static gboolean -tiff_document_can_get_text (EvDocument *document) -{ - return FALSE; -} - static EvDocumentInfo * tiff_document_get_info (EvDocument *document) { @@ -395,7 +408,6 @@ tiff_document_document_iface_init (EvDocumentIface *iface) { iface->load = tiff_document_load; iface->save = tiff_document_save; - iface->can_get_text = tiff_document_can_get_text; iface->get_n_pages = tiff_document_get_n_pages; iface->get_page_size = tiff_document_get_page_size; iface->render = tiff_document_render; @@ -450,27 +462,13 @@ tiff_document_document_thumbnails_iface_init (EvDocumentThumbnailsIface *iface) } /* postscript exporter implementation */ - -static gboolean -tiff_document_file_exporter_format_supported (EvFileExporter *exporter, - EvFileExporterFormat format) -{ - return (format == EV_FILE_FORMAT_PS); -} - static void -tiff_document_file_exporter_begin (EvFileExporter *exporter, - EvFileExporterFormat format, - const char *filename, - int first_page, - int last_page, - double width, - double height, - gboolean duplex) +tiff_document_file_exporter_begin (EvFileExporter *exporter, + EvFileExporterContext *fc) { TiffDocument *document = TIFF_DOCUMENT (exporter); - document->ps_export_ctx = tiff2ps_context_new(filename); + document->ps_export_ctx = tiff2ps_context_new(fc->filename); } static void @@ -496,13 +494,23 @@ tiff_document_file_exporter_end (EvFileExporter *exporter) tiff2ps_context_finalize(document->ps_export_ctx); } +static EvFileExporterCapabilities +tiff_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_PS; +} + static void tiff_document_document_file_exporter_iface_init (EvFileExporterIface *iface) { - iface->format_supported = tiff_document_file_exporter_format_supported; iface->begin = tiff_document_file_exporter_begin; iface->do_page = tiff_document_file_exporter_do_page; iface->end = tiff_document_file_exporter_end; + iface->get_capabilities = tiff_document_file_exporter_get_capabilities; } static void