Merge lp:~drbild/inkscape/multilayer-pdf-latex-output into lp:~inkscape.dev/inkscape/trunk

Proposed by Martin Owens
Status: Merged
Approved by: Johan Engelen
Approved revision: 12489
Merged at revision: 12489
Proposed branch: lp:~drbild/inkscape/multilayer-pdf-latex-output
Merge into: lp:~inkscape.dev/inkscape/trunk
Diff against target: 366 lines (+114/-18)
8 files modified
src/extension/internal/cairo-ps-out.cpp (+1/-1)
src/extension/internal/cairo-render-context.cpp (+47/-2)
src/extension/internal/cairo-render-context.h (+17/-0)
src/extension/internal/cairo-renderer-pdf-out.cpp (+1/-1)
src/extension/internal/cairo-renderer.cpp (+0/-6)
src/extension/internal/cairo-renderer.h (+0/-4)
src/extension/internal/latex-text-renderer.cpp (+37/-4)
src/extension/internal/latex-text-renderer.h (+11/-0)
To merge this branch: bzr merge lp:~drbild/inkscape/multilayer-pdf-latex-output
Reviewer Review Type Date Requested Status
Johan Engelen Approve
Review via email: mp+183288@code.launchpad.net

Description of the change

Merge in, signed off by Johan Engelen

To post a comment you must log in.
12489. By David R. Bild <email address hidden>

use multiple graphic/text layers for pdf+latex output

Revision history for this message
Johan Engelen (johanengelen) :
review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'src/extension/internal/cairo-ps-out.cpp'
2--- src/extension/internal/cairo-ps-out.cpp 2013-08-05 21:07:35 +0000
3+++ src/extension/internal/cairo-ps-out.cpp 2013-08-30 22:23:52 +0000
4@@ -97,7 +97,7 @@
5 ctx->setPSLevel(level);
6 ctx->setEPS(eps);
7 ctx->setTextToPath(texttopath);
8- renderer->_omitText = omittext;
9+ ctx->setOmitText(omittext);
10 ctx->setFilterToBitmap(filtertobitmap);
11 ctx->setBitmapResolution(resolution);
12
13
14=== modified file 'src/extension/internal/cairo-render-context.cpp'
15--- src/extension/internal/cairo-render-context.cpp 2013-08-06 18:54:40 +0000
16+++ src/extension/internal/cairo-render-context.cpp 2013-08-30 22:23:52 +0000
17@@ -6,6 +6,7 @@
18 * Miklos Erdelyi <erdelyim@gmail.com>
19 * Jon A. Cruz <jon@joncruz.org>
20 * Abhishek Sharma
21+ * David R. Bild <drbild@umich.edu>
22 *
23 * Copyright (C) 2006 Miklos Erdelyi
24 *
25@@ -111,6 +112,7 @@
26 _ps_level(1),
27 _eps(false),
28 _is_texttopath(FALSE),
29+ _is_omittext(FALSE),
30 _is_filtertobitmap(FALSE),
31 _bitmapresolution(72),
32 _stream(NULL),
33@@ -124,7 +126,8 @@
34 _state(NULL),
35 _renderer(parent),
36 _render_mode(RENDER_MODE_NORMAL),
37- _clip_mode(CLIP_MODE_MASK)
38+ _clip_mode(CLIP_MODE_MASK),
39+ _omittext_state(EMPTY)
40 {
41 font_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, font_data_free);
42 }
43@@ -426,6 +429,16 @@
44 _is_texttopath = texttopath;
45 }
46
47+void CairoRenderContext::setOmitText(bool omittext)
48+{
49+ _is_omittext = omittext;
50+}
51+
52+bool CairoRenderContext::getOmitText(void)
53+{
54+ return _is_omittext;
55+}
56+
57 void CairoRenderContext::setFilterToBitmap(bool filtertobitmap)
58 {
59 _is_filtertobitmap = filtertobitmap;
60@@ -1331,11 +1344,36 @@
61 cairo_set_miter_limit(_cr, MAX(1, style->stroke_miterlimit.value));
62 }
63
64+void
65+CairoRenderContext::_prepareRenderGraphic()
66+{
67+ // Only PDFLaTeX supports importing a single page of a graphics file,
68+ // so only PDF backend gets interleaved text/graphics
69+ if (_is_omittext && _target == CAIRO_SURFACE_TYPE_PDF) {
70+ if (_omittext_state == NEW_PAGE_ON_GRAPHIC)
71+ cairo_show_page(_cr);
72+ _omittext_state = GRAPHIC_ON_TOP;
73+ }
74+}
75+
76+void
77+CairoRenderContext::_prepareRenderText()
78+{
79+ // Only PDFLaTeX supports importing a single page of a graphics file,
80+ // so only PDF backend gets interleaved text/graphics
81+ if (_is_omittext && _target == CAIRO_SURFACE_TYPE_PDF) {
82+ if (_omittext_state == GRAPHIC_ON_TOP)
83+ _omittext_state = NEW_PAGE_ON_GRAPHIC;
84+ }
85+}
86+
87 bool
88 CairoRenderContext::renderPathVector(Geom::PathVector const & pathv, SPStyle const *style, Geom::OptRect const &pbox)
89 {
90 g_assert( _is_valid );
91
92+ _prepareRenderGraphic();
93+
94 if (_render_mode == RENDER_MODE_CLIP) {
95 if (_clip_mode == CLIP_MODE_PATH) {
96 addClipPath(pathv, &style->fill_rule);
97@@ -1408,6 +1446,8 @@
98 return true;
99 }
100
101+ _prepareRenderGraphic();
102+
103 int w = gdk_pixbuf_get_width (pb);
104 int h = gdk_pixbuf_get_height (pb);
105
106@@ -1489,7 +1529,12 @@
107 bool
108 CairoRenderContext::renderGlyphtext(PangoFont *font, Geom::Affine const &font_matrix,
109 std::vector<CairoGlyphInfo> const &glyphtext, SPStyle const *style)
110-{
111+{
112+
113+ _prepareRenderText();
114+ if (_is_omittext)
115+ return true;
116+
117 // create a cairo_font_face from PangoFont
118 double size = style->font_size.computed; /// \fixme why is this variable never used?
119 gpointer fonthash = (gpointer)font;
120
121=== modified file 'src/extension/internal/cairo-render-context.h'
122--- src/extension/internal/cairo-render-context.h 2013-03-15 00:39:02 +0000
123+++ src/extension/internal/cairo-render-context.h 2013-08-30 22:23:52 +0000
124@@ -94,6 +94,8 @@
125 void setPDFLevel(unsigned int level);
126 void setTextToPath(bool texttopath);
127 bool getTextToPath(void);
128+ void setOmitText(bool omittext);
129+ bool getOmitText(void);
130 void setFilterToBitmap(bool filtertobitmap);
131 bool getFilterToBitmap(void);
132 void setBitmapResolution(int resolution);
133@@ -109,6 +111,9 @@
134 /** Saves the contents of the context to a PNG file. */
135 bool saveAsPng(const char *file_name);
136
137+ /** On targets supporting multiple pages, sends subsequent rendering to a new page*/
138+ void newPage(void);
139+
140 /* Render/clip mode setting/query */
141 void setRenderMode(CairoRenderMode mode);
142 CairoRenderMode getRenderMode(void) const;
143@@ -150,6 +155,12 @@
144 CairoRenderContext(CairoRenderer *renderer);
145 virtual ~CairoRenderContext(void);
146
147+ enum CairoOmitTextPageState {
148+ EMPTY,
149+ GRAPHIC_ON_TOP,
150+ NEW_PAGE_ON_GRAPHIC
151+ };
152+
153 float _width;
154 float _height;
155 unsigned short _dpi;
156@@ -157,6 +168,7 @@
157 unsigned int _ps_level;
158 bool _eps;
159 bool _is_texttopath;
160+ bool _is_omittext;
161 bool _is_filtertobitmap;
162 int _bitmapresolution;
163
164@@ -182,6 +194,8 @@
165 CairoRenderMode _render_mode;
166 CairoClipMode _clip_mode;
167
168+ CairoOmitTextPageState _omittext_state;
169+
170 cairo_pattern_t *_createPatternForPaintServer(SPPaintServer const *const paintserver,
171 Geom::OptRect const &pbox, float alpha);
172 cairo_pattern_t *_createPatternPainter(SPPaintServer const *const paintserver, Geom::OptRect const &pbox);
173@@ -196,6 +210,9 @@
174 void _concatTransform(cairo_t *cr, double xx, double yx, double xy, double yy, double x0, double y0);
175 void _concatTransform(cairo_t *cr, Geom::Affine const &transform);
176
177+ void _prepareRenderGraphic(void);
178+ void _prepareRenderText(void);
179+
180 GHashTable *font_table;
181 static void font_data_free(gpointer data);
182
183
184=== modified file 'src/extension/internal/cairo-renderer-pdf-out.cpp'
185--- src/extension/internal/cairo-renderer-pdf-out.cpp 2013-08-06 18:54:40 +0000
186+++ src/extension/internal/cairo-renderer-pdf-out.cpp 2013-08-30 22:23:52 +0000
187@@ -94,7 +94,7 @@
188 CairoRenderContext *ctx = renderer->createContext();
189 ctx->setPDFLevel(level);
190 ctx->setTextToPath(texttopath);
191- renderer->_omitText = omittext;
192+ ctx->setOmitText(omittext);
193 ctx->setFilterToBitmap(filtertobitmap);
194 ctx->setBitmapResolution(resolution);
195
196
197=== modified file 'src/extension/internal/cairo-renderer.cpp'
198--- src/extension/internal/cairo-renderer.cpp 2013-07-31 22:33:03 +0000
199+++ src/extension/internal/cairo-renderer.cpp 2013-08-30 22:23:52 +0000
200@@ -101,7 +101,6 @@
201 namespace Internal {
202
203 CairoRenderer::CairoRenderer(void)
204- : _omitText(false)
205 {}
206
207 CairoRenderer::~CairoRenderer(void)
208@@ -578,11 +577,6 @@
209 // TODO change this to accept a const SPItem:
210 void CairoRenderer::renderItem(CairoRenderContext *ctx, SPItem *item)
211 {
212- if ( _omitText && (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) ) {
213- // skip text if _omitText is true
214- return;
215- }
216-
217 ctx->pushState();
218 setStateForItem(ctx, item);
219
220
221=== modified file 'src/extension/internal/cairo-renderer.h'
222--- src/extension/internal/cairo-renderer.h 2013-03-15 00:39:02 +0000
223+++ src/extension/internal/cairo-renderer.h 2013-08-30 22:23:52 +0000
224@@ -57,10 +57,6 @@
225
226 /** Traverses the object tree and invokes the render methods. */
227 void renderItem(CairoRenderContext *ctx, SPItem *item);
228-
229- /** If _omitText is true, no text will be output to the PDF document.
230- The PDF will be exactly the same as if the text was written to it and then erased. */
231- bool _omitText;
232 };
233
234 // FIXME: this should be a static method of CairoRenderer
235
236=== modified file 'src/extension/internal/latex-text-renderer.cpp'
237--- src/extension/internal/latex-text-renderer.cpp 2013-07-31 22:33:03 +0000
238+++ src/extension/internal/latex-text-renderer.cpp 2013-08-30 22:23:52 +0000
239@@ -9,6 +9,7 @@
240 * Miklos Erdelyi <erdelyim@gmail.com>
241 * Jon A. Cruz <jon@joncruz.org>
242 * Abhishek Sharma
243+ * David R. Bild <drbild@umich.edu>
244 *
245 * Copyright (C) 2006-2011 Authors
246 *
247@@ -98,7 +99,9 @@
248 LaTeXTextRenderer::LaTeXTextRenderer(bool pdflatex)
249 : _stream(NULL),
250 _filename(NULL),
251- _pdflatex(pdflatex)
252+ _pdflatex(pdflatex),
253+ _omittext_state(EMPTY),
254+ _omittext_page(1)
255 {
256 push_transform(Geom::identity());
257 }
258@@ -262,6 +265,11 @@
259 void
260 LaTeXTextRenderer::sp_text_render(SPItem *item)
261 {
262+ // Only PDFLaTeX supports importing a single page of a graphics file,
263+ // so only PDF backend gets interleaved text/graphics
264+ if (_pdflatex && _omittext_state == GRAPHIC_ON_TOP)
265+ _omittext_state = NEW_PAGE_ON_GRAPHIC;
266+
267 SPText *textobj = SP_TEXT (item);
268 SPStyle *style = item->style;
269
270@@ -395,6 +403,11 @@
271 Flowing in rectangle is possible, not in arb shape.
272 */
273
274+ // Only PDFLaTeX supports importing a single page of a graphics file,
275+ // so only PDF backend gets interleaved text/graphics
276+ if (_pdflatex && _omittext_state == GRAPHIC_ON_TOP)
277+ _omittext_state = NEW_PAGE_ON_GRAPHIC;
278+
279 SPFlowtext *flowtext = SP_FLOWTEXT(item);
280 SPStyle *style = item->style;
281
282@@ -556,8 +569,13 @@
283 return sp_text_render(item);
284 } else if (SP_IS_FLOWTEXT(item)) {
285 return sp_flowtext_render(item);
286+ } else {
287+ // Only PDFLaTeX supports importing a single page of a graphics file,
288+ // so only PDF backend gets interleaved text/graphics
289+ if (_pdflatex && (_omittext_state == EMPTY || _omittext_state == NEW_PAGE_ON_GRAPHIC))
290+ writeGraphicPage();
291+ _omittext_state = GRAPHIC_ON_TOP;
292 }
293- // We are not interested in writing the other SPItem types to LaTeX
294 }
295
296 void
297@@ -568,6 +586,20 @@
298 pop_transform();
299 }
300
301+void
302+LaTeXTextRenderer::writeGraphicPage(void) {
303+ Inkscape::SVGOStringStream os;
304+ os.setf(std::ios::fixed); // no scientific notation
305+
306+ // strip pathname, as it is probably desired. Having a specific path in the TeX file is not convenient.
307+ if (_pdflatex)
308+ os << " \\put(0,0){\\includegraphics[width=\\unitlength,page=" << _omittext_page++ << "]{" << _filename << "}}%\n";
309+ else
310+ os << " \\put(0,0){\\includegraphics[width=\\unitlength]{" << _filename << "}}%\n";
311+
312+ fprintf(_stream, "%s", os.str().c_str());
313+}
314+
315 bool
316 LaTeXTextRenderer::setupDocument(SPDocument *doc, bool pageBoundingBox, float bleedmargin_px, SPItem *base)
317 {
318@@ -625,11 +657,12 @@
319 os << " \\makeatother%\n";
320
321 os << " \\begin{picture}(" << _width << "," << _height << ")%\n";
322- // strip pathname, as it is probably desired. Having a specific path in the TeX file is not convenient.
323- os << " \\put(0,0){\\includegraphics[width=\\unitlength]{" << _filename << "}}%\n";
324
325 fprintf(_stream, "%s", os.str().c_str());
326
327+ if (!_pdflatex)
328+ writeGraphicPage();
329+
330 return true;
331 }
332
333
334=== modified file 'src/extension/internal/latex-text-renderer.h'
335--- src/extension/internal/latex-text-renderer.h 2012-10-28 14:10:22 +0000
336+++ src/extension/internal/latex-text-renderer.h 2013-08-30 22:23:52 +0000
337@@ -47,11 +47,20 @@
338 void renderItem(SPItem *item);
339
340 protected:
341+ enum LaTeXOmitTextPageState {
342+ EMPTY,
343+ GRAPHIC_ON_TOP,
344+ NEW_PAGE_ON_GRAPHIC
345+ };
346+
347 FILE * _stream;
348 gchar * _filename;
349
350 bool _pdflatex; /** true if ouputting for pdfLaTeX*/
351
352+ LaTeXOmitTextPageState _omittext_state;
353+ gulong _omittext_page;
354+
355 void push_transform(Geom::Affine const &transform);
356 Geom::Affine const & transform();
357 void pop_transform();
358@@ -60,6 +69,8 @@
359 void writePreamble();
360 void writePostamble();
361
362+ void writeGraphicPage();
363+
364 void sp_item_invoke_render(SPItem *item);
365 void sp_root_render(SPRoot *item);
366 void sp_group_render(SPItem *item);