diff options
| author | Alvin Penner <penner@vaxxine.com> | 2011-10-17 14:06:30 +0000 |
|---|---|---|
| committer | apenner <penner@vaxxine.com> | 2011-10-17 14:06:30 +0000 |
| commit | f53c6ac9626ae7069fe486f2f0b0667e90a1eac1 (patch) | |
| tree | b8dce9cf2219ba55fb42b16cb70301945f2f23c9 /src | |
| parent | Updated Russian translation (diff) | |
| download | inkscape-f53c6ac9626ae7069fe486f2f0b0667e90a1eac1.tar.gz inkscape-f53c6ac9626ae7069fe486f2f0b0667e90a1eac1.zip | |
pdf import. modify calculation of GradientTransform (Bug 530895)
Fixed bugs:
- https://launchpad.net/bugs/530895
(bzr r10680)
Diffstat (limited to 'src')
| -rw-r--r-- | src/extension/internal/pdfinput/svg-builder.cpp | 39 |
1 files changed, 38 insertions, 1 deletions
diff --git a/src/extension/internal/pdfinput/svg-builder.cpp b/src/extension/internal/pdfinput/svg-builder.cpp index 1aaf3a1a5..f5dea54bf 100644 --- a/src/extension/internal/pdfinput/svg-builder.cpp +++ b/src/extension/internal/pdfinput/svg-builder.cpp @@ -56,6 +56,7 @@ namespace Internal { #define TRACE(_args) IFTRACE(g_print _args) +static double ttm[6] = {1, 0, 0, 1, 0, 0}; // temporary transform matrix /** * \struct SvgTransparencyGroup @@ -561,6 +562,19 @@ bool SvgBuilder::getTransform(double *transform) { */ void SvgBuilder::setTransform(double c0, double c1, double c2, double c3, double c4, double c5) { + // do not remember the group which is a layer + if (_container->attribute("inkscape:groupmode") != NULL) { + ttm[0] = ttm[3] = 1.0; + ttm[1] = ttm[2] = ttm[4] = ttm[5] = 0.0; + } + else { + ttm[0] = c0; + ttm[1] = c1; + ttm[2] = c2; + ttm[3] = c3; + ttm[4] = c4; + ttm[5] = c5; + } // Avoid transforming a group with an already set clip-path if ( _container->attribute("clip-path") != NULL ) { @@ -608,8 +622,31 @@ gchar *SvgBuilder::_createPattern(GfxPattern *pattern, GfxState *state, bool is_ if ( pattern != NULL ) { if ( pattern->getType() == 2 ) { // Shading pattern GfxShadingPattern *shading_pattern = (GfxShadingPattern*)pattern; + double *ptm; + double ittm[6]; // invert ttm + double m[6] = {1, 0, 0, 1, 0, 0}; + double det; + + // construct a (pattern space) -> (current space) transform matrix + + ptm = shading_pattern->getMatrix(); + det = ttm[0] * ttm[3] - ttm[1] * ttm[2]; + if (det) { + ittm[0] = ttm[3] / det; + ittm[1] = -ttm[1] / det; + ittm[2] = -ttm[2] / det; + ittm[3] = ttm[0] / det; + ittm[4] = (ttm[2] * ttm[5] - ttm[3] * ttm[4]) / det; + ittm[5] = (ttm[1] * ttm[4] - ttm[0] * ttm[5]) / det; + m[0] = ptm[0] * ittm[0] + ptm[1] * ittm[2]; + m[1] = ptm[0] * ittm[1] + ptm[1] * ittm[3]; + m[2] = ptm[2] * ittm[0] + ptm[3] * ittm[2]; + m[3] = ptm[2] * ittm[1] + ptm[3] * ittm[3]; + m[4] = ptm[4] * ittm[0] + ptm[5] * ittm[2] + ittm[4]; + m[5] = ptm[4] * ittm[1] + ptm[5] * ittm[3] + ittm[5]; + } id = _createGradient(shading_pattern->getShading(), - shading_pattern->getMatrix(), + m, !is_stroke); } else if ( pattern->getType() == 1 ) { // Tiling pattern id = _createTilingPattern((GfxTilingPattern*)pattern, state, is_stroke); |
