tdf#113050 sdext.pdfimport: Write the tiling pattern header

Add the 'tilingPatternFill' hook to our output device, but don't enable
it yet; we can do that at the end of the series.

Change-Id: Id52b023c3025f5addce1ab09663da9b8bd8a75e4
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/163561
Tested-by: Jenkins
Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk>
diff --git a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx
index 2517618..e7afe67 100644
--- a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx
+++ b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.cxx
@@ -20,6 +20,25 @@
#include "pdfioutdev_gpl.hxx"
#include "pnghelper.hxx"

#if defined __GNUC__ || defined __clang__
# pragma GCC diagnostic push
# pragma GCC diagnostic ignored "-Wunused-parameter"
#elif defined _MSC_VER
#pragma warning(push)
#pragma warning(disable : 4100) // unreferenced formal parameter
#pragma warning(disable : 4121) // alignment of a member was sensitive to packing in Gfx.h/Operator
#endif

#include <Gfx.h>
#include <splash/SplashBitmap.h>
#include <SplashOutputDev.h>
#if defined __GNUC__ || defined __clang__
# pragma GCC diagnostic pop
#elif defined _MSC_VER
#pragma warning(pop)
#endif


#include <stdlib.h>
#include <stdio.h>
#include <assert.h>
@@ -426,7 +445,6 @@ static void writeMaskLF( OutputBuffer&     o_rOutputBuf,
                         int               height,
                         bool              bInvert ) { writeMask_(o_rOutputBuf,str,width,height,bInvert); }


int PDFOutDev::parseFont( long long nNewId, GfxFont* gfxFont, const GfxState* state ) const
{
    FontAttributes aNewFont;
@@ -1163,6 +1181,50 @@ void PDFOutDev::setSkipImages( bool bSkipImages )
    m_bSkipImages = bSkipImages;
}

#if POPPLER_CHECK_VERSION(21, 3, 0)
poppler_bool PDFOutDev::tilingPatternFill(GfxState *, Gfx *, Catalog *,
                                          GfxTilingPattern *tPat, const double *mat,
                                          int x0, int y0, int x1, int y1,
                                          double xStep, double yStep)
{
    const double *pBbox = tPat->getBBox();
    const int nPaintType = tPat->getPaintType();
    double nWidth = pBbox[2] - pBbox[0];
    double nHeight = pBbox[3] - pBbox[1];

    // If our wrapper is skipping images then we don't need to do anything
    // but return 'true' so that Poppler doesn't do the slow method
    if (m_bSkipImages)
        return true;

    // Copied from the Cairo output dev; I think this is patterns
    // with gaps, let poppler do the slow method for now.
    if (xStep != nWidth || yStep != nHeight)
        return false;

    printf( "tilingPatternFill %d %d %d %d %f %f "
            "%d "
            "%f %f %f %f %f %f", // No ending space!

            x0, y0, x1, y1, normalize(xStep), normalize(yStep),

            nPaintType,

            normalize(mat[0]), normalize(mat[1]),
            normalize(mat[2]), normalize(mat[3]),
            normalize(mat[4]), normalize(mat[5])
            );

    // TODO: Write the image

    // If we return false here we can fall back to the slow path
    return true;
}

// This could be implemented for earlier versions, but the interface keeps
// changing a little; not having it is only a problem for inputs with
// large patterns.
#endif
}

/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx
index b34fad1..f38bf42 100644
--- a/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx
+++ b/sdext/source/pdfimport/xpdfwrapper/pdfioutdev_gpl.hxx
@@ -283,6 +283,13 @@ namespace pdfi

        static void setPageNum( int nNumPages );
        void setSkipImages ( bool bSkipImages );
#if POPPLER_CHECK_VERSION(21, 3, 0)
        poppler_bool useTilingPatternFill() override { return false; };
        poppler_bool tilingPatternFill(GfxState *state, Gfx *gfx, Catalog *cat,
                                       GfxTilingPattern *tPat, const double *mat,
                                       int x0, int y0, int x1, int y1,
                                       double xStep, double yStep) override;
#endif
    };
}