summaryrefslogtreecommitdiff
path: root/drawinglayer
diff options
context:
space:
mode:
authorKatarina Behrens <Katarina.Behrens@cib.de>2019-03-21 13:27:03 +0100
committerKatarina Behrens <Katarina.Behrens@cib.de>2019-03-27 18:14:24 +0100
commit67adfc89585f242b69a91050ac9cb8197c2dff1c (patch)
tree6ca25a7b977020889f23f7eff35158825a7da2a6 /drawinglayer
parenta80317b602e175f780cd662b5526a538d053419a (diff)
Nested list L must be a child of parent's LBody
Implement this as https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf#G13.2259746 describes. The example implementation in Annex H8.2 https://www.adobe.com/content/dam/acom/en/devnet/pdf/pdfs/PDF32000_2008.pdf#G21.1021285 where nested L is a sibling of its parent LI contradicts the specification and is prolly wrong Change-Id: I2bd4a6692ac0cbe02ff6f1746656f104de3fe1f2 Reviewed-on: https://gerrit.libreoffice.org/69506 Tested-by: Jenkins Reviewed-by: Katarina Behrens <Katarina.Behrens@cib.de>
Diffstat (limited to 'drawinglayer')
-rw-r--r--drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx71
-rw-r--r--drawinglayer/source/processor2d/vclmetafileprocessor2d.hxx7
2 files changed, 62 insertions, 16 deletions
diff --git a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
index 43676ae674f7..3b0af02df486 100644
--- a/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
+++ b/drawinglayer/source/processor2d/vclmetafileprocessor2d.cxx
@@ -554,6 +554,27 @@ namespace drawinglayer
}
}
+ void VclMetafileProcessor2D::popStructureElement(vcl::PDFWriter::StructElement eElem)
+ {
+ if (!maListElements.empty() && maListElements.top() == eElem)
+ {
+ maListElements.pop();
+ mpPDFExtOutDevData->EndStructureElement();
+ }
+ }
+
+ void VclMetafileProcessor2D::popListItem()
+ {
+ popStructureElement(vcl::PDFWriter::LIBody);
+ popStructureElement(vcl::PDFWriter::ListItem);
+ }
+
+ void VclMetafileProcessor2D::popList()
+ {
+ popListItem();
+ popStructureElement(vcl::PDFWriter::List);
+ }
+
// init static break iterator
uno::Reference< css::i18n::XBreakIterator > VclMetafileProcessor2D::mxBreakIterator;
@@ -1232,7 +1253,10 @@ namespace drawinglayer
// this is a part of list item, start LILabel ( = bullet)
if(mbInListItem)
+ {
+ maListElements.push(vcl::PDFWriter::LILabel);
mpPDFExtOutDevData->BeginStructureElement(vcl::PDFWriter::LILabel);
+ }
// process recursively and add MetaFile comment
process(rBulletPrimitive);
@@ -1240,8 +1264,12 @@ namespace drawinglayer
if(mbInListItem)
{
- mpPDFExtOutDevData->EndStructureElement(); // end LILabel
- mbBulletPresent = true;
+ if (maListElements.top() == vcl::PDFWriter::LILabel)
+ {
+ maListElements.pop();
+ mpPDFExtOutDevData->EndStructureElement(); // end LILabel
+ mbBulletPresent = true;
+ }
}
}
@@ -1285,29 +1313,41 @@ namespace drawinglayer
if(nNewOutlineLevel > mnCurrentOutlineLevel)
{
// increase List level
- for(sal_Int16 a(mnCurrentOutlineLevel); a != nNewOutlineLevel; a++)
+ for(sal_Int16 a(mnCurrentOutlineLevel); a != nNewOutlineLevel; ++a)
{
+ maListElements.push(vcl::PDFWriter::List);
mpPDFExtOutDevData->BeginStructureElement( vcl::PDFWriter::List );
}
}
else // if(nNewOutlineLevel < mnCurrentOutlineLevel)
{
- // decrease List level
- for(sal_Int16 a(mnCurrentOutlineLevel); a != nNewOutlineLevel; a--)
+ // close list levels below nNewOutlineLevel completely by removing
+ // list items as well as list tag itself
+ for(sal_Int16 a(nNewOutlineLevel); a < mnCurrentOutlineLevel; ++a)
{
- mpPDFExtOutDevData->EndStructureElement();
+ popList(); // end LBody LI and L
}
- }
+
+ // on nNewOutlineLevel close the previous list item (LBody and LI)
+ popListItem();
+
+ }
// Remember new current OutlineLevel
mnCurrentOutlineLevel = nNewOutlineLevel;
}
+ else // the same list level
+ {
+ // close the previous list item (LBody and LI)
+ popListItem();
+ }
const bool bDumpAsListItem(-1 != mnCurrentOutlineLevel);
if(bDumpAsListItem)
{
// Dump as ListItem
+ maListElements.push(vcl::PDFWriter::ListItem);
mpPDFExtOutDevData->BeginStructureElement( vcl::PDFWriter::ListItem );
mbInListItem = true;
}
@@ -1322,10 +1362,7 @@ namespace drawinglayer
mpMetaFile->AddAction(new MetaCommentAction(aCommentString));
if(bDumpAsListItem)
- {
- mpPDFExtOutDevData->EndStructureElement(); // end ListItem
mbInListItem = false;
- }
else
mpPDFExtOutDevData->EndStructureElement(); // end Paragraph
}
@@ -1341,9 +1378,11 @@ namespace drawinglayer
if (mnCurrentOutlineLevel >= 0 )
{
- // end any opened List structure elements
- for(sal_Int16 i(0); i <= mnCurrentOutlineLevel; ++i)
- mpPDFExtOutDevData->EndStructureElement();
+ // end any opened List structure elements (LBody, LI, L)
+ for(sal_Int16 a(0); a <= mnCurrentOutlineLevel; ++a)
+ {
+ popList();
+ }
}
mpMetaFile->AddAction(new MetaCommentAction(aCommentStringB));
@@ -1358,16 +1397,16 @@ namespace drawinglayer
// this is a 2nd portion of list item
// bullet has been already processed, start LIBody
if (mbInListItem && mbBulletPresent)
+ {
+ maListElements.push(vcl::PDFWriter::LIBody);
mpPDFExtOutDevData->BeginStructureElement(vcl::PDFWriter::LIBody);
+ }
// directdraw of text simple portion; use default processing
RenderTextSimpleOrDecoratedPortionPrimitive2D(rTextCandidate);
if (mbInListItem && mbBulletPresent)
- {
- mpPDFExtOutDevData->EndStructureElement(); // end LIBody
mbBulletPresent = false;
- }
// restore DrawMode
mpOutputDevice->SetDrawMode(nOriginalDrawMode);
diff --git a/drawinglayer/source/processor2d/vclmetafileprocessor2d.hxx b/drawinglayer/source/processor2d/vclmetafileprocessor2d.hxx
index 3806a683b4da..062e9d53d2c7 100644
--- a/drawinglayer/source/processor2d/vclmetafileprocessor2d.hxx
+++ b/drawinglayer/source/processor2d/vclmetafileprocessor2d.hxx
@@ -20,6 +20,8 @@
#ifndef INCLUDED_DRAWINGLAYER_SOURCE_PROCESSOR2D_VCLMETAFILEPROCESSOR2D_HXX
#define INCLUDED_DRAWINGLAYER_SOURCE_PROCESSOR2D_VCLMETAFILEPROCESSOR2D_HXX
+#include <stack>
+
#include <drawinglayer/drawinglayerdllapi.h>
#include "vclprocessor2d.hxx"
@@ -112,6 +114,9 @@ namespace drawinglayer
const attribute::LineStartEndAttribute* pEnd);
void impStartSvtGraphicStroke(SvtGraphicStroke const * pSvtGraphicStroke);
void impEndSvtGraphicStroke(SvtGraphicStroke const * pSvtGraphicStroke);
+ void popStructureElement(vcl::PDFWriter::StructElement eElem);
+ void popListItem();
+ void popList();
void processGraphicPrimitive2D(const primitive2d::GraphicPrimitive2D& rGraphicPrimitive);
void processControlPrimitive2D(const primitive2d::ControlPrimitive2D& rControlPrimitive);
@@ -177,6 +182,8 @@ namespace drawinglayer
bool mbInListItem;
bool mbBulletPresent;
+ std::stack<vcl::PDFWriter::StructElement> maListElements;
+
protected:
/* the local processor for BasePrimitive2D-Implementation based primitives,
called from the common process()-implementation