poppler/PSOutputDev.cc | 55 +++++++++++++++++++++++++++++++++++++++++++++++++ poppler/PSOutputDev.h | 4 ++- 2 files changed, 58 insertions(+), 1 deletion(-)
New commits: commit e3a3e3fa996f318c36f9926fa8cc5dfc9edfac20 Author: Philipp Knechtges <[email protected]> Date: Sun Aug 26 19:37:29 2018 +0200 PSOutputDev: add native support for type 7 shadings when using level 3 Type 7 shadings are identical for PS and PDF, so we can just emit the corresponding information rather than tiling the whole domain. diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc index d1ead586..0c320fac 100644 --- a/poppler/PSOutputDev.cc +++ b/poppler/PSOutputDev.cc @@ -33,6 +33,7 @@ // Copyright (C) 2016 Caolán McNamara <[email protected]> // Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <[email protected]>. Work sponsored by the LiMux project of the city of Munich // Copyright (C) 2018 Adam Reichold <[email protected]> +// Copyright (C) 2018 Philipp Knechtges <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -4927,6 +4928,60 @@ GBool PSOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading, return gTrue; } +GBool PSOutputDev::patchMeshShadedFill(GfxState *state, + GfxPatchMeshShading *shading) { + // TODO: support parametrized shading + if (level < psLevel3 || shading->isParameterized()) { + return gFalse; + } + + writePS("%% Begin patchMeshShadedFill\n"); + + // ShadingType 7 shadings are pretty much the same for pdf and ps. + // As such, we basically just need to invert GfxPatchMeshShading::parse here. + + writePS("<<\n"); + writePS(" /ShadingType 7\n"); + writePS(" /ColorSpace "); + dumpColorSpaceL2(shading->getColorSpace(), gFalse, gFalse, gFalse); + writePS("\n"); + writePS(" /DataSource [\n"); + + const int ncomps = shading->getColorSpace()->getNComps(); + + for (int i = 0; i < shading->getNPatches(); ++i) { + const auto& patch = *shading->getPatch(i); + // Print Flag, for us always f = 0 + writePS(" 0 \n"); + + // Print coordinates + const std::array<std::pair<int,int>, 16> coordindices = {{ {0,0}, {0,1}, {0,2}, {0,3}, + {1,3}, {2,3}, {3,3}, {3,2}, + {3,1}, {3,0}, {2,0}, {1,0}, + {1,1}, {1,2}, {2,2}, {2,1} }}; + for (const auto& index: coordindices) { + writePSFmt(" {0:.6g} {1:.6g}\n", patch.x[index.first][index.second], + patch.y[index.first][index.second]); + } + + // Print colors + const std::array<std::pair<int, int>, 4> colindices = {{ {0,0}, {0,1}, {1,1}, {1,0} }}; + for (const auto& index: colindices) { + writePS(" "); + for (int comp = 0; comp < ncomps; ++comp) { + writePSFmt(" {0:.6g}", colToDbl(patch.color[index.first][index.second].c[comp])); + } + writePS("\n"); + } + } + + writePS(" ]\n"); + + writePS(">> shfill\n"); + writePS("%% End patchMeshShadedFill\n"); + return gTrue; +} + void PSOutputDev::clip(GfxState *state) { doPath(state->getPath()); writePS("W\n"); diff --git a/poppler/PSOutputDev.h b/poppler/PSOutputDev.h index b51cf472..ef6106bb 100644 --- a/poppler/PSOutputDev.h +++ b/poppler/PSOutputDev.h @@ -26,6 +26,7 @@ // Copyright (C) 2012 Fabio D'Urso <[email protected]> // Copyright (C) 2018 Klarälvdalens Datakonsult AB, a KDAB Group company, <[email protected]>. Work sponsored by the LiMux project of the city of Munich // Copyright (C) 2018 Adam Reichold <[email protected]> +// Copyright (C) 2018 Philipp Knechtges <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -152,7 +153,7 @@ public: // radialShadedFill()? If this returns false, these shaded fills // will be reduced to a series of other drawing operations. GBool useShadedFills(int type) override - { return type < 4 && level >= psLevel2; } + { return (type < 4 && level >= psLevel2) || (type == 7 && level >= psLevel3); } // Does this device use drawForm()? If this returns false, // form-type XObjects will be interpreted (i.e., unrolled). @@ -249,6 +250,7 @@ public: GfxFunctionShading *shading) override; GBool axialShadedFill(GfxState *state, GfxAxialShading *shading, double /*tMin*/, double /*tMax*/) override; GBool radialShadedFill(GfxState *state, GfxRadialShading *shading, double /*sMin*/, double /*sMax*/) override; + GBool patchMeshShadedFill(GfxState *state, GfxPatchMeshShading *shading) override; //----- path clipping void clip(GfxState *state) override; _______________________________________________ poppler mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/poppler
