Merge lp:~ballogy/gloobus-preview/xps-support into lp:gloobus-preview

Proposed by Balló György
Status: Merged
Merged at revision: 301
Proposed branch: lp:~ballogy/gloobus-preview/xps-support
Merge into: lp:gloobus-preview
Diff against target: 335 lines (+185/-14)
11 files modified
configure.ac (+3/-1)
src/Makefile.am (+2/-1)
src/gloobus-preview-plugin-manager.cpp (+1/-0)
src/plugin-gstreamer-audio/Makefile.am (+2/-2)
src/plugin-gstreamer-audio/plugin-gstreamer-audio.cpp (+6/-8)
src/plugin-gstreamer-audio/plugin-gstreamer-audio.h (+2/-2)
src/plugin-xps/Makefile.am (+13/-0)
src/plugin-xps/xps-loader.cpp (+106/-0)
src/plugin-xps/xps-loader.h (+23/-0)
src/plugin-xps/xps-plugin.cpp (+14/-0)
src/plugin-xps/xps-plugin.h (+13/-0)
To merge this branch: bzr merge lp:~ballogy/gloobus-preview/xps-support
Reviewer Review Type Date Requested Status
Gloobus Developers Pending
Review via email: mp+245348@code.launchpad.net

Description of the change

Add support for XPS document format

It introduces a new libgxps based plugin.

To post a comment you must log in.
293. By Balló György

Better error handling

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'configure.ac'
--- configure.ac 2014-12-23 16:22:50 +0000
+++ configure.ac 2014-12-23 19:06:15 +0000
@@ -49,7 +49,8 @@
49PKG_CHECK_MODULES(POPPLER, poppler-glib)49PKG_CHECK_MODULES(POPPLER, poppler-glib)
50PKG_CHECK_MODULES(SPECTRE, libspectre >= 0.2.2)50PKG_CHECK_MODULES(SPECTRE, libspectre >= 0.2.2)
51PKG_CHECK_MODULES(DJVU, ddjvuapi)51PKG_CHECK_MODULES(DJVU, ddjvuapi)
52PKG_CHECK_MODULES(TAGLIB, taglib)52#PKG_CHECK_MODULES(TAGLIB, taglib)
53PKG_CHECK_MODULES(GXPS, libgxps)
53PKG_CHECK_MODULES(FREETYPE,freetype2)54PKG_CHECK_MODULES(FREETYPE,freetype2)
54PKG_CHECK_MODULES(GLIB, glib-2.0)55PKG_CHECK_MODULES(GLIB, glib-2.0)
55PKG_CHECK_MODULES(DBUS, dbus-glib-1)56PKG_CHECK_MODULES(DBUS, dbus-glib-1)
@@ -87,6 +88,7 @@
87 src/plugin-ps/Makefile88 src/plugin-ps/Makefile
88 src/plugin-text/Makefile89 src/plugin-text/Makefile
89 src/plugin-ttf/Makefile90 src/plugin-ttf/Makefile
91 src/plugin-xps/Makefile
90 src/loaders/PSD/Makefile92 src/loaders/PSD/Makefile
91 src/loaders/XCF/Makefile93 src/loaders/XCF/Makefile
92 data/Makefile94 data/Makefile
9395
=== modified file 'src/Makefile.am'
--- src/Makefile.am 2014-12-23 16:22:50 +0000
+++ src/Makefile.am 2014-12-23 19:06:15 +0000
@@ -12,7 +12,8 @@
12 plugin-pixbuf \12 plugin-pixbuf \
13 plugin-ps \13 plugin-ps \
14 plugin-text \14 plugin-text \
15 plugin-ttf15 plugin-ttf \
16 plugin-xps
1617
17#CXXFLAGS = -Werror -g #If -O2 iDocument threads don't work18#CXXFLAGS = -Werror -g #If -O2 iDocument threads don't work
18AM_CXXFLAGS = -Wall #-g -O019AM_CXXFLAGS = -Wall #-g -O0
1920
=== modified file 'src/gloobus-preview-plugin-manager.cpp'
--- src/gloobus-preview-plugin-manager.cpp 2014-12-20 21:05:12 +0000
+++ src/gloobus-preview-plugin-manager.cpp 2014-12-23 19:06:15 +0000
@@ -107,4 +107,5 @@
107#include "plugin-ps/ps-plugin.h"107#include "plugin-ps/ps-plugin.h"
108#include "plugin-text/plugin-text.h"108#include "plugin-text/plugin-text.h"
109#include "plugin-ttf/plugin-ttf.h"109#include "plugin-ttf/plugin-ttf.h"
110#include "plugin-xps/xps-plugin.h"
110}111}
111112
=== modified file 'src/plugin-gstreamer-audio/Makefile.am'
--- src/plugin-gstreamer-audio/Makefile.am 2010-04-19 18:00:37 +0000
+++ src/plugin-gstreamer-audio/Makefile.am 2014-12-23 19:06:15 +0000
@@ -1,7 +1,7 @@
1plugindir = $(prefix)/lib/gloobus/1plugindir = $(prefix)/lib/gloobus/
22
3AM_CPPFLAGS += $(GTK_CFLAGS) $(GSTREAMER_CFLAGS) $(GDK_CFLAGS) $(TAGLIB_CFLAGS)3AM_CPPFLAGS += $(GTK_CFLAGS) $(GSTREAMER_CFLAGS) $(GDK_CFLAGS) #$(TAGLIB_CFLAGS)
4AM_LDFLAGS = $(GTK_LIBS) $(GSTREAMER_LIBS) $(GDK_LIBS) $(TAGLIB_LIBS)4AM_LDFLAGS = $(GTK_LIBS) $(GSTREAMER_LIBS) $(GDK_LIBS) #$(TAGLIB_LIBS)
55
6plugin_LTLIBRARIES = audio.la 6plugin_LTLIBRARIES = audio.la
7audio_la_SOURCES = plugin-gstreamer-audio.cpp 7audio_la_SOURCES = plugin-gstreamer-audio.cpp
88
=== modified file 'src/plugin-gstreamer-audio/plugin-gstreamer-audio.cpp'
--- src/plugin-gstreamer-audio/plugin-gstreamer-audio.cpp 2014-12-23 10:30:25 +0000
+++ src/plugin-gstreamer-audio/plugin-gstreamer-audio.cpp 2014-12-23 19:06:15 +0000
@@ -38,12 +38,12 @@
38 pix_reflection = ui->pixbuf_reflect(pix_cover);38 pix_reflection = ui->pixbuf_reflect(pix_cover);
39 g_object_unref(temp);39 g_object_unref(temp);
4040
41 load_info();41 //load_info(); // Use GStreamer instead of taglib
42 42
43 return true;43 return true;
44}44}
4545
46void iAudio::load_info( void )46/*void iAudio::load_info( void )
47{47{
48 TagLib::FileRef file(m_filename.c_str());48 TagLib::FileRef file(m_filename.c_str());
49 49
@@ -54,7 +54,7 @@
54 this->title = title.toCString(true);54 this->title = title.toCString(true);
55 this->artist = artist.toCString(true);55 this->artist = artist.toCString(true);
56 this->album = album.toCString(true);56 this->album = album.toCString(true);
57}57}*/
5858
59void iAudio::end( void )59void iAudio::end( void )
60{60{
@@ -166,7 +166,7 @@
166{166{
167 GdkPixbuf *temp = NULL;167 GdkPixbuf *temp = NULL;
168168
169 TagLib::MPEG::File file(m_filename.c_str());169/* TagLib::MPEG::File file(m_filename.c_str());
170 TagLib::ID3v2::Tag *tagv2 = file.ID3v2Tag();170 TagLib::ID3v2::Tag *tagv2 = file.ID3v2Tag();
171 if(tagv2) {171 if(tagv2) {
172 TagLib::ID3v2::FrameListMap tags = tagv2->frameListMap();172 TagLib::ID3v2::FrameListMap tags = tagv2->frameListMap();
@@ -187,7 +187,7 @@
187 if(temp)187 if(temp)
188 return temp;188 return temp;
189 }189 }
190 }190 }*/
191 191
192 // If there is no cover attached, load cover.jpg, then if there is not cover.jpg, try to load192 // If there is no cover attached, load cover.jpg, then if there is not cover.jpg, try to load
193 // cover.png, and there is not cover.png, then, load the default theme icon for audio/mpeg using the193 // cover.png, and there is not cover.png, then, load the default theme icon for audio/mpeg using the
@@ -262,7 +262,7 @@
262 case GST_MESSAGE_TAG: {262 case GST_MESSAGE_TAG: {
263 GstTagList *tags = NULL;263 GstTagList *tags = NULL;
264 gst_message_parse_tag (message, &tags);264 gst_message_parse_tag (message, &tags);
265 //audio->handle_tags (tags); // FIXME: uncomment when handle_tags() works well265 audio->handle_tags (tags);
266 gst_tag_list_free (tags);266 gst_tag_list_free (tags);
267 break;267 break;
268 }268 }
@@ -272,8 +272,6 @@
272272
273void iAudio::handle_tags( GstTagList *tags )273void iAudio::handle_tags( GstTagList *tags )
274{274{
275 // FIXME: this works very bad for now, so we still have to use TagLib
276
277 gchar *title, *artist, *album, *info;275 gchar *title, *artist, *album, *info;
278 276
279 if( !gst_tag_list_get_string_index (tags, GST_TAG_TITLE, 0, &title) )277 if( !gst_tag_list_get_string_index (tags, GST_TAG_TITLE, 0, &title) )
280278
=== modified file 'src/plugin-gstreamer-audio/plugin-gstreamer-audio.h'
--- src/plugin-gstreamer-audio/plugin-gstreamer-audio.h 2012-04-13 12:53:01 +0000
+++ src/plugin-gstreamer-audio/plugin-gstreamer-audio.h 2014-12-23 19:06:15 +0000
@@ -3,10 +3,10 @@
33
4#ifndef PLUGIN_LOADER4#ifndef PLUGIN_LOADER
55
6#include <taglib/fileref.h>6/*#include <taglib/fileref.h>
7#include <taglib/mpegfile.h>7#include <taglib/mpegfile.h>
8#include <taglib/attachedpictureframe.h>8#include <taglib/attachedpictureframe.h>
9#include <taglib/id3v2tag.h>9#include <taglib/id3v2tag.h>*/
10#include <config.h>10#include <config.h>
11#include <string>11#include <string>
1212
1313
=== added directory 'src/plugin-xps'
=== added file 'src/plugin-xps/Makefile.am'
--- src/plugin-xps/Makefile.am 1970-01-01 00:00:00 +0000
+++ src/plugin-xps/Makefile.am 2014-12-23 19:06:15 +0000
@@ -0,0 +1,13 @@
1plugindir = $(prefix)/lib/gloobus/
2officeplugindir = $(prefix)/lib/gloobus/
3
4AM_CPPFLAGS += $(GTK_CFLAGS) $(GXPS_CFLAGS)
5AM_LDFLAGS = $(GTK_LIBS) $(GXPS_LIBS)
6
7plugin_LTLIBRARIES = xps.la
8xps_la_SOURCES = xps-plugin.cpp xps-loader.cpp
9xps_la_LDFLAGS = -module -export-dynamic $(AM_LDFLAGS)
10
11noinst_HEADERS = \
12 xps-loader.h \
13 xps-plugin.h
014
=== added file 'src/plugin-xps/xps-loader.cpp'
--- src/plugin-xps/xps-loader.cpp 1970-01-01 00:00:00 +0000
+++ src/plugin-xps/xps-loader.cpp 2014-12-23 19:06:15 +0000
@@ -0,0 +1,106 @@
1#include "xps-loader.h"
2
3#include "../gloobus-preview-defines.h"
4
5XpsLoader::XpsLoader ():xps_document_(NULL) {}
6
7XpsLoader::~XpsLoader ()
8{
9 if (xps_document_) {
10 g_object_unref(xps_document_);
11 }
12}
13
14DocumentState XpsLoader::loadDocument( GFile *file )
15{
16 GError *error = NULL;
17 DocumentState state = DOCUMENT_NONE;
18
19 GXPSFile * xps_file = gxps_file_new (file, &error);
20 if (!xps_file) {
21 g_warning ("Error opening XPS file: %s\n", error->message);
22 g_error_free (error);
23 return DOCUMENT_INVALID;
24 }
25
26 xps_document_ = gxps_file_get_document (xps_file, 0, &error);
27 if (!xps_document_) {
28 g_warning ("Error loading XPS document: %s\n", error->message);
29 g_error_free (error);
30 state = DOCUMENT_INVALID;
31 } else {
32 state = DOCUMENT_LOADED;
33 }
34
35 return state;
36}
37
38int XpsLoader::getPagesNumber (void)
39{
40 return gxps_document_get_n_pages(xps_document_);
41}
42
43void XpsLoader::getPageSize (int index, int *width, int *height)
44{
45 GError *error = NULL;
46 GXPSPage *page = gxps_document_get_page (xps_document_, index, &error);
47 if (!page) {
48 g_warning ("Error loading page %d: %s\n", index, error->message);
49 g_error_free (error);
50 return;
51 }
52
53 double page_width, page_height;
54 gxps_page_get_size (page, &page_width, &page_height);
55
56 if (width) {
57 *width = page_width;
58 }
59 if (height) {
60 *height = page_height;
61 }
62
63 g_object_unref(page);
64}
65
66cairo_surface_t * XpsLoader::getPage(int index, double scale)
67{
68 GXPSPage *page;
69 gdouble page_width, page_height;
70 gdouble width, height;
71 cairo_t *cr;
72 cairo_surface_t *surface;
73 GError *error = NULL;
74
75 page = gxps_document_get_page (xps_document_, index, &error);
76 if (!page) {
77 g_warning ("Error loading page %d: %s\n", index, error->message);
78 g_error_free (error);
79 return NULL;
80 }
81
82 gxps_page_get_size (page, &page_width, &page_height);
83 width = page_width * scale;
84 height = page_height * scale;
85
86 surface = cairo_image_surface_create (CAIRO_FORMAT_ARGB32, width, height);
87 cr = cairo_create (surface);
88
89 if (scale != 1.0) {
90 cairo_scale (cr, scale, scale);
91 }
92 cairo_set_source_rgb (cr, 1., 1., 1.);
93 cairo_paint (cr);
94
95 gxps_page_render (page, cr, &error);
96
97 cairo_destroy (cr);
98 g_object_unref(page);
99
100 if (error) {
101 g_warning ("Error rendering page %d: %s\n", index, error->message);
102 g_error_free (error);
103 }
104
105 return surface;
106}
0107
=== added file 'src/plugin-xps/xps-loader.h'
--- src/plugin-xps/xps-loader.h 1970-01-01 00:00:00 +0000
+++ src/plugin-xps/xps-loader.h 2014-12-23 19:06:15 +0000
@@ -0,0 +1,23 @@
1#ifndef XPS_LOADER_H
2#define XPS_LOADER_H
3
4#include <libgxps/gxps.h>
5
6#include "../document-loader.h"
7
8class XpsLoader : public DocumentLoader
9{
10 private:
11 GXPSDocument *xps_document_;
12
13 public:
14 XpsLoader ();
15 virtual ~XpsLoader ();
16
17 virtual DocumentState loadDocument( GFile *file );
18 virtual int getPagesNumber();
19 virtual void getPageSize( int index, int *width, int *height );
20 virtual cairo_surface_t *getPage( int index, double scale );
21};
22
23#endif /* XPS_LOADER_H */
024
=== added file 'src/plugin-xps/xps-plugin.cpp'
--- src/plugin-xps/xps-plugin.cpp 1970-01-01 00:00:00 +0000
+++ src/plugin-xps/xps-plugin.cpp 2014-12-23 19:06:15 +0000
@@ -0,0 +1,14 @@
1#include "../document-plugin.h"
2#include "xps-loader.h"
3
4extern "C" interface * create() {
5 return new DocumentPlugin(new XpsLoader());
6}
7
8extern "C" void destroy(interface * p) {
9 delete static_cast<DocumentPlugin*>(p);
10}
11
12extern "C" int getVersion() {
13 return MANAGER_VERSION;
14}
015
=== added file 'src/plugin-xps/xps-plugin.h'
--- src/plugin-xps/xps-plugin.h 1970-01-01 00:00:00 +0000
+++ src/plugin-xps/xps-plugin.h 2014-12-23 19:06:15 +0000
@@ -0,0 +1,13 @@
1#ifndef XPS_PLUGIN_H
2#define XPS_PLUGIN_H
3
4#ifdef PLUGIN_LOADER
5
6PluginManager::register_plugin("xps");
7
8PluginManager::register_filetype("application/oxps", 1);
9PluginManager::register_filetype("application/vnd.ms-xpsdocument",1);
10
11#endif
12
13#endif /* XPS_PLUGIN_H */

Subscribers

People subscribed via source and target branches