summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMartin Owens <doctormo@gmail.com>2013-08-30 22:48:28 +0000
committerMartin Owens <doctormo@gmail.com>2013-08-30 22:48:28 +0000
commit4a2406c54934a07ac125d00ba728873144a711d6 (patch)
tree78b73e51e171c05461f23a006769f050dbe29f21 /src
parentMerge emf/wmf work (diff)
parentuse multiple graphic/text layers for pdf+latex output (diff)
downloadinkscape-4a2406c54934a07ac125d00ba728873144a711d6.tar.gz
inkscape-4a2406c54934a07ac125d00ba728873144a711d6.zip
Merge in pdf work by david bild, thanks David\!
(bzr r12489)
Diffstat (limited to 'src')
-rw-r--r--src/extension/internal/cairo-ps-out.cpp2
-rw-r--r--src/extension/internal/cairo-render-context.cpp48
-rw-r--r--src/extension/internal/cairo-render-context.h17
-rw-r--r--src/extension/internal/cairo-renderer-pdf-out.cpp2
-rw-r--r--src/extension/internal/cairo-renderer.cpp6
-rw-r--r--src/extension/internal/cairo-renderer.h4
-rw-r--r--src/extension/internal/latex-text-renderer.cpp40
-rw-r--r--src/extension/internal/latex-text-renderer.h11
8 files changed, 112 insertions, 18 deletions
diff --git a/src/extension/internal/cairo-ps-out.cpp b/src/extension/internal/cairo-ps-out.cpp
index bfbdd8149..e06c9f30d 100644
--- a/src/extension/internal/cairo-ps-out.cpp
+++ b/src/extension/internal/cairo-ps-out.cpp
@@ -97,7 +97,7 @@ ps_print_document_to_file(SPDocument *doc, gchar const *filename, unsigned int l
ctx->setPSLevel(level);
ctx->setEPS(eps);
ctx->setTextToPath(texttopath);
- renderer->_omitText = omittext;
+ ctx->setOmitText(omittext);
ctx->setFilterToBitmap(filtertobitmap);
ctx->setBitmapResolution(resolution);
diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp
index 0ea1fd591..3c222bd9e 100644
--- a/src/extension/internal/cairo-render-context.cpp
+++ b/src/extension/internal/cairo-render-context.cpp
@@ -111,6 +111,7 @@ CairoRenderContext::CairoRenderContext(CairoRenderer *parent) :
_ps_level(1),
_eps(false),
_is_texttopath(FALSE),
+ _is_omittext(FALSE),
_is_filtertobitmap(FALSE),
_bitmapresolution(72),
_stream(NULL),
@@ -124,7 +125,8 @@ CairoRenderContext::CairoRenderContext(CairoRenderer *parent) :
_state(NULL),
_renderer(parent),
_render_mode(RENDER_MODE_NORMAL),
- _clip_mode(CLIP_MODE_MASK)
+ _clip_mode(CLIP_MODE_MASK),
+ _omittext_state(EMPTY)
{
font_table = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, font_data_free);
}
@@ -426,6 +428,16 @@ void CairoRenderContext::setTextToPath(bool texttopath)
_is_texttopath = texttopath;
}
+void CairoRenderContext::setOmitText(bool omittext)
+{
+ _is_omittext = omittext;
+}
+
+bool CairoRenderContext::getOmitText(void)
+{
+ return _is_omittext;
+}
+
void CairoRenderContext::setFilterToBitmap(bool filtertobitmap)
{
_is_filtertobitmap = filtertobitmap;
@@ -1331,11 +1343,36 @@ CairoRenderContext::_setStrokeStyle(SPStyle const *style, Geom::OptRect const &p
cairo_set_miter_limit(_cr, MAX(1, style->stroke_miterlimit.value));
}
+void
+CairoRenderContext::_prepareRenderGraphic()
+{
+ // Only PDFLaTeX supports importing a single page of a graphics file,
+ // so only PDF backend gets interleaved text/graphics
+ if (_is_omittext && _target == CAIRO_SURFACE_TYPE_PDF) {
+ if (_omittext_state == NEW_PAGE_ON_GRAPHIC)
+ cairo_show_page(_cr);
+ _omittext_state = GRAPHIC_ON_TOP;
+ }
+}
+
+void
+CairoRenderContext::_prepareRenderText()
+{
+ // Only PDFLaTeX supports importing a single page of a graphics file,
+ // so only PDF backend gets interleaved text/graphics
+ if (_is_omittext && _target == CAIRO_SURFACE_TYPE_PDF) {
+ if (_omittext_state == GRAPHIC_ON_TOP)
+ _omittext_state = NEW_PAGE_ON_GRAPHIC;
+ }
+}
+
bool
CairoRenderContext::renderPathVector(Geom::PathVector const & pathv, SPStyle const *style, Geom::OptRect const &pbox)
{
g_assert( _is_valid );
+ _prepareRenderGraphic();
+
if (_render_mode == RENDER_MODE_CLIP) {
if (_clip_mode == CLIP_MODE_PATH) {
addClipPath(pathv, &style->fill_rule);
@@ -1408,6 +1445,8 @@ bool CairoRenderContext::renderImage(GdkPixbuf *pb,
return true;
}
+ _prepareRenderGraphic();
+
int w = gdk_pixbuf_get_width (pb);
int h = gdk_pixbuf_get_height (pb);
@@ -1489,7 +1528,12 @@ unsigned int CairoRenderContext::_showGlyphs(cairo_t *cr, PangoFont * /*font*/,
bool
CairoRenderContext::renderGlyphtext(PangoFont *font, Geom::Affine const &font_matrix,
std::vector<CairoGlyphInfo> const &glyphtext, SPStyle const *style)
-{
+{
+
+ _prepareRenderText();
+ if (_is_omittext)
+ return true;
+
// create a cairo_font_face from PangoFont
double size = style->font_size.computed; /// \fixme why is this variable never used?
gpointer fonthash = (gpointer)font;
diff --git a/src/extension/internal/cairo-render-context.h b/src/extension/internal/cairo-render-context.h
index 8829940c6..f8426aebe 100644
--- a/src/extension/internal/cairo-render-context.h
+++ b/src/extension/internal/cairo-render-context.h
@@ -94,6 +94,8 @@ public:
void setPDFLevel(unsigned int level);
void setTextToPath(bool texttopath);
bool getTextToPath(void);
+ void setOmitText(bool omittext);
+ bool getOmitText(void);
void setFilterToBitmap(bool filtertobitmap);
bool getFilterToBitmap(void);
void setBitmapResolution(int resolution);
@@ -109,6 +111,9 @@ public:
/** Saves the contents of the context to a PNG file. */
bool saveAsPng(const char *file_name);
+ /** On targets supporting multiple pages, sends subsequent rendering to a new page*/
+ void newPage(void);
+
/* Render/clip mode setting/query */
void setRenderMode(CairoRenderMode mode);
CairoRenderMode getRenderMode(void) const;
@@ -150,6 +155,12 @@ protected:
CairoRenderContext(CairoRenderer *renderer);
virtual ~CairoRenderContext(void);
+ enum CairoOmitTextPageState {
+ EMPTY,
+ GRAPHIC_ON_TOP,
+ NEW_PAGE_ON_GRAPHIC
+ };
+
float _width;
float _height;
unsigned short _dpi;
@@ -157,6 +168,7 @@ protected:
unsigned int _ps_level;
bool _eps;
bool _is_texttopath;
+ bool _is_omittext;
bool _is_filtertobitmap;
int _bitmapresolution;
@@ -182,6 +194,8 @@ protected:
CairoRenderMode _render_mode;
CairoClipMode _clip_mode;
+ CairoOmitTextPageState _omittext_state;
+
cairo_pattern_t *_createPatternForPaintServer(SPPaintServer const *const paintserver,
Geom::OptRect const &pbox, float alpha);
cairo_pattern_t *_createPatternPainter(SPPaintServer const *const paintserver, Geom::OptRect const &pbox);
@@ -196,6 +210,9 @@ protected:
void _concatTransform(cairo_t *cr, double xx, double yx, double xy, double yy, double x0, double y0);
void _concatTransform(cairo_t *cr, Geom::Affine const &transform);
+ void _prepareRenderGraphic(void);
+ void _prepareRenderText(void);
+
GHashTable *font_table;
static void font_data_free(gpointer data);
diff --git a/src/extension/internal/cairo-renderer-pdf-out.cpp b/src/extension/internal/cairo-renderer-pdf-out.cpp
index 0a0c3f44a..b9125582a 100644
--- a/src/extension/internal/cairo-renderer-pdf-out.cpp
+++ b/src/extension/internal/cairo-renderer-pdf-out.cpp
@@ -94,7 +94,7 @@ pdf_render_document_to_file(SPDocument *doc, gchar const *filename, unsigned int
CairoRenderContext *ctx = renderer->createContext();
ctx->setPDFLevel(level);
ctx->setTextToPath(texttopath);
- renderer->_omitText = omittext;
+ ctx->setOmitText(omittext);
ctx->setFilterToBitmap(filtertobitmap);
ctx->setBitmapResolution(resolution);
diff --git a/src/extension/internal/cairo-renderer.cpp b/src/extension/internal/cairo-renderer.cpp
index f7ab63c98..76ebbfcb5 100644
--- a/src/extension/internal/cairo-renderer.cpp
+++ b/src/extension/internal/cairo-renderer.cpp
@@ -101,7 +101,6 @@ namespace Extension {
namespace Internal {
CairoRenderer::CairoRenderer(void)
- : _omitText(false)
{}
CairoRenderer::~CairoRenderer(void)
@@ -578,11 +577,6 @@ CairoRenderer::setStateForItem(CairoRenderContext *ctx, SPItem const *item)
// TODO change this to accept a const SPItem:
void CairoRenderer::renderItem(CairoRenderContext *ctx, SPItem *item)
{
- if ( _omitText && (SP_IS_TEXT(item) || SP_IS_FLOWTEXT(item)) ) {
- // skip text if _omitText is true
- return;
- }
-
ctx->pushState();
setStateForItem(ctx, item);
diff --git a/src/extension/internal/cairo-renderer.h b/src/extension/internal/cairo-renderer.h
index c1482d82e..1ab8f1872 100644
--- a/src/extension/internal/cairo-renderer.h
+++ b/src/extension/internal/cairo-renderer.h
@@ -57,10 +57,6 @@ public:
/** Traverses the object tree and invokes the render methods. */
void renderItem(CairoRenderContext *ctx, SPItem *item);
-
- /** If _omitText is true, no text will be output to the PDF document.
- The PDF will be exactly the same as if the text was written to it and then erased. */
- bool _omitText;
};
// FIXME: this should be a static method of CairoRenderer
diff --git a/src/extension/internal/latex-text-renderer.cpp b/src/extension/internal/latex-text-renderer.cpp
index 57a71b467..55d8d8352 100644
--- a/src/extension/internal/latex-text-renderer.cpp
+++ b/src/extension/internal/latex-text-renderer.cpp
@@ -98,7 +98,9 @@ latex_render_document_text_to_file( SPDocument *doc, gchar const *filename,
LaTeXTextRenderer::LaTeXTextRenderer(bool pdflatex)
: _stream(NULL),
_filename(NULL),
- _pdflatex(pdflatex)
+ _pdflatex(pdflatex),
+ _omittext_state(EMPTY),
+ _omittext_page(1)
{
push_transform(Geom::identity());
}
@@ -262,6 +264,11 @@ LaTeXTextRenderer::sp_use_render(SPItem *item)
void
LaTeXTextRenderer::sp_text_render(SPItem *item)
{
+ // Only PDFLaTeX supports importing a single page of a graphics file,
+ // so only PDF backend gets interleaved text/graphics
+ if (_pdflatex && _omittext_state == GRAPHIC_ON_TOP)
+ _omittext_state = NEW_PAGE_ON_GRAPHIC;
+
SPText *textobj = SP_TEXT (item);
SPStyle *style = item->style;
@@ -395,6 +402,11 @@ Flowtext is possible by using a minipage! :)
Flowing in rectangle is possible, not in arb shape.
*/
+ // Only PDFLaTeX supports importing a single page of a graphics file,
+ // so only PDF backend gets interleaved text/graphics
+ if (_pdflatex && _omittext_state == GRAPHIC_ON_TOP)
+ _omittext_state = NEW_PAGE_ON_GRAPHIC;
+
SPFlowtext *flowtext = SP_FLOWTEXT(item);
SPStyle *style = item->style;
@@ -556,8 +568,13 @@ LaTeXTextRenderer::sp_item_invoke_render(SPItem *item)
return sp_text_render(item);
} else if (SP_IS_FLOWTEXT(item)) {
return sp_flowtext_render(item);
+ } else {
+ // Only PDFLaTeX supports importing a single page of a graphics file,
+ // so only PDF backend gets interleaved text/graphics
+ if (_pdflatex && (_omittext_state == EMPTY || _omittext_state == NEW_PAGE_ON_GRAPHIC))
+ writeGraphicPage();
+ _omittext_state = GRAPHIC_ON_TOP;
}
- // We are not interested in writing the other SPItem types to LaTeX
}
void
@@ -568,6 +585,20 @@ LaTeXTextRenderer::renderItem(SPItem *item)
pop_transform();
}
+void
+LaTeXTextRenderer::writeGraphicPage(void) {
+ Inkscape::SVGOStringStream os;
+ os.setf(std::ios::fixed); // no scientific notation
+
+ // strip pathname, as it is probably desired. Having a specific path in the TeX file is not convenient.
+ if (_pdflatex)
+ os << " \\put(0,0){\\includegraphics[width=\\unitlength,page=" << _omittext_page++ << "]{" << _filename << "}}%\n";
+ else
+ os << " \\put(0,0){\\includegraphics[width=\\unitlength]{" << _filename << "}}%\n";
+
+ fprintf(_stream, "%s", os.str().c_str());
+}
+
bool
LaTeXTextRenderer::setupDocument(SPDocument *doc, bool pageBoundingBox, float bleedmargin_px, SPItem *base)
{
@@ -625,11 +656,12 @@ LaTeXTextRenderer::setupDocument(SPDocument *doc, bool pageBoundingBox, float bl
os << " \\makeatother%\n";
os << " \\begin{picture}(" << _width << "," << _height << ")%\n";
- // strip pathname, as it is probably desired. Having a specific path in the TeX file is not convenient.
- os << " \\put(0,0){\\includegraphics[width=\\unitlength]{" << _filename << "}}%\n";
fprintf(_stream, "%s", os.str().c_str());
+ if (!_pdflatex)
+ writeGraphicPage();
+
return true;
}
diff --git a/src/extension/internal/latex-text-renderer.h b/src/extension/internal/latex-text-renderer.h
index 0fa94c9e6..9aecf5ed9 100644
--- a/src/extension/internal/latex-text-renderer.h
+++ b/src/extension/internal/latex-text-renderer.h
@@ -47,11 +47,20 @@ public:
void renderItem(SPItem *item);
protected:
+ enum LaTeXOmitTextPageState {
+ EMPTY,
+ GRAPHIC_ON_TOP,
+ NEW_PAGE_ON_GRAPHIC
+ };
+
FILE * _stream;
gchar * _filename;
bool _pdflatex; /** true if ouputting for pdfLaTeX*/
+ LaTeXOmitTextPageState _omittext_state;
+ gulong _omittext_page;
+
void push_transform(Geom::Affine const &transform);
Geom::Affine const & transform();
void pop_transform();
@@ -60,6 +69,8 @@ protected:
void writePreamble();
void writePostamble();
+ void writeGraphicPage();
+
void sp_item_invoke_render(SPItem *item);
void sp_root_render(SPRoot *item);
void sp_group_render(SPItem *item);