61#include <lineinfo.hxx>
90#include <bitmaps.hlst>
128struct SwPaintProperties;
131enum class SubColFlags {
147class SwLineRect :
public SwRect
152 SubColFlags m_nSubColor;
157 const SwTabFrame *pT ,
const SubColFlags nSCol );
161 const SwTabFrame* GetTab()
const {
return m_pTabFrame; }
162 void SetPainted() { m_bPainted =
true; }
163 void Lock(
bool bLock)
170 bool IsPainted()
const {
return m_bPainted; }
171 bool IsLocked()
const {
return m_nLock != 0; }
172 SubColFlags GetSubColor()
const {
return m_nSubColor; }
180static void dummy_function()
182 pid_t pid = getpid();
192 std::vector<SwLineRect> m_aLineRects;
193 typedef std::vector< SwLineRect >::const_iterator const_iterator;
194 typedef std::vector< SwLineRect >::iterator iterator;
195 typedef std::vector< SwLineRect >::reverse_iterator reverse_iterator;
196 typedef std::vector< SwLineRect >::size_type size_type;
214 void LockLines(
bool bLock );
217 bool isFull()
const {
return m_aLineRects.size() > 100; }
220class SwSubsRects :
public SwLineRects
222 void RemoveSuperfluousSubsidiaryLines(
const SwLineRects &rRects, SwPaintProperties
const &
properties );
224 void PaintSubsidiary(
OutputDevice *pOut,
const SwLineRects *pRects, SwPaintProperties
const &
properties );
261struct SwPaintProperties {
280 std::unique_ptr<BorderLines> pBLines;
281 std::unique_ptr<SwLineRects> pSLines;
282 std::unique_ptr<SwSubsRects> pSSubsLines;
285 std::unique_ptr<SwSubsRects> pSSpecSubsLines;
297 Color aSGlobalRetoucheColor;
304 : bSFlyMetafile(false)
305 , pSFlyMetafileOut(nullptr)
306 , pSGlobalShell(nullptr)
307 , pSRetoucheFly(nullptr)
308 , pSRetoucheFly2(nullptr)
309 , pSFlyOnlyDraw(nullptr)
310 , pSProgress(nullptr)
330 return !
gProp.pSGlobalShell->GetViewOptions()->IsPagePreview() &&
331 !
gProp.pSGlobalShell->GetViewOptions()->IsReadonly() &&
332 !
gProp.pSGlobalShell->GetViewOptions()->IsFormView() &&
333 gProp.pSGlobalShell->GetViewOptions()->IsObjectBoundaries();
338 return !
gProp.pSGlobalShell->GetViewOptions()->IsPagePreview() &&
339 !
gProp.pSGlobalShell->GetViewOptions()->IsReadonly() &&
340 !
gProp.pSGlobalShell->GetViewOptions()->IsFormView() &&
341 !
gProp.pSGlobalShell->GetViewOptions()->IsWhitespaceHidden() &&
342 gProp.pSGlobalShell->GetViewOptions()->IsDocBoundaries();
347 return !
gProp.pSGlobalShell->GetViewOptions()->IsPagePreview() &&
348 !
gProp.pSGlobalShell->GetViewOptions()->IsReadonly() &&
349 !
gProp.pSGlobalShell->GetViewOptions()->IsFormView() &&
350 gProp.pSGlobalShell->GetViewOptions()->IsSectionBoundaries();
356bool isTableBoundariesEnabled()
358 if (!
gProp.pSGlobalShell->GetViewOptions()->IsTable())
361 if (
gProp.pSGlobalShell->GetViewOptions()->IsPagePreview())
364 if (
gProp.pSGlobalShell->GetViewOptions()->IsReadonly())
367 if (
gProp.pSGlobalShell->GetViewOptions()->IsFormView())
370 return gProp.pSGlobalShell->GetViewOptions()->IsTableBoundaries();
384 bool bSmallTwipToPxRelW =
false;
385 bool bSmallTwipToPxRelH =
false;
387 Size aCheckTwipToPxRelSz(
pOut->PixelToLogic(
Size( 100, 100 )) );
388 if ( (aCheckTwipToPxRelSz.
Width()/100.0) < 2.0 )
390 bSmallTwipToPxRelW =
true;
392 if ( (aCheckTwipToPxRelSz.
Height()/100.0) < 2.0 )
394 bSmallTwipToPxRelH =
true;
401 if( !
gProp.nSPixelSzW )
402 gProp.nSPixelSzW = 1;
404 if( !
gProp.nSPixelSzH )
405 gProp.nSPixelSzH = 1;
408 if ( !bSmallTwipToPxRelW )
410 gProp.nSHalfPixelSzW =
gProp.nSPixelSzW / 2 + 1;
414 gProp.nSHalfPixelSzW = 0;
417 if ( !bSmallTwipToPxRelH )
419 gProp.nSHalfPixelSzH =
gProp.nSPixelSzH / 2 + 1;
423 gProp.nSHalfPixelSzH = 0;
426 gProp.nSMinDistPixelW =
gProp.nSPixelSzW * 2 + 1;
427 gProp.nSMinDistPixelH =
gProp.nSPixelSzH * 2 + 1;
439class SwSavePaintStatics :
public SwPaintProperties
442 SwSavePaintStatics();
443 ~SwSavePaintStatics();
448SwSavePaintStatics::SwSavePaintStatics()
451 bSFlyMetafile =
gProp.bSFlyMetafile;
452 pSGlobalShell =
gProp.pSGlobalShell;
453 pSFlyMetafileOut =
gProp.pSFlyMetafileOut;
454 pSRetoucheFly =
gProp.pSRetoucheFly;
455 pSRetoucheFly2 =
gProp.pSRetoucheFly2;
456 pSFlyOnlyDraw =
gProp.pSFlyOnlyDraw;
457 pBLines = std::move(
gProp.pBLines);
458 pSLines = std::move(
gProp.pSLines);
459 pSSubsLines = std::move(
gProp.pSSubsLines);
460 pSSpecSubsLines = std::move(
gProp.pSSpecSubsLines);
461 pSProgress =
gProp.pSProgress;
462 nSPixelSzW =
gProp.nSPixelSzW;
463 nSPixelSzH =
gProp.nSPixelSzH;
464 nSHalfPixelSzW =
gProp.nSHalfPixelSzW;
465 nSHalfPixelSzH =
gProp.nSHalfPixelSzH;
466 nSMinDistPixelW =
gProp.nSMinDistPixelW;
467 nSMinDistPixelH =
gProp.nSMinDistPixelH ;
469 aSScaleX =
gProp.aSScaleX;
470 aSScaleY =
gProp.aSScaleY;
473 gProp.bSFlyMetafile =
false;
474 gProp.pSFlyMetafileOut =
nullptr;
475 gProp.pSRetoucheFly =
nullptr;
476 gProp.pSRetoucheFly2 =
nullptr;
479 gProp.nSMinDistPixelW =
gProp.nSMinDistPixelH = 0;
481 gProp.pSProgress =
nullptr;
484SwSavePaintStatics::~SwSavePaintStatics()
487 gProp.pSGlobalShell = pSGlobalShell;
488 gProp.bSFlyMetafile = bSFlyMetafile;
489 gProp.pSFlyMetafileOut = pSFlyMetafileOut;
490 gProp.pSRetoucheFly = pSRetoucheFly;
491 gProp.pSRetoucheFly2 = pSRetoucheFly2;
492 gProp.pSFlyOnlyDraw = pSFlyOnlyDraw;
493 gProp.pBLines = std::move(pBLines);
494 gProp.pSLines = std::move(pSLines);
495 gProp.pSSubsLines = std::move(pSSubsLines);
496 gProp.pSSpecSubsLines = std::move(pSSpecSubsLines);
497 gProp.pSProgress = pSProgress;
498 gProp.nSPixelSzW = nSPixelSzW;
499 gProp.nSPixelSzH = nSPixelSzH;
500 gProp.nSHalfPixelSzW = nSHalfPixelSzW;
501 gProp.nSHalfPixelSzH = nSHalfPixelSzH;
502 gProp.nSMinDistPixelW = nSMinDistPixelW;
503 gProp.nSMinDistPixelH = nSMinDistPixelH;
505 gProp.aSScaleX = aSScaleX;
506 gProp.aSScaleY = aSScaleY;
511 if(!rContainer.empty())
513 m_Lines.append(std::move(rContainer));
518 const SwTabFrame* pT,
const SubColFlags nSCol)
526 if ( pCol !=
nullptr )
530bool SwLineRect::MakeUnion(
const SwRect &rRect, SwPaintProperties
const &
properties)
572 for (reverse_iterator it = m_aLineRects.rbegin(); it != m_aLineRects.rend(); ++it)
574 SwLineRect &rLRect = *it;
576 if ( rLRect.GetTab() == pTab &&
577 !rLRect.IsPainted() && rLRect.GetSubColor() == nSCol &&
578 (rLRect.Height() > rLRect.Width()) == (rRect.
Height() > rRect.
Width()) &&
579 (pCol && rLRect.GetColor() == *pCol) )
585 m_aLineRects.emplace_back(rRect, pCol, nStyle, pTab, nSCol);
590 if (
pOut->GetOutDevType() != OUTDEV_PRINTER )
599 std::vector<SwLineRect*> aCheck;
601 for (
size_t i = 0;
i < m_aLineRects.size(); ++
i)
603 SwLineRect& rL1 = m_aLineRects[
i];
604 if ( !rL1.GetTab() || rL1.IsPainted() || rL1.IsLocked() )
609 const bool bVert = rL1.Height() > rL1.Width();
614 nL1a = rL1.Top(); nL1b = rL1.Left();
615 nL1c = rL1.Right(); nL1d = rL1.Bottom();
619 nL1a = rL1.Left(); nL1b = rL1.Top();
620 nL1c = rL1.Bottom(); nL1d = rL1.Right();
624 for (iterator it2 = m_aLineRects.begin(); it2 != m_aLineRects.end(); ++it2)
626 SwLineRect &rL2 = *it2;
627 if ( rL2.GetTab() != rL1.GetTab() ||
630 (bVert == (rL2.Height() > rL2.Width())) )
636 nL2a = rL2.Top(); nL2b = rL2.Left();
637 nL2c = rL2.Right(); nL2d = rL2.Bottom();
641 nL2a = rL2.Left(); nL2b = rL2.Top();
642 nL2c = rL2.Bottom(); nL2d = rL2.Right();
645 if ( (nL1a - nAdd < nL2d && nL1d + nAdd > nL2a) &&
646 ((nL1b > nL2b && nL1c < nL2c) ||
647 (nL1c >= nL2c && nL1b - nAdd < nL2c) ||
648 (nL1b <= nL2b && nL1c + nAdd > nL2b)) )
650 aCheck.push_back( &rL2 );
653 if ( aCheck.size() < 2 )
656 bool bRemove =
false;
659 for (
size_t k = 0; !bRemove && k < aCheck.size(); ++k )
661 SwLineRect &rR1 = *aCheck[k];
663 for (
size_t k2 = k+1; !bRemove && k2 < aCheck.size(); ++k2 )
665 SwLineRect &rR2 = *aCheck[k2];
668 SwLineRect *pLA =
nullptr;
669 SwLineRect *pLB =
nullptr;
670 if ( rR1.Top() < rR2.Top() )
672 pLA = &rR1; pLB = &rR2;
674 else if ( rR1.Top() > rR2.Top() )
676 pLA = &rR2; pLB = &rR1;
679 if ( pLA && pLA->Bottom() + 60 > pLB->Top() )
681 if ( rL1.Top() < pLA->Top() )
683 if ( rL1.Bottom() == pLA->Bottom() )
687 aIns.Bottom( pLA->Bottom() );
688 if ( !rL1.Contains( aIns ) )
690 m_aLineRects.emplace_back(aIns, &rL1.GetColor(),
691 SvxBorderLineStyle::SOLID, rL1.GetTab(),
701 if ( rL1.Bottom() > pLB->Bottom() )
702 rL1.Top( pLB->Top() );
709 SwLineRect *pLA =
nullptr;
710 SwLineRect *pLB =
nullptr;
711 if ( rR1.Left() < rR2.Left() )
713 pLA = &rR1; pLB = &rR2;
715 else if ( rR1.Left() > rR2.Left() )
717 pLA = &rR2; pLB = &rR1;
720 if ( pLA && pLA->Right() + 60 > pLB->Left() )
722 if ( rL1.Left() < pLA->Left() )
724 if ( rL1.Right() == pLA->Right() )
728 aIns.Right( pLA->Right() );
729 if ( !rL1.Contains( aIns ) )
731 m_aLineRects.emplace_back(aIns, &rL1.GetColor(),
732 SvxBorderLineStyle::SOLID, rL1.GetTab(),
741 if ( rL1.Right() > pLB->Right() )
742 rL1.Left( pLB->Left() );
751 m_aLineRects.erase(m_aLineRects.begin() + i);
757void SwSubsRects::RemoveSuperfluousSubsidiaryLines(
const SwLineRects &rRects, SwPaintProperties
const &
properties )
760 for (
size_t i = 0;
i < m_aLineRects.size(); ++
i)
764 const SwLineRect aSubsLineRect(m_aLineRects[i]);
768 if ( aSubsLineRect.IsPainted() ||
769 aSubsLineRect.IsLocked() )
772 const bool bVerticalSubs = aSubsLineRect.Height() > aSubsLineRect.Width();
773 SwRect aSubsRect( aSubsLineRect );
784 for (const_iterator itK = rRects.m_aLineRects.begin(); itK != rRects.m_aLineRects.end();
787 const SwLineRect &rLine = *itK;
791 if ( rLine.IsLocked () )
794 if ( !bVerticalSubs == ( rLine.Height() > rLine.Width() ) )
797 if ( aSubsRect.Overlaps( rLine ) )
801 if ( aSubsRect.Left() <= rLine.Right() &&
802 aSubsRect.Right() >= rLine.Left() )
805 if ( aSubsLineRect.Top() < nTmp )
807 SwRect aNewSubsRect( aSubsLineRect );
808 aNewSubsRect.Bottom( nTmp );
809 m_aLineRects.emplace_back(aNewSubsRect,
nullptr,
810 aSubsLineRect.GetStyle(),
nullptr,
811 aSubsLineRect.GetSubColor());
813 nTmp = rLine.Bottom()+
properties.nSPixelSzH+1;
814 if ( aSubsLineRect.Bottom() > nTmp )
816 SwRect aNewSubsRect( aSubsLineRect );
817 aNewSubsRect.Top( nTmp );
818 m_aLineRects.emplace_back(aNewSubsRect,
nullptr,
819 aSubsLineRect.GetStyle(),
nullptr,
820 aSubsLineRect.GetSubColor());
822 m_aLineRects.erase(m_aLineRects.begin() + i);
829 if ( aSubsRect.Top() <= rLine.Bottom() &&
830 aSubsRect.Bottom() >= rLine.Top() )
833 if ( aSubsLineRect.Left() < nTmp )
835 SwRect aNewSubsRect( aSubsLineRect );
836 aNewSubsRect.Right( nTmp );
837 m_aLineRects.emplace_back(aNewSubsRect,
nullptr,
838 aSubsLineRect.GetStyle(),
nullptr,
839 aSubsLineRect.GetSubColor());
842 if ( aSubsLineRect.Right() > nTmp )
844 SwRect aNewSubsRect( aSubsLineRect );
845 aNewSubsRect.Left( nTmp );
846 m_aLineRects.emplace_back(aNewSubsRect,
nullptr,
847 aSubsLineRect.GetStyle(),
nullptr,
848 aSubsLineRect.GetSubColor());
850 m_aLineRects.erase(m_aLineRects.begin() + i);
860void SwLineRects::LockLines(
bool bLock )
862 for (SwLineRect& rLRect : m_aLineRects)
875 if ( rLRect.Height( ) > rLRect.Width( ) )
877 startX += nHalfLWidth;
879 endY = startY + rLRect.Height( );
883 startY += nHalfLWidth;
885 endX = startX + rLRect.Width( );
889 sal_uInt32( nHalfLWidth * 2 ), rLRect.GetStyle( ) );
896 if (m_aLineRects.size() == m_nLastCount)
903 pOut->SetFillColor();
904 pOut->SetLineColor();
906 const Color *pLast =
nullptr;
908 bool bPaint2nd =
false;
909 size_t nMinCount = m_aLineRects.size();
911 for (
size_t i = 0;
i < m_aLineRects.size(); ++
i)
913 SwLineRect& rLRect = m_aLineRects[
i];
915 if ( rLRect.IsPainted() )
918 if ( rLRect.IsLocked() )
920 nMinCount =
std::min( nMinCount, i );
926 if ( rLRect.GetTab() )
928 if ( rLRect.Height() > rLRect.Width() )
931 SwTwips nLLeft = rLRect.Left() - 30,
932 nLRight = rLRect.Right() + 30,
933 nTLeft = rLRect.GetTab()->getFrameArea().Left() + rLRect.GetTab()->getFramePrintArea().Left(),
934 nTRight = rLRect.GetTab()->getFrameArea().Left() + rLRect.GetTab()->getFramePrintArea().Right();
935 if ( (nTLeft >= nLLeft && nTLeft <= nLRight) ||
936 (nTRight>= nLLeft && nTRight<= nLRight) )
942 SwTwips nLTop = rLRect.Top() - 30,
943 nLBottom = rLRect.Bottom() + 30,
944 nTTop = rLRect.GetTab()->getFrameArea().Top() + rLRect.GetTab()->getFramePrintArea().Top(),
945 nTBottom = rLRect.GetTab()->getFrameArea().Top() + rLRect.GetTab()->getFramePrintArea().Bottom();
946 if ( (nTTop >= nLTop && nTTop <= nLBottom) ||
947 (nTBottom >= nLTop && nTBottom <= nLBottom) )
953 if ( !pLast || *pLast != rLRect.GetColor() )
955 pLast = &rLRect.GetColor();
960 pOut->SetDrawMode( DrawModeFlags::Default );
962 pOut->SetLineColor( *pLast );
963 pOut->SetFillColor( *pLast );
964 pOut->SetDrawMode( nOldDrawMode );
967 if( !rLRect.IsEmpty() )
976 for (
size_t i = 0;
i < m_aLineRects.size(); ++
i)
978 SwLineRect& rLRect = m_aLineRects[
i];
979 if ( rLRect.IsPainted() )
982 if ( rLRect.IsLocked() )
984 nMinCount =
std::min( nMinCount, i );
988 if ( !pLast || *pLast != rLRect.GetColor() )
990 pLast = &rLRect.GetColor();
996 pOut->SetDrawMode( DrawModeFlags::Default );
999 pOut->SetFillColor( *pLast );
1000 pOut->SetDrawMode( nOldDrawMode );
1002 if( !rLRect.IsEmpty() )
1004 rLRect.SetPainted();
1007 m_nLastCount = nMinCount;
1013 const SwLineRects *pRects,
1016 if (m_aLineRects.empty())
1023 for (size_type i = 0;
i != m_aLineRects.size(); ++
i)
1025 SwLineRect& rLi = m_aLineRects[
i];
1026 const bool bVerticalSubs = rLi.Height() > rLi.Width();
1028 for (size_type k = i + 1; k != m_aLineRects.size(); ++k)
1030 SwLineRect& rLk = m_aLineRects[k];
1031 if ( rLi.SSize() == rLk.SSize() )
1033 if ( bVerticalSubs == ( rLk.Height() > rLk.Width() ) )
1035 if ( bVerticalSubs )
1039 if ( rLi.Top() == rLk.Top() &&
1040 ((nLi < rLk.Left() && nLi+21 > rLk.Left()) ||
1041 (nLk < rLi.Left() && nLk+21 > rLi.Left())))
1043 m_aLineRects.erase(m_aLineRects.begin() + i);
1054 if ( rLi.Left() == rLk.Left() &&
1055 ((nLi < rLk.Top() && nLi+21 > rLk.Top()) ||
1056 (nLk < rLi.Top() && nLk+21 > rLi.Top())))
1058 m_aLineRects.erase(m_aLineRects.begin() + i);
1070 if (pRects && (!pRects->m_aLineRects.empty()))
1071 RemoveSuperfluousSubsidiaryLines( *pRects,
properties );
1073 if (m_aLineRects.empty())
1077 pOut->SetLineColor();
1083 if(
gProp.pSGlobalShell->GetWin() &&
1086 pOut->SetDrawMode( DrawModeFlags::Default );
1089 for (SwLineRect& rLRect : m_aLineRects)
1092 if ( !rLRect.IsPainted() &&
1093 !rLRect.IsLocked() )
1095 const Color *pCol =
nullptr;
1098 switch ( rLRect.GetSubColor() )
1106 if (pCol &&
pOut->GetFillColor() != *pCol)
1107 pOut->SetFillColor( *pCol );
1108 pOut->DrawRect( rLRect.SVRect() );
1110 rLRect.SetPainted();
1114 pOut->SetDrawMode( nOldDrawMode );
1136 if ( !
gProp.bSFlyMetafile && !pSh )
1142 gProp.pSFlyMetafileOut.get() : pRenderContext;
1147 const SwRect aPxCenterRect(
pOut->PixelToLogic( aOrgPxRect ) );
1150 SwRect aAlignedPxRect( aOrgPxRect );
1151 if ( rRect.
Top() > aPxCenterRect.
Top() )
1154 aAlignedPxRect.
AddTop( 1 );
1163 if ( rRect.
Left() > aPxCenterRect.
Left() )
1181 if ( aAlignedPxRect.
Width() < 0 )
1183 aAlignedPxRect.
Width(0);
1185 if ( aAlignedPxRect.
Height() < 0 )
1187 aAlignedPxRect.
Height(0);
1192 bool bZeroWidth =
false;
1193 if ( aAlignedPxRect.
Width() == 0 )
1195 aAlignedPxRect.
Width(1);
1198 bool bZeroHeight =
false;
1199 if ( aAlignedPxRect.
Height() == 0 )
1201 aAlignedPxRect.
Height(1);
1296 if ( bTop || rBox.
GetTop() )
1302 (rRect.*fnRect->
fnSubTop)( nDiff );
1311 static_cast<const SwTabFrame*
>(pFrame)->IsCollapsingBorders() )
1315 nDiff =
static_cast<const SwTabFrame*
>(pFrame)->GetBottomLineSize();
1378 static MapMode aMapMode(MapUnit::MapTwip);
1394 if (!
gProp.pSRetoucheFly)
1397 for (
size_t j = 0; (j < rObjs.
size()) && !rRegion.empty(); ++j)
1415 gProp.pSGlobalShell->IsPreview()))
1418 const bool bLowerOfSelf = pSelfFly && pFly->
IsLowerOf( pSelfFly );
1424 if (pSelfFly && pSelfFly->
IsLowerOf(pFly))
1428 if (
gProp.pSRetoucheFly &&
gProp.pSRetoucheFly->IsLowerOf(pFly))
1431#if OSL_DEBUG_LEVEL > 0
1434 if (pSelfFly && bLowerOfSelf)
1438 "Fly with wrong z-Order" );
1442 bool bStopOnHell =
true;
1458 bStopOnHell =
false;
1461 if (
gProp.pSRetoucheFly)
1476 bStopOnHell =
false;
1484 if ( (bStopOnHell && bHell) ||
1550 if (
gProp.pSRetoucheFly ==
gProp.pSRetoucheFly2)
1551 gProp.pSRetoucheFly =
nullptr;
1556 const SwRect& _rAlignedPaintRect,
1571 bool bDrawTransparent =
false;
1575 bDrawTransparent =
true;
1576 nTransparencyPercent = ((255 - aColor.
GetAlpha())*100 + 0x7F)/0xFF;
1583 bDrawTransparent =
true;
1584 nTransparencyPercent = 100 - (_rGraphicObj.
GetAttr().
GetAlpha() * 100 + 127) / 255;
1587 if ( bDrawTransparent )
1638 const SwRect& _rAlignedPaintRect,
1640 bool _bNumberingGraphic,
1642 bool _bBackgrdAlreadyDrawn =
false)
1648 if ( !_bNumberingGraphic &&
1649 !_bBackgrdAlreadyDrawn &&
1676 bool bBackgrdAlreadyDrawn )
1682 SwRect aAlignedGrfRect = rGrf;
1686 const bool bNotInside = !rOut.
Contains( aAlignedGrfRect );
1696 if (pGrf->
GetGraphic().
GetType() == GraphicType::Default && !aOriginURL.isEmpty())
1711 aAlignedGrfRect.
Width(), aAlignedGrfRect.
Height(),
1712 aAlignedGrfRect.
Left(), aAlignedGrfRect.
Top()));
1729 const SwRect& rOriginalLayoutRect,
1734 if(rFillAttributes && rFillAttributes->isUsed())
1743 !rPaintRegion.empty() &&
1758 static const double fExpandX = 0.55;
1759 static const double fExpandY = 0.70;
1775 rOriginalLayoutRect.
Left(),
1776 rOriginalLayoutRect.
Top(),
1777 rOriginalLayoutRect.
Right(),
1778 rOriginalLayoutRect.
Bottom());
1784 if(rSequence.size())
1787 pPrimitives(&rSequence);
1790 if (rPaintRegion.size() > 1 || rPaintRegion[0] != rPaintRegion.
GetOrigin())
1793 primitives.resize(1);
1796 pPrimitives = &primitives;
1798 assert(pPrimitives && pPrimitives->size());
1806 aViewInformation2D) );
1807 pProcessor->process(*pPrimitives);
1822 const bool bConsiderBackgroundTransparency )
1831 if( pBrush && !bReplaceGrfNum )
1837 if (sh !=
nullptr && sh->
HasName()) {
1841 if( pGrf && GraphicType::NONE != pGrf->
GetType() )
1850 bReplaceGrfNum = bGrfNum;
1854 aGrf.
SSize( aGrfSize );
1856 bool bRetouche =
true;
1864 aGrf.
Pos().setY( rOrg.
Top() );
1869 aGrf.
Pos().setY( rOrg.
Top() );
1875 aGrf.
Pos().setX( rOrg.
Left() );
1890 aGrf.
Pos().setX( rOrg.
Left() );
1912 bRetouche = !rOut.
Contains( aGrf );
1921 SwRect aAlignedPaintRect = rOut;
1935 Point aPaintOffset( aAlignedPaintRect.
Pos() - aGrf.
Pos() );
1956 const double k1( 50 );
1957 const double k2( 7 );
1958 const Size aSize( aAlignedPaintRect.
SSize() );
1959 const double Abitmap( k1/k2 *
static_cast<double>(aSize.
Width())*aSize.
Height() );
1962 aAlignedPaintRect.
SVRect(),
1964 Size( aPaintOffset.X(), aPaintOffset.Y() ),
1965 std::max( 128,
static_cast<int>( sqrt(sqrt( Abitmap)) + .5 ) ) );
1971 bDraw = bRetouche =
false;
1979 default: OSL_ENSURE(
false,
"new Graphic position?" );
1984 bool bGrfBackgrdAlreadyDrawn =
false;
1996 bool bTransparentGrfWithNoFillBackgrd =
false;
1997 sal_Int32 nGrfTransparency = 0;
1998 bool bGrfIsTransparent =
false;
2004 if ( bConsiderBackgroundTransparency )
2011 bTransparentGrfWithNoFillBackgrd =
true;
2012 nGrfTransparency = 255 - aGrfAttr.
GetAlpha();
2017 bGrfIsTransparent =
true;
2023 const Color aColor( pBrush &&
2025 gProp.bSFlyMetafile )
2043 if (bConsiderBackgroundTransparency &&
2045 bTransparentGrfWithNoFillBackgrd ) )
2052 if (
gProp.pSGlobalShell->GetWin() &&
2090 if ( !bGrfIsTransparent )
2099 aDrawPoly.
Insert( aGrfPoly );
2103 bGrfBackgrdAlreadyDrawn =
true;
2111 (( bTransparentGrfWithNoFillBackgrd ? nGrfTransparency : (255 - aColor.
GetAlpha())
2112 )*100 + 0x7F)/0xFF);
2122 if ( !bGrfIsTransparent )
2125 bGrfBackgrdAlreadyDrawn =
true;
2127 for(
size_t i = 0;
i < aRegion.size(); ++
i )
2129 rOutDev.
DrawRect( aRegion[
i].SVRect() );
2136 if( bDraw && aGrf.
Overlaps( rOut ) )
2138 bGrfBackgrdAlreadyDrawn );
2140 if( bReplaceGrfNum )
2202 io_aSwRect =
SwRect( aSizedRect );
2204#if OSL_DEBUG_LEVEL > 0
2207 OSL_ENSURE( aTestOrgPxRect == aTestNewPxRect,
2208 "Error in lcl_AlignRectToPixelSize(..): Adjusted rectangle has incorrect position or size");
2212 OSL_ENSURE( aTestOrgPxRect.
Left() >= (aTestNewPxRect.
Left()+1),
2213 "Error in lcl_AlignRectToPixelSize(..): Left() not correct adjusted");
2218 OSL_ENSURE( aTestOrgPxRect.
Right() <= (aTestNewPxRect.
Right()-1),
2219 "Error in lcl_AlignRectToPixelSize(..): Right() not correct adjusted");
2224 OSL_ENSURE( aTestOrgPxRect.
Top() >= (aTestNewPxRect.
Top()+1),
2225 "Error in lcl_AlignRectToPixelSize(..): Top() not correct adjusted");
2230 OSL_ENSURE( aTestOrgPxRect.
Bottom() <= (aTestNewPxRect.
Bottom()-1),
2231 "Error in lcl_AlignRectToPixelSize(..): Bottom() not correct adjusted");
2250 enum OverlapType { NO_OVERLAP, OVERLAP1, OVERLAP2, OVERLAP3 };
2252 enum class VerticalType {
LEFT,
RIGHT };
2261 OverlapType Overlaps(
const SwLineEntry& rComp )
const;
2267 void LimitVerticalEndPos(
const SwFrame& rFrame, VerticalType eType);
2272SwLineEntry::SwLineEntry(
SwTwips nKey,
2278 mnStartPos( nStartPos ),
2279 mnEndPos( nEndPos ),
2282 maAttribute( rAttribute )
2316SwLineEntry::OverlapType SwLineEntry::Overlaps(
const SwLineEntry& rNew )
const
2318 SwLineEntry::OverlapType eRet = OVERLAP3;
2320 if ( mnStartPos >= rNew.mnEndPos || mnEndPos <= rNew.mnStartPos )
2324 else if ( mnEndPos < rNew.mnEndPos )
2328 else if (mnStartPos <= rNew.mnStartPos)
2335void SwLineEntry::LimitVerticalEndPos(
const SwFrame& rFrame, VerticalType eType)
2342 const auto& rCellFrame =
static_cast<const SwCellFrame&
>(rFrame);
2343 std::vector<const SwCellFrame*> aCoveredCells = rCellFrame.
GetCoveredCells();
2346 for (
auto it = aCoveredCells.rbegin(); it != aCoveredCells.rend(); ++it)
2352 if (eType == VerticalType::LEFT && rBox.
GetLeft())
2357 if (eType == VerticalType::RIGHT && rBox.
GetRight())
2368struct lt_SwLineEntry
2370 bool operator()(
const SwLineEntry& e1,
const SwLineEntry& e2 )
const
2372 return e1.mnStartPos < e2.mnStartPos;
2383class SwTabFramePainter
2389 void Insert( SwLineEntry&,
bool bHori );
2392 void FindStylesForLine(
Point&,
2396 bool bOuter )
const;
2399 explicit SwTabFramePainter(
const SwTabFrame& rTabFrame );
2406SwTabFramePainter::SwTabFramePainter(
const SwTabFrame& rTabFrame )
2407 : mrTabFrame( rTabFrame )
2410 HandleFrame(rTabFrame, aPaintArea);
2413void SwTabFramePainter::HandleFrame(
const SwLayoutFrame& rLayoutFrame,
const SwRect& rPaintArea)
2422 if ( !pRowFrame->
IsRowSpanLine() || nRowSpan > 1 || nRowSpan < -1 )
2427 Insert(rLayoutFrame, rBox, rPaintArea);
2438 HandleFrame(*pLowerLayFrame, rPaintArea);
2449 SwLineEntryMap::const_iterator aIter = maHoriLines.begin();
2453 const Color& rCol(
gProp.pSGlobalShell->GetViewOptions()->GetTableBoundariesColor() );
2457 const Color* pHCColor =
nullptr;
2459 if(
gProp.pSGlobalShell->GetWin() &&
2462 pHCColor = &
gProp.pSGlobalShell->GetViewOptions()->GetFontColor();
2469 SwRect aUpperAligned( aUpper );
2477 if ( bHori && aIter == maHoriLines.end() )
2479 aIter = maVertLines.begin();
2483 if ( !bHori && aIter == maVertLines.end() )
2487 for (
const SwLineEntry& rEntry : rEntrySet)
2494 aStart.setX( rEntry.mnStartPos );
2495 aStart.setY( rEntry.mnKey );
2496 aEnd.setX( rEntry.mnEndPos );
2497 aEnd.setY( rEntry.mnKey );
2501 aStart.setX( rEntry.mnKey );
2502 aStart.setY( rEntry.mnStartPos );
2503 aEnd.setX( rEntry.mnKey );
2504 aEnd.setY( rEntry.mnEndPos );
2508 aStyles[ 0 ] = rEntryStyle;
2509 FindStylesForLine(aStart, aEnd, aStyles, bHori, rEntry.mbOuter);
2511 if (!bHori && rEntry.mnLimitedEndPos)
2513 aEnd.setY(rEntry.mnLimitedEndPos);
2516 SwRect aRepaintRect( aStart, aEnd );
2519 SwTwips nRepaintRectSize = !rEntryStyle.GetWidth() ? 1 : rEntryStyle.GetWidth();
2522 aRepaintRect.Height( 2 * nRepaintRectSize );
2523 aRepaintRect.Pos().AdjustY( -nRepaintRectSize );
2529 if(aStyles[1].IsUsed() || aStyles[3].IsUsed() || aStyles[4].IsUsed() || aStyles[6].IsUsed())
2531 const double fLineWidthMaxLeft(std::max(aStyles[1].GetWidth(), aStyles[3].GetWidth()));
2532 const double fLineWidthMaxRight(std::max(aStyles[4].GetWidth(), aStyles[6].GetWidth()));
2533 aRepaintRect.Width(aRepaintRect.Width() + (fLineWidthMaxLeft + fLineWidthMaxRight));
2534 aRepaintRect.Pos().AdjustX( -fLineWidthMaxLeft );
2539 aRepaintRect.Width( 2 * nRepaintRectSize );
2540 aRepaintRect.Pos().AdjustX( -nRepaintRectSize );
2544 if(aStyles[3].IsUsed() || aStyles[1].IsUsed() || aStyles[6].IsUsed() || aStyles[4].IsUsed())
2546 const double fLineWidthMaxTop(std::max(aStyles[3].GetWidth(), aStyles[1].GetWidth()));
2547 const double fLineWidthMaxBottom(std::max(aStyles[6].GetWidth(), aStyles[4].GetWidth()));
2548 aRepaintRect.Height(aRepaintRect.Height() + (fLineWidthMaxTop + fLineWidthMaxBottom));
2549 aRepaintRect.Pos().AdjustY( -fLineWidthMaxTop );
2559 const Color* pTmpColor =
nullptr;
2560 if (0 == aStyles[ 0 ].GetWidth())
2562 if (isTableBoundariesEnabled() &&
gProp.pSGlobalShell->GetWin())
2563 aStyles[ 0 ].
Set( rCol, rCol, rCol,
false, 1, 0, 0 );
2565 aStyles[0].
SetType(SvxBorderLineStyle::NONE);
2568 pTmpColor = pHCColor;
2581 if (
gProp.pSGlobalShell->GetWin())
2586 if (aStart.X() == aUpper.Left())
2587 aPaintStart.setX( aUpperAligned.Left() );
2588 else if (aStart.X() == aUpper.Right_())
2589 aPaintStart.setX( aUpperAligned.Right_() );
2590 if (aStart.Y() == aUpper.Top())
2591 aPaintStart.setY( aUpperAligned.Top() );
2592 else if (aStart.Y() == aUpper.Bottom_())
2593 aPaintStart.setY( aUpperAligned.Bottom_() );
2595 if (aEnd.X() == aUpper.Left())
2596 aPaintEnd.setX( aUpperAligned.Left() );
2597 else if (aEnd.X() == aUpper.Right_())
2598 aPaintEnd.setX( aUpperAligned.Right_() );
2599 if (aEnd.Y() == aUpper.Top())
2600 aPaintEnd.setY( aUpperAligned.Top() );
2601 else if (aEnd.Y() == aUpper.Bottom_())
2602 aPaintEnd.setY( aUpperAligned.Bottom_() );
2605 if(aStyles[0].IsUsed())
2622 rInstance.addSdrConnectStyleData(
true, aStyles[1], -aY,
true);
2623 rInstance.addSdrConnectStyleData(
true, aStyles[2], -aX,
true);
2624 rInstance.addSdrConnectStyleData(
true, aStyles[3], aY,
false);
2626 rInstance.addSdrConnectStyleData(
false, aStyles[4], -aY,
true);
2627 rInstance.addSdrConnectStyleData(
false, aStyles[5], aX,
false);
2628 rInstance.addSdrConnectStyleData(
false, aStyles[6], aY,
false);
2646 rInstance.addSdrConnectStyleData(
true, aStyles[3], -aY,
false);
2647 rInstance.addSdrConnectStyleData(
true, aStyles[2], -aX,
true);
2648 rInstance.addSdrConnectStyleData(
true, aStyles[1], aY,
true);
2650 rInstance.addSdrConnectStyleData(
false, aStyles[6], -aY,
false);
2651 rInstance.addSdrConnectStyleData(
false, aStyles[5], aX,
false);
2652 rInstance.addSdrConnectStyleData(
false, aStyles[4], aY,
true);
2671 mrTabFrame.ProcessPrimitives(aSequence);
2683void SwTabFramePainter::FindStylesForLine( Point& rStartPoint,
2686 bool bHori,
bool bOuter )
const
2697 bool bWordTableCell =
false;
2698 SwViewShell* pShell = mrTabFrame.getRootFrame()->GetCurrShell();
2705 SwLineEntryMap::const_iterator aMapIter = maVertLines.find( rStartPoint.X() );
2706 OSL_ENSURE( aMapIter != maVertLines.end(),
"FindStylesForLine: Error" );
2709 for (
const SwLineEntry& rEntry : rVertSet )
2713 if ( rStartPoint.Y() == rEntry.mnStartPos )
2714 pStyles[ 3 ] = rEntry.maAttribute;
2715 else if ( rStartPoint.Y() == rEntry.mnEndPos )
2716 pStyles[ 1 ] = rEntry.maAttribute;
2718 if (bWordTableCell && rStartPoint.X() == rEntry.mnKey && !bOuter && rEntry.mbOuter)
2720 rStartPoint.AdjustX(rEntry.maAttribute.GetWidth());
2725 if ( rStartPoint.Y() == rEntry.mnEndPos )
2726 pStyles[ 2 ] = rEntry.maAttribute;
2727 else if ( rEndPoint.Y() == rEntry.mnStartPos )
2728 pStyles[ 5 ] = rEntry.maAttribute;
2732 aMapIter = maHoriLines.find( rStartPoint.Y() );
2733 OSL_ENSURE( aMapIter != maHoriLines.end(),
"FindStylesForLine: Error" );
2736 for (
const SwLineEntry& rEntry : rHoriSet )
2740 if ( rStartPoint.X() == rEntry.mnEndPos )
2741 pStyles[ 2 ] = rEntry.maAttribute;
2742 else if ( rEndPoint.X() == rEntry.mnStartPos )
2743 pStyles[ 5 ] = rEntry.maAttribute;
2747 if ( rStartPoint.X() == rEntry.mnEndPos )
2748 pStyles[ 1 ] = rEntry.maAttribute;
2749 else if ( rStartPoint.X() == rEntry.mnStartPos )
2750 pStyles[ 3 ] = rEntry.maAttribute;
2752 if (bWordTableCell && rStartPoint.Y() == rEntry.mnKey && !bOuter && rEntry.mbOuter)
2754 rStartPoint.AdjustY(rEntry.maAttribute.GetWidth());
2761 aMapIter = maVertLines.find( rEndPoint.X() );
2762 OSL_ENSURE( aMapIter != maVertLines.end(),
"FindStylesForLine: Error" );
2765 for (
const SwLineEntry& rEntry : rVertSet2 )
2767 if ( rEndPoint.Y() == rEntry.mnStartPos )
2768 pStyles[ 6 ] = rEntry.maAttribute;
2769 else if ( rEndPoint.Y() == rEntry.mnEndPos )
2770 pStyles[ 4 ] = rEntry.maAttribute;
2772 if (bWordTableCell && rEndPoint.X() == rEntry.mnKey && !bOuter && rEntry.mbOuter)
2774 rEndPoint.AdjustX(-rEntry.maAttribute.GetWidth());
2780 aMapIter = maHoriLines.find( rEndPoint.Y() );
2781 OSL_ENSURE( aMapIter != maHoriLines.end(),
"FindStylesForLine: Error" );
2784 for (
const SwLineEntry& rEntry : rHoriSet2 )
2786 if ( rEndPoint.X() == rEntry.mnEndPos )
2787 pStyles[ 4 ] = rEntry.maAttribute;
2788 else if ( rEndPoint.X() == rEntry.mnStartPos )
2789 pStyles[ 6 ] = rEntry.maAttribute;
2791 if (bWordTableCell && rEndPoint.Y() == rEntry.mnKey && !bOuter && rEntry.mbOuter)
2793 rEndPoint.AdjustY(-rEntry.maAttribute.GetWidth());
2808 return (pThisRowFrame
2809 && (pThisRowFrame->
GetUpper() == &rTabFrame)
2810 && rTabFrame.IsFollow()
2812 && ( !pThisRowFrame->
GetPrev()
2827 mrTabFrame, rFrame, rBoxItem));
2828 bool const bVert = mrTabFrame.IsVertical();
2829 bool const bR2L = mrTabFrame.IsRightToLeft();
2831 bool bWordTableCell =
false;
2841 aL.SetWordTableCell(bWordTableCell);
2843 aR.SetWordTableCell(bWordTableCell);
2845 aT.SetWordTableCell(bWordTableCell);
2847 aB.SetWordTableCell(bWordTableCell);
2859 if (!bWordTableCell || !bBottomIsOuter)
2875 if (bWordTableCell && bLeftIsOuter)
2881 SwLineEntry aLeft (nLeft, nTop, nBottom, bLeftIsOuter,
2882 bVert ? aB : (bR2L ? aR : aL));
2885 aLeft.LimitVerticalEndPos(rFrame, SwLineEntry::VerticalType::LEFT);
2888 SwLineEntry aRight (nRight, nTop, nBottom, bRightIsOuter,
2889 bVert ? (bBottomAsTop ? aB : aT) : (bR2L ? aL : aR));
2892 aRight.LimitVerticalEndPos(rFrame, SwLineEntry::VerticalType::RIGHT);
2895 SwLineEntry aTop (nTop, nLeft, nRight, bTopIsOuter,
2896 bVert ? aL : (bBottomAsTop ? aB : aT));
2898 SwLineEntry aBottom(nBottom, nLeft, nRight, bBottomIsOuter,
2907void SwTabFramePainter::Insert( SwLineEntry& rNew,
bool bHori )
2911 const SwTwips nKey = rNew.mnKey;
2912 SwLineEntryMap::iterator aMapIter = pLine2->find( nKey );
2914 SwLineEntrySet* pLineSet = aMapIter != pLine2->end() ? &((*aMapIter).second) :
nullptr;
2918 (*pLine2)[ nKey ] = aNewSet;
2919 pLineSet = &(*pLine2)[ nKey ];
2921 SwLineEntrySet::iterator aIter = pLineSet->begin();
2923 bool bWordTableCell =
false;
2924 SwViewShell* pShell = mrTabFrame.getRootFrame()->GetCurrShell();
2930 while ( aIter != pLineSet->end() && rNew.mnStartPos < rNew.mnEndPos )
2932 const SwLineEntry& rOld = *aIter;
2934 if (rOld.mnLimitedEndPos || (bWordTableCell && (rOld.mbOuter != rNew.mbOuter)))
2941 const SwLineEntry::OverlapType nOverlapType = rOld.Overlaps( rNew );
2947 if ( SwLineEntry::OVERLAP1 == nOverlapType )
2949 OSL_ENSURE( rNew.mnStartPos >= rOld.mnStartPos,
"Overlap type 3? How this?" );
2952 const SwLineEntry aLeft(nKey, rOld.mnStartPos, rNew.mnStartPos, rOld.mbOuter, rOldAttr);
2955 const SwLineEntry aMiddle(nKey, rNew.mnStartPos, rOld.mnEndPos, rOld.mbOuter, rCmpAttr);
2958 rNew.mnStartPos = rOld.mnEndPos;
2961 pLineSet->erase( aIter );
2962 if ( aLeft.mnStartPos < aLeft.mnEndPos ) pLineSet->insert( aLeft );
2963 if ( aMiddle.mnStartPos < aMiddle.mnEndPos ) pLineSet->insert( aMiddle );
2965 aIter = pLineSet->begin();
2969 else if ( SwLineEntry::OVERLAP2 == nOverlapType )
2972 const SwLineEntry aLeft(nKey, rOld.mnStartPos, rNew.mnStartPos, rOld.mbOuter, rOldAttr);
2975 const SwLineEntry aMiddle(nKey, rNew.mnStartPos, rNew.mnEndPos, rOld.mbOuter, rCmpAttr);
2978 const SwLineEntry aRight(nKey, rNew.mnEndPos, rOld.mnEndPos, rOld.mbOuter, rOldAttr);
2981 pLineSet->erase( aIter );
2982 if ( aLeft.mnStartPos < aLeft.mnEndPos ) pLineSet->insert( aLeft );
2983 if ( aMiddle.mnStartPos < aMiddle.mnEndPos ) pLineSet->insert( aMiddle );
2984 if ( aRight.mnStartPos < aRight.mnEndPos ) pLineSet->insert( aRight );
2986 rNew.mnStartPos = rNew.mnEndPos;
2990 else if ( SwLineEntry::OVERLAP3 == nOverlapType )
2993 const SwLineEntry aLeft(nKey, rNew.mnStartPos, rOld.mnStartPos, rOld.mbOuter, rNewAttr);
2996 const SwLineEntry aMiddle(nKey, rOld.mnStartPos, rNew.mnEndPos, rOld.mbOuter, rCmpAttr);
2999 const SwLineEntry aRight(nKey, rNew.mnEndPos, rOld.mnEndPos, rOld.mbOuter, rOldAttr);
3002 pLineSet->erase( aIter );
3003 if ( aLeft.mnStartPos < aLeft.mnEndPos ) pLineSet->insert( aLeft );
3004 if ( aMiddle.mnStartPos < aMiddle.mnEndPos ) pLineSet->insert( aMiddle );
3005 if ( aRight.mnStartPos < aRight.mnEndPos ) pLineSet->insert( aRight );
3007 rNew.mnStartPos = rNew.mnEndPos;
3015 if ( rNew.mnStartPos < rNew.mnEndPos )
3016 pLineSet->insert( rNew );
3031 explicit SwViewObjectContactRedirector(
const SwViewShell& rSh )
3040 bool bPaint(
true );
3054 rOriginal, rDisplayInfo, rVisitor );
3076 bool bResetRootPaint =
false;
3094 std::unique_ptr<SwSavePaintStatics> pStatics;
3095 if (
gProp.pSGlobalShell )
3096 pStatics.reset(
new SwSavePaintStatics());
3097 gProp.pSGlobalShell = pSh;
3115 bool bPerformLayoutAction(
true );
3119 if ( rTmpViewShell.IsInEndAction() ||
3120 rTmpViewShell.IsPaintInProgress() ||
3121 ( rTmpViewShell.Imp()->IsAction() &&
3122 rTmpViewShell.Imp()->GetLayAction().IsActionInProgress() ) )
3124 bPerformLayoutAction =
false;
3127 if(!bPerformLayoutAction)
3131 if ( bPerformLayoutAction )
3138 aAction.
Action(&rRenderContext);
3148 gProp.pSLines.reset(
new SwLineRects);
3167 "Neighbour of page is not a page.");
3171 const bool bBookMode =
gProp.pSGlobalShell->GetViewOptions()->IsViewLayoutBookMode();
3185 while ( pHiddenPage->
GetPrev() != nullptr )
3190 pControl->ShowAll(
false );
3195 SwViewObjectContactRedirector aSwRedirector( *pSh );
3207 bPaintLeftShadow, bPaintRightShadow, bRightSidebar );
3209 if ( aRect.
Overlaps( aPaintRect ) )
3213 gProp.pSSubsLines.reset(
new SwSubsRects);
3214 gProp.pSSpecSubsLines.reset(
new SwSubsRects);
3216 gProp.pBLines.reset(
new BorderLines);
3226 SwRect aPageRectTemp( aPaintRect );
3276 gProp.pSLines->LockLines(
true );
3285 gProp.pSLines->LockLines(
false );
3289 pPage->
PaintBaBo( aPaintRect, pPage,
true );
3313 gProp.pSSubsLines.reset();
3314 gProp.pSSpecSubsLines.reset();
3334 gProp.pBLines.reset();
3368 bPaintLeftShadow, bPaintRightShadow, bRightSidebar );
3371 if ( aRect.
Overlaps( aEmptyPageRect ) )
3386 SwRect aTmpPageRect( aEmptyPageRect );
3388 aEmptyPageRect = aTmpPageRect;
3399 DrawTextFlags::VCenter |
3400 DrawTextFlags::Center |
3401 DrawTextFlags::Clip );
3415 "Neighbour of page is not a page." );
3419 gProp.pSLines.reset();
3421 if ( bResetRootPaint )
3427 gProp.pSProgress =
nullptr;
3428 gProp.pSGlobalShell =
nullptr;
3442 pCnt->
Calc(pRenderContext);
3456 bool Stop(
const SwRect& rRect)
const {
return (rRect.*m_fnCheck)(m_nLimit) > 0; }
3461SwShortCut::SwShortCut(
const SwFrame& rFrame,
const SwRect& rRect )
3470 m_nLimit = rRect.
Top();
3475 m_nLimit = rRect.
Left() + rRect.
Width();
3481 m_nLimit = rRect.
Top() + rRect.
Height();
3488 m_nLimit = rRect.
Right();
3493 m_nLimit = rRect.
Left();
3502 SwTaggedPDFHelper aTaggedPDFHelper(
nullptr, &aFrameInfo,
nullptr, rRenderContext );
3509 SwShortCut aShortCut( *pFrame, rRect );
3512 pFrame->
Calc(&rRenderContext);
3521 bool bWin =
gProp.pSGlobalShell->GetWin() !=
nullptr;
3530 if( aShortCut.Stop( aPaintRect ) )
3532 if ( bCnt &&
gProp.pSProgress )
3543 pFrame->
Retouch( pPage, rRect );
3548 if ( rRect.
Overlaps( aPaintRect ) )
3561 if ( aPaintRect.
Left() == rRect.
Left() &&
3565 if ( aPaintRect.
Height() > 0 )
3566 gProp.pSGlobalShell->InvalidateWindows(aPaintRect);
3569 if ( aPaintRect.
Height() > 0 )
3570 gProp.pSGlobalShell->InvalidateWindows(aPaintRect);
3576 gProp.pSGlobalShell->InvalidateWindows( aPaintRect );
3582 pFrame->
Calc(&rRenderContext);
3618 pFrame->
Calc(&rRenderContext);
3629 std::vector< double > aStrokePattern;
3631 aLinePolygon.
append(rStart);
3632 aLinePolygon.
append(rEnd);
3644 double nLuminance = aHslLine.
getZ() * 2.5;
3645 if ( nLuminance == 0 )
3647 else if ( nLuminance >= 1.0 )
3648 nLuminance = aHslLine.
getZ() * 0.4;
3649 aHslLine.
setZ( nLuminance );
3655 aLinePolygon, aOtherColor );
3658 aStrokePattern.push_back( 40 );
3659 aStrokePattern.push_back( 40 );
3678 gProp.pSGlobalShell->GetViewOptions()->IsPDFExport() ||
3679 gProp.pSGlobalShell->GetViewOptions()->IsReadonly() ||
3680 gProp.pSGlobalShell->IsPreview() )
3684 while ( pBodyFrame && !pBodyFrame->
IsBodyFrame() )
3685 pBodyFrame = pBodyFrame->
GetNext();
3694 if ( pFirstFrame && pFirstFrame->
IsTabFrame() )
3695 pFlowFrame =
static_cast< const SwTabFrame*
>( pFirstFrame );
3703 if ( pFlowFrame && pFlowFrame->IsPageBreak(
true ) )
3715 gProp.pSGlobalShell->GetViewOptions()->IsPDFExport() ||
3716 gProp.pSGlobalShell->GetViewOptions()->IsReadonly() ||
3717 gProp.pSGlobalShell->IsPreview() )
3721 while ( pBodyFrame && !pBodyFrame->
IsBodyFrame() )
3722 pBodyFrame = pBodyFrame->
GetNext();
3728 if ( !(pCnt && pCnt->IsColBreak(
true )) )
3738 gProp.pSGlobalShell->GetViewOptions()->IsLineBreak()) )
3747 double nWidth = aRect.
Width();
3755 basegfx::BColor aLineColor =
gProp.pSGlobalShell->GetViewOptions()->GetPageBreakColor().getBColor();
3761 OUString aBreakText =
SwResId(STR_COLUMN_BREAK);
3765 vcl::Font aFont =
pOut->GetSettings().GetStyleSettings().GetToolFont();
3767 pOut->SetFont( aFont );
3772 pOut->GetTextBoundRect( aTextRect, aBreakText );
3776 aFontSize.
getX(), aFontSize.
getY(),
3777 aRect.
Left() + nTextOff, aRect.
Top() ) );
3781 aFontSize.
getX(), aFontSize.
getY(), 0.0, M_PI_2,
3782 aRect.
Right(), aRect.
Top() + nTextOff );
3788 aBreakText, 0, aBreakText.getLength(),
3789 std::vector< double >(),
3791 std::move(aFontAttr),
3824 !
gProp.pSGlobalShell->GetViewOptions()->IsPDFExport() &&
3825 !
gProp.pSGlobalShell->IsPreview() &&
3826 !
gProp.pSGlobalShell->GetViewOptions()->IsReadonly() &&
3827 !
gProp.pSGlobalShell->GetViewOptions()->getBrowseMode() &&
3833 const SwRect& rVisArea =
gProp.pSGlobalShell->VisArea();
3836 nXOff = std::max( aBodyRect.
Left(), rVisArea.
Left() );
3843 pHeaderFrame =
nullptr;
3855 while ( pFootnoteContFrame )
3859 pFootnoteContFrame = pFootnoteContFrame->
GetNext();
3883 if ( !bBackgroundTransparent &&
3884 GetFormat()->IsBackgroundBrushInherited() )
3887 std::optional<Color> xSectionTOXColor;
3891 if (
GetBackgroundBrush( aFillAttributes, pBackgroundBrush, xSectionTOXColor, aDummyRect,
false,
false) )
3893 if ( xSectionTOXColor &&
3894 (xSectionTOXColor->IsTransparent()) &&
3897 bBackgroundTransparent =
true;
3899 else if(aFillAttributes && aFillAttributes->isUsed())
3901 bBackgroundTransparent = aFillAttributes->isTransparent();
3903 else if ( pBackgroundBrush )
3908 bBackgroundTransparent =
true;
3918 bBackgroundTransparent =
true;
3925 return bBackgroundTransparent;
3932 if (
nullptr == pUserCall )
3936 bool bPaint =
gProp.pSFlyOnlyDraw ||
3945 if (
dynamic_cast< const SwFlyDrawObj *
>( pObj ) != nullptr )
3952 if (
gProp.pSFlyOnlyDraw &&
gProp.pSFlyOnlyDraw == pFly )
3971 pAnch = pDrawContact ? pDrawContact->
GetAnchorFrame(pObj) :
nullptr;
3990 if (
dynamic_cast< const SdrObjGroup *
>( pObj ) == nullptr )
3992 OSL_FAIL(
"<SwFlyFrame::IsPaint(..)> - paint of drawing object without anchor frame!?" );
4001 else if (
gProp.pSFlyOnlyDraw )
4018struct BorderLinesGuard
4020 explicit BorderLinesGuard() : m_pBorderLines(
std::move(
gProp.pBLines))
4022 gProp.pBLines.reset(
new BorderLines);
4026 gProp.pBLines = std::move(m_pBorderLines);
4029 std::unique_ptr<BorderLines> m_pBorderLines;
4041 if (
auto pFly = pAnchoredObj->DynCastFlyFrame() )
4043 pFly->SetDeleted(bDeleted);
4056 if (bInGenerateThumbnail)
4067 gProp.pSLines->LockLines(
true);
4068 BorderLinesGuard blg;
4080 bool bIsChart =
false;
4107 bool bPaintCompleteBack( !pNoText );
4110 const bool bIsGraphicTransparent = pNoText && pNoText->
IsTransparent();
4111 if ( !bPaintCompleteBack &&
4112 ( bIsGraphicTransparent|| bContour ) )
4122 if(aFillAttributes && aFillAttributes->isUsed())
4124 bPaintCompleteBack =
true;
4133 bPaintCompleteBack =
4139 const bool bPaintMarginOnly( !bPaintCompleteBack &&
4148 if (bIsGraphicTransparent &&
4162 SwRect aPaintRect( aRect );
4166 gProp.pSRetoucheFly2 = pOldRet;
4170 if ( bPaintCompleteBack || bPaintMarginOnly )
4190 if ( bPaintMarginOnly ||
4191 ( pNoText && !bIsGraphicTransparent ) )
4200 rRenderContext.
Push();
4213 for (
size_t i = 0;
i < aRegion.size(); ++
i )
4218 rRenderContext.
Pop();
4222 for (
size_t i = 0;
i < aRegion.size(); ++
i )
4232 rRenderContext.
Pop();
4239 if(
gProp.pSGlobalShell->GetWin()
4242 bool bSubsLineRectsCreated;
4243 if (
gProp.pSSubsLines )
4246 gProp.pSSubsLines->LockLines(
true );
4247 bSubsLineRectsCreated =
false;
4252 gProp.pSSubsLines.reset(
new SwSubsRects);
4253 bSubsLineRectsCreated =
true;
4256 bool bSpecSubsLineRectsCreated;
4257 if (
gProp.pSSpecSubsLines )
4260 gProp.pSSpecSubsLines->LockLines(
true );
4261 bSpecSubsLineRectsCreated =
false;
4266 gProp.pSSpecSubsLines.reset(
new SwSubsRects);
4267 bSpecSubsLineRectsCreated =
true;
4272 gProp.pSSpecSubsLines->PaintSubsidiary( &rRenderContext,
nullptr,
gProp );
4273 gProp.pSSubsLines->PaintSubsidiary(&rRenderContext,
gProp.pSLines.get(),
gProp);
4274 if ( !bSubsLineRectsCreated )
4276 gProp.pSSubsLines->LockLines(
false );
4280 gProp.pSSubsLines.reset();
4283 if ( !bSpecSubsLineRectsCreated )
4285 gProp.pSSpecSubsLines->LockLines(
false );
4289 gProp.pSSpecSubsLines.reset();
4301 gProp.pSLines->PaintLines( &rRenderContext,
gProp );
4302 gProp.pSLines->LockLines(
false );
4319 rRenderContext.
Pop();
4321 if (
gProp.pSProgress && pNoText )
4362 SwTabFramePainter
aHelper(*
this);
4363 aHelper.PaintLines(rRenderContext, rRect);
4369 else if (
gProp.pSGlobalShell->GetWin() && !
gProp.pSGlobalShell->IsPreview() )
4374 SwRect aTabOutRect( rRect );
4395 const SvxShadowItem& rShadow,
const bool bDrawFullShadowRectangle,
4396 const bool bTop,
const bool bBottom,
4397 const bool bLeft,
const bool bRight,
4408 case SvxShadowLocation::BottomRight:
4410 if ( bDrawFullShadowRectangle )
4413 aOut.
Top( rOutRect.
Top() + nHeight );
4414 aOut.
Left( rOutRect.
Left() + nWidth );
4415 aRegion.push_back( aOut );
4421 aOut.
Top( rOutRect.
Bottom() - nHeight );
4423 aOut.
Left( rOutRect.
Left() + nWidth );
4424 aRegion.push_back( aOut );
4430 aOut.
Top( rOutRect.
Top() + nHeight );
4432 aOut.
Top( rOutRect.
Top() );
4435 aRegion.push_back( aOut );
4445 case SvxShadowLocation::TopLeft:
4447 if ( bDrawFullShadowRectangle )
4452 aRegion.push_back( aOut );
4458 aOut.
Bottom( rOutRect.
Top() + nHeight );
4461 aRegion.push_back( aOut );
4471 aOut.
Top( rOutRect.
Top() + nHeight );
4472 aRegion.push_back( aOut );
4479 rOutRect.
AddTop( nHeight );
4482 case SvxShadowLocation::TopRight:
4484 if ( bDrawFullShadowRectangle )
4488 aOut.
Left( rOutRect.
Left() + nWidth );
4489 aRegion.push_back( aOut );
4495 aOut.
Bottom( rOutRect.
Top() + nHeight );
4497 aOut.
Left( rOutRect.
Left() + nWidth );
4498 aRegion.push_back( aOut );
4508 aOut.
Top( rOutRect.
Top() + nHeight );
4509 aRegion.push_back( aOut );
4516 rOutRect.
AddTop( nHeight );
4519 case SvxShadowLocation::BottomLeft:
4521 if ( bDrawFullShadowRectangle )
4524 aOut.
Top( rOutRect.
Top() + nHeight );
4526 aRegion.push_back( aOut );
4535 aRegion.push_back( aOut );
4541 aOut.
Top( rOutRect.
Top() + nHeight );
4543 aOut.
Top( rOutRect.
Top() );
4546 aRegion.push_back( aOut );
4565 if( !aRegion.empty() &&
properties.pSGlobalShell->GetWin() &&
4572 pOut->SetDrawMode( DrawModeFlags::Default );
4573 aShadowColor =
properties.pSGlobalShell->GetViewOptions()->GetFontColor();
4576 if (
pOut->GetFillColor() != aShadowColor )
4577 pOut->SetFillColor( aShadowColor );
4579 pOut->SetLineColor();
4581 pOut->SetDrawMode( nOldDrawMode );
4583 for (
const SwRect & rOut : aRegion)
4609 const bool bTop = !bCnt || rAttrs.
GetTopLine ( *(
this) );
4610 const bool bBottom = !bCnt || rAttrs.
GetBottomLine( *(
this) );
4616 case SvxShadowLocation::BottomRight: rShadow.
SetLocation(SvxShadowLocation::BottomLeft);
break;
4617 case SvxShadowLocation::TopLeft: rShadow.
SetLocation(SvxShadowLocation::TopRight);
break;
4618 case SvxShadowLocation::TopRight: rShadow.
SetLocation(SvxShadowLocation::BottomRight);
break;
4619 case SvxShadowLocation::BottomLeft: rShadow.
SetLocation(SvxShadowLocation::TopLeft);
break;
4629 const bool bDrawFullShadowRectangle =
4637 lcl_PaintShadow(rRect, rOutRect, rShadow, bDrawFullShadowRectangle, bTop, bBottom,
true,
true,
gProp);
4643 const Color *pColor,
4657 : (
IsInFly() ? SubColFlags::Fly : SubColFlags::Page ) );
4658 if( pColor &&
gProp.pSGlobalShell->GetWin() &&
4672 for (
size_t i = 0;
i < aRegion.size(); ++
i )
4673 gProp.pSLines->AddLineRect( aRegion[
i], pColor, nStyle, pTab, nSubCol,
gProp );
4676 gProp.pSLines->AddLineRect( aOut, pColor, nStyle, pTab, nSubCol,
gProp );
4683 class SwBorderRectanglePrimitive2D :
public BufferedDecompositionPrimitive2D
4697 virtual void create2DDecomposition(
4698 Primitive2DContainer& rContainer,
4699 const geometry::ViewInformation2D& rViewInformation)
const override;
4703 SwBorderRectanglePrimitive2D(
4718 virtual bool operator==(
const BasePrimitive2D& rPrimitive)
const override;
4721 virtual basegfx::B2DRange getB2DRange(
const geometry::ViewInformation2D& rViewInformation)
const override;
4724 virtual sal_uInt32 getPrimitive2DID()
const override;
4729 void SwBorderRectanglePrimitive2D::create2DDecomposition(
4730 Primitive2DContainer& rContainer,
4731 const geometry::ViewInformation2D& )
const
4741 if(getStyleTop().IsUsed())
4745 aDown.setLength(getStyleTop().GetWidth() * 0.5);
4750 if(getStyleBottom().IsUsed())
4754 aUp.setLength(getStyleBottom().GetWidth() * 0.5);
4756 aBottomRight += aUp;
4759 if(getStyleLeft().IsUsed())
4763 aRight.setLength(getStyleLeft().GetWidth() * 0.5);
4765 aBottomLeft += aRight;
4768 if(getStyleRight().IsUsed())
4772 aLeft.setLength(getStyleRight().GetWidth() * 0.5);
4774 aBottomRight += aLeft;
4779 if(getStyleTop().IsUsed())
4790 if(getStyleLeft().IsUsed())
4792 rInstance.addSdrConnectStyleData(
true, getStyleLeft(),
basegfx::B2DVector(aBottomLeft - aTopLeft),
false);
4795 if(getStyleRight().IsUsed())
4797 rInstance.addSdrConnectStyleData(
false, getStyleRight(),
basegfx::B2DVector(aBottomRight - aTopRight),
false);
4801 if(getStyleRight().IsUsed())
4812 if(getStyleTop().IsUsed())
4814 rInstance.addSdrConnectStyleData(
true, getStyleTop(),
basegfx::B2DVector(aTopLeft - aTopRight),
false);
4817 if(getStyleBottom().IsUsed())
4819 rInstance.addSdrConnectStyleData(
false, getStyleBottom(),
basegfx::B2DVector(aBottomLeft - aBottomRight),
false);
4823 if(getStyleBottom().IsUsed())
4834 if(getStyleRight().IsUsed())
4836 rInstance.addSdrConnectStyleData(
true, getStyleRight(),
basegfx::B2DVector(aTopRight - aBottomRight),
false);
4839 if(getStyleLeft().IsUsed())
4841 rInstance.addSdrConnectStyleData(
false, getStyleLeft(),
basegfx::B2DVector(aTopLeft - aBottomLeft),
false);
4845 if(getStyleLeft().IsUsed())
4856 if(getStyleBottom().IsUsed())
4858 rInstance.addSdrConnectStyleData(
true, getStyleBottom(),
basegfx::B2DVector(aBottomRight - aBottomLeft),
false);
4861 if(getStyleTop().IsUsed())
4863 rInstance.addSdrConnectStyleData(
false, getStyleTop(),
basegfx::B2DVector(aTopRight - aTopLeft),
false);
4879 SwBorderRectanglePrimitive2D::SwBorderRectanglePrimitive2D(
4893 bool SwBorderRectanglePrimitive2D::operator==(
const BasePrimitive2D& rPrimitive)
const
4895 if(BasePrimitive2D::operator==(rPrimitive))
4897 const SwBorderRectanglePrimitive2D& rCompare =
static_cast<const SwBorderRectanglePrimitive2D&
>(rPrimitive);
4899 return (getB2DHomMatrix() == rCompare.getB2DHomMatrix() &&
4900 getStyleTop() == rCompare.getStyleTop() &&
4901 getStyleRight() == rCompare.getStyleRight() &&
4902 getStyleBottom() == rCompare.getStyleBottom() &&
4903 getStyleLeft() == rCompare.getStyleLeft());
4909 basegfx::B2DRange SwBorderRectanglePrimitive2D::getB2DRange(
const geometry::ViewInformation2D& )
const
4913 aRetval.transform(getB2DHomMatrix());
4918 sal_uInt32 SwBorderRectanglePrimitive2D::getPrimitive2DID()
const
4928 return opt ? &*opt :
nullptr;
4935 const SwRect& rPaintArea,
4936 const bool bVerticalLayout,
4937 const bool bVerticalLayoutLRBT,
4938 const bool bJoinWithPrev,
4939 const bool bJoinWithNext )
4941 SwRect aAlignedRect(rPaintArea);
4945 bool bBottom =
true;
4952 bLeft = !bJoinWithPrev;
4953 bRight = !bJoinWithNext;
4956 bBottom = !bJoinWithPrev;
4957 bTop = !bJoinWithNext;
4960 bRight = !bJoinWithPrev;
4961 bLeft = !bJoinWithNext;
4964 bTop = !bJoinWithPrev;
4965 bBottom = !bJoinWithNext;
4975 if( aShadow.
GetLocation() != SvxShadowLocation::NONE )
4978 false, bTop, bBottom, bLeft, bRight,
gProp);
4985 aAlignedRect.
Left(), aAlignedRect.
Top()));
4987 bTop ? get_ptr(rFont.
GetAbsTopBorder(bVerticalLayout, bVerticalLayoutLRBT)) :
nullptr,
4990 bRight ? get_ptr(rFont.
GetAbsRightBorder(bVerticalLayout, bVerticalLayoutLRBT)) :
nullptr,
4997 bLeft ? get_ptr(rFont.
GetAbsLeftBorder(bVerticalLayout, bVerticalLayoutLRBT)) :
nullptr,
5001 aBorderLineTarget.
append(
5003 new drawinglayer::primitive2d::SwBorderRectanglePrimitive2D(
5009 gProp.pBLines->AddBorderLines(std::move(aBorderLineTarget));
5016 "lcl_HasNextCell( const SwFrame& rFrame ) should be called with SwCellFrame" );
5018 const SwFrame* pTmpFrame = &rFrame;
5056 OSL_ENSURE( _pCellFrame,
"No cell frame available, dying soon" );
5060 const SwFrame* pTmpFrame = _pCellFrame;
5061 bool bCellAtBorder =
true;
5062 bool bCellAtLeftBorder = !_pCellFrame->
GetPrev();
5063 bool bCellAtRightBorder = !_pCellFrame->
GetNext();
5071 bCellAtBorder =
false;
5077 bCellAtLeftBorder =
false;
5081 bCellAtRightBorder =
false;
5085 OSL_ENSURE( pTmpFrame && pTmpFrame->
IsRowFrame(),
"No RowFrame available" );
5091 const bool bCellNeedsAttribute = bCellAtBorder &&
5094 ( !pParentRowFrame->
GetPrev() &&
5095 pParentTabFrame->IsFollow() &&
5098 ( !pParentRowFrame->
GetNext() &&
5102 const SwFrame* pRet = _pCellFrame;
5103 if ( bCellNeedsAttribute )
5106 const SwFrame* pNextCell =
nullptr;
5107 bool bNoBordersInside =
false;
5109 if ( bCellAtLeftBorder && (
nullptr != ( pNextCell =
lcl_HasNextCell( *_pCellFrame ) ) ) )
5118 ( !rBorderBox.
GetRight() || bCellAtRightBorder ) &&
5126 ( !rBorderBox.
GetLeft() || bCellAtLeftBorder ) &&
5127 ( !rBorderBox.
GetRight() || bCellAtRightBorder ) &&
5131 if ( bNoBordersInside )
5149 pLowerCell = pLowerCell->
GetLower();
5151 OSL_ENSURE( pLowerCell && pLowerCell->
IsCellFrame(),
"No CellFrame available" );
5164 pLastTabFrame = pLastTabFrame->
GetFollow();
5176 while ( pLowerCell->
GetNext() )
5178 pLowerCell = pLowerCell->
GetNext();
5181 pLowerCell = pLowerCell->
GetLower();
5183 OSL_ENSURE( pLowerCell && pLowerCell->
IsCellFrame(),
"No CellFrame available" );
5209 std::unique_ptr<drawinglayer::processor2d::BaseProcessor2D> pProcessor2D =
CreateProcessor2D();
5212 pProcessor2D->process( rSequence );
5240 const bool bLine = rAttrs.
IsLine();
5245 const bool bb4779636HackActive =
true;
5247 const SwFrame* pCellFrameForBottomBorderAttrs =
nullptr;
5248 const SwFrame* pCellFrameForTopBorderAttrs =
nullptr;
5249 bool bFoundCellForTopOrBorderAttrs =
false;
5253 if ( pCellFrameForBottomBorderAttrs !=
this )
5254 bFoundCellForTopOrBorderAttrs =
true;
5256 if ( pCellFrameForTopBorderAttrs !=
this )
5257 bFoundCellForTopOrBorderAttrs =
true;
5262 if ( !(bLine || bShadow || bFoundCellForTopOrBorderAttrs) )
5275 bool bDrawOnlyShadowForTransparentFrame =
false;
5290 bDrawOnlyShadowForTransparentFrame =
true;
5310 if((bLine || bFoundCellForTopOrBorderAttrs) && !bDrawOnlyShadowForTransparentFrame)
5314 const SvxBorderLine* pLeftBorder(rBox.
GetLeft());
5315 const SvxBorderLine* pRightBorder(rBox.
GetRight());
5316 const SvxBorderLine* pTopBorder(rBox.
GetTop());
5317 const SvxBorderLine* pBottomBorder(rBox.
GetBottom());
5324 std::swap(pLeftBorder, pRightBorder);
5342 pTopBorder =
nullptr;
5353 pBottomBorder =
nullptr;
5371 bool bWordBorder =
false;
5379 if (bInWordTableCell)
5384 if (pContentFrame->IsUndersized())
5386 pBottomBorder =
nullptr;
5390 if(
nullptr != pLeftBorder ||
nullptr != pRightBorder ||
nullptr != pTopBorder ||
nullptr != pBottomBorder)
5417 new drawinglayer::primitive2d::SwBorderRectanglePrimitive2D(
5424 if (bInWordTableCell)
5437 aBorderLineTarget.
append(aRetval);
5438 gProp.pBLines->AddBorderLines(std::move(aBorderLineTarget));
5485 case css::text::HorizontalAdjust_CENTER:
5486 nX += nPrtWidth/2 - nWidth/2;
break;
5487 case css::text::HorizontalAdjust_RIGHT:
5488 nX += nPrtWidth - nWidth;
break;
5489 case css::text::HorizontalAdjust_LEFT:
5492 SAL_WARN(
"sw.core",
"New adjustment for footnote lines?");