[packages/scribus] - up to 1.6.5
mrozowik
mrozowik at pld-linux.org
Tue Dec 16 13:23:21 CET 2025
commit e699e1f15f07b457dc30f65e6d8decf882bd6950
Author: Krzysztof Mrozowicz <mrozowik at pld-linux.org>
Date: Tue Dec 16 12:23:10 2025 +0000
- up to 1.6.5
scribus-1.6.4-poppler.patch | 8217 -------------------------------------------
scribus.spec | 8 +-
2 files changed, 3 insertions(+), 8222 deletions(-)
---
diff --git a/scribus.spec b/scribus.spec
index 8487161..f8aa170 100644
--- a/scribus.spec
+++ b/scribus.spec
@@ -11,14 +11,13 @@
Summary: Scribus - Open Source Desktop Publishing
Summary(pl.UTF-8): Scribus - DTP dla Wolnego Oprogramowania
Name: scribus
-Version: 1.6.4
-Release: 6
+Version: 1.6.5
+Release: 1
License: GPL v2+
Group: X11/Applications/Publishing
Source0: https://downloads.sourceforge.net/scribus/%{name}-%{version}.tar.xz
-# Source0-md5: ec0aea8e653172e57e625d78425c0946
+# Source0-md5: 82cffe8942b26127a76299b19c1f6402
Patch0: %{name}-docs.patch
-Patch1: %{name}-1.6.4-poppler.patch
URL: https://www.scribus.net/
BuildRequires: GraphicsMagick-devel
BuildRequires: Qt5Core-devel >= %{qt_ver}
@@ -154,7 +153,6 @@ Domyślne szablony dokumentów dostarczane wraz ze Scribusem.
%prep
%setup -q
%patch -P 0 -p1
-%patch -P 1 -p1
%build
%cmake -B build \
diff --git a/scribus-1.6.4-poppler.patch b/scribus-1.6.4-poppler.patch
deleted file mode 100644
index 3e43169..0000000
--- a/scribus-1.6.4-poppler.patch
+++ /dev/null
@@ -1,8217 +0,0 @@
---- scribus-1.6.4/scribus/plugins/import/pdf/slaoutput.cpp~ 2025-04-20 13:52:19.000000000 +0000
-+++ scribus-1.6.4/scribus/plugins/import/pdf/slaoutput.cpp 2025-08-02 22:34:29.964978714 +0000
-@@ -1,4196 +1,4018 @@
--/*
--For general Scribus (>=1.3.2) copyright and licensing information please refer
--to the COPYING file provided with the program. Following this notice may exist
--a copyright and/or license notice that predates the release of Scribus 1.3.2
--for which a new license (GPL+exception) is in place.
--*/
--
--#include "slaoutput.h"
--
--#include <memory>
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)
--#include <optional>
--#endif
--
--#include <poppler/GlobalParams.h>
--#include <poppler/poppler-config.h>
--#include <poppler/FileSpec.h>
--#include <poppler/fofi/FoFiTrueType.h>
--
--#include <QApplication>
--#include <QFile>
--
--#include "commonstrings.h"
--#include "loadsaveplugin.h"
--#include "sccolorengine.h"
--#include "util.h"
--#include "util_math.h"
--#include <tiffio.h>
--
--//#ifndef DEBUG_TEXT_IMPORT
--// #define DEBUG_TEXT_IMPORT
--//#endif
--
--namespace
--{
-- // Compute the intersection of two paths while considering the fillrule of each of them.
-- // QPainterPath has the right interface to do the operation but is currently buggy.
-- // See for example https://bugreports.qt.io/browse/QTBUG-83102. Thus this function
-- // applies some heuristics to find the best result. As soon QPainterPath is fixed
-- // one can just use a.intersected(b) wherever this function is called.
-- // TODO: Find an alternative to QPainterPath that works for different fill rules.
-- QPainterPath intersection(QPainterPath const &a, QPainterPath const &b)
-- {
-- // An empty path is treated like the whole area.
-- if (a.elementCount() == 0)
-- return b;
-- if (b.elementCount() == 0)
-- return a;
--
-- QPainterPath ret_a = a.intersected(b);
-- QPainterPath ret_b = b.intersected(a);
-- // Sometimes the resulting paths are not closed even though they should.
-- // Close them now.
-- ret_a.closeSubpath();
-- ret_b.closeSubpath();
--
-- // Most of the time one of the two operations returns an empty path while the other
-- // gives us the desired result. Return the non-empty one.
-- if (ret_a.elementCount() == 0)
-- return ret_b;
-- if (ret_b.elementCount() == 0)
-- return ret_a;
--
-- // There are cases where both intersections are not empty but one of them is quite
-- // complicated with several subpaths, etc. We return the simpler one.
-- return (ret_a.elementCount() <= ret_b.elementCount()) ? ret_a : ret_b;
-- }
--
-- // Invert preblending matte values into the color values. Assuming that c and alpha are RGBA components
-- // between 0 and 255.
-- int unblendMatte(int c, int alpha, int matte)
-- {
-- if (alpha == 0)
-- return matte;
-- int ret = matte + ((c - matte) * 255) / alpha;
-- if (ret < 0)
-- return 0;
-- if (ret > 255)
-- return 255;
-- return ret;
-- }
--}
--
--#if POPPLER_ENCODED_VERSION < POPPLER_VERSION_ENCODE(24, 10, 0)
--
--LinkSubmitForm::LinkSubmitForm(Object *actionObj)
--{
-- if (!actionObj->isDict())
-- return;
--
-- Object obj1 = actionObj->dictLookup("F");
-- if (!obj1.isNull() && obj1.isDict())
-- {
-- Object obj3 = obj1.dictLookup("FS");
-- if (!obj3.isNull() && obj3.isName())
-- {
-- const char *name = obj3.getName();
-- if (!strcmp(name, "URL"))
-- {
-- Object obj2 = obj1.dictLookup("F");
-- if (!obj2.isNull())
-- m_url = obj2.getString()->copy();
-- }
-- }
-- }
-- obj1 = actionObj->dictLookup("Flags");
-- if (!obj1.isNull() && obj1.isNum())
-- m_flags = obj1.getInt();
--}
--
--LinkSubmitForm::~LinkSubmitForm()
--{
-- delete m_url;
--}
--
--#endif
--
--LinkImportData::LinkImportData(Object *actionObj)
--{
-- if (!actionObj->isDict())
-- return;
-- Object obj1 = actionObj->dictLookup("F");
-- if (obj1.isNull())
-- return;
--
-- Object obj3 = getFileSpecNameForPlatform(&obj1);
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 01, 0)
-- if (!obj3.isNull())
-- fileName = obj3.getString()->copy();
--#else
-- if (!obj3.isNull())
-- fileName.reset(obj3.getString()->copy());
--#endif
--}
--
--AnoOutputDev::AnoOutputDev(ScribusDoc* doc, QStringList *importedColors)
--{
-- m_doc = doc;
-- m_importedColors = importedColors;
-- currColorText = "Black";
-- currColorFill = CommonStrings::None;
-- currColorStroke = CommonStrings::None;
--}
--
--void AnoOutputDev::eoFill(GfxState *state)
--{
-- int shade = 100;
-- currColorFill = getColor(state->getFillColorSpace(), state->getFillColor(), &shade);
--}
--
--void AnoOutputDev::fill(GfxState *state)
--{
-- int shade = 100;
-- currColorFill = getColor(state->getFillColorSpace(), state->getFillColor(), &shade);
--}
--
--void AnoOutputDev::stroke(GfxState *state)
--{
-- int shade = 100;
-- currColorStroke = getColor(state->getStrokeColorSpace(), state->getStrokeColor(), &shade);
--}
--
--void AnoOutputDev::drawString(GfxState *state, const GooString *s)
--{
-- int shade = 100;
-- currColorText = getColor(state->getFillColorSpace(), state->getFillColor(), &shade);
-- fontSize = state->getFontSize();
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)
-- if (state->getFont() && state->getFont()->getName())
-- fontName.reset(new GooString(state->getFont()->getName().value()));
--#else
-- if (state->getFont())
-- fontName.reset(state->getFont()->getName()->copy());
--#endif
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 01, 0)
-- itemText = s->copy();
--#else
-- itemText.reset(s->copy());
--#endif
--}
--
--QString AnoOutputDev::getColor(GfxColorSpace *color_space, const GfxColor *color, int *shade)
--{
-- QString fNam;
-- QString namPrefix = "FromPDF";
-- ScColor tmp;
-- tmp.setSpotColor(false);
-- tmp.setRegistrationColor(false);
-- *shade = 100;
-- if ((color_space->getMode() == csDeviceRGB) || (color_space->getMode() == csCalRGB))
-- {
-- GfxRGB rgb;
-- color_space->getRGB(color, &rgb);
-- double Rc = colToDbl(rgb.r);
-- double Gc = colToDbl(rgb.g);
-- double Bc = colToDbl(rgb.b);
-- tmp.setRgbColorF(Rc, Gc, Bc);
-- fNam = m_doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
-- }
-- else if (color_space->getMode() == csDeviceCMYK)
-- {
-- GfxCMYK cmyk;
-- color_space->getCMYK(color, &cmyk);
-- double Cc = colToDbl(cmyk.c);
-- double Mc = colToDbl(cmyk.m);
-- double Yc = colToDbl(cmyk.y);
-- double Kc = colToDbl(cmyk.k);
-- tmp.setCmykColorF(Cc, Mc, Yc, Kc);
-- fNam = m_doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
-- }
-- else if ((color_space->getMode() == csCalGray) || (color_space->getMode() == csDeviceGray))
-- {
-- GfxGray gray;
-- color_space->getGray(color, &gray);
-- double Kc = 1.0 - colToDbl(gray);
-- tmp.setCmykColorF(0, 0, 0, Kc);
-- fNam = m_doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
-- }
-- else if (color_space->getMode() == csSeparation)
-- {
-- auto* sepColorSpace = (GfxSeparationColorSpace*) color_space;
-- GfxColorSpace* altColorSpace = sepColorSpace->getAlt();
-- QString name(sepColorSpace->getName()->c_str());
-- bool isRegistrationColor = (name == "All");
-- if (isRegistrationColor)
-- {
-- tmp.setCmykColorF(1.0, 1.0, 1.0, 1.0);
-- tmp.setRegistrationColor(true);
-- name = "Registration";
-- }
-- else if ((altColorSpace->getMode() == csDeviceRGB) || (altColorSpace->getMode() == csCalRGB))
-- {
-- double x = 1.0;
-- double comps[gfxColorMaxComps];
-- sepColorSpace->getFunc()->transform(&x, comps);
-- tmp.setRgbColorF(comps[0], comps[1], comps[2]);
-- }
-- else if ((altColorSpace->getMode() == csCalGray) || (altColorSpace->getMode() == csDeviceGray))
-- {
-- double x = 1.0;
-- double comps[gfxColorMaxComps];
-- sepColorSpace->getFunc()->transform(&x, comps);
-- tmp.setCmykColorF(0.0, 0.0, 0.0, 1.0 - comps[0]);
-- }
-- else if (altColorSpace->getMode() == csLab)
-- {
-- double x = 1.0;
-- double comps[gfxColorMaxComps];
-- sepColorSpace->getFunc()->transform(&x, comps);
-- tmp.setLabColor(comps[0], comps[1], comps[2]);
-- }
-- else
-- {
-- GfxCMYK cmyk;
-- color_space->getCMYK(color, &cmyk);
-- double Cc = colToDbl(cmyk.c);
-- double Mc = colToDbl(cmyk.m);
-- double Yc = colToDbl(cmyk.y);
-- double Kc = colToDbl(cmyk.k);
-- tmp.setCmykColorF(Cc, Mc, Yc, Kc);
-- }
-- tmp.setSpotColor(true);
--
-- fNam = m_doc->PageColors.tryAddColor(name, tmp);
-- *shade = qRound(colToDbl(color->c[0]) * 100);
-- }
-- else
-- {
-- GfxRGB rgb;
-- color_space->getRGB(color, &rgb);
-- double Rc = colToDbl(rgb.r);
-- double Gc = colToDbl(rgb.g);
-- double Bc = colToDbl(rgb.b);
-- tmp.setRgbColorF(Rc, Gc, Bc);
-- fNam = m_doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
-- // qDebug() << "update fill color other colorspace" << color_space->getMode() << "treating as rgb" << Rc << Gc << Bc;
-- }
-- if (fNam == namPrefix+tmp.name())
-- m_importedColors->append(fNam);
-- return fNam;
--}
--
--SlaOutputDev::SlaOutputDev(ScribusDoc* doc, QList<PageItem*> *Elements, QStringList *importedColors, int flags)
--{
-- m_doc = doc;
-- m_Elements = Elements;
-- pushGroup();
-- m_importedColors = importedColors;
-- m_tmpSel = new Selection(m_doc, false);
-- m_importerFlags = flags;
-- m_currentLayer = m_doc->activeLayer();
-- layersSetByOCG = false;
--}
--
--SlaOutputDev::~SlaOutputDev()
--{
-- m_groupStack.clear();
-- m_tmpSel->clear();
-- delete m_tmpSel;
-- delete m_fontEngine;
--}
--
--/* get Actions not implemented by Poppler */
--LinkAction* SlaOutputDev::SC_getAction(AnnotWidget *ano)
--{
-- LinkAction *linkAction = nullptr;
-- Object obj;
-- Ref refa = ano->getRef();
--
-- obj = m_xref->fetch(refa.num, refa.gen);
-- if (obj.isDict())
-- {
-- Dict* adic = obj.getDict();
-- const Object& additionalActions = adic->lookupNF("A");
-- Object additionalActionsObject = additionalActions.fetch(m_pdfDoc->getXRef());
-- if (additionalActionsObject.isDict())
-- {
-- Object actionObject = additionalActionsObject.dictLookup("S");
-- if (actionObject.isName("ImportData"))
-- {
-- linkAction = new LinkImportData(&additionalActionsObject);
-- }
-- else if (actionObject.isName("SubmitForm"))
-- {
-- linkAction = new LinkSubmitForm(&additionalActionsObject);
-- }
-- }
-- }
-- return linkAction;
--}
--
--/* Replacement for the crippled Poppler function LinkAction* AnnotWidget::getAdditionalAction(AdditionalActionsType type) */
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
--std::unique_ptr<LinkAction> SlaOutputDev::SC_getAdditionalAction(const char *key, AnnotWidget *ano)
--{
-- std::unique_ptr<LinkAction> linkAction;
--#else
--LinkAction* SlaOutputDev::SC_getAdditionalAction(const char *key, AnnotWidget *ano)
--{
-- LinkAction *linkAction = nullptr;
--#endif
-- Object obj;
-- Ref refa = ano->getRef();
--
-- obj = m_xref->fetch(refa.num, refa.gen);
-- if (obj.isDict())
-- {
-- Dict* adic = obj.getDict();
-- const Object& additionalActions = adic->lookupNF("AA");
-- Object additionalActionsObject = additionalActions.fetch(m_pdfDoc->getXRef());
-- if (additionalActionsObject.isDict())
-- {
-- Object actionObject = additionalActionsObject.dictLookup(key);
-- if (actionObject.isDict())
-- linkAction = LinkAction::parseAction(&actionObject, m_pdfDoc->getCatalog()->getBaseURI());
-- }
-- }
-- return linkAction;
--}
--
--bool SlaOutputDev::annotations_callback(Annot *annota, void *user_data)
--{
-- auto *dev = (SlaOutputDev*) user_data;
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)
-- const PDFRectangle& annotRect = annota->getRect();
-- const PDFRectangle* box = &annotRect;
--#else
-- PDFRectangle *box = annota->getRect();
--#endif
-- double xCoor = dev->m_doc->currentPage()->xOffset() + box->x1 - dev->cropOffsetX;
-- double yCoor = dev->m_doc->currentPage()->yOffset() + dev->m_doc->currentPage()->height() - box->y2 + dev->cropOffsetY;
-- double width = box->x2 - box->x1;
-- double height = box->y2 - box->y1;
-- if (dev->rotate == 90)
-- {
-- xCoor = dev->m_doc->currentPage()->xOffset() - dev->cropOffsetX + box->y2;
-- yCoor = dev->m_doc->currentPage()->yOffset() + dev->cropOffsetY + box->x1;
-- }
-- else if (dev->rotate == 180)
-- {
-- xCoor = dev->m_doc->currentPage()->xOffset() - dev->cropOffsetX + dev->m_doc->currentPage()->width() - box->x1;
-- yCoor = dev->m_doc->currentPage()->yOffset() + dev->cropOffsetY + box->y2;
-- }
-- else if (dev->rotate == 270)
-- {
-- xCoor = dev->m_doc->currentPage()->xOffset() - dev->cropOffsetX + dev->m_doc->currentPage()->width() - box->y2;
-- yCoor = dev->m_doc->currentPage()->yOffset() + dev->cropOffsetY + dev->m_doc->currentPage()->height() - box->x1;
-- }
-- bool retVal = true;
-- if (annota->getType() == Annot::typeText)
-- retVal = !dev->handleTextAnnot(annota, xCoor, yCoor, width, height);
-- else if (annota->getType() == Annot::typeLink)
-- retVal = !dev->handleLinkAnnot(annota, xCoor, yCoor, width, height);
-- else if (annota->getType() == Annot::typeWidget)
-- retVal = !dev->handleWidgetAnnot(annota, xCoor, yCoor, width, height);
-- return retVal;
--}
--
--bool SlaOutputDev::handleTextAnnot(Annot* annota, double xCoor, double yCoor, double width, double height)
--{
-- auto *anl = (AnnotText*) annota;
-- int z = m_doc->itemAdd(PageItem::TextFrame, PageItem::Rectangle, xCoor, yCoor, width, height, 0, CommonStrings::None, CommonStrings::None);
-- PageItem *ite = m_doc->Items->at(z);
-- int flg = annota->getFlags();
-- if (!(flg & 16))
-- ite->setRotation(rotate, true);
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setFillEvenOdd(false);
-- ite->Clip = flattenPath(ite->PoLine, ite->Segments);
-- ite->ContourLine = ite->PoLine.copy();
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
-- ite->setIsAnnotation(true);
-- ite->AutoName = false;
-- ite->annotation().setType(Annotation::Text);
-- ite->annotation().setActionType(Annotation::Action_None);
-- ite->annotation().setAnOpen(anl->getOpen());
-- QString iconName = UnicodeParsedString(anl->getIcon());
-- if (iconName == "Note")
-- ite->annotation().setIcon(Annotation::Icon_Note);
-- else if (iconName == "Comment")
-- ite->annotation().setIcon(Annotation::Icon_Comment);
-- else if (iconName == "Key")
-- ite->annotation().setIcon(Annotation::Icon_Key);
-- else if (iconName == "Help")
-- ite->annotation().setIcon(Annotation::Icon_Help);
-- else if (iconName == "NewParagraph")
-- ite->annotation().setIcon(Annotation::Icon_NewParagraph);
-- else if (iconName == "Paragraph")
-- ite->annotation().setIcon(Annotation::Icon_Paragraph);
-- else if (iconName == "Insert")
-- ite->annotation().setIcon(Annotation::Icon_Insert);
-- else if (iconName == "Cross")
-- ite->annotation().setIcon(Annotation::Icon_Cross);
-- else if (iconName == "Circle")
-- ite->annotation().setIcon(Annotation::Icon_Circle);
-- else
-- ite->annotation().setIcon(Annotation::Icon_Note);
-- ite->setItemName( CommonStrings::itemName_TextAnnotation + QString("%1").arg(m_doc->TotalItems));
-- ite->itemText.insertChars(UnicodeParsedString(annota->getContents()));
-- ite->itemText.trim();
-- return true;
--}
--
--bool SlaOutputDev::handleLinkAnnot(Annot* annota, double xCoor, double yCoor, double width, double height)
--{
-- auto *anl = (AnnotLink*) annota;
-- LinkAction *act = anl->getAction();
-- if (!act)
-- return false;
-- bool validLink = false;
-- int pagNum = 0;
-- int xco = 0;
-- int yco = 0;
-- QString fileName;
-- if (act->getKind() == actionGoTo)
-- {
-- auto *gto = (LinkGoTo*) act;
-- const LinkDest *dst = gto->getDest();
-- if (dst)
-- {
-- if (dst->getKind() == destXYZ)
-- {
-- if (dst->isPageRef())
-- {
-- Ref dstr = dst->getPageRef();
-- pagNum = m_pdfDoc->findPage(dstr);
-- }
-- else
-- pagNum = dst->getPageNum();
-- xco = dst->getLeft();
-- yco = dst->getTop();
-- validLink = true;
-- }
-- }
-- else
-- {
-- const GooString *ndst = gto->getNamedDest();
-- if (ndst)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- std::unique_ptr<LinkDest> dstn = m_pdfDoc->findDest(ndst);
--#else
-- LinkDest *dstn = m_pdfDoc->findDest(ndst);
--#endif
-- if (dstn && (dstn->getKind() == destXYZ))
-- {
-- if (dstn->isPageRef())
-- {
-- Ref dstr = dstn->getPageRef();
-- pagNum = m_pdfDoc->findPage(dstr);
-- }
-- else
-- pagNum = dstn->getPageNum();
-- xco = dstn->getLeft();
-- yco = dstn->getTop();
-- validLink = true;
-- }
-- }
-- }
-- }
-- else if (act->getKind() == actionGoToR)
-- {
-- auto *gto = (LinkGoToR*) act;
-- fileName = UnicodeParsedString(gto->getFileName());
-- const LinkDest *dst = gto->getDest();
-- if (dst)
-- {
-- if (dst->getKind() == destXYZ)
-- {
-- pagNum = dst->getPageNum();
-- xco = dst->getLeft();
-- yco = dst->getTop();
-- validLink = true;
-- }
-- }
-- else
-- {
-- const GooString *ndst = gto->getNamedDest();
-- if (ndst)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- std::unique_ptr<LinkDest> dstn = m_pdfDoc->findDest(ndst);
--#else
-- LinkDest *dstn = m_pdfDoc->findDest(ndst);
--#endif
-- if (dstn && (dstn->getKind() == destXYZ))
-- {
-- pagNum = dstn->getPageNum();
-- xco = dstn->getLeft();
-- yco = dstn->getTop();
-- validLink = true;
-- }
-- }
-- }
-- }
-- else if (act->getKind() == actionURI)
-- {
-- auto *gto = (LinkURI*) act;
-- validLink = true;
-- fileName = UnicodeParsedString(gto->getURI());
-- }
-- if (validLink)
-- {
-- int z = m_doc->itemAdd(PageItem::TextFrame, PageItem::Rectangle, xCoor, yCoor, width, height, 0, CommonStrings::None, CommonStrings::None);
-- PageItem *ite = m_doc->Items->at(z);
-- int flg = annota->getFlags();
-- if (!(flg & 16))
-- ite->setRotation(rotate, true);
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setFillEvenOdd(false);
-- ite->Clip = flattenPath(ite->PoLine, ite->Segments);
-- ite->ContourLine = ite->PoLine.copy();
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
-- ite->setIsAnnotation(true);
-- ite->AutoName = false;
-- if (act->getKind() == actionGoTo)
-- {
-- ite->annotation().setZiel((pagNum > 0) ? (pagNum - 1) : (m_actPage - 1));
-- ite->annotation().setAction(QString("%1 %2").arg(xco).arg(yco));
-- ite->annotation().setActionType(2);
-- }
-- else if (act->getKind() == actionGoToR)
-- {
-- ite->annotation().setZiel((pagNum > 0) ? (pagNum - 1) : (m_actPage - 1));
-- ite->annotation().setExtern(fileName);
-- ite->annotation().setAction(QString("%1 %2").arg(xco).arg(yco));
-- ite->annotation().setActionType(9);
-- }
-- else if (act->getKind() == actionURI)
-- {
-- ite->annotation().setAction("");
-- ite->annotation().setExtern(fileName);
-- ite->annotation().setActionType(8);
-- }
-- ite->annotation().setType(Annotation::Link);
-- ite->setItemName( CommonStrings::itemName_LinkAnnotation + QString("%1").arg(m_doc->TotalItems));
-- }
-- return validLink;
--}
--
--bool SlaOutputDev::handleWidgetAnnot(Annot* annota, double xCoor, double yCoor, double width, double height)
--{
-- bool retVal = false;
-- bool found = false;
--
-- if (!m_formWidgets)
-- return false;
--
-- int formcount = m_formWidgets->getNumWidgets();
-- for (int i = 0; i < formcount; ++i)
-- {
-- FormWidget *fm = m_formWidgets->getWidget(i);
-- if (!fm)
-- continue;
-- AnnotWidget *ano = fm->getWidgetAnnotation();
-- if (!ano)
-- continue;
-- if (ano != (AnnotWidget*) annota)
-- continue;
-- found = true;
-- int wtyp = -1;
-- if (fm->getType() == formButton)
-- {
-- auto *btn = (FormWidgetButton*) fm;
-- if (btn)
-- {
-- if (btn->getButtonType() == formButtonCheck)
-- {
-- wtyp = Annotation::Checkbox;
-- retVal = true;
-- }
-- else if (btn->getButtonType() == formButtonPush)
-- {
-- wtyp = Annotation::Button;
-- retVal = true;
-- }
-- else if (btn->getButtonType() == formButtonRadio)
-- {
-- wtyp = Annotation::RadioButton;
-- retVal = true;
-- }
-- }
-- }
-- else if (fm->getType() == formText)
-- {
-- wtyp = Annotation::Textfield;
-- retVal = true;
-- }
-- else if (fm->getType() == formChoice)
-- {
-- auto *btn = (FormWidgetChoice*) fm;
-- if (btn)
-- {
-- if (btn->isCombo())
-- {
-- wtyp = Annotation::Combobox;
-- retVal = true;
-- }
-- else if (btn->isListBox())
-- {
-- wtyp = Annotation::Listbox;
-- retVal = true;
-- }
-- }
-- }
-- if (retVal)
-- {
-- AnnotAppearanceCharacs *achar = ano->getAppearCharacs();
-- bool fgFound = false;
-- bool bgFound = false;
-- if (achar)
-- {
-- const AnnotColor *bgCol = achar->getBackColor();
-- if (bgCol)
-- {
-- bgFound = true;
-- m_graphicStack.top().fillColor = getAnnotationColor(bgCol);
-- }
-- else
-- m_graphicStack.top().fillColor = CommonStrings::None;
-- const AnnotColor *fgCol = achar->getBorderColor();
-- if (fgCol)
-- {
-- fgFound = true;
-- m_graphicStack.top().strokeColor = getAnnotationColor(fgCol);
-- }
-- else
-- {
-- fgCol = achar->getBackColor();
-- if (fgCol)
-- m_graphicStack.top().strokeColor = getAnnotationColor(fgCol);
-- else
-- m_graphicStack.top().strokeColor = CommonStrings::None;
-- }
-- }
-- QString currTextColor = "Black";
-- double fontSize = 12;
-- QString fontName;
-- QString itemText;
-- AnnotAppearance *apa = annota->getAppearStreams();
-- if (apa || !achar)
-- {
-- auto *annotOutDev = new AnoOutputDev(m_doc, m_importedColors);
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)
-- const PDFRectangle& annotaRect = annota->getRect();
-- auto* gfx = new Gfx(m_pdfDoc, annotOutDev, m_pdfDoc->getPage(m_actPage)->getResourceDict(), &annotaRect, nullptr);
--#else
-- auto* gfx = new Gfx(m_pdfDoc, annotOutDev, m_pdfDoc->getPage(m_actPage)->getResourceDict(), annota->getRect(), nullptr);
--#endif
-- ano->draw(gfx, false);
-- if (!bgFound)
-- m_graphicStack.top().fillColor = annotOutDev->currColorFill;
-- if (!fgFound)
-- m_graphicStack.top().strokeColor = annotOutDev->currColorStroke;
-- currTextColor = annotOutDev->currColorText;
-- fontSize = annotOutDev->fontSize;
-- fontName = UnicodeParsedString(annotOutDev->fontName.get());
-- itemText = UnicodeParsedString(annotOutDev->itemText.get());
-- delete gfx;
-- delete annotOutDev;
-- }
-- const auto& graphicState = m_graphicStack.top();
-- int z = m_doc->itemAdd(PageItem::TextFrame, PageItem::Rectangle, xCoor, yCoor, width, height, 0, graphicState.fillColor, CommonStrings::None);
-- PageItem *ite = m_doc->Items->at(z);
-- int flg = annota->getFlags();
-- if (!(flg & 16))
-- ite->setRotation(rotate, true);
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setFillEvenOdd(false);
-- ite->Clip = flattenPath(ite->PoLine, ite->Segments);
-- ite->ContourLine = ite->PoLine.copy();
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
-- ite->setIsAnnotation(true);
-- ite->AutoName = false;
-- AnnotBorder *brd = annota->getBorder();
-- if (brd)
-- {
-- int bsty = brd->getStyle();
-- if (bsty == AnnotBorder::borderDashed)
-- bsty = 1;
-- else if (bsty == AnnotBorder::borderBeveled)
-- bsty = 3;
-- else if (bsty == AnnotBorder::borderInset)
-- bsty = 4;
-- else if (bsty == AnnotBorder::borderUnderlined)
-- bsty = 2;
-- ite->annotation().setBorderStyle(bsty);
-- ite->annotation().setBorderColor(graphicState.strokeColor);
-- ite->annotation().setBorderWidth(qRound(brd->getWidth()));
-- }
-- else
-- {
-- ite->annotation().setBorderStyle(0);
-- ite->annotation().setBorderColor(CommonStrings::None);
-- ite->annotation().setBorderWidth(0);
-- }
-- QString tmTxt = UnicodeParsedString(fm->getPartialName());
-- if (!tmTxt.isEmpty())
-- ite->setItemName(tmTxt);
-- tmTxt.clear();
-- tmTxt = UnicodeParsedString(fm->getAlternateUiName());
-- if (!tmTxt.isEmpty())
-- ite->annotation().setToolTip(tmTxt);
-- tmTxt.clear();
-- if (achar)
-- {
-- tmTxt = UnicodeParsedString(achar->getRolloverCaption());
-- if (!tmTxt.isEmpty())
-- ite->annotation().setRollOver(tmTxt);
-- tmTxt = "";
-- tmTxt = UnicodeParsedString(achar->getAlternateCaption());
-- if (!tmTxt.isEmpty())
-- ite->annotation().setDown(tmTxt);
-- }
-- ite->annotation().setType(wtyp);
-- ite->annotation().setFlag(0);
-- if (flg & 2)
-- ite->annotation().setVis(1);
-- if (flg & 32)
-- ite->annotation().setVis(3);
-- if (wtyp == Annotation::Button)
-- {
-- ite->setFillColor(graphicState.fillColor);
-- if (achar)
-- ite->itemText.insertChars(UnicodeParsedString(achar->getNormalCaption()));
-- else
-- ite->itemText.insertChars(itemText);
-- applyTextStyle(ite, fontName, currTextColor, fontSize);
-- ite->annotation().addToFlag(Annotation::Flag_PushButton);
-- auto *btn = (FormWidgetButton*) fm;
-- if (!btn->isReadOnly())
-- ite->annotation().addToFlag(Annotation::Flag_Edit);
-- handleActions(ite, ano);
-- }
-- else if (wtyp == Annotation::Textfield)
-- {
-- auto *btn = (FormWidgetText*) fm;
-- if (btn)
-- {
-- ite->itemText.insertChars(UnicodeParsedString(btn->getContent()));
-- applyTextStyle(ite, fontName, currTextColor, fontSize);
-- ite->itemText.trim();
-- if (btn->isMultiline())
-- ite->annotation().addToFlag(Annotation::Flag_Multiline);
-- if (btn->isPassword())
-- ite->annotation().addToFlag(Annotation::Flag_Password);
-- if (btn->noSpellCheck())
-- ite->annotation().addToFlag(Annotation::Flag_DoNotSpellCheck);
-- if (btn->noScroll())
-- ite->annotation().addToFlag(Annotation::Flag_DoNotScroll);
-- int mxLen = btn->getMaxLen();
-- if (mxLen > 0)
-- ite->annotation().setMaxChar(mxLen);
-- else
-- ite->annotation().setMaxChar(-1);
-- if (!btn->isReadOnly())
-- ite->annotation().addToFlag(Annotation::Flag_Edit);
-- if (btn->getTextFontSize() == 0)
-- ite->annotation().addToFlag(Annotation::Flag_AutoTextSize);
-- handleActions(ite, ano);
-- }
-- }
-- else if (wtyp == Annotation::Checkbox)
-- {
-- auto *btn = (FormWidgetButton*) fm;
-- if (btn)
-- {
-- ite->annotation().setIsChk(btn->getState());
-- ite->annotation().setCheckState(ite->annotation().IsChk());
-- handleActions(ite, ano);
-- if (itemText == "4")
-- ite->annotation().setChkStil(0);
-- else if (itemText == "5")
-- ite->annotation().setChkStil(1);
-- else if (itemText == "F")
-- ite->annotation().setChkStil(2);
-- else if (itemText == "l")
-- ite->annotation().setChkStil(3);
-- else if (itemText == "H")
-- ite->annotation().setChkStil(4);
-- else if (itemText == "n")
-- ite->annotation().setChkStil(5);
-- else
-- ite->annotation().setChkStil(0);
-- if (!btn->isReadOnly())
-- ite->annotation().addToFlag(Annotation::Flag_Edit);
-- }
-- }
-- else if ((wtyp == Annotation::Combobox) || (wtyp == Annotation::Listbox))
-- {
-- auto *btn = (FormWidgetChoice*) fm;
-- if (btn)
-- {
-- if (wtyp == 5)
-- ite->annotation().addToFlag(Annotation::Flag_Combo);
-- int co = btn->getNumChoices();
-- if (co > 0)
-- {
-- QString inh = UnicodeParsedString(btn->getChoice(0));
-- for (int a = 1; a < co; a++)
-- {
-- inh += "\n" + UnicodeParsedString(btn->getChoice(a));
-- }
-- ite->itemText.insertChars(inh);
-- }
-- applyTextStyle(ite, fontName, currTextColor, fontSize);
-- if (!btn->isReadOnly())
-- ite->annotation().addToFlag(Annotation::Flag_Edit);
-- handleActions(ite, ano);
-- }
-- }
-- else if (wtyp == Annotation::RadioButton)
-- {
-- auto *btn = (FormWidgetButton*) fm;
-- if (btn)
-- {
-- ite->setItemName( CommonStrings::itemName_RadioButton + QString("%1").arg(m_doc->TotalItems));
-- ite->annotation().setIsChk(btn->getState());
-- ite->annotation().setCheckState(ite->annotation().IsChk());
-- handleActions(ite, ano);
-- m_radioButtons.insert(annota->getRef().num, ite);
-- }
-- }
-- }
-- break;
-- }
-- if (!found)
-- {
-- Object obj1;
-- Ref refa = annota->getRef();
-- obj1 = m_xref->fetch(refa.num, refa.gen);
-- if (obj1.isDict())
-- {
-- Dict* dict = obj1.getDict();
-- Object obj2 = dict->lookup("Kids");
-- //childs
-- if (obj2.isArray())
-- {
-- // Load children
-- QList<int> radList;
-- for (int i = 0; i < obj2.arrayGetLength(); i++)
-- {
-- const Object& childRef = obj2.arrayGetNF(i);
-- if (!childRef.isRef())
-- continue;
-- Object childObj = obj2.arrayGet(i);
-- if (!childObj.isDict())
-- continue;
-- const Ref ref = childRef.getRef();
-- radList.append(ref.num);
-- }
-- QString tmTxt = UnicodeParsedString(annota->getName());
-- m_radioMap.insert(tmTxt, radList);
-- }
-- }
-- }
-- return retVal;
--}
--
--void SlaOutputDev::applyTextStyle(PageItem* ite, const QString& fontName, const QString& textColor, double fontSize)
--{
-- CharStyle newStyle;
-- newStyle.setFillColor(textColor);
-- newStyle.setFontSize(fontSize * 10);
-- if (!fontName.isEmpty())
-- {
-- SCFontsIterator it(*m_doc->AllFonts);
-- for ( ; it.hasNext() ; it.next())
-- {
-- ScFace& face(it.current());
-- if ((face.psName() == fontName) && (face.usable()) && (face.type() == ScFace::TTF))
-- {
-- newStyle.setFont(face);
-- break;
-- }
-- if ((face.family() == fontName) && (face.usable()) && (face.type() == ScFace::TTF))
-- {
-- newStyle.setFont(face);
-- break;
-- }
-- if ((face.scName() == fontName) && (face.usable()) && (face.type() == ScFace::TTF))
-- {
-- newStyle.setFont(face);
-- break;
-- }
-- }
-- }
-- ParagraphStyle dstyle(ite->itemText.defaultStyle());
-- dstyle.charStyle().applyCharStyle(newStyle);
-- ite->itemText.setDefaultStyle(dstyle);
-- ite->itemText.applyCharStyle(0, ite->itemText.length(), newStyle);
-- ite->invalid = true;
--}
--
--void SlaOutputDev::handleActions(PageItem* ite, AnnotWidget *ano)
--{
-- LinkAction *Lact = ano->getAction();
-- if (Lact)
-- {
-- if (Lact->getKind() == actionJavaScript)
-- {
-- auto *jsa = (LinkJavaScript*) Lact;
-- if (jsa->isOk())
-- {
-- ite->annotation().setActionType(1);
-- ite->annotation().setAction(UnicodeParsedString(jsa->getScript()));
-- }
-- }
-- else if (Lact->getKind() == actionGoTo)
-- {
-- int pagNum = 0;
-- int xco = 0;
-- int yco = 0;
-- auto *gto = (LinkGoTo*) Lact;
-- const LinkDest *dst = gto->getDest();
-- if (dst)
-- {
-- if (dst->getKind() == destXYZ)
-- {
-- if (dst->isPageRef())
-- {
-- Ref dstr = dst->getPageRef();
-- pagNum = m_pdfDoc->findPage(dstr);
-- }
-- else
-- pagNum = dst->getPageNum();
-- xco = dst->getLeft();
-- yco = dst->getTop();
-- ite->annotation().setZiel((pagNum > 0) ? (pagNum - 1) : (m_actPage - 1));
-- ite->annotation().setAction(QString("%1 %2").arg(xco).arg(yco));
-- ite->annotation().setActionType(2);
-- }
-- }
-- else
-- {
-- const GooString *ndst = gto->getNamedDest();
-- if (ndst)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- std::unique_ptr<LinkDest> dstn = m_pdfDoc->findDest(ndst);
--#else
-- LinkDest *dstn = m_pdfDoc->findDest(ndst);
--#endif
-- if (dstn && (dstn->getKind() == destXYZ))
-- {
-- if (dstn->isPageRef())
-- {
-- Ref dstr = dstn->getPageRef();
-- pagNum = m_pdfDoc->findPage(dstr);
-- }
-- else
-- pagNum = dstn->getPageNum();
-- xco = dstn->getLeft();
-- yco = dstn->getTop();
-- ite->annotation().setZiel((pagNum > 0) ? (pagNum - 1) : (m_actPage - 1));
-- ite->annotation().setAction(QString("%1 %2").arg(xco).arg(yco));
-- ite->annotation().setActionType(2);
-- }
-- }
-- }
-- }
-- else if (Lact->getKind() == actionGoToR)
-- {
-- int pagNum = 0;
-- int xco = 0;
-- int yco = 0;
-- auto *gto = (LinkGoToR*) Lact;
-- QString fileName = UnicodeParsedString(gto->getFileName());
-- const LinkDest *dst = gto->getDest();
-- if (dst)
-- {
-- if (dst->getKind() == destXYZ)
-- {
-- pagNum = dst->getPageNum();
-- xco = dst->getLeft();
-- yco = dst->getTop();
-- ite->annotation().setZiel((pagNum > 0) ? (pagNum - 1) : (m_actPage - 1));
-- ite->annotation().setExtern(fileName);
-- ite->annotation().setAction(QString("%1 %2").arg(xco).arg(yco));
-- ite->annotation().setActionType(9);
-- }
-- }
-- else
-- {
-- const GooString *ndst = gto->getNamedDest();
-- if (ndst)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- std::unique_ptr<LinkDest> dstn = m_pdfDoc->findDest(ndst);
--#else
-- LinkDest *dstn = m_pdfDoc->findDest(ndst);
--#endif
-- if (dstn && (dstn->getKind() == destXYZ))
-- {
-- pagNum = dstn->getPageNum();
-- xco = dstn->getLeft();
-- yco = dstn->getTop();
-- ite->annotation().setZiel((pagNum > 0) ? (pagNum - 1) : (m_actPage - 1));
-- ite->annotation().setExtern(fileName);
-- ite->annotation().setAction(QString("%1 %2").arg(xco).arg(yco));
-- ite->annotation().setActionType(9);
-- }
-- }
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 89, 0)
-- else if (Lact->getKind() == actionResetForm)
-- {
-- ite->annotation().setActionType(4);
-- }
--#endif
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 10, 0)
-- else if (Lact->getKind() == actionSubmitForm)
-- {
-- const auto* impo = (LinkSubmitForm*) Lact;
-- if (impo->isOk())
-- {
-- ite->annotation().setActionType(3);
-- ite->annotation().setAction(UnicodeParsedString(impo->getUrl()));
-- int fl = impo->getFlags();
-- if (fl == 0)
-- ite->annotation().setHTML(0);
-- else if (fl == 4)
-- ite->annotation().setHTML(1);
-- else if (fl == 64)
-- ite->annotation().setHTML(2);
-- else if (fl == 512)
-- ite->annotation().setHTML(3);
-- }
-- }
--#endif
-- else if (Lact->getKind() == actionUnknown)
-- {
-- auto *uno = (LinkUnknown*) Lact;
-- QString actString = UnicodeParsedString(uno->getAction());
-- if (actString == "ResetForm")
-- {
-- ite->annotation().setActionType(4);
-- }
-- else
-- {
-- LinkAction* scact = SC_getAction(ano);
-- if (scact)
-- {
-- if (actString == "ImportData")
-- {
-- auto *impo = (LinkImportData*) scact;
-- if (impo->isOk())
-- {
-- ite->annotation().setActionType(5);
-- ite->annotation().setAction(UnicodeParsedString(impo->getFileName()));
-- }
-- }
-- else if (actString == "SubmitForm")
-- {
-- auto *impo = (LinkSubmitForm*) scact;
-- if (impo->isOk())
-- {
-- ite->annotation().setActionType(3);
-- ite->annotation().setAction(UnicodeParsedString(impo->getUrl()));
-- int fl = impo->getFlags();
-- if (fl == 0)
-- ite->annotation().setHTML(0);
-- else if (fl == 4)
-- ite->annotation().setHTML(1);
-- else if (fl == 64)
-- ite->annotation().setHTML(2);
-- else if (fl == 512)
-- ite->annotation().setHTML(3);
-- }
-- }
-- }
-- }
-- }
-- else if (Lact->getKind() == actionNamed)
-- {
-- auto *uno = (LinkNamed*) Lact;
-- ite->annotation().setActionType(10);
-- ite->annotation().setAction(UnicodeParsedString(uno->getName()));
-- }
-- else
-- qDebug() << "Found unsupported Action of type" << Lact->getKind();
-- }
-- auto Aact = SC_getAdditionalAction("D", ano);
-- if (Aact)
-- {
-- if (Aact->getKind() == actionJavaScript)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- auto *jsa = (LinkJavaScript*) Aact.get();
--#else
-- auto *jsa = (LinkJavaScript*) Aact;
--#endif
-- if (jsa->isOk())
-- {
-- ite->annotation().setD_act(UnicodeParsedString(jsa->getScript()));
-- ite->annotation().setAAact(true);
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- Aact.reset();
--#else
-- Aact = nullptr;
--#endif
-- }
-- Aact = SC_getAdditionalAction("E", ano);
-- if (Aact)
-- {
-- if (Aact->getKind() == actionJavaScript)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- auto *jsa = (LinkJavaScript*) Aact.get();
--#else
-- auto *jsa = (LinkJavaScript*) Aact;
--#endif
-- if (jsa->isOk())
-- {
-- ite->annotation().setE_act(UnicodeParsedString(jsa->getScript()));
-- ite->annotation().setAAact(true);
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- Aact.reset();
--#else
-- Aact = nullptr;
--#endif
-- }
-- Aact = SC_getAdditionalAction("X", ano);
-- if (Aact)
-- {
-- if (Aact->getKind() == actionJavaScript)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- auto *jsa = (LinkJavaScript*) Aact.get();
--#else
-- auto *jsa = (LinkJavaScript*) Aact;
--#endif
-- if (jsa->isOk())
-- {
-- ite->annotation().setX_act(UnicodeParsedString(jsa->getScript()));
-- ite->annotation().setAAact(true);
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- Aact.reset();
--#else
-- Aact = nullptr;
--#endif
-- }
-- Aact = SC_getAdditionalAction("Fo", ano);
-- if (Aact)
-- {
-- if (Aact->getKind() == actionJavaScript)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- auto *jsa = (LinkJavaScript*) Aact.get();
--#else
-- auto *jsa = (LinkJavaScript*) Aact;
--#endif
-- if (jsa->isOk())
-- {
-- ite->annotation().setFo_act(UnicodeParsedString(jsa->getScript()));
-- ite->annotation().setAAact(true);
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- Aact.reset();
--#else
-- Aact = nullptr;
--#endif
-- }
-- Aact = SC_getAdditionalAction("Bl", ano);
-- if (Aact)
-- {
-- if (Aact->getKind() == actionJavaScript)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- auto *jsa = (LinkJavaScript*) Aact.get();
--#else
-- auto *jsa = (LinkJavaScript*) Aact;
--#endif
-- if (jsa->isOk())
-- {
-- ite->annotation().setBl_act(UnicodeParsedString(jsa->getScript()));
-- ite->annotation().setAAact(true);
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- Aact.reset();
--#else
-- Aact = nullptr;
--#endif
-- }
-- Aact = SC_getAdditionalAction("C", ano);
-- if (Aact)
-- {
-- if (Aact->getKind() == actionJavaScript)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- auto *jsa = (LinkJavaScript*) Aact.get();
--#else
-- auto *jsa = (LinkJavaScript*) Aact;
--#endif
-- if (jsa->isOk())
-- {
-- ite->annotation().setC_act(UnicodeParsedString(jsa->getScript()));
-- ite->annotation().setAAact(true);
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- Aact.reset();
--#else
-- Aact = nullptr;
--#endif
-- }
-- Aact = SC_getAdditionalAction("F", ano);
-- if (Aact)
-- {
-- if (Aact->getKind() == actionJavaScript)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- auto *jsa = (LinkJavaScript*) Aact.get();
--#else
-- autoz*jsa = (LinkJavaScript*) Aact;
--#endif
-- if (jsa->isOk())
-- {
-- ite->annotation().setF_act(UnicodeParsedString(jsa->getScript()));
-- ite->annotation().setAAact(true);
-- ite->annotation().setFormat(5);
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- Aact.reset();
--#else
-- Aact = nullptr;
--#endif
-- }
-- Aact = SC_getAdditionalAction("K", ano);
-- if (Aact)
-- {
-- if (Aact->getKind() == actionJavaScript)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- auto *jsa = (LinkJavaScript*) Aact.get();
--#else
-- auto *jsa = (LinkJavaScript*) Aact;
--#endif
-- if (jsa->isOk())
-- {
-- ite->annotation().setK_act(UnicodeParsedString(jsa->getScript()));
-- ite->annotation().setAAact(true);
-- ite->annotation().setFormat(5);
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- Aact.reset();
--#else
-- Aact = nullptr;
--#endif
-- }
-- Aact = SC_getAdditionalAction("V", ano);
-- if (Aact)
-- {
-- if (Aact->getKind() == actionJavaScript)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- auto *jsa = (LinkJavaScript*) Aact.get();
--#else
-- auto *jsa = (LinkJavaScript*) Aact;
--#endif
-- if (jsa->isOk())
-- {
-- ite->annotation().setV_act(UnicodeParsedString(jsa->getScript()));
-- ite->annotation().setAAact(true);
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 86, 0)
-- Aact.reset();
--#else
-- Aact = nullptr;
--#endif
-- }
--}
--
--void SlaOutputDev::startDoc(PDFDoc *doc, XRef *xrefA, Catalog *catA)
--{
-- m_xref = xrefA;
-- m_catalog = catA;
-- m_pdfDoc = doc;
-- m_updateGUICounter = 0;
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(0, 84, 0)
-- m_fontEngine = new SplashFontEngine(true, false, false, true);
--#else
-- m_fontEngine = new SplashFontEngine(globalParams->getEnableFreeType(), false, false, true);
--#endif
--}
--
--void SlaOutputDev::startPage(int pageNum, GfxState *, XRef *)
--{
-- m_formWidgets = m_pdfDoc->getPage(pageNum)->getFormWidgets();
-- m_radioMap.clear();
-- m_radioButtons.clear();
-- m_actPage = pageNum;
-- m_graphicStack.clear();
-- m_groupStack.clear();
-- pushGroup();
--}
--
--void SlaOutputDev::endPage()
--{
-- if (!m_radioMap.isEmpty())
-- {
-- for (auto it = m_radioMap.begin(); it != m_radioMap.end(); ++it)
-- {
-- m_tmpSel->clear();
-- QList<int> refList = it.value();
-- for (int a = 0; a < refList.count(); a++)
-- {
-- if (m_radioButtons.contains(refList[a]))
-- {
-- m_tmpSel->addItem(m_radioButtons[refList[a]], true);
-- m_Elements->removeAll(m_radioButtons[refList[a]]);
-- }
-- }
-- if (!m_tmpSel->isEmpty())
-- {
-- PageItem *ite = m_doc->groupObjectsSelection(m_tmpSel);
-- ite->setItemName(it.key());
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- m_groupStack.top().Items.append(ite);
-- }
-- }
-- }
-- m_radioMap.clear();
-- m_radioButtons.clear();
--// qDebug() << "ending page";
--}
--
--void SlaOutputDev::saveState(GfxState *state)
--{
-- m_graphicStack.save();
-- pushGroup();
--}
--
--void SlaOutputDev::restoreState(GfxState *state)
--{
-- if (m_groupStack.count() != 0)
-- {
-- groupEntry gElements = m_groupStack.pop();
-- if (gElements.Items.count() > 0)
-- {
-- if ((gElements.Items.count() > 1) && (checkClip()))
-- {
-- m_tmpSel->clear();
-- for (int dre = 0; dre < gElements.Items.count(); ++dre)
-- {
-- m_tmpSel->addItem(gElements.Items.at(dre), true);
-- m_Elements->removeAll(gElements.Items.at(dre));
-- }
-- PageItem *ite = m_doc->groupObjectsSelection(m_tmpSel);
-- if (ite)
-- {
-- QPainterPath clippath = m_graphicStack.top().clipPath;
-- clippath.translate(m_doc->currentPage()->xOffset(), m_doc->currentPage()->yOffset());
-- clippath.translate(-ite->xPos(), -ite->yPos());
-- ite->PoLine.fromQPainterPath(clippath, true);
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- // Comment out temporarily, there are some bad interactions between adjustItemSize() and
-- // resizeGroupToContents() since fixing resizing of multiple selections
-- //m_doc->adjustItemSize(ite, true);
-- m_doc->resizeGroupToContents(ite);
-- ite->OldB2 = ite->width();
-- ite->OldH2 = ite->height();
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- applyMask(ite);
-- m_groupStack.top().Items.append(ite);
-- }
-- }
-- else
-- {
-- if (m_groupStack.count() != 0)
-- {
-- for (int dre = 0; dre < gElements.Items.count(); ++dre)
-- {
-- PageItem *ite = gElements.Items.at(dre);
-- applyMask(ite);
-- m_groupStack.top().Items.append(ite);
-- }
-- }
-- }
-- m_tmpSel->clear();
-- }
-- else
-- {
-- if (m_groupStack.count() != 0)
-- {
-- for (int dre = 0; dre < gElements.Items.count(); ++dre)
-- {
-- PageItem *ite = gElements.Items.at(dre);
-- applyMask(ite);
-- m_groupStack.top().Items.append(ite);
-- }
-- }
-- }
-- }
-- }
--
-- m_graphicStack.restore();
--}
--
--void SlaOutputDev::beginTransparencyGroup(GfxState *state, const double *bbox, GfxColorSpace * /*blendingColorSpace*/, bool isolated, bool knockout, bool forSoftMask)
--{
--// qDebug() << "SlaOutputDev::beginTransparencyGroup isolated:" << isolated << "knockout:" << knockout << "forSoftMask:" << forSoftMask;
-- pushGroup("", forSoftMask);
-- m_groupStack.top().isolated = isolated;
--}
--
--void SlaOutputDev::paintTransparencyGroup(GfxState *state, const double *bbox)
--{
--// qDebug() << "SlaOutputDev::paintTransparencyGroup";
-- if (m_groupStack.count() != 0)
-- {
-- if ((m_groupStack.top().Items.count() != 0) && (!m_groupStack.top().forSoftMask))
-- {
-- PageItem *ite = m_groupStack.top().Items.last();
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- }
-- }
--}
--
--void SlaOutputDev::endTransparencyGroup(GfxState *state)
--{
--// qDebug() << "SlaOutputDev::endTransparencyGroup";
-- if (m_groupStack.count() <= 0)
-- return;
--
-- m_tmpSel->clear();
--
-- groupEntry gElements = m_groupStack.pop();
-- if (gElements.Items.count() <= 0)
-- return;
--
-- if (gElements.forSoftMask)
-- {
-- for (int dre = 0; dre < gElements.Items.count(); ++dre)
-- {
-- m_tmpSel->addItem(gElements.Items.at(dre), true);
-- m_Elements->removeAll(gElements.Items.at(dre));
-- }
-- PageItem *ite = m_doc->groupObjectsSelection(m_tmpSel);
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- ScPattern pat(m_doc);
-- m_doc->DoDrawing = true;
-- pat.pattern = ite->DrawObj_toImage(qMin(qMax(ite->width(), ite->height()), 500.0));
-- pat.xoffset = 0;
-- pat.yoffset = 0;
-- m_doc->DoDrawing = false;
-- pat.width = ite->width();
-- pat.height = ite->height();
-- m_currentMaskPosition = QPointF(ite->xPos(), ite->yPos());
-- ite->gXpos = 0;
-- ite->gYpos = 0;
-- ite->setXYPos(ite->gXpos, ite->gYpos, true);
-- pat.items.append(ite);
-- m_doc->Items->removeAll(ite);
-- QString id = QString("Pattern_from_PDF_%1S").arg(m_doc->docPatterns.count() + 1);
-- m_doc->addPattern(id, pat);
-- m_currentMask = id;
-- m_tmpSel->clear();
-- return;
-- }
-- PageItem *ite;
-- for (int dre = 0; dre < gElements.Items.count(); ++dre)
-- {
-- m_tmpSel->addItem(gElements.Items.at(dre), true);
-- m_Elements->removeAll(gElements.Items.at(dre));
-- }
-- if ((gElements.Items.count() != 1) || (gElements.isolated))
-- ite = m_doc->groupObjectsSelection(m_tmpSel);
-- else
-- ite = gElements.Items.first();
-- if (ite->isGroup())
-- {
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- if (checkClip())
-- {
-- QPainterPath clippath = m_graphicStack.top().clipPath;
-- clippath.translate(m_doc->currentPage()->xOffset(), m_doc->currentPage()->yOffset());
-- clippath.translate(-ite->xPos(), -ite->yPos());
-- ite->PoLine.fromQPainterPath(clippath, true);
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- // Comment out temporarily, there are some bad interactions between adjustItemSize() and
-- // resizeGroupToContents() since fixing resizing of multiple selections
-- //m_doc->adjustItemSize(ite, true);
-- m_doc->resizeGroupToContents(ite);
-- ite->OldB2 = ite->width();
-- ite->OldH2 = ite->height();
-- }
-- }
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- applyMask(ite);
-- m_groupStack.top().Items.append(ite);
-- }
--
-- m_tmpSel->clear();
--}
--
--void SlaOutputDev::setSoftMask(GfxState * /*state*/, const double * bbox, bool alpha, Function *transferFunc, GfxColor * /*backdropColor*/)
--{
-- if (m_groupStack.count() <= 0)
-- return;
--
-- double lum = 0;
-- double lum2 = 0;
-- if (transferFunc)
-- transferFunc->transform(&lum, &lum2);
-- else
-- lum2 = lum;
-- m_groupStack.top().inverted = (lum != lum2);
-- m_groupStack.top().maskName = m_currentMask;
-- // Remember the mask's position as it might not align with the image to which the mask is later assigned.
-- m_groupStack.top().maskPos = m_currentMaskPosition;
-- m_groupStack.top().alpha = alpha;
-- if (m_groupStack.top().Items.count() != 0)
-- applyMask(m_groupStack.top().Items.last());
--}
--
--void SlaOutputDev::clearSoftMask(GfxState * /*state*/)
--{
-- if (m_groupStack.count() != 0)
-- m_groupStack.top().maskName = "";
--}
--
--void SlaOutputDev::updateFillColor(GfxState *state)
--{
-- auto& graphicState = m_graphicStack.top();
-- graphicState.fillShade = 100;
-- graphicState.fillColor = getColor(state->getFillColorSpace(), state->getFillColor(), &graphicState.fillShade);
--}
--
--void SlaOutputDev::updateStrokeColor(GfxState *state)
--{
-- auto& graphicState = m_graphicStack.top();
-- graphicState.strokeShade = 100;
-- graphicState.strokeColor = getColor(state->getStrokeColorSpace(), state->getStrokeColor(), &graphicState.strokeShade);
--}
--
--void SlaOutputDev::clip(GfxState *state)
--{
--// qDebug() << "Clip";
-- adjustClip(state, Qt::WindingFill);
--}
--
--void SlaOutputDev::eoClip(GfxState *state)
--{
--// qDebug() << "EoClip";
-- adjustClip(state, Qt::OddEvenFill);
--}
--
--void SlaOutputDev::adjustClip(GfxState *state, Qt::FillRule fillRule)
--{
-- const double *ctm = state->getCTM();
-- m_ctm = QTransform(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
-- QString output = convertPath(state->getPath());
-- if (output.isEmpty())
-- return;
--
-- FPointArray out;
-- out.parseSVG(output);
-- out.svgClosePath();
-- out.map(m_ctm);
-- if (checkClip())
-- {
-- // "clip" (WindingFill) and "eoClip" (OddEvenFill) only the determine
-- // the fill rule of the new clipping path. The new clip should be the
-- // intersection of the old and new area. QPainterPath determines on
-- // its own which fill rule to use for the result. We should not loose
-- // this information.
-- QPainterPath pathN = out.toQPainterPath(false);
-- pathN.setFillRule(fillRule);
-- m_graphicStack.top().clipPath = intersection(pathN, m_graphicStack.top().clipPath);
-- }
-- else
-- m_graphicStack.top().clipPath = out.toQPainterPath(false);
--}
--
--void SlaOutputDev::stroke(GfxState *state)
--{
--// qDebug() << "Stroke";
-- const double *ctm = state->getCTM();
-- m_ctm = QTransform(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
-- double xCoor = m_doc->currentPage()->xOffset();
-- double yCoor = m_doc->currentPage()->yOffset();
-- getPenState(state);
--
-- auto& graphicState = m_graphicStack.top();
-- graphicState.strokeColor = getColor(state->getStrokeColorSpace(), state->getStrokeColor(), &graphicState.strokeShade);
--
-- QString output = convertPath(state->getPath());
--
-- FPointArray out;
-- out.parseSVG(output);
-- out.map(m_ctm);
--
-- // Path is the same as in last fill
-- if (!m_Elements->isEmpty() && /*(m_coords == output)*/
-- ((m_Elements->last()->PoLine == out) || (m_pathIsClosed && (m_coords == output))))
-- {
-- PageItem* ite = m_Elements->last();
-- ite->setLineColor(graphicState.strokeColor);
-- ite->setLineShade(graphicState.strokeShade);
-- ite->setLineEnd(m_lineEnd);
-- ite->setLineJoin(m_lineJoin);
-- ite->setLineWidth(state->getTransformedLineWidth());
-- ite->setDashes(m_dashValues);
-- ite->setDashOffset(m_dashOffset);
-- ite->setLineTransparency(1.0 - state->getStrokeOpacity());
-- return;
-- }
--
-- FPoint wh = out.widthHeight();
-- if ((out.size() <= 3) || ((wh.x() <= 0.0) && (wh.y() <= 0.0)))
-- return;
--
-- int z;
-- if (m_pathIsClosed)
-- z = m_doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, xCoor, yCoor, 10, 10, state->getTransformedLineWidth(), CommonStrings::None, graphicState.strokeColor);
-- else
-- z = m_doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, xCoor, yCoor, 10, 10, state->getTransformedLineWidth(), CommonStrings::None, graphicState.strokeColor);
-- PageItem* ite = m_doc->Items->at(z);
-- ite->PoLine = out.copy();
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setWidthHeight(wh.x(), wh.y());
-- m_doc->adjustItemSize(ite);
-- if (m_Elements->count() != 0)
-- {
-- PageItem* lItem = m_Elements->last();
-- if ((lItem->lineColor() == CommonStrings::None) && (lItem->PoLine == ite->PoLine))
-- {
-- lItem->setLineColor(graphicState.strokeColor);
-- lItem->setLineWidth(state->getTransformedLineWidth());
-- lItem->setLineShade(graphicState.strokeShade);
-- lItem->setLineTransparency(1.0 - state->getStrokeOpacity());
-- lItem->setLineBlendmode(getBlendMode(state));
-- lItem->setLineEnd(m_lineEnd);
-- lItem->setLineJoin(m_lineJoin);
-- lItem->setDashes(m_dashValues);
-- lItem->setDashOffset(m_dashOffset);
-- lItem->setTextFlowMode(PageItem::TextFlowDisabled);
-- m_doc->Items->removeAll(ite);
-- }
-- else
-- {
-- ite->setLineShade(graphicState.strokeShade);
-- ite->setLineTransparency(1.0 - state->getStrokeOpacity());
-- ite->setLineBlendmode(getBlendMode(state));
-- ite->setLineEnd(m_lineEnd);
-- ite->setLineJoin(m_lineJoin);
-- ite->setDashes(m_dashValues);
-- ite->setDashOffset(m_dashOffset);
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- m_groupStack.top().Items.append(ite);
-- }
-- }
-- else
-- {
-- ite->setLineShade(graphicState.strokeShade);
-- ite->setLineTransparency(1.0 - state->getStrokeOpacity());
-- ite->setLineBlendmode(getBlendMode(state));
-- ite->setLineEnd(m_lineEnd);
-- ite->setLineJoin(m_lineJoin);
-- ite->setDashes(m_dashValues);
-- ite->setDashOffset(m_dashOffset);
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- m_groupStack.top().Items.append(ite);
-- }
--}
--
--void SlaOutputDev::fill(GfxState *state)
--{
--// qDebug() << "Fill";
-- createFillItem(state, Qt::WindingFill);
--}
--
--void SlaOutputDev::eoFill(GfxState *state)
--{
--// qDebug() << "EoFill";
-- createFillItem(state, Qt::OddEvenFill);
--}
--
--void SlaOutputDev::createFillItem(GfxState *state, Qt::FillRule fillRule)
--{
-- const double *ctm;
-- ctm = state->getCTM();
-- m_ctm = QTransform(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
-- double xCoor = m_doc->currentPage()->xOffset();
-- double yCoor = m_doc->currentPage()->yOffset();
-- FPointArray out;
-- QString output = convertPath(state->getPath());
-- out.parseSVG(output);
-- out.map(m_ctm);
--
-- auto& graphicState = m_graphicStack.top();
--
-- // Clip the new path first and only add it if it is not empty.
-- QPainterPath path = out.toQPainterPath(false);
-- path.setFillRule(fillRule);
-- QPainterPath clippedPath = intersection(graphicState.clipPath, path);
--
-- // Undo the rotation of the clipping path as it is rotated together with the item.
-- double angle = m_ctm.map(QLineF(0, 0, 1, 0)).angle();
-- QTransform mm;
-- mm.rotate(angle);
-- clippedPath = mm.map(clippedPath);
--
-- QRectF bbox = clippedPath.boundingRect();
-- if (clippedPath.isEmpty() || bbox.isNull())
-- return;
-- m_coords = output;
--
-- graphicState.fillColor = getColor(state->getFillColorSpace(), state->getFillColor(), &graphicState.fillShade);
-- int z;
-- if (m_pathIsClosed)
-- z = m_doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, xCoor, yCoor, 10, 10, 0, graphicState.fillColor, CommonStrings::None);
-- else
-- z = m_doc->itemAdd(PageItem::PolyLine, PageItem::Unspecified, xCoor, yCoor, 10, 10, 0, graphicState.fillColor, CommonStrings::None);
-- PageItem* ite = m_doc->Items->at(z);
-- ite->PoLine.fromQPainterPath(clippedPath, m_pathIsClosed);
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setFillShade(graphicState.fillShade);
-- ite->setLineShade(100);
-- ite->setRotation(-angle);
-- // Only the new path has to be interpreted according to fillRule. QPainterPath
-- // could decide to create a final path according to the other rule. Thus
-- // we have to set this from the final path.
-- ite->setFillEvenOdd(clippedPath.fillRule() == Qt::OddEvenFill);
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- ite->setLineEnd(m_lineEnd);
-- ite->setLineJoin(m_lineJoin);
-- ite->setWidthHeight(bbox.width(),bbox.height());
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- m_doc->adjustItemSize(ite);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
--}
--
--bool SlaOutputDev::axialShadedFill(GfxState *state, GfxAxialShading *shading, double tMin, double tMax)
--{
--// qDebug() << "SlaOutputDev::axialShadedFill";
-- double GrStartX;
-- double GrStartY;
-- double GrEndX;
-- double GrEndY;
-- int shade = 100;
-- const Function *func = shading->getFunc(0);
-- VGradient fillGradient(VGradient::linear);
-- fillGradient.clearStops();
-- GfxColorSpace *color_space = shading->getColorSpace();
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 3, 0)
-- if (func->getType() == Function::Type::Stitching)
--#else
-- if (func->getType() == 3)
--#endif
-- {
-- const auto *stitchingFunc = (const StitchingFunction*) func;
-- const double *bounds = stitchingFunc->getBounds();
-- int num_funcs = stitchingFunc->getNumFuncs();
-- double domain_min = stitchingFunc->getDomainMin(0);
-- double domain_max = stitchingFunc->getDomainMax(0);
-- if (fabs(domain_max - domain_min) < 1e-6)
-- {
-- domain_min = 0.0;
-- domain_max = 1.0;
-- }
-- // Add stops from all the stitched functions
-- for (int i = 0 ; i <= num_funcs ; i++)
-- {
-- GfxColor temp;
-- shading->getColor(bounds[i], &temp);
-- QString stopColor = getColor(color_space, &temp, &shade);
-- double stopPoint = (bounds[i] - domain_min) / (domain_max - domain_min);
-- fillGradient.addStop( ScColorEngine::getShadeColor(m_doc->PageColors[stopColor], m_doc, shade), stopPoint, 0.5, 1.0, stopColor, shade );
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 3, 0)
-- else if ((func->getType() == Function::Type::Exponential) || (func->getType() == Function::Type::Sampled))
--#else
-- else if ((func->getType() == 2) || (func->getType() == 0))
--#endif
-- {
-- GfxColor stop1;
-- shading->getColor(0.0, &stop1);
-- QString stopColor1 = getColor(color_space, &stop1, &shade);
-- fillGradient.addStop( ScColorEngine::getShadeColor(m_doc->PageColors[stopColor1], m_doc, shade), 0.0, 0.5, 1.0, stopColor1, shade );
-- GfxColor stop2;
-- shading->getColor(1.0, &stop2);
-- QString stopColor2 = getColor(color_space, &stop2, &shade);
-- fillGradient.addStop( ScColorEngine::getShadeColor(m_doc->PageColors[stopColor2], m_doc, shade), 1.0, 0.5, 1.0, stopColor2, shade );
-- }
-- shading->getCoords(&GrStartX, &GrStartY, &GrEndX, &GrEndY);
-- double xmin, ymin, xmax, ymax;
-- // get the clip region bbox
-- state->getClipBBox(&xmin, &ymin, &xmax, &ymax);
-- QRectF crect(QPointF(xmin, ymin), QPointF(xmax, ymax));
-- crect = crect.normalized();
-- QPainterPath out;
-- out.addRect(crect);
-- if (checkClip())
-- {
-- // Apply the clip path early to adjust the gradient vector to the
-- // smaller boundign box.
-- out = intersection(m_graphicStack.top().clipPath, out);
-- crect = out.boundingRect();
-- }
-- const double *ctm = state->getCTM();
-- m_ctm = QTransform(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
-- FPointArray gr;
-- gr.addPoint(GrStartX, GrStartY);
-- gr.addPoint(GrEndX, GrEndY);
-- gr.map(m_ctm);
-- gr.translate(-crect.x(), -crect.y());
--
-- // Undo the rotation and translation of the gradient vector.
-- double angle = m_ctm.map(QLineF(0, 0, 1, 0)).angle();
-- QTransform mm;
-- mm.rotate(angle);
-- out.translate(-crect.x(), -crect.y());
-- out = mm.map(out);
-- QRectF bb = out.boundingRect();
-- gr.map(mm);
-- gr.translate(-bb.left(), -bb.top());
-- GrStartX = gr.point(0).x();
-- GrStartY = gr.point(0).y();
-- GrEndX = gr.point(1).x();
-- GrEndY = gr.point(1).y();
--
-- double xCoor = m_doc->currentPage()->xOffset();
-- double yCoor = m_doc->currentPage()->yOffset();
-- QString output = QString("M %1 %2").arg(0.0).arg(0.0);
-- output += QString("L %1 %2").arg(crect.width()).arg(0.0);
-- output += QString("L %1 %2").arg(crect.width()).arg(crect.height());
-- output += QString("L %1 %2").arg(0.0).arg(crect.height());
-- output += QString("L %1 %2").arg(0.0).arg(0.0);
-- output += QString("Z");
-- m_pathIsClosed = true;
-- m_coords = output;
--
-- const auto& graphicState = m_graphicStack.top();
-- int z = m_doc->itemAdd(PageItem::Polygon, PageItem::Rectangle, xCoor + crect.x(), yCoor + crect.y(), bb.width(), bb.height(), 0, graphicState.fillColor, CommonStrings::None);
-- PageItem* ite = m_doc->Items->at(z);
-- if (checkClip())
-- {
-- ite->PoLine.fromQPainterPath(out, true);
-- ite->setFillEvenOdd(out.fillRule() == Qt::OddEvenFill);
-- }
-- ite->setRotation(-angle);
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setFillShade(graphicState.fillShade);
-- ite->setLineShade(100);
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- ite->setLineEnd(m_lineEnd);
-- ite->setLineJoin(m_lineJoin);
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- ite->GrType = 6;
-- if (!shading->getExtend0() || !shading->getExtend1())
-- {
-- fillGradient.setRepeatMethod(VGradient::none);
-- ite->setGradientExtend(VGradient::none);
-- }
-- else
-- {
-- fillGradient.setRepeatMethod(VGradient::pad);
-- ite->setGradientExtend(VGradient::pad);
-- }
-- ite->fill_gradient = fillGradient;
-- ite->setGradientVector(GrStartX, GrStartY, GrEndX, GrEndY, 0, 0, 1, 0);
-- m_doc->adjustItemSize(ite);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
-- return true;
--}
--
--bool SlaOutputDev::radialShadedFill(GfxState *state, GfxRadialShading *shading, double sMin, double sMax)
--{
--// qDebug() << "SlaOutputDev::radialShadedFill";
-- double GrStartX;
-- double GrStartY;
-- double GrEndX;
-- double GrEndY;
-- int shade = 100;
-- const Function *func = shading->getFunc(0);
-- VGradient fillGradient(VGradient::linear);
-- fillGradient.clearStops();
-- GfxColorSpace *color_space = shading->getColorSpace();
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 3, 0)
-- if (func->getType() == Function::Type::Stitching)
--#else
-- if (func->getType() == 3)
--#endif
-- {
-- const auto *stitchingFunc = (const StitchingFunction*) func;
-- const double *bounds = stitchingFunc->getBounds();
-- int num_funcs = stitchingFunc->getNumFuncs();
-- double domain_min = stitchingFunc->getDomainMin(0);
-- double domain_max = stitchingFunc->getDomainMax(0);
-- if (fabs(domain_max - domain_min) < 1e-6)
-- {
-- domain_min = 0.0;
-- domain_max = 1.0;
-- }
-- // Add stops from all the stitched functions
-- for (int i = 0 ; i <= num_funcs ; i++)
-- {
-- GfxColor temp;
-- shading->getColor(bounds[i], &temp);
-- QString stopColor = getColor(color_space, &temp, &shade);
-- double stopPoint = (bounds[i] - domain_min) / (domain_max - domain_min);
-- fillGradient.addStop( ScColorEngine::getShadeColor(m_doc->PageColors[stopColor], m_doc, shade), stopPoint, 0.5, 1.0, stopColor, shade );
-- }
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 3, 0)
-- else if ((func->getType() == Function::Type::Exponential) || (func->getType() == Function::Type::Sampled))
--#else
-- else if ((func->getType() == 2) || (func->getType() == 0))
--#endif
-- {
-- GfxColor stop1;
-- shading->getColor(0.0, &stop1);
-- QString stopColor1 = getColor(color_space, &stop1, &shade);
-- fillGradient.addStop( ScColorEngine::getShadeColor(m_doc->PageColors[stopColor1], m_doc, shade), 0.0, 0.5, 1.0, stopColor1, shade );
-- GfxColor stop2;
-- shading->getColor(1.0, &stop2);
-- QString stopColor2 = getColor(color_space, &stop2, &shade);
-- fillGradient.addStop( ScColorEngine::getShadeColor(m_doc->PageColors[stopColor2], m_doc, shade), 1.0, 0.5, 1.0, stopColor2, shade );
-- }
--
-- double r0, x1, y1, r1;
-- shading->getCoords(&GrStartX, &GrStartY, &r0, &x1, &y1, &r1);
-- double xmin, ymin, xmax, ymax;
-- // get the clip region bbox
-- state->getClipBBox(&xmin, &ymin, &xmax, &ymax);
-- QRectF crect(QPointF(xmin, ymin), QPointF(xmax, ymax));
-- crect = crect.normalized();
-- double GrFocalX = x1;
-- double GrFocalY = y1;
-- GrEndX = GrFocalX + r1;
-- GrEndY = GrFocalY;
-- const double *ctm = state->getCTM();
-- m_ctm = QTransform(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
-- FPointArray gr;
-- gr.addPoint(GrStartX, GrStartY);
-- gr.addPoint(GrEndX, GrEndY);
-- gr.addPoint(GrFocalX, GrFocalY);
-- gr.map(m_ctm);
-- GrStartX = gr.point(0).x() - crect.x();
-- GrStartY = gr.point(0).y() - crect.y();
-- GrEndX = gr.point(1).x() - crect.x();
-- GrEndY = gr.point(1).y() - crect.y();
-- GrFocalX = gr.point(2).x() - crect.x();
-- GrFocalY = gr.point(2).y() - crect.y();
-- double xCoor = m_doc->currentPage()->xOffset();
-- double yCoor = m_doc->currentPage()->yOffset();
-- QString output = QString("M %1 %2").arg(0.0).arg(0.0);
-- output += QString("L %1 %2").arg(crect.width()).arg(0.0);
-- output += QString("L %1 %2").arg(crect.width()).arg(crect.height());
-- output += QString("L %1 %2").arg(0.0).arg(crect.height());
-- output += QString("L %1 %2").arg(0.0).arg(0.0);
-- output += QString("Z");
-- m_pathIsClosed = true;
-- m_coords = output;
--
-- const auto& graphicState = m_graphicStack.top();
-- int z = m_doc->itemAdd(PageItem::Polygon, PageItem::Rectangle, xCoor + crect.x(), yCoor + crect.y(), crect.width(), crect.height(), 0, graphicState.fillColor, CommonStrings::None);
-- PageItem* ite = m_doc->Items->at(z);
-- if (checkClip())
-- {
-- QPainterPath out = graphicState.clipPath;
-- out.translate(m_doc->currentPage()->xOffset(), m_doc->currentPage()->yOffset());
-- out.translate(-ite->xPos(), -ite->yPos());
-- ite->PoLine.fromQPainterPath(out, true);
-- ite->setFillEvenOdd(out.fillRule() == Qt::OddEvenFill);
-- }
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setFillShade(graphicState.fillShade);
-- ite->setLineShade(100);
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- ite->setLineEnd(m_lineEnd);
-- ite->setLineJoin(m_lineJoin);
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- ite->GrType = 7;
-- if (!shading->getExtend0() || !shading->getExtend1())
-- {
-- fillGradient.setRepeatMethod(VGradient::none);
-- ite->setGradientExtend(VGradient::none);
-- }
-- else
-- {
-- fillGradient.setRepeatMethod(VGradient::pad);
-- ite->setGradientExtend(VGradient::pad);
-- }
-- ite->fill_gradient = fillGradient;
-- ite->setGradientVector(GrStartX, GrStartY, GrEndX, GrEndY, GrFocalX, GrFocalY, 1, 0);
-- m_doc->adjustItemSize(ite);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
-- return true;
--}
--
--bool SlaOutputDev::gouraudTriangleShadedFill(GfxState *state, GfxGouraudTriangleShading *shading)
--{
--// qDebug() << "SlaOutputDev::gouraudTriangleShadedFill";
-- double xCoor = m_doc->currentPage()->xOffset();
-- double yCoor = m_doc->currentPage()->yOffset();
-- double xmin, ymin, xmax, ymax;
-- // get the clip region bbox
-- state->getClipBBox(&xmin, &ymin, &xmax, &ymax);
-- QRectF crect(QPointF(xmin, ymin), QPointF(xmax, ymax));
-- crect = crect.normalized();
-- QString output = QString("M %1 %2").arg(0.0).arg(0.0);
-- output += QString("L %1 %2").arg(crect.width()).arg(0.0);
-- output += QString("L %1 %2").arg(crect.width()).arg(crect.height());
-- output += QString("L %1 %2").arg(0.0).arg(crect.height());
-- output += QString("L %1 %2").arg(0.0).arg(0.0);
-- output += QString("Z");
-- m_pathIsClosed = true;
-- m_coords = output;
-- const double *ctm = state->getCTM();
-- m_ctm = QTransform(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
-- const auto& graphicState = m_graphicStack.top();
-- int z = m_doc->itemAdd(PageItem::Polygon, PageItem::Rectangle, xCoor + crect.x(), yCoor + crect.y(), crect.width(), crect.height(), 0, graphicState.fillColor, CommonStrings::None);
-- PageItem* ite = m_doc->Items->at(z);
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setFillShade(graphicState.fillShade);
-- ite->setLineShade(100);
-- ite->setFillEvenOdd(false);
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- ite->setLineEnd(m_lineEnd);
-- ite->setLineJoin(m_lineJoin);
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- m_doc->adjustItemSize(ite);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
-- GfxColor color[3];
-- double x0, y0, x1, y1, x2, y2;
-- for (int i = 0; i < shading->getNTriangles(); i++)
-- {
-- int shade = 100;
-- meshGradientPatch patchM;
-- shading->getTriangle(i, &x0, &y0, &color[0], &x1, &y1, &color[1], &x2, &y2, &color[2]);
-- patchM.BL.resetTo(FPoint(x0, y0));
-- patchM.BL.shade = 100;
-- patchM.BL.transparency = 1.0;
-- patchM.BL.colorName = getColor(shading->getColorSpace(), &color[0], &shade);
-- patchM.BL.color = ScColorEngine::getShadeColorProof(m_doc->PageColors[patchM.BL.colorName], m_doc, shade);
-- patchM.TL.resetTo(FPoint(x1, y1));
-- patchM.TL.shade = 100;
-- patchM.TL.transparency = 1.0;
-- patchM.TL.colorName = getColor(shading->getColorSpace(), &color[1], &shade);
-- patchM.TL.color = ScColorEngine::getShadeColorProof(m_doc->PageColors[patchM.TL.colorName], m_doc, shade);
-- patchM.TR.resetTo(FPoint(x2, y2));
-- patchM.TR.shade = 100;
-- patchM.TR.transparency = 1.0;
-- patchM.TR.colorName = getColor(shading->getColorSpace(), &color[2], &shade);
-- patchM.TR.color = ScColorEngine::getShadeColorProof(m_doc->PageColors[patchM.TR.colorName], m_doc, shade);
-- patchM.BR.resetTo(FPoint(x0, y0));
-- patchM.BR.shade = 100;
-- patchM.BR.transparency = 1.0;
-- patchM.BR.colorName = getColor(shading->getColorSpace(), &color[0], &shade);
-- patchM.BR.color = ScColorEngine::getShadeColorProof(m_doc->PageColors[patchM.BR.colorName], m_doc, shade);
-- patchM.TL.transform(m_ctm);
-- patchM.TL.moveRel(-crect.x(), -crect.y());
-- patchM.TR.transform(m_ctm);
-- patchM.TR.moveRel(-crect.x(), -crect.y());
-- patchM.BR.transform(m_ctm);
-- patchM.BR.moveRel(-crect.x(), -crect.y());
-- patchM.BL.transform(m_ctm);
-- patchM.BL.moveRel(-crect.x(), -crect.y());
-- ite->meshGradientPatches.append(patchM);
-- }
-- ite->GrType = 12;
-- return true;
--}
--
--bool SlaOutputDev::patchMeshShadedFill(GfxState *state, GfxPatchMeshShading *shading)
--{
--// qDebug() << "SlaOutputDev::patchMeshShadedFill";
-- double xCoor = m_doc->currentPage()->xOffset();
-- double yCoor = m_doc->currentPage()->yOffset();
-- double xmin, ymin, xmax, ymax;
-- // get the clip region bbox
-- state->getClipBBox(&xmin, &ymin, &xmax, &ymax);
-- QRectF crect(QPointF(xmin, ymin), QPointF(xmax, ymax));
-- crect = crect.normalized();
-- QString output = QString("M %1 %2").arg(0.0).arg(0.0);
-- output += QString("L %1 %2").arg(crect.width()).arg(0.0);
-- output += QString("L %1 %2").arg(crect.width()).arg(crect.height());
-- output += QString("L %1 %2").arg(0.0).arg(crect.height());
-- output += QString("L %1 %2").arg(0.0).arg(0.0);
-- output += QString("Z");
-- m_pathIsClosed = true;
-- m_coords = output;
-- const double *ctm = state->getCTM();
-- m_ctm = QTransform(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
-- const auto& graphicState = m_graphicStack.top();
-- int z = m_doc->itemAdd(PageItem::Polygon, PageItem::Rectangle, xCoor + crect.x(), yCoor + crect.y(), crect.width(), crect.height(), 0, graphicState.fillColor, CommonStrings::None);
-- PageItem* ite = m_doc->Items->at(z);
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setFillShade(graphicState.fillShade);
-- ite->setLineShade(100);
-- ite->setFillEvenOdd(false);
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- ite->setLineEnd(m_lineEnd);
-- ite->setLineJoin(m_lineJoin);
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- m_doc->adjustItemSize(ite);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
-- ite->meshGradientPatches.clear();
-- for (int i = 0; i < shading->getNPatches(); i++)
-- {
-- int shade = 100;
-- const GfxPatch *patch = shading->getPatch(i);
-- GfxColor color;
-- meshGradientPatch patchM;
-- int u, v;
-- patchM.BL.resetTo(FPoint(patch->x[0][0], patch->y[0][0]));
-- patchM.BL.controlTop = FPoint(patch->x[0][1], patch->y[0][1]);
-- patchM.BL.controlRight = FPoint(patch->x[1][0], patch->y[1][0]);
-- patchM.BL.controlColor = FPoint(patch->x[1][1], patch->y[1][1]);
-- u = 0;
-- v = 0;
-- if (shading->isParameterized())
-- {
-- shading->getParameterizedColor (patch->color[u][v].c[0], &color);
-- }
-- else
-- {
-- for (int k = 0; k < shading->getColorSpace()->getNComps(); k++)
-- {
-- color.c[k] = GfxColorComp (patch->color[u][v].c[k]);
-- }
-- }
-- patchM.BL.colorName = getColor(shading->getColorSpace(), &color, &shade);
-- patchM.BL.shade = 100;
-- patchM.BL.transparency = 1.0;
-- patchM.BL.color = ScColorEngine::getShadeColorProof(m_doc->PageColors[patchM.BL.colorName], m_doc, shade);
--
-- u = 0;
-- v = 1;
-- patchM.TL.resetTo(FPoint(patch->x[0][3], patch->y[0][3]));
-- patchM.TL.controlRight = FPoint(patch->x[1][3], patch->y[1][3]);
-- patchM.TL.controlBottom = FPoint(patch->x[0][2], patch->y[0][2]);
-- patchM.TL.controlColor = FPoint(patch->x[1][2], patch->y[1][2]);
-- if (shading->isParameterized())
-- {
-- shading->getParameterizedColor (patch->color[u][v].c[0], &color);
-- }
-- else
-- {
-- for (int k = 0; k < shading->getColorSpace()->getNComps(); k++)
-- {
-- color.c[k] = GfxColorComp (patch->color[u][v].c[k]);
-- }
-- }
-- patchM.TL.colorName = getColor(shading->getColorSpace(), &color, &shade);
-- patchM.TL.shade = 100;
-- patchM.TL.transparency = 1.0;
-- patchM.TL.color = ScColorEngine::getShadeColorProof(m_doc->PageColors[patchM.TL.colorName], m_doc, shade);
--
-- u = 1;
-- v = 1;
-- patchM.TR.resetTo(FPoint(patch->x[3][3], patch->y[3][3]));
-- patchM.TR.controlBottom = FPoint(patch->x[3][2], patch->y[3][2]);
-- patchM.TR.controlLeft = FPoint(patch->x[2][3], patch->y[2][3]);
-- patchM.TR.controlColor = FPoint(patch->x[2][2], patch->y[2][2]);
-- if (shading->isParameterized())
-- {
-- shading->getParameterizedColor (patch->color[u][v].c[0], &color);
-- }
-- else
-- {
-- for (int k = 0; k < shading->getColorSpace()->getNComps(); k++)
-- {
-- color.c[k] = GfxColorComp (patch->color[u][v].c[k]);
-- }
-- }
-- patchM.TR.colorName = getColor(shading->getColorSpace(), &color, &shade);
-- patchM.TR.shade = 100;
-- patchM.TR.transparency = 1.0;
-- patchM.TR.color = ScColorEngine::getShadeColorProof(m_doc->PageColors[patchM.TR.colorName], m_doc, shade);
--
-- u = 1;
-- v = 0;
-- patchM.BR.resetTo(FPoint(patch->x[3][0], patch->y[3][0]));
-- patchM.BR.controlLeft = FPoint(patch->x[2][0], patch->y[2][0]);
-- patchM.BR.controlTop = FPoint(patch->x[3][1], patch->y[3][1]);
-- patchM.BR.controlColor = FPoint(patch->x[2][1], patch->y[2][1]);
-- if (shading->isParameterized())
-- {
-- shading->getParameterizedColor (patch->color[u][v].c[0], &color);
-- }
-- else
-- {
-- for (int k = 0; k < shading->getColorSpace()->getNComps(); k++)
-- {
-- color.c[k] = GfxColorComp (patch->color[u][v].c[k]);
-- }
-- }
-- patchM.BR.colorName = getColor(shading->getColorSpace(), &color, &shade);
-- patchM.BR.shade = 100;
-- patchM.BR.transparency = 1.0;
-- patchM.BR.color = ScColorEngine::getShadeColorProof(m_doc->PageColors[patchM.BR.colorName], m_doc, shade);
--
-- patchM.TL.transform(m_ctm);
-- patchM.TL.moveRel(-crect.x(), -crect.y());
-- patchM.TR.transform(m_ctm);
-- patchM.TR.moveRel(-crect.x(), -crect.y());
-- patchM.BR.transform(m_ctm);
-- patchM.BR.moveRel(-crect.x(), -crect.y());
-- patchM.BL.transform(m_ctm);
-- patchM.BL.moveRel(-crect.x(), -crect.y());
-- ite->meshGradientPatches.append(patchM);
-- }
-- ite->GrType = 12;
-- return true;
--}
--
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(21, 3, 0)
--bool SlaOutputDev::tilingPatternFill(GfxState *state, Gfx * /*gfx*/, Catalog *cat, GfxTilingPattern *tPat, const double *mat, int x0, int y0, int x1, int y1, double xStep, double yStep)
--#else
--bool SlaOutputDev::tilingPatternFill(GfxState *state, Gfx * /*gfx*/, Catalog *cat, Object *str, const double *pmat, int /*paintType*/, int /*tilingType*/, Dict *resDict, const double *mat, const double *bbox, int x0, int y0, int x1, int y1, double xStep, double yStep)
--#endif
--{
--// qDebug() << "SlaOutputDev::tilingPatternFill";
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(21, 3, 0)
-- const double *bbox = tPat->getBBox();
-- const double *pmat = tPat->getMatrix();
-- Dict *resDict = tPat->getResDict();
--#endif
--
-- PDFRectangle box;
-- Gfx *gfx;
-- QString id;
-- PageItem *ite;
-- groupEntry gElements;
-- m_groupStack.push(gElements);
-- double width, height;
-- width = bbox[2] - bbox[0];
-- height = bbox[3] - bbox[1];
-- if (xStep != width || yStep != height)
-- return false;
-- box.x1 = bbox[0];
-- box.y1 = bbox[1];
-- box.x2 = bbox[2];
-- box.y2 = bbox[3];
--
-- const double *ctm = state->getCTM();
-- m_ctm = QTransform(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
-- QTransform mm(mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
-- QTransform mmx = mm * m_ctm;
--
-- gfx = new Gfx(m_pdfDoc, this, resDict, &box, nullptr);
-- m_inPattern++;
-- // Unset the clip path as it is unrelated to the pattern's coordinate space.
-- QPainterPath savedClip = m_graphicStack.top().clipPath;
-- m_graphicStack.top().clipPath = QPainterPath();
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(21, 3, 0)
-- gfx->display(tPat->getContentStream());
--#else
-- gfx->display(str);
--#endif
-- m_graphicStack.top().clipPath = savedClip;
-- m_inPattern--;
-- m_doc->m_Selection->clear();
--
-- gElements = m_groupStack.pop();
-- if (gElements.Items.count() > 0)
-- {
-- for (int dre = 0; dre < gElements.Items.count(); ++dre)
-- {
-- m_doc->m_Selection->addItem(gElements.Items.at(dre), true);
-- m_Elements->removeAll(gElements.Items.at(dre));
-- }
-- m_doc->itemSelection_FlipV();
-- PageItem *ite;
-- if (m_doc->m_Selection->count() > 1)
-- ite = m_doc->groupObjectsSelection();
-- else
-- ite = m_doc->m_Selection->itemAt(0);
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- m_doc->m_Selection->clear();
-- m_doc->DoDrawing = true;
-- ScPattern pat(m_doc);
-- pat.pattern = ite->DrawObj_toImage(qMin(qMax(ite->width(), ite->height()), 500.0));
-- pat.xoffset = 0;
-- pat.yoffset = 0;
-- m_doc->DoDrawing = false;
-- pat.width = ite->width();
-- pat.height = ite->height();
-- ite->gXpos = 0;
-- ite->gYpos = 0;
-- ite->setXYPos(ite->gXpos, ite->gYpos, true);
-- pat.items.append(ite);
-- m_doc->Items->removeAll(ite);
-- id = QString("Pattern_from_PDF_%1").arg(m_doc->docPatterns.count() + 1);
-- m_doc->addPattern(id, pat);
-- }
-- double xCoor = m_doc->currentPage()->xOffset();
-- double yCoor = m_doc->currentPage()->yOffset();
-- double xmin, ymin, xmax, ymax;
-- // get the clip region bbox
-- state->getClipBBox(&xmin, &ymin, &xmax, &ymax);
-- QRectF crect(QPointF(xmin, ymin), QPointF(xmax, ymax));
-- crect = crect.normalized();
-- QString output = QString("M %1 %2").arg(0.0).arg(0.0);
-- output += QString("L %1 %2").arg(crect.width()).arg(0.0);
-- output += QString("L %1 %2").arg(crect.width()).arg(crect.height());
-- output += QString("L %1 %2").arg(0.0).arg(crect.height());
-- output += QString("L %1 %2").arg(0.0).arg(0.0);
-- output += QString("Z");
-- m_pathIsClosed = true;
-- m_coords = output;
--
-- const auto& graphicState = m_graphicStack.top();
-- int z = m_doc->itemAdd(PageItem::Polygon, PageItem::Rectangle, xCoor + crect.x(), yCoor + crect.y(), crect.width(), crect.height(), 0, graphicState.fillColor, CommonStrings::None);
-- ite = m_doc->Items->at(z);
--
-- m_ctm = QTransform(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
-- double angle = m_ctm.map(QLineF(0, 0, 1, 0)).angle();
-- ite->setRotation(-angle);
-- if (checkClip())
-- {
-- QPainterPath outline = graphicState.clipPath;
-- outline.translate(xCoor - ite->xPos(), yCoor - ite->yPos());
-- // Undo the rotation of the clipping path as it is rotated together with the item.
-- QTransform mm;
-- mm.rotate(angle);
-- outline = mm.map(outline);
-- ite->PoLine.fromQPainterPath(outline, true);
-- ite->setFillEvenOdd(outline.fillRule() == Qt::OddEvenFill);
-- }
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setFillShade(graphicState.fillShade);
-- ite->setLineShade(100);
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- ite->setLineEnd(m_lineEnd);
-- ite->setLineJoin(m_lineJoin);
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- ite->GrType = 8;
-- ite->setPattern(id);
-- ite->setPatternTransform(fabs(pmat[0]), fabs(pmat[3]), mmx.dx() - ctm[4], mmx.dy() - ctm[5], 0, -1 * pmat[1], pmat[2]);
-- m_doc->adjustItemSize(ite);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
-- delete gfx;
-- return true;
--}
--
--void SlaOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, int width, int height, bool invert, bool interpolate, bool inlineImg)
--{
--// qDebug() << "Draw Image Mask";
-- auto imgStr = std::make_shared<ImageStream>(str, width, 1, 1);
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 02, 0)
-- bool resetDone = imgStr->reset();
-- if (!resetDone)
-- return;
--#else
-- imgStr->reset();
--#endif
--
--#ifdef WORDS_BIGENDIAN
-- QImage image(width, height, QImage::Format_Mono);
--#else
-- QImage image(width, height, QImage::Format_MonoLSB);
--#endif
-- if (image.isNull())
-- return;
--
-- int invertBit = invert ? 1 : 0;
-- unsigned char* buffer = image.bits();
-- unsigned char* dest = nullptr;
-- int rowStride = image.bytesPerLine();
-- int i, bit;
-- unsigned char* pix;
--
-- for (int y = 0; y < height; y++)
-- {
-- pix = imgStr->getLine();
-- dest = buffer + y * rowStride;
-- i = 0;
-- bit = 0;
-- for (int x = 0; x < width; x++)
-- {
-- if (bit == 0)
-- dest[i] = 0;
-- if (!(pix[x] ^ invertBit))
-- {
--#ifdef WORDS_BIGENDIAN
-- dest[i] |= (1 << (7 - bit));
--#else
-- dest[i] |= (1 << bit);
--#endif
-- }
-- bit++;
-- if (bit > 7)
-- {
-- bit = 0;
-- i++;
-- }
-- }
-- }
-- const auto& graphicState = m_graphicStack.top();
-- QColor backColor = ScColorEngine::getShadeColorProof(m_doc->PageColors[graphicState.fillColor], m_doc, graphicState.fillShade);
-- QImage res(width, height, QImage::Format_ARGB32);
-- res.fill(backColor.rgb());
-- unsigned char cc, cm, cy, ck;
-- for (int yi = 0; yi < res.height(); ++yi)
-- {
-- QRgb *t = (QRgb*)(res.scanLine( yi ));
-- for (int xi = 0; xi < res.width(); ++xi)
-- {
-- cc = static_cast<unsigned char>( qRed(*t) );
-- cm = static_cast<unsigned char>( qGreen(*t) );
-- cy = static_cast<unsigned char>( qBlue(*t) );
-- ck = static_cast<unsigned char>( image.pixel(xi, yi) );
-- if (ck == 0)
-- (*t) = qRgba(cc, cm, cy, 0);
-- else
-- (*t) = qRgba(cc, cm, cy, 255);
-- t++;
-- }
-- }
--
-- createImageFrame(res, state, 3);
--
-- imgStr->close();
--}
--
--void SlaOutputDev::drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, bool interpolate, Stream *maskStr, int maskWidth, int maskHeight,
-- GfxImageColorMap *maskColorMap, bool maskInterpolate)
--{
--// qDebug() << "SlaOutputDev::drawSoftMaskedImage Masked Image Components" << colorMap->getNumPixelComps();
-- auto imgStr = std::make_shared<ImageStream>(str, width, colorMap->getNumPixelComps(), colorMap->getBits());
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 02, 0)
-- bool resetDone = imgStr->reset();
-- if (!resetDone)
-- return;
--#else
-- imgStr->reset();
--#endif
--
-- unsigned int *dest = nullptr;
-- unsigned char * buffer = new unsigned char[width * height * 4];
-- for (int y = 0; y < height; y++)
-- {
-- dest = (unsigned int *)(buffer + y * 4 * width);
-- unsigned char * pix = imgStr->getLine();
-- colorMap->getRGBLine(pix, dest, width);
-- }
--
-- QImage image(buffer, width, height, QImage::Format_RGB32);
-- if (image.isNull())
-- {
-- delete[] buffer;
-- return;
-- }
--
-- auto mskStr = std::make_shared<ImageStream>(maskStr, maskWidth, maskColorMap->getNumPixelComps(), maskColorMap->getBits());
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 02, 0)
-- bool mskResetDone = mskStr->reset();
-- if (!mskResetDone)
-- return;
--#else
-- mskStr->reset();
--#endif
--
-- unsigned char *mdest = nullptr;
-- unsigned char * mbuffer = new unsigned char[maskWidth * maskHeight];
-- memset(mbuffer, 0, maskWidth * maskHeight);
-- for (int y = 0; y < maskHeight; y++)
-- {
-- mdest = mbuffer + y * maskWidth;
-- unsigned char * pix = mskStr->getLine();
-- maskColorMap->getGrayLine(pix, mdest, maskWidth);
-- }
-- if ((maskWidth != width) || (maskHeight != height))
-- image = image.scaled(maskWidth, maskHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
-- QImage res = image.convertToFormat(QImage::Format_ARGB32);
--
-- int matteRc, matteGc, matteBc;
-- const GfxColor *matteColor = maskColorMap->getMatteColor();
-- if (matteColor != nullptr)
-- {
-- GfxRGB matteRgb;
-- colorMap->getColorSpace()->getRGB(matteColor, &matteRgb);
-- matteRc = qRound(colToDbl(matteRgb.r) * 255);
-- matteGc = qRound(colToDbl(matteRgb.g) * 255);
-- matteBc = qRound(colToDbl(matteRgb.b) * 255);
-- }
--
-- unsigned char cr, cg, cb, ca;
-- int s = 0;
-- for (int yi = 0; yi < res.height(); ++yi)
-- {
-- QRgb *t = (QRgb*)(res.scanLine( yi ));
-- for (int xi = 0; xi < res.width(); ++xi)
-- {
-- cr = static_cast<unsigned char>( qRed(*t) );
-- cg = static_cast<unsigned char>( qGreen(*t) );
-- cb = static_cast<unsigned char>( qBlue(*t) );
-- ca = mbuffer[s];
-- if (matteColor != nullptr)
-- {
-- cr = static_cast<unsigned char>( unblendMatte(cr, ca, matteRc) );
-- cg = static_cast<unsigned char>( unblendMatte(cg, ca, matteGc) );
-- cb = static_cast<unsigned char>( unblendMatte(cb, ca, matteBc) );
-- }
-- (*t) = qRgba(cr, cg, cb, ca);
-- s++;
-- t++;
-- }
-- }
--
-- createImageFrame(res, state, 3);
--
-- delete[] buffer;
-- delete[] mbuffer;
--}
--
--void SlaOutputDev::drawMaskedImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, bool interpolate, Stream *maskStr, int maskWidth, int maskHeight, bool maskInvert, bool maskInterpolate)
--{
--// qDebug() << "SlaOutputDev::drawMaskedImage";
-- auto imgStr = std::make_shared<ImageStream>(str, width, colorMap->getNumPixelComps(), colorMap->getBits());
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 02, 0)
-- bool resetDone = imgStr->reset();
-- if (resetDone)
-- return;
--#else
-- imgStr->reset();
--#endif
--
-- unsigned int *dest = nullptr;
-- unsigned char * buffer = new unsigned char[width * height * 4];
-- for (int y = 0; y < height; y++)
-- {
-- dest = (unsigned int *)(buffer + y * 4 * width);
-- unsigned char * pix = imgStr->getLine();
-- colorMap->getRGBLine(pix, dest, width);
-- }
--
-- QImage image(buffer, width, height, QImage::Format_RGB32);
-- if (image.isNull())
-- {
-- delete[] buffer;
-- return;
-- }
--
-- auto mskStr = std::make_shared<ImageStream>(maskStr, maskWidth, 1, 1);
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 02, 0)
-- bool mskResetDone = mskStr->reset();
-- if (!mskResetDone)
-- return;
--#else
-- mskStr->reset();
--#endif
--
-- unsigned char *mdest = nullptr;
-- int invert_bit = maskInvert ? 1 : 0;
-- unsigned char * mbuffer = new unsigned char[maskWidth * maskHeight];
-- memset(mbuffer, 0, maskWidth * maskHeight);
-- for (int y = 0; y < maskHeight; y++)
-- {
-- mdest = mbuffer + y * maskWidth;
-- unsigned char * pix = mskStr->getLine();
-- for (int x = 0; x < maskWidth; x++)
-- {
-- if (pix[x] ^ invert_bit)
-- *mdest++ = 0;
-- else
-- *mdest++ = 255;
-- }
-- }
-- if ((maskWidth != width) || (maskHeight != height))
-- image = image.scaled(maskWidth, maskHeight, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);
-- QImage res = image.convertToFormat(QImage::Format_ARGB32);
-- unsigned char cc, cm, cy, ck;
-- int s = 0;
-- for (int yi = 0; yi < res.height(); ++yi)
-- {
-- QRgb *t = (QRgb*)(res.scanLine( yi ));
-- for (int xi = 0; xi < res.width(); ++xi)
-- {
-- cc = static_cast<unsigned char>( qRed(*t) );
-- cm = static_cast<unsigned char>( qGreen(*t) );
-- cy = static_cast<unsigned char>( qBlue(*t) );
-- ck = mbuffer[s];
-- (*t) = qRgba(cc, cm, cy, ck);
-- s++;
-- t++;
-- }
-- }
--
-- createImageFrame(res, state, 3);
--
-- delete[] buffer;
-- delete[] mbuffer;
--}
--
--void SlaOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, int width, int height, GfxImageColorMap *colorMap, bool interpolate, POPPLER_CONST_082 int* maskColors, bool inlineImg)
--{
-- auto imgStr = std::make_shared<ImageStream>(str, width, colorMap->getNumPixelComps(), colorMap->getBits());
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 02, 0)
-- bool resetDone = imgStr->reset();
-- if (!resetDone)
-- return;
--#else
-- imgStr->reset();
--#endif
--
-- QImage image(width, height, QImage::Format_ARGB32);
-- if (image.isNull())
-- return;
--
-- if (maskColors)
-- {
-- for (int y = 0; y < height; y++)
-- {
-- QRgb *s = (QRgb*)(image.scanLine(y));
-- unsigned char *pix = imgStr->getLine();
-- for (int x = 0; x < width; x++)
-- {
-- GfxRGB rgb;
-- colorMap->getRGB(pix, &rgb);
-- int Rc = qRound(colToDbl(rgb.r) * 255);
-- int Gc = qRound(colToDbl(rgb.g) * 255);
-- int Bc = qRound(colToDbl(rgb.b) * 255);
-- *s = qRgba(Rc, Gc, Bc, 255);
-- for (int i = 0; i < colorMap->getNumPixelComps(); ++i)
-- {
-- if (pix[i] < maskColors[2*i] * 255 || pix[i] > maskColors[2*i+1] * 255)
-- {
-- *s = *s | 0xff000000;
-- break;
-- }
-- }
-- s++;
-- pix += colorMap->getNumPixelComps();
-- }
-- }
-- }
-- else
-- {
-- for (int y = 0; y < height; y++)
-- {
-- QRgb *s = (QRgb*)(image.scanLine(y));
-- unsigned char *pix = imgStr->getLine();
-- for (int x = 0; x < width; x++)
-- {
-- if (colorMap->getNumPixelComps() == 4)
-- {
-- GfxCMYK cmyk;
-- colorMap->getCMYK(pix, &cmyk);
-- int Cc = qRound(colToDbl(cmyk.c) * 255);
-- int Mc = qRound(colToDbl(cmyk.m) * 255);
-- int Yc = qRound(colToDbl(cmyk.y) * 255);
-- int Kc = qRound(colToDbl(cmyk.k) * 255);
-- *s = qRgba(Yc, Mc, Cc, Kc);
-- }
-- else
-- {
-- GfxRGB rgb;
-- colorMap->getRGB(pix, &rgb);
-- int Rc = qRound(colToDbl(rgb.r) * 255);
-- int Gc = qRound(colToDbl(rgb.g) * 255);
-- int Bc = qRound(colToDbl(rgb.b) * 255);
-- *s = qRgba(Rc, Gc, Bc, 255);
-- }
-- s++;
-- pix += colorMap->getNumPixelComps();
-- }
-- }
-- }
--
-- createImageFrame(image, state, colorMap->getNumPixelComps());
--}
--
--void SlaOutputDev::createImageFrame(QImage& image, GfxState *state, int numColorComponents)
--{
--// qDebug() << "SlaOutputDev::createImageFrame";
-- const double *ctm = state->getCTM();
-- double xCoor = m_doc->currentPage()->xOffset();
-- double yCoor = m_doc->currentPage()->yOffset();
--
-- m_ctm = QTransform(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
-- double angle = m_ctm.map(QLineF(0, 0, 1, 0)).angle();
-- QPointF torigin;
-- // In PDF all images considered squares with unit length that are transformed into the proper
-- // dimensions by ctm.
-- // A positive determinant retains orientation. Thus orientation is the same as in the PDF
-- // coordinate system (y-axis increases upwards). As Scribus uses the inverse orientation the
-- // image needs to be flipped (a horizontal flip is applied later). For a flipped image the
-- // corner that will be origin in Scribus is the upper right corner (1, 1) of the image.
-- // A negative determinant changes the orientation such that the image is already in the Scribus
-- // coordinate orientation and no flip is necessary. The origin will be the upper left corner (0, 1).
-- if (m_ctm.determinant() > 0) {
-- torigin = m_ctm.map(QPointF(1, 1));
-- } else {
-- torigin = m_ctm.map(QPointF(0, 1));
-- }
--
-- // Determine the visible area of the picture after clipping it. If it is empty, no item
-- // needs to be created.
-- QPainterPath outline;
-- outline.addRect(0, 0, 1, 1);
-- outline = m_ctm.map(outline);
-- outline = intersection(outline, m_graphicStack.top().clipPath);
--
-- if ((m_inPattern == 0) && (outline.isEmpty() || outline.boundingRect().isNull()))
-- return;
--
-- // Determine the width and height of the image by undoing the rotation part
-- // of the CTM and applying the result to the unit square.
-- QTransform without_rotation;
-- without_rotation = m_ctm * without_rotation.rotate(angle);
-- QRectF trect_wr = without_rotation.mapRect(QRectF(0, 0, 1, 1));
--
-- int z = m_doc->itemAdd(PageItem::ImageFrame, PageItem::Rectangle, xCoor + torigin.x(), yCoor + torigin.y(), trect_wr.width(), trect_wr.height(), 0, CommonStrings::None, CommonStrings::None);
-- PageItem* ite = m_doc->Items->at(z);
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- m_doc->setRedrawBounding(ite);
-- ite->Clip = flattenPath(ite->PoLine, ite->Segments);
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- ite->setFillShade(100);
-- ite->setLineShade(100);
-- ite->setFillEvenOdd(false);
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- if (m_ctm.determinant() > 0)
-- {
-- ite->setRotation(-(angle - 180));
-- ite->setImageFlippedH(true);
-- }
-- else
-- ite->setRotation(-angle);
-- m_doc->adjustItemSize(ite);
--
-- if (numColorComponents == 4)
-- {
-- auto *tempFile = new QTemporaryFile(QDir::tempPath() + "/scribus_temp_pdf_XXXXXX.tif");
-- tempFile->setAutoRemove(false);
-- if (tempFile->open())
-- {
-- QString fileName = getLongPathName(tempFile->fileName());
-- if (!fileName.isEmpty())
-- {
-- tempFile->close();
-- ite->isInlineImage = true;
-- ite->isTempFile = true;
-- ite->AspectRatio = false;
-- ite->ScaleType = false;
-- TIFF* tif = TIFFOpen(fileName.toLocal8Bit().data(), "w");
-- if (tif)
-- {
-- TIFFSetField(tif, TIFFTAG_IMAGEWIDTH, image.width());
-- TIFFSetField(tif, TIFFTAG_IMAGELENGTH, image.height());
-- TIFFSetField(tif, TIFFTAG_BITSPERSAMPLE, 8);
-- TIFFSetField(tif, TIFFTAG_SAMPLESPERPIXEL, 4);
-- TIFFSetField(tif, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
-- TIFFSetField(tif, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_SEPARATED);
-- TIFFSetField(tif, TIFFTAG_COMPRESSION, COMPRESSION_LZW);
-- for (int y = 0; y < image.height(); ++y)
-- {
-- TIFFWriteScanline(tif, image.scanLine(y), y);
-- }
-- TIFFClose(tif);
-- m_doc->loadPict(fileName, ite);
-- }
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
-- }
-- else
-- m_doc->Items->removeAll(ite);
-- }
-- delete tempFile;
-- }
-- else
-- {
-- auto *tempFile = new QTemporaryFile(QDir::tempPath() + "/scribus_temp_pdf_XXXXXX.png");
-- tempFile->setAutoRemove(false);
-- if (tempFile->open())
-- {
-- QString fileName = getLongPathName(tempFile->fileName());
-- if (!fileName.isEmpty())
-- {
-- tempFile->close();
-- ite->isInlineImage = true;
-- ite->isTempFile = true;
-- ite->AspectRatio = false;
-- ite->ScaleType = false;
-- image.save(fileName, "PNG");
-- m_doc->loadPict(fileName, ite);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
-- }
-- else
-- m_doc->Items->removeAll(ite);
-- }
-- delete tempFile;
-- }
-- if (m_inPattern == 0)
-- {
-- outline.translate(xCoor - ite->xPos(), yCoor - ite->yPos());
-- // Undo the rotation of the clipping path as it is rotated together with the image.
-- QTransform mm;
-- mm.rotate(-ite->rotation());
-- outline = mm.map(outline);
-- ite->PoLine.fromQPainterPath(outline, true);
-- ite->setFillEvenOdd(outline.fillRule() == Qt::OddEvenFill);
-- ite->ClipEdited = true;
-- ite->FrameType = 3;
-- ite->setTextFlowMode(PageItem::TextFlowDisabled);
-- ite->ScaleType = true;
-- m_doc->adjustItemSize(ite);
-- ite->OldB2 = ite->width();
-- ite->OldH2 = ite->height();
-- ite->updateClip();
-- }
--}
--
--void SlaOutputDev::beginMarkedContent(const char *name, Object *dictRef)
--{
-- mContent mSte;
-- mSte.name = QString(name);
-- mSte.ocgName = "";
-- if (m_importerFlags & LoadSavePlugin::lfCreateDoc)
-- {
-- if (dictRef->isNull())
-- return;
-- POPPLER_CONST_25_02 OCGs *contentConfig = m_catalog->getOptContentConfig();
-- OptionalContentGroup *oc;
-- if (dictRef->isRef())
-- {
-- oc = contentConfig->findOcgByRef(dictRef->getRef());
-- if (oc)
-- {
--// qDebug() << "Begin OCG Content (Ref) with Name " << QString(name) << "Layer" << UnicodeParsedString(oc->getName());
-- m_doc->setActiveLayer(UnicodeParsedString(oc->getName()));
-- mSte.ocgName = UnicodeParsedString(oc->getName());
-- }
-- }
-- else
-- {
-- Object dictObj = dictRef->fetch(m_xref);
-- if (!dictObj.isDict())
-- return;
-- Dict* dict = dictObj.getDict();
-- Object dictType = dict->lookup("Type");
-- if (dictType.isName("OCG"))
-- {
-- oc = contentConfig->findOcgByRef(dictRef->getRef());
-- if (oc)
-- {
-- // qDebug() << "Begin OCG Content with Name " << UnicodeParsedString(oc->getName());
-- m_doc->setActiveLayer(UnicodeParsedString(oc->getName()));
-- mSte.ocgName = UnicodeParsedString(oc->getName());
-- }
-- }
-- }
-- }
-- m_mcStack.push(mSte);
--}
--
--void SlaOutputDev::beginMarkedContent(const char *name, Dict *properties)
--{
--// qDebug() << "Begin Marked Content with Name " << QString(name);
-- QString nam(name);
-- mContent mSte;
-- mSte.name = nam;
-- mSte.ocgName = "";
-- m_mcStack.push(mSte);
-- if (m_importerFlags & LoadSavePlugin::lfCreateDoc)
-- {
-- if (nam == "Layer") // Handle Adobe Illustrator Layer command
-- {
-- if (layersSetByOCG)
-- return;
-- QString lName = QString("Layer_%1").arg(m_layerNum + 1);
-- Object obj = properties->lookup("Title");
-- if (obj.isString())
-- lName = QString(obj.getString()->c_str());
-- for (const auto& layer : m_doc->Layers)
-- {
-- if (layer.Name == lName)
-- {
-- m_doc->setActiveLayer(lName);
-- return;
-- }
-- }
-- m_layerNum++;
-- if (!m_firstLayer)
-- m_currentLayer = m_doc->addLayer(lName, true);
-- m_firstLayer = false;
--
-- obj = properties->lookup("Visible");
-- if (obj.isBool())
-- m_doc->setLayerVisible(m_currentLayer, obj.getBool());
-- obj = properties->lookup("Editable");
-- if (obj.isBool())
-- m_doc->setLayerLocked(m_currentLayer, !obj.getBool());
-- obj = properties->lookup("Printed");
-- if (obj.isBool())
-- m_doc->setLayerPrintable(m_currentLayer, obj.getBool());
-- obj = properties->lookup("Color");
-- if (obj.isArray())
-- {
-- Object obj1;
-- obj1 = obj.arrayGet(0);
-- int r = obj1.getNum() / 256;
-- obj1 = obj.arrayGet(1);
-- int g = obj1.getNum() / 256;
-- obj1 = obj.arrayGet(2);
-- int b = obj1.getNum() / 256;
-- m_doc->setLayerMarker(m_currentLayer, QColor(r, g, b));
-- }
-- }
-- }
--}
--
--void SlaOutputDev::endMarkedContent(GfxState *state)
--{
-- if (m_mcStack.isEmpty())
-- return;
--
-- mContent mSte = m_mcStack.pop();
-- if ((m_importerFlags & LoadSavePlugin::lfCreateDoc) == 0)
-- return;
-- if (mSte.name != "OC")
-- return;
--
-- for (const auto& layer : m_doc->Layers)
-- {
-- if (layer.Name == mSte.ocgName)
-- {
-- m_doc->setActiveLayer(mSte.ocgName);
-- return;
-- }
-- }
--}
--
--void SlaOutputDev::markPoint(const char *name)
--{
--// qDebug() << "Begin Marked Point with Name " << QString(name);
--}
--
--void SlaOutputDev::markPoint(const char *name, Dict *properties)
--{
--// qDebug() << "Begin Marked Point with Name " << QString(name) << "and Properties";
-- beginMarkedContent(name, properties);
--}
--
--void SlaOutputDev::updateFont(GfxState *state)
--{
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)
-- std::optional<GfxFontLoc> fontLoc;
-- std::string fileName;
-- std::unique_ptr<FoFiTrueType> ff;
-- std::optional<std::vector<unsigned char>> tmpBuf;
--#elif POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)
-- std::optional<GfxFontLoc> fontLoc;
-- const GooString * fileName = nullptr;
-- std::unique_ptr<FoFiTrueType> ff;
-- char* tmpBuf = nullptr;
--#else
-- GfxFontLoc * fontLoc = nullptr;
-- GooString * fileName = nullptr;
-- FoFiTrueType * ff = nullptr;
-- char* tmpBuf = nullptr;
--#endif
-- GfxFontType fontType;
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- std::unique_ptr<SlaOutFontFileID> id;
--#else
-- SlaOutFontFileID *id;
--#endif
-- SplashFontFile *fontFile;
-- SplashFontSrc *fontsrc = nullptr;
-- Object refObj, strObj;
--#if POPPLER_ENCODED_VERSION < POPPLER_VERSION_ENCODE(22, 4, 0)
-- int tmpBufLen = 0;
--#endif
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 2, 0)
-- std::vector<int> codeToGID;
--#else
-- int *codeToGID = nullptr;
--#endif
-- const double *textMat = nullptr;
-- double m11, m12, m21, m22, fontSize;
-- SplashCoord mat[4] = { 1.0, 0.0, 0.0, 1.0 };
-- int n = 0;
-- int faceIndex = 0;
-- SplashCoord matrix[6] = { 1.0, 0.0, 0.0, 1.0, 0.0, 0.0 };
--
-- m_font = nullptr;
--
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)
-- GfxFont* gfxFont = state->getFont().get();
--#else
-- GfxFont* gfxFont = state->getFont();
--#endif
-- if (!gfxFont)
-- goto err1;
--
-- fontType = gfxFont->getType();
-- if (fontType == fontType3)
-- goto err1;
--
-- // check the font file cache
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- id.reset(new SlaOutFontFileID(gfxFont->getID()));
-- if ((fontFile = m_fontEngine->getFontFile(*id)))
-- id.reset();
--#else
-- id = new SlaOutFontFileID(gfxFont->getID());
-- if ((fontFile = m_fontEngine->getFontFile(id)))
-- delete id;
--#endif
-- else
-- {
-- fontLoc = gfxFont->locateFont(m_xref ? m_xref : m_pdfDoc->getXRef(), nullptr);
-- if (!fontLoc)
-- {
-- error(errSyntaxError, -1, "Couldn't find a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--
-- // embedded font
-- if (fontLoc->locType == gfxFontLocEmbedded)
-- {
-- // if there is an embedded font, read it to memory
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)
-- tmpBuf = gfxFont->readEmbFontFile(m_xref ? m_xref : m_pdfDoc->getXRef());
-- if (! tmpBuf)
-- goto err2;
--#else
-- tmpBuf = gfxFont->readEmbFontFile(m_xref, &tmpBufLen);
-- if (!tmpBuf)
-- goto err2;
--#endif
--
-- // external font
-- }
-- else
-- { // gfxFontLocExternal
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)
-- fileName = fontLoc->path;
--#elif POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)
-- fileName = fontLoc->pathAsGooString();
--#else
-- fileName = fontLoc->path;
--#endif
-- fontType = fontLoc->fontType;
-- }
--
-- fontsrc = new SplashFontSrc;
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)
-- if (!fileName.empty())
-- fontsrc->setFile(fileName);
-- else
-- fontsrc->setBuf(std::move(tmpBuf.value()));
--#else
-- if (fileName)
-- fontsrc->setFile(fileName, false);
-- else
-- fontsrc->setBuf(tmpBuf, tmpBufLen, true);
--#endif
--
-- // load the font file
-- switch (fontType) {
-- case fontType1:
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- if (!(fontFile = m_fontEngine->loadType1Font(std::move(id), fontsrc, (const char**) ((Gfx8BitFont*) gfxFont)->getEncoding(), fontLoc->fontNum)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#else
-- if (!(fontFile = m_fontEngine->loadType1Font(id, fontsrc, (const char **)((Gfx8BitFont *) gfxFont)->getEncoding())))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#endif
-- break;
-- case fontType1C:
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- if (!(fontFile = m_fontEngine->loadType1CFont(std::move(id), fontsrc, (const char**) ((Gfx8BitFont*) gfxFont)->getEncoding(), fontLoc->fontNum)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#else
-- if (!(fontFile = m_fontEngine->loadType1CFont(id, fontsrc, (const char **)((Gfx8BitFont *) gfxFont)->getEncoding())))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#endif
-- break;
-- case fontType1COT:
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- if (!(fontFile = m_fontEngine->loadOpenTypeT1CFont(std::move(id), fontsrc, (const char **)((Gfx8BitFont *) gfxFont)->getEncoding(), fontLoc->fontNum)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#else
-- if (!(fontFile = m_fontEngine->loadOpenTypeT1CFont(id, fontsrc, (const char **)((Gfx8BitFont *) gfxFont)->getEncoding())))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#endif
-- break;
-- case fontTrueType:
-- case fontTrueTypeOT:
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- if (!fileName.empty())
-- ff = FoFiTrueType::load(fileName.c_str(), fontLoc->fontNum);
-- else
-- ff = FoFiTrueType::make(fontsrc->buf.data(), fontsrc->buf.size(), fontLoc->fontNum);
--#elif POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)
-- if (!fileName.empty())
-- ff = FoFiTrueType::load(fileName.c_str());
-- else
-- ff = FoFiTrueType::make(fontsrc->buf.data(), fontsrc->buf.size());
--#else
-- if (fileName)
-- ff = FoFiTrueType::load(fileName->c_str());
-- else
-- ff = FoFiTrueType::make(tmpBuf, tmpBufLen);
--#endif
-- if (ff)
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)
-- codeToGID = ((Gfx8BitFont*) gfxFont)->getCodeToGIDMap(ff.get());
-- ff.reset();
--#else
-- codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff);
-- delete ff;
--#endif
-- n = 256;
-- }
-- else
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 2, 0)
-- codeToGID.clear();
--#else
-- codeToGID = nullptr;
--#endif
-- n = 0;
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 2, 0)
-- if (!(fontFile = m_fontEngine->loadTrueTypeFont(std::move(id), fontsrc, std::move(codeToGID), fontLoc->fontNum)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#elif POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- if (!(fontFile = m_fontEngine->loadTrueTypeFont(std::move(id), fontsrc, codeToGID, n, fontLoc->fontNum)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#else
-- if (!(fontFile = m_fontEngine->loadTrueTypeFont(id, fontsrc, codeToGID, n)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#endif
-- break;
-- case fontCIDType0:
-- case fontCIDType0C:
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- if (!(fontFile = m_fontEngine->loadCIDFont(std::move(id), fontsrc, fontLoc->fontNum)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#else
-- if (!(fontFile = m_fontEngine->loadCIDFont(id, fontsrc)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#endif
-- break;
-- case fontCIDType0COT:
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 2, 0)
-- if (((GfxCIDFont*) gfxFont)->getCIDToGIDLen() > 0)
-- {
-- codeToGID = ((GfxCIDFont*) gfxFont)->getCIDToGID();
-- n = codeToGID.size();
-- }
-- else
-- {
-- codeToGID.clear();
-- n = 0;
-- }
--#else
-- if (((GfxCIDFont *) gfxFont)->getCIDToGID())
-- {
-- n = ((GfxCIDFont *) gfxFont)->getCIDToGIDLen();
-- codeToGID = (int *) gmallocn(n, sizeof(*codeToGID));
-- memcpy(codeToGID, ((GfxCIDFont *) gfxFont)->getCIDToGID(), n * sizeof(*codeToGID));
-- }
-- else
-- {
-- codeToGID = nullptr;
-- n = 0;
-- }
--#endif
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 2, 0)
-- if (!(fontFile = m_fontEngine->loadOpenTypeCFFFont(std::move(id), fontsrc, std::move(codeToGID), fontLoc->fontNum)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
-- gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#elif POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- if (!(fontFile = m_fontEngine->loadOpenTypeCFFFont(std::move(id), fontsrc, codeToGID, n, fontLoc->fontNum)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
-- gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#else
-- if (!(fontFile = m_fontEngine->loadOpenTypeCFFFont(id, fontsrc, codeToGID, n)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'",
-- gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#endif
-- break;
-- case fontCIDType2:
-- case fontCIDType2OT:
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 2, 0)
-- codeToGID.clear();
-- n = 0;
-- if (((GfxCIDFont*) gfxFont)->getCIDToGIDLen() > 0)
-- {
-- codeToGID = ((GfxCIDFont*) gfxFont)->getCIDToGID();
-- n = codeToGID.size();
-- }
--#else
-- codeToGID = nullptr;
-- n = 0;
-- if (((GfxCIDFont *) gfxFont)->getCIDToGID())
-- {
-- n = ((GfxCIDFont *) gfxFont)->getCIDToGIDLen();
-- if (n)
-- {
-- codeToGID = (int *)gmallocn(n, sizeof(*codeToGID));
-- memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), n * sizeof(*codeToGID));
-- }
-- }
--#endif
-- else
-- {
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- if (!fileName.empty())
-- ff = FoFiTrueType::load(fileName.c_str(), fontLoc->fontNum);
-- else
-- ff = FoFiTrueType::make(fontsrc->buf.data(), fontsrc->buf.size(), fontLoc->fontNum);
--#elif POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)
-- if (!fileName.empty())
-- ff = FoFiTrueType::load(fileName.c_str());
-- else
-- ff = FoFiTrueType::make(fontsrc->buf.data(), fontsrc->buf.size());
--#else
-- if (fileName)
-- ff = FoFiTrueType::load(fileName->c_str());
-- else
-- ff = FoFiTrueType::make(tmpBuf, tmpBufLen);
--#endif
-- if (! ff)
-- goto err2;
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 2, 0)
-- codeToGID = ((GfxCIDFont*) gfxFont)->getCodeToGIDMap(ff.get());
--#elif POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 2, 0)
-- codeToGID = ((GfxCIDFont*) gfxFont)->getCodeToGIDMap(ff.get(), &n);
-- ff.reset();
--#else
-- codeToGID = ((GfxCIDFont *)gfxFont)->getCodeToGIDMap(ff, &n);
-- delete ff;
--#endif
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(25, 2, 0)
-- if (!(fontFile = m_fontEngine->loadTrueTypeFont(std::move(id), fontsrc, std::move(codeToGID), fontLoc->fontNum)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#elif POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- if (!(fontFile = m_fontEngine->loadTrueTypeFont(std::move(id), fontsrc, codeToGID, n, fontLoc->fontNum)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#else
-- if (!(fontFile = m_fontEngine->loadTrueTypeFont(id, fontsrc, codeToGID, n, faceIndex)))
-- {
-- error(errSyntaxError, -1, "Couldn't create a font for '{0:s}'", gfxFont->getName() ? gfxFont->getName()->c_str() : "(unnamed)");
-- goto err2;
-- }
--#endif
-- break;
-- default:
-- // this shouldn't happen
-- goto err2;
-- }
-- }
-- // get the font matrix
-- textMat = state->getTextMat();
-- fontSize = state->getFontSize();
-- m11 = textMat[0] * fontSize * state->getHorizScaling();
-- m12 = textMat[1] * fontSize * state->getHorizScaling();
-- m21 = textMat[2] * fontSize;
-- m22 = textMat[3] * fontSize;
-- matrix[0] = 1;
-- matrix[1] = 0;
-- matrix[2] = 0;
-- matrix[3] = 1;
-- matrix[4] = 0;
-- matrix[5] = 0;
-- // create the scaled font
-- mat[0] = m11;
-- mat[1] = -m12;
-- mat[2] = m21;
-- mat[3] = -m22;
-- m_font = m_fontEngine->getFont(fontFile, mat, matrix);
--
--#if POPPLER_ENCODED_VERSION < POPPLER_VERSION_ENCODE(22, 2, 0)
-- delete fontLoc;
--#endif
-- if (fontsrc && !fontsrc->isFile)
-- fontsrc->unref();
-- return;
--
--err2:
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(24, 11, 0)
-- id.reset();
--#else
-- delete id;
--#endif
--#if POPPLER_ENCODED_VERSION < POPPLER_VERSION_ENCODE(22, 2, 0)
-- delete fontLoc;
--#endif
--
--err1:
-- if (fontsrc && !fontsrc->isFile)
-- fontsrc->unref();
--}
--
--void SlaOutputDev::drawChar(GfxState* state, double x, double y, double dx, double dy, double originX, double originY, CharCode code, int nBytes, POPPLER_CONST_082 Unicode* u, int uLen)
--{
--// qDebug() << "SlaOutputDev::drawChar code:" << code << "bytes:" << nBytes << "Unicode:" << u << "ulen:" << uLen << "render:" << state->getRender();
-- double x1, y1, x2, y2;
-- updateFont(state);
-- if (!m_font)
-- return;
--
-- // PDF 1.7 Section 9.3.6 defines eight text rendering modes.
-- // 0 - Fill
-- // 1 - Stroke
-- // 2 - First fill and then stroke
-- // 3 - Invisible
-- // 4 - Fill and use as a clipping path
-- // 5 - Stroke and use as a clipping path
-- // 6 - First fill, then stroke and add as a clipping path
-- // 7 - Only use as a clipping path.
-- // TODO Implement the clipping operations. At least the characters are shown.
-- int textRenderingMode = state->getRender();
-- // Invisible or only used for clipping
-- if (textRenderingMode == 3)
-- return;
-- if (textRenderingMode < 8)
-- {
-- SplashPath * fontPath;
-- fontPath = m_font->getGlyphPath(code);
-- if (fontPath)
-- {
-- QPainterPath qPath;
-- qPath.setFillRule(Qt::WindingFill);
-- for (int i = 0; i < fontPath->getLength(); ++i)
-- {
-- unsigned char f;
-- fontPath->getPoint(i, &x1, &y1, &f);
-- if (f & splashPathFirst)
-- qPath.moveTo(x1,y1);
-- else if (f & splashPathCurve)
-- {
-- double x3, y3;
-- ++i;
-- fontPath->getPoint(i, &x2, &y2, &f);
-- ++i;
-- fontPath->getPoint(i, &x3, &y3, &f);
-- qPath.cubicTo(x1, y1, x2, y2, x3, y3);
-- }
-- else
-- qPath.lineTo(x1, y1);
-- if (f & splashPathLast)
-- qPath.closeSubpath();
-- }
-- const double * ctm = state->getCTM();
-- m_ctm = QTransform(ctm[0], ctm[1], ctm[2], ctm[3], ctm[4], ctm[5]);
-- double xCoor = m_doc->currentPage()->xOffset();
-- double yCoor = m_doc->currentPage()->yOffset();
-- FPointArray textPath;
-- textPath.fromQPainterPath(qPath);
-- FPoint wh = textPath.widthHeight();
-- if (textRenderingMode > 3)
-- {
-- QTransform mm;
-- mm.scale(1, -1);
-- mm.translate(x, -y);
-- // Remember the glyph for later clipping
-- m_clipTextPath.addPath(m_ctm.map(mm.map(qPath)));
-- }
-- if ((textPath.size() > 3) && ((wh.x() != 0.0) || (wh.y() != 0.0)) && (textRenderingMode != 7))
-- {
-- int z = m_doc->itemAdd(PageItem::Polygon, PageItem::Unspecified, xCoor, yCoor, 10, 10, 0, CommonStrings::None, CommonStrings::None);
-- PageItem* ite = m_doc->Items->at(z);
--
-- // todo: merge this between vector and text implementations.
-- QTransform mm;
-- mm.scale(1, -1);
-- mm.translate(x, -y);
-- textPath.map(mm);
-- textPath.map(m_ctm);
-- ite->PoLine = textPath.copy();
-- setItemFillAndStroke(state, ite);
-- // Fill text rendering modes. See above
-- m_doc->adjustItemSize(ite);
-- m_Elements->append(ite);
-- if (m_groupStack.count() != 0)
-- {
-- m_groupStack.top().Items.append(ite);
-- applyMask(ite);
-- }
-- }
-- delete fontPath;
--
-- }
-- }
--}
--
--
--bool SlaOutputDev::beginType3Char(GfxState *state, double x, double y, double dx, double dy, CharCode code, POPPLER_CONST_082 Unicode *u, int uLen)
--{
--// qDebug() << "beginType3Char";
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 4, 0)
-- GfxFont *gfxFont;
-- if (!(gfxFont = state->getFont().get()))
-- return true;
--#else
-- GfxFont* gfxFont;
-- if (!(gfxFont = state->getFont()))
-- return true;
--#endif
-- if (gfxFont->getType() != fontType3)
-- return true;
-- F3Entry f3e;
-- f3e.colored = false;
-- m_F3Stack.push(f3e);
-- pushGroup();
-- return false;
--}
--
--void SlaOutputDev::endType3Char(GfxState *state)
--{
--// qDebug() << "endType3Char";
-- F3Entry f3e = m_F3Stack.pop();
-- groupEntry gElements = m_groupStack.pop();
-- m_doc->m_Selection->clear();
-- if (gElements.Items.count() > 0)
-- {
-- m_doc->m_Selection->delaySignalsOn();
-- for (int dre = 0; dre < gElements.Items.count(); ++dre)
-- {
-- m_doc->m_Selection->addItem(gElements.Items.at(dre), true);
-- m_Elements->removeAll(gElements.Items.at(dre));
-- }
-- PageItem *ite;
-- if (m_doc->m_Selection->count() > 1)
-- ite = m_doc->groupObjectsSelection();
-- else
-- ite = m_doc->m_Selection->itemAt(0);
-- if (!f3e.colored)
-- {
-- const auto& graphicState = m_graphicStack.top();
-- m_doc->itemSelection_SetItemBrush(graphicState.fillColor);
-- m_doc->itemSelection_SetItemBrushShade(graphicState.fillShade);
-- m_doc->itemSelection_SetItemFillTransparency(1.0 - state->getFillOpacity());
-- m_doc->itemSelection_SetItemFillBlend(getBlendMode(state));
-- }
-- m_Elements->append(ite);
-- m_doc->m_Selection->clear();
-- m_doc->m_Selection->delaySignalsOff();
-- }
--}
--
--void SlaOutputDev::type3D0(GfxState * /*state*/, double /*wx*/, double /*wy*/)
--{
--// qDebug() << "type3D0";
-- if (m_F3Stack.count() > 0)
-- m_F3Stack.top().colored = true;
--}
--
--void SlaOutputDev::type3D1(GfxState *state, double wx, double wy, double llx, double lly, double urx, double ury)
--{
--// qDebug() << "type3D1";
-- if (m_F3Stack.count() > 0)
-- m_F3Stack.top().colored = false;
--}
--
--void SlaOutputDev::beginTextObject(GfxState *state)
--{
-- pushGroup();
--}
--
--void SlaOutputDev::endTextObject(GfxState *state)
--{
--// qDebug() << "SlaOutputDev::endTextObject";
-- if (!m_clipTextPath.isEmpty())
-- {
-- m_graphicStack.top().clipPath = intersection(m_graphicStack.top().clipPath, m_clipTextPath);
-- m_clipTextPath = QPainterPath();
-- }
-- if (m_groupStack.count() != 0)
-- {
-- groupEntry gElements = m_groupStack.pop();
-- m_tmpSel->clear();
-- if (gElements.Items.count() > 0)
-- {
-- for (int dre = 0; dre < gElements.Items.count(); ++dre)
-- {
-- m_tmpSel->addItem(gElements.Items.at(dre), true);
-- m_Elements->removeAll(gElements.Items.at(dre));
-- }
-- PageItem *ite;
-- if (gElements.Items.count() != 1)
-- ite = m_doc->groupObjectsSelection(m_tmpSel);
-- else
-- ite = gElements.Items.first();
-- ite->setGroupClipping(false);
-- ite->setFillTransparency(1.0 - state->getFillOpacity());
-- ite->setFillBlendmode(getBlendMode(state));
-- for (int as = 0; as < m_tmpSel->count(); ++as)
-- {
-- m_Elements->append(m_tmpSel->itemAt(as));
-- }
-- if (m_groupStack.count() != 0)
-- applyMask(ite);
-- }
-- if (m_groupStack.count() != 0)
-- {
-- for (int as = 0; as < m_tmpSel->count(); ++as)
-- {
-- m_groupStack.top().Items.append(m_tmpSel->itemAt(as));
-- }
-- }
-- m_tmpSel->clear();
-- }
--}
--
--QString SlaOutputDev::getColor(GfxColorSpace *color_space, const GfxColor *color, int *shade)
--{
-- QString fNam;
-- QString namPrefix = "FromPDF";
-- ScColor tmp;
-- tmp.setSpotColor(false);
-- tmp.setRegistrationColor(false);
-- *shade = 100;
-- /*if (m_F3Stack.count() > 0)
-- {
-- if (!m_F3Stack.top().colored)
-- return "Black";
-- }*/
--
-- if ((color_space->getMode() == csDeviceRGB) || (color_space->getMode() == csCalRGB))
-- {
-- GfxRGB rgb;
-- color_space->getRGB(color, &rgb);
-- double Rc = colToDbl(rgb.r);
-- double Gc = colToDbl(rgb.g);
-- double Bc = colToDbl(rgb.b);
-- tmp.setRgbColorF(Rc, Gc, Bc);
-- fNam = m_doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
-- }
-- else if (color_space->getMode() == csDeviceCMYK)
-- {
-- GfxCMYK cmyk;
-- color_space->getCMYK(color, &cmyk);
-- double Cc = colToDbl(cmyk.c);
-- double Mc = colToDbl(cmyk.m);
-- double Yc = colToDbl(cmyk.y);
-- double Kc = colToDbl(cmyk.k);
-- tmp.setCmykColorF(Cc, Mc, Yc, Kc);
-- fNam = m_doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
-- }
-- else if ((color_space->getMode() == csCalGray) || (color_space->getMode() == csDeviceGray))
-- {
-- GfxGray gray;
-- color_space->getGray(color, &gray);
-- double Kc = 1.0 - colToDbl(gray);
-- tmp.setCmykColorF(0, 0, 0, Kc);
-- fNam = m_doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
-- }
-- else if (color_space->getMode() == csSeparation)
-- {
-- auto* sepColorSpace = (GfxSeparationColorSpace*) color_space;
-- GfxColorSpace* altColorSpace = sepColorSpace->getAlt();
-- QString name(sepColorSpace->getName()->c_str());
-- bool isRegistrationColor = (name == "All");
-- if (isRegistrationColor)
-- {
-- tmp.setCmykColorF(1.0, 1.0, 1.0, 1.0);
-- tmp.setRegistrationColor(true);
-- name = "Registration";
-- }
-- else if ((altColorSpace->getMode() == csDeviceRGB) || (altColorSpace->getMode() == csCalRGB))
-- {
-- double x = 1.0;
-- double comps[gfxColorMaxComps];
-- sepColorSpace->getFunc()->transform(&x, comps);
-- tmp.setRgbColorF(comps[0], comps[1], comps[2]);
-- }
-- else if ((altColorSpace->getMode() == csCalGray) || (altColorSpace->getMode() == csDeviceGray))
-- {
-- double x = 1.0;
-- double comps[gfxColorMaxComps];
-- sepColorSpace->getFunc()->transform(&x, comps);
-- tmp.setCmykColorF(0.0, 0.0, 0.0, 1.0 - comps[0]);
-- }
-- else if (altColorSpace->getMode() == csLab)
-- {
-- double x = 1.0;
-- double comps[gfxColorMaxComps];
-- sepColorSpace->getFunc()->transform(&x, comps);
-- tmp.setLabColor(comps[0], comps[1], comps[2]);
-- }
-- else
-- {
-- GfxCMYK cmyk;
-- color_space->getCMYK(color, &cmyk);
-- double Cc = colToDbl(cmyk.c);
-- double Mc = colToDbl(cmyk.m);
-- double Yc = colToDbl(cmyk.y);
-- double Kc = colToDbl(cmyk.k);
-- tmp.setCmykColorF(Cc, Mc, Yc, Kc);
-- }
-- tmp.setSpotColor(true);
--
-- fNam = m_doc->PageColors.tryAddColor(name, tmp);
-- *shade = qRound(colToDbl(color->c[0]) * 100);
-- }
-- else
-- {
-- GfxRGB rgb;
-- color_space->getRGB(color, &rgb);
-- double Rc = colToDbl(rgb.r);
-- double Gc = colToDbl(rgb.g);
-- double Bc = colToDbl(rgb.b);
-- tmp.setRgbColorF(Rc, Gc, Bc);
-- fNam = m_doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
--// qDebug() << "update fill color other colorspace" << color_space->getMode() << "treating as rgb" << Rc << Gc << Bc;
-- }
-- if (fNam == namPrefix+tmp.name())
-- m_importedColors->append(fNam);
-- return fNam;
--}
--
--QString SlaOutputDev::getAnnotationColor(const AnnotColor *color)
--{
-- QString fNam;
-- QString namPrefix = "FromPDF";
-- ScColor tmp;
-- tmp.setSpotColor(false);
-- tmp.setRegistrationColor(false);
-- if (color->getSpace() == AnnotColor::colorTransparent)
-- return CommonStrings::None;
-- if (color->getSpace() == AnnotColor::colorRGB)
-- {
-- const double *color_data = color->getValues();
-- double Rc = color_data[0];
-- double Gc = color_data[1];
-- double Bc = color_data[2];
-- tmp.setRgbColorF(Rc, Gc, Bc);
-- fNam = m_doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
-- }
-- else if (color->getSpace() == AnnotColor::colorCMYK)
-- {
-- const double *color_data = color->getValues();
-- double Cc = color_data[0];
-- double Mc = color_data[1];
-- double Yc = color_data[2];
-- double Kc = color_data[3];
-- tmp.setCmykColorF(Cc, Mc, Yc, Kc);
-- fNam = m_doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
-- }
-- else if (color->getSpace() == AnnotColor::colorGray)
-- {
-- const double *color_data = color->getValues();
-- double Kc = 1.0 - color_data[0];
-- tmp.setCmykColorF(0, 0, 0, Kc);
-- fNam = m_doc->PageColors.tryAddColor(namPrefix+tmp.name(), tmp);
-- }
-- if (fNam == namPrefix+tmp.name())
-- m_importedColors->append(fNam);
-- return fNam;
--}
--
--QString SlaOutputDev::convertPath(POPPLER_CONST_083 GfxPath *path)
--{
--// qDebug() << "SlaOutputDev::convertPath";
-- if (! path)
-- return QString();
--
-- QString output;
-- m_pathIsClosed = false;
--
-- for (int i = 0; i < path->getNumSubpaths(); ++i)
-- {
-- POPPLER_CONST_083 GfxSubpath * subpath = path->getSubpath(i);
-- if (subpath->getNumPoints() > 0)
-- {
-- output += QString("M %1 %2").arg(subpath->getX(0)).arg(subpath->getY(0));
-- int j = 1;
-- while (j < subpath->getNumPoints())
-- {
-- if (subpath->getCurve(j))
-- {
-- output += QString("C %1 %2 %3 %4 %5 %6")
-- .arg(subpath->getX(j)).arg(subpath->getY(j))
-- .arg(subpath->getX(j + 1)).arg(subpath->getY(j + 1))
-- .arg(subpath->getX(j + 2)).arg(subpath->getY(j + 2));
-- j += 3;
-- }
-- else
-- {
-- output += QString("L %1 %2").arg(subpath->getX(j)).arg(subpath->getY(j));
-- ++j;
-- }
-- }
-- if (subpath->isClosed())
-- {
-- output += QString("Z");
-- m_pathIsClosed = true;
-- }
-- }
-- }
-- return output;
--}
--
--void SlaOutputDev::getPenState(GfxState *state)
--{
-- switch (state->getLineCap())
-- {
-- case 0:
-- m_lineEnd = Qt::FlatCap;
-- break;
-- case 1:
-- m_lineEnd = Qt::RoundCap;
-- break;
-- case 2:
-- m_lineEnd = Qt::SquareCap;
-- break;
-- }
-- switch (state->getLineJoin())
-- {
-- case 0:
-- m_lineJoin = Qt::MiterJoin;
-- break;
-- case 1:
-- m_lineJoin = Qt::RoundJoin;
-- break;
-- case 2:
-- m_lineJoin = Qt::BevelJoin;
-- break;
-- }
--#if POPPLER_ENCODED_VERSION >= POPPLER_VERSION_ENCODE(22, 9, 0)
-- const auto& dashPattern = state->getLineDash(&m_dashOffset);
-- QVector<double> pattern(dashPattern.size());
-- for (size_t i = 0; i < dashPattern.size(); ++i)
-- pattern[i] = dashPattern[i];
-- m_dashValues = pattern;
--#else
-- double *dashPattern;
-- int dashLength;
-- state->getLineDash(&dashPattern, &dashLength, &m_dashOffset);
-- QVector<double> pattern(dashLength);
-- for (int i = 0; i < dashLength; ++i)
-- pattern[i] = dashPattern[i];
-- m_dashValues = pattern;
--#endif
--}
--
<Skipped 4277 lines>
================================================================
---- gitweb:
http://git.pld-linux.org/gitweb.cgi/packages/scribus.git/commitdiff/e699e1f15f07b457dc30f65e6d8decf882bd6950
More information about the pld-cvs-commit
mailing list