diff --git a/src/extension/internal/pdfinput/svg-builder.h b/src/extension/internal/pdfinput/svg-builder.h
index 8145a45224a99c460de6c2c67cddc8ec9beecb46..28f7e1be3200fb736403b821270d855a27458f99 100644 (file)
#include "CharTypes.h"
class GooString;
class Function;
-class SampledFunction;
struct GfxState;
+class GfxColor;
+class GfxColorSpace;
+class GfxRGB;
+class GfxPath;
class GfxPattern;
-class GfxShadingPattern;
class GfxTilingPattern;
+class GfxShading;
class GfxFont;
class GfxImageColorMap;
class Stream;
+class XRef;
class SPCSSAttr;
namespace Extension {
namespace Internal {
+struct SvgTransparencyGroup;
+
+/**
+ * \struct SvgGraphicsState
+ * Holds information about the current softmask and group depth.
+ * Could be later used to store other graphics state parameters so that we could
+ * emit only the differences in style settings from the parent state.
+ */
+struct SvgGraphicsState {
+ Inkscape::XML::Node *softmask; // Points to current softmask node
+ int group_depth; // Depth of nesting groups at this level
+};
+
/**
* \struct SvgGlyph
* Holds information about glyphs added by PdfParser which haven't been added
* to the document yet.
*/
struct SvgGlyph {
- NR::Point position; // Absolute glyph coords
- NR::Point transformed_position; // Glyph coords transformed by text matrix
+ Geom::Point position; // Absolute glyph coords
+ Geom::Point text_position; // Absolute glyph coords in text space
double dx, dy; // Advance values
+ double rise; // Text rise parameter
char code[8]; // UTF-8 coded character
int code_size;
bool is_space;
bool style_changed; // Set to true if style has to be reset
SPCSSAttr *style;
int render_mode; // Text render mode
+ char *font_specification; // Pointer to current font specification
};
/**
*/
class SvgBuilder {
public:
- SvgBuilder(SPDocument *document);
+ SvgBuilder(SPDocument *document, gchar *docname, XRef *xref);
SvgBuilder(SvgBuilder *parent, Inkscape::XML::Node *root);
- ~SvgBuilder();
+ virtual ~SvgBuilder();
// Property setting
void setDocumentSize(double width, double height); // Document size in px
+ void setAsLayer(char *layer_name=NULL);
+ void setGroupOpacity(double opacity);
+ Inkscape::XML::Node *getPreferences() {
+ return _preferences;
+ }
// Handling the node stack
Inkscape::XML::Node *pushGroup();
// Path adding
void addPath(GfxState *state, bool fill, bool stroke, bool even_odd=false);
+ void addShadedFill(GfxShading *shading, double *matrix, GfxPath *path, bool even_odd=false);
// Image handling
void addImage(GfxState *state, Stream *str, int width, int height,
GfxImageColorMap *color_map, int *mask_colors);
+ void addImageMask(GfxState *state, Stream *str, int width, int height,
+ bool invert);
+ void addMaskedImage(GfxState *state, Stream *str, int width, int height,
+ GfxImageColorMap *color_map,
+ Stream *mask_str, int mask_width, int mask_height,
+ bool invert_mask);
+ void addSoftMaskedImage(GfxState *state, Stream *str, int width, int height,
+ GfxImageColorMap *color_map,
+ Stream *mask_str, int mask_width, int mask_height,
+ GfxImageColorMap *mask_color_map);
+
+ // Transparency group and soft mask handling
+ void pushTransparencyGroup(GfxState *state, double *bbox,
+ GfxColorSpace *blending_color_space,
+ bool isolated, bool knockout,
+ bool for_softmask);
+ void popTransparencyGroup(GfxState *state);
+ void paintTransparencyGroup(GfxState *state, double *bbox);
+ void setSoftMask(GfxState *state, double *bbox, bool alpha,
+ Function *transfer_func, GfxColor *backdrop_color);
+ void clearSoftMask(GfxState *state);
// Text handling
void beginString(GfxState *state, GooString *s);
void restoreState();
void updateStyle(GfxState *state);
void updateFont(GfxState *state);
+ void updateTextPosition(double tx, double ty);
+ void updateTextShift(GfxState *state, double shift);
+ void updateTextMatrix(GfxState *state);
// Clipping
void clip(GfxState *state, bool even_odd=false);
// Transforming
void setTransform(double c0, double c1, double c2, double c3, double c4,
double c5);
- void setTransform(double *transform);
+ void setTransform(double const *transform);
bool getTransform(double *transform);
private:
- SvgBuilder();
+ void _init();
// Pattern creation
- gchar *_createPattern(GfxPattern *pattern);
- gchar *_createGradient(GfxShadingPattern *shading_pattern);
- bool _addStopsToGradient(Inkscape::XML::Node *gradient, Function *func, double opacity);
- bool _addSamplesToGradient(Inkscape::XML::Node *gradient, SampledFunction *func,
- double offset0, double offset1, double opacity);
- gchar *_createTilingPattern(GfxTilingPattern *tiling_pattern);
+ gchar *_createPattern(GfxPattern *pattern, GfxState *state, bool is_stroke=false);
+ gchar *_createGradient(GfxShading *shading, double *matrix, bool for_shading=false);
+ void _addStopToGradient(Inkscape::XML::Node *gradient, double offset,
+ GfxRGB *color, double opacity);
+ bool _addGradientStops(Inkscape::XML::Node *gradient, GfxShading *shading,
+ Function *func);
+ gchar *_createTilingPattern(GfxTilingPattern *tiling_pattern, GfxState *state,
+ bool is_stroke=false);
// Image/mask creation
Inkscape::XML::Node *_createImage(Stream *str, int width, int height,
GfxImageColorMap *color_map, int *mask_colors,
bool alpha_only=false, bool invert_alpha=false);
+ Inkscape::XML::Node *_createMask(double width, double height);
// Style setting
SPCSSAttr *_setStyle(GfxState *state, bool fill, bool stroke, bool even_odd=false);
void _setStrokeStyle(SPCSSAttr *css, GfxState *state);
void _flushText(); // Write buffered text into doc
+ // Handling of node stack
+ Inkscape::XML::Node *pushNode(const char* name);
+ Inkscape::XML::Node *popNode();
+ std::vector<Inkscape::XML::Node *> _node_stack;
std::vector<int> _group_depth; // Depth of nesting groups
+ SvgTransparencyGroup *_transp_group_stack; // Transparency group stack
+ std::vector<SvgGraphicsState> _state_stack;
SPCSSAttr *_font_style; // Current font style
GfxFont *_current_font;
char *_font_specification;
+ double _font_scaling;
bool _need_font_update;
- NR::Matrix _text_matrix;
+ Geom::Matrix _text_matrix;
+ Geom::Point _text_position;
std::vector<SvgGlyph> _glyphs; // Added characters
bool _in_text_object; // Whether we are inside a text object
bool _invalidated_style;
GfxState *_current_state;
+ bool _is_top_level; // Whether this SvgBuilder is the top-level one
SPDocument *_doc;
+ gchar *_docname; // Basename of the URI from which this document is created
+ XRef *_xref; // Cross-reference table from the PDF doc we're converting from
Inkscape::XML::Document *_xml_doc;
Inkscape::XML::Node *_root; // Root node from the point of view of this SvgBuilder
Inkscape::XML::Node *_container; // Current container (group/pattern/mask)
+ Inkscape::XML::Node *_preferences; // Preferences container node
double _width, _height; // Document size in px
};