summaryrefslogtreecommitdiffstats
path: root/src/extension/internal/pdfinput/svg-builder.cpp
diff options
context:
space:
mode:
authormiklosh <miklosh@users.sourceforge.net>2007-08-09 13:04:00 +0000
committermiklosh <miklosh@users.sourceforge.net>2007-08-09 13:04:00 +0000
commite0c2afb13438f6c7494e395235e08dcde6c554a1 (patch)
tree083affebdf4e8c3fa0b732cfa7ef48badde10740 /src/extension/internal/pdfinput/svg-builder.cpp
parentFix unbalanced <b> tags in ru.po (diff)
downloadinkscape-e0c2afb13438f6c7494e395235e08dcde6c554a1.tar.gz
inkscape-e0c2afb13438f6c7494e395235e08dcde6c554a1.zip
Added support for the shading operator
(bzr r3439)
Diffstat (limited to 'src/extension/internal/pdfinput/svg-builder.cpp')
-rw-r--r--src/extension/internal/pdfinput/svg-builder.cpp59
1 files changed, 49 insertions, 10 deletions
diff --git a/src/extension/internal/pdfinput/svg-builder.cpp b/src/extension/internal/pdfinput/svg-builder.cpp
index 78426b85d..08719afd0 100644
--- a/src/extension/internal/pdfinput/svg-builder.cpp
+++ b/src/extension/internal/pdfinput/svg-builder.cpp
@@ -383,6 +383,42 @@ void SvgBuilder::addPath(GfxState *state, bool fill, bool stroke, bool even_odd)
}
/**
+ * \brief Emits the current path in poppler's GfxState data structure
+ * The path is set to be filled with the given shading.
+ */
+void SvgBuilder::addShadedFill(GfxShading *shading, double *matrix, GfxPath *path,
+ bool even_odd) {
+
+ Inkscape::XML::Node *path_node = _xml_doc->createElement("svg:path");
+ gchar *pathtext = svgInterpretPath(path);
+ path_node->setAttribute("d", pathtext);
+ g_free(pathtext);
+
+ // Set style
+ SPCSSAttr *css = sp_repr_css_attr_new();
+ gchar *id = _createGradient(shading, matrix);
+ if (id) {
+ gchar *urltext = g_strdup_printf ("url(#%s)", id);
+ sp_repr_css_set_property(css, "fill", urltext);
+ g_free(urltext);
+ g_free(id);
+ } else {
+ sp_repr_css_attr_unref(css);
+ Inkscape::GC::release(path_node);
+ return;
+ }
+ if (even_odd) {
+ sp_repr_css_set_property(css, "fill-rule", "evenodd");
+ }
+ sp_repr_css_set_property(css, "stroke", "none");
+ sp_repr_css_change(path_node, css, "style");
+ sp_repr_css_attr_unref(css);
+
+ _container->appendChild(path_node);
+ Inkscape::GC::release(path_node);
+}
+
+/**
* \brief Clips to the current path set in GfxState
* \param state poppler's data structure
* \param even_odd whether the even-odd rule should be applied
@@ -480,7 +516,9 @@ gchar *SvgBuilder::_createPattern(GfxPattern *pattern, GfxState *state, bool is_
gchar *id = NULL;
if ( pattern != NULL ) {
if ( pattern->getType() == 2 ) { // Shading pattern
- id = _createGradient((GfxShadingPattern*)pattern);
+ GfxShadingPattern *shading_pattern = (GfxShadingPattern*)pattern;
+ id = _createGradient(shading_pattern->getShading(),
+ shading_pattern->getMatrix());
} else if ( pattern->getType() == 1 ) { // Tiling pattern
id = _createTilingPattern((GfxTilingPattern*)pattern, state, is_stroke);
}
@@ -558,8 +596,7 @@ gchar *SvgBuilder::_createTilingPattern(GfxTilingPattern *tiling_pattern,
* \brief Creates a linear or radial gradient from poppler's data structure
* \return id of the created object
*/
-gchar *SvgBuilder::_createGradient(GfxShadingPattern *shading_pattern) {
- GfxShading *shading = shading_pattern->getShading();
+gchar *SvgBuilder::_createGradient(GfxShading *shading, double *matrix) {
Inkscape::XML::Node *gradient;
Function *func;
int num_funcs;
@@ -598,13 +635,15 @@ gchar *SvgBuilder::_createGradient(GfxShadingPattern *shading_pattern) {
}
gradient->setAttribute("gradientUnits", "userSpaceOnUse");
// Flip the gradient transform around the y axis
- double *p2u = shading_pattern->getMatrix();
- NR::Matrix pat_matrix(p2u[0], p2u[1], p2u[2], p2u[3], p2u[4], p2u[5]);
- NR::Matrix flip(1.0, 0.0, 0.0, -1.0, 0.0, _height * PT_PER_PX);
- pat_matrix *= flip;
- gchar *transform_text = sp_svg_transform_write(pat_matrix);
- gradient->setAttribute("gradientTransform", transform_text);
- g_free(transform_text);
+ if (matrix) {
+ NR::Matrix pat_matrix(matrix[0], matrix[1], matrix[2], matrix[3],
+ matrix[4], matrix[5]);
+ NR::Matrix flip(1.0, 0.0, 0.0, -1.0, 0.0, _height * PT_PER_PX);
+ pat_matrix *= flip;
+ gchar *transform_text = sp_svg_transform_write(pat_matrix);
+ gradient->setAttribute("gradientTransform", transform_text);
+ g_free(transform_text);
+ }
if ( extend0 && extend1 ) {
gradient->setAttribute("spreadMethod", "pad");