[Libreoffice-commits] core.git: sw/source
Libreoffice Gerrit user
logerrit at kemper.freedesktop.org
Wed Feb 13 08:03:03 UTC 2019
sw/source/core/inc/frmtool.hxx | 7 ++-
sw/source/core/inc/swfont.hxx | 26 +++++++++----
sw/source/core/layout/paintfrm.cxx | 22 ++++++++---
sw/source/core/text/inftxt.cxx | 23 ++++++++---
sw/source/core/txtnode/fntcache.cxx | 25 +++++++-----
sw/source/core/txtnode/swfont.cxx | 72 ++++++++++++++++++++++++------------
6 files changed, 117 insertions(+), 58 deletions(-)
New commits:
commit cb9f393a5293c0f39d76b703154f8392c45f8047
Author: Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Tue Feb 12 17:50:59 2019 +0100
Commit: Miklos Vajna <vmiklos at collabora.com>
CommitDate: Wed Feb 13 09:02:37 2019 +0100
sw btlr writing mode layout: implement unmapping of this direction
Fix various cases which trigger this warning:
warn:legacy.osl:10975:10975:sw/source/core/txtnode/swfont.cxx:427: Unsupported direction
Which means that we tried to work with a VCL direction of 900, without
passing around the btlr flag accordingly.
Change-Id: I96374fc949f60e8324c5a84de48b710b6461bafb
Reviewed-on: https://gerrit.libreoffice.org/67746
Tested-by: Jenkins
Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
diff --git a/sw/source/core/inc/frmtool.hxx b/sw/source/core/inc/frmtool.hxx
index 507dca39313d..0790582777bf 100644
--- a/sw/source/core/inc/frmtool.hxx
+++ b/sw/source/core/inc/frmtool.hxx
@@ -111,12 +111,13 @@ void SwAlignGrfRect( SwRect *pGrfRect, const OutputDevice &rOut );
* @param[in] rFont font object of actual text, which specify the border
* @param[in] rPaintArea rectangle area in which line portion takes place
* @param[in] bVerticalLayout corresponding text frame verticality
+ * @param[in] bVerticalLayoutLRBT corresponding text frame verticality (LRBT subset)
* @param[in] bJoinWithPrev leave border with which actual border joins to the previous portion
* @param[in] bJoinWithNext leave border with which actual border joins to the next portion
**/
-void PaintCharacterBorder(
- const SwFont& rFont, const SwRect& rPaintArea, const bool bVerticalLayout,
- const bool bJoinWithPrev, const bool bJoinWithNext );
+void PaintCharacterBorder(const SwFont& rFont, const SwRect& rPaintArea, const bool bVerticalLayout,
+ const bool bVerticalLayoutLRBT, const bool bJoinWithPrev,
+ const bool bJoinWithNext);
// get Fly, if no List is given use the current shell
// Implementation in feshview.cxx
diff --git a/sw/source/core/inc/swfont.hxx b/sw/source/core/inc/swfont.hxx
index cc299a1d3fba..2e1369450c89 100644
--- a/sw/source/core/inc/swfont.hxx
+++ b/sw/source/core/inc/swfont.hxx
@@ -46,7 +46,7 @@ const sal_Unicode CH_TAB = '\t'; // \t
const sal_Unicode CH_PAR = 0xB6; // paragraph
const sal_Unicode CH_BULLET = 0xB7; // centered dot
-sal_uInt16 UnMapDirection( sal_uInt16 nDir, const bool bVertFormat );
+sal_uInt16 UnMapDirection( sal_uInt16 nDir, const bool bVertFormat, const bool bVertFormatLRBT );
class SwSubFont : public SvxFont
{
@@ -282,7 +282,8 @@ public:
FontWeight GetWeight() const { return m_aSub[m_nActual].GetWeight(); }
FontEmphasisMark GetEmphasisMark() const
{ return m_aSub[m_nActual].GetEmphasisMark(); }
- sal_uInt16 GetOrientation( const bool bVertLayout = false ) const;
+ sal_uInt16 GetOrientation(const bool bVertLayout = false,
+ const bool bVertFormatLRBT = false) const;
const OUString& GetName( const SwFontScript nWhich ) const
{ return m_aSub[nWhich].GetFamilyName(); }
@@ -339,10 +340,14 @@ public:
const boost::optional<editeng::SvxBorderLine>& GetLeftBorder() const { return m_aLeftBorder; }
// Get absolute border correspond to the layout verticality and orientation.
- const boost::optional<editeng::SvxBorderLine>& GetAbsTopBorder( const bool bVertLayout ) const;
- const boost::optional<editeng::SvxBorderLine>& GetAbsBottomBorder( const bool bVertLayout ) const;
- const boost::optional<editeng::SvxBorderLine>& GetAbsRightBorder( const bool bVertLayout ) const;
- const boost::optional<editeng::SvxBorderLine>& GetAbsLeftBorder( const bool bVertLayout ) const;
+ const boost::optional<editeng::SvxBorderLine>&
+ GetAbsTopBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const;
+ const boost::optional<editeng::SvxBorderLine>&
+ GetAbsBottomBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const;
+ const boost::optional<editeng::SvxBorderLine>&
+ GetAbsRightBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const;
+ const boost::optional<editeng::SvxBorderLine>&
+ GetAbsLeftBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const;
void SetTopBorderDist( const sal_uInt16 nTopDist );
void SetBottomBorderDist( const sal_uInt16 nBottomDist );
@@ -376,9 +381,12 @@ public:
*
* @param[in] bVertLayout true, if the container layout is vertical
* false, otherwise
+ * @param[in] bVertLayoutLRBT true if the container layout is vertical
+ * (bottom to top, left to right), false otherwise
* @return absolute location
**/
- SvxShadowLocation GetAbsShadowLocation( const bool bVertLayout ) const;
+ SvxShadowLocation GetAbsShadowLocation(const bool bVertLayout,
+ const bool bVertLayoutLRBT) const;
/**
* Calculate the shadow space on the specified side dependent from
@@ -388,12 +396,14 @@ public:
* @param[in] nShadow specify the side
* @param[in] bVertLayout true, if the container layout is vertical
* false, otherwise
+ * @param[in] bVertLayoutLRBT true if the container layout is vertical
+ * (bottom to top, left to right), false otherwise
* @param[in] bSkipLeft relative left shadow space is skipped
* @param[in] bSkipRight relative right shadow space is skipped
* @return the shadow space
**/
sal_uInt16 CalcShadowSpace(
- const SvxShadowItemSide nShadow, const bool bVertLayout,
+ const SvxShadowItemSide nShadow, const bool bVertLayout, const bool bVertLayoutLRBT,
const bool bSkipLeft, const bool bSkipRight ) const;
void dumpAsXml( xmlTextWriterPtr writer ) const;
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index 9db67c8b292d..28244dab159f 100644
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -4694,6 +4694,7 @@ void PaintCharacterBorder(
const SwFont& rFont,
const SwRect& rPaintArea,
const bool bVerticalLayout,
+ const bool bVerticalLayoutLRBT,
const bool bJoinWithPrev,
const bool bJoinWithNext )
{
@@ -4705,7 +4706,7 @@ void PaintCharacterBorder(
bool bLeft = true;
bool bRight = true;
- switch( rFont.GetOrientation(bVerticalLayout) )
+ switch (rFont.GetOrientation(bVerticalLayout, bVerticalLayoutLRBT))
{
case 0 :
bLeft = !bJoinWithPrev;
@@ -4729,7 +4730,7 @@ void PaintCharacterBorder(
{
const SvxShadowItem aShadow(
0, &rFont.GetShadowColor(), rFont.GetShadowWidth(),
- rFont.GetAbsShadowLocation(bVerticalLayout));
+ rFont.GetAbsShadowLocation(bVerticalLayout, bVerticalLayoutLRBT));
if( aShadow.GetLocation() != SvxShadowLocation::NONE )
{
@@ -4742,10 +4743,19 @@ void PaintCharacterBorder(
basegfx::utils::createScaleTranslateB2DHomMatrix(
aAlignedRect.Width(), aAlignedRect.Height(),
aAlignedRect.Left(), aAlignedRect.Top()));
- const svx::frame::Style aStyleTop(bTop ? rFont.GetAbsTopBorder(bVerticalLayout).get_ptr() : nullptr, 1.0);
- const svx::frame::Style aStyleRight(bRight ? rFont.GetAbsRightBorder(bVerticalLayout).get_ptr() : nullptr, 1.0);
- const svx::frame::Style aStyleBottom(bBottom ? rFont.GetAbsBottomBorder(bVerticalLayout).get_ptr() : nullptr, 1.0);
- const svx::frame::Style aStyleLeft(bLeft ? rFont.GetAbsLeftBorder(bVerticalLayout).get_ptr() : nullptr, 1.0);
+ const svx::frame::Style aStyleTop(
+ bTop ? rFont.GetAbsTopBorder(bVerticalLayout, bVerticalLayoutLRBT).get_ptr() : nullptr,
+ 1.0);
+ const svx::frame::Style aStyleRight(
+ bRight ? rFont.GetAbsRightBorder(bVerticalLayout, bVerticalLayoutLRBT).get_ptr() : nullptr,
+ 1.0);
+ const svx::frame::Style aStyleBottom(
+ bBottom ? rFont.GetAbsBottomBorder(bVerticalLayout, bVerticalLayoutLRBT).get_ptr()
+ : nullptr,
+ 1.0);
+ const svx::frame::Style aStyleLeft(
+ bLeft ? rFont.GetAbsLeftBorder(bVerticalLayout, bVerticalLayoutLRBT).get_ptr() : nullptr,
+ 1.0);
drawinglayer::primitive2d::Primitive2DContainer aBorderLineTarget;
aBorderLineTarget.append(
diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx
index cb3668dbb710..b18e7273672c 100644
--- a/sw/source/core/text/inftxt.cxx
+++ b/sw/source/core/text/inftxt.cxx
@@ -778,10 +778,19 @@ void SwTextPaintInfo::CalcRect( const SwLinePortion& rPor,
const bool bJoinWithNext =
static_cast<const SwTextPortion&>(rPor).GetJoinBorderWithNext();
const bool bIsVert = GetTextFrame()->IsVertical();
- aRect.Top(aRect.Top() + GetFont()->CalcShadowSpace(SvxShadowItemSide::TOP, bIsVert, bJoinWithPrev, bJoinWithNext ));
- aRect.Bottom(aRect.Bottom() - GetFont()->CalcShadowSpace(SvxShadowItemSide::BOTTOM, bIsVert, bJoinWithPrev, bJoinWithNext ));
- aRect.Left(aRect.Left() + GetFont()->CalcShadowSpace(SvxShadowItemSide::LEFT, bIsVert, bJoinWithPrev, bJoinWithNext ));
- aRect.Right(aRect.Right() - GetFont()->CalcShadowSpace(SvxShadowItemSide::RIGHT, bIsVert, bJoinWithPrev, bJoinWithNext ));
+ const bool bIsVertLRBT = GetTextFrame()->IsVertLRBT();
+ aRect.Top(aRect.Top()
+ + GetFont()->CalcShadowSpace(SvxShadowItemSide::TOP, bIsVert, bIsVertLRBT,
+ bJoinWithPrev, bJoinWithNext));
+ aRect.Bottom(aRect.Bottom()
+ - GetFont()->CalcShadowSpace(SvxShadowItemSide::BOTTOM, bIsVert, bIsVertLRBT,
+ bJoinWithPrev, bJoinWithNext));
+ aRect.Left(aRect.Left()
+ + GetFont()->CalcShadowSpace(SvxShadowItemSide::LEFT, bIsVert, bIsVertLRBT,
+ bJoinWithPrev, bJoinWithNext));
+ aRect.Right(aRect.Right()
+ - GetFont()->CalcShadowSpace(SvxShadowItemSide::RIGHT, bIsVert, bIsVertLRBT,
+ bJoinWithPrev, bJoinWithNext));
}
if ( pRect )
@@ -1263,9 +1272,9 @@ void SwTextPaintInfo::DrawBorder( const SwLinePortion &rPor ) const
CalcRect( rPor, &aDrawArea );
if ( aDrawArea.HasArea() )
{
- PaintCharacterBorder(
- *m_pFnt, aDrawArea, GetTextFrame()->IsVertical(),
- rPor.GetJoinBorderWithPrev(), rPor.GetJoinBorderWithNext());
+ PaintCharacterBorder(*m_pFnt, aDrawArea, GetTextFrame()->IsVertical(),
+ GetTextFrame()->IsVertLRBT(), rPor.GetJoinBorderWithPrev(),
+ rPor.GetJoinBorderWithNext());
}
}
diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx
index 8cdcf5478392..1a9ad25b933c 100644
--- a/sw/source/core/txtnode/fntcache.cxx
+++ b/sw/source/core/txtnode/fntcache.cxx
@@ -252,18 +252,20 @@ struct CalcLinePosData
vcl::Font& rFont;
TextFrameIndex const nCnt;
const bool bSwitchH2V;
+ const bool bSwitchH2VLRBT;
const bool bSwitchL2R;
long const nHalfSpace;
long* const pKernArray;
const bool bBidiPor;
CalcLinePosData( SwDrawTextInfo& _rInf, vcl::Font& _rFont,
- TextFrameIndex const _nCnt, const bool _bSwitchH2V, const bool _bSwitchL2R,
+ TextFrameIndex const _nCnt, const bool _bSwitchH2V, const bool _bSwitchH2VLRBT, const bool _bSwitchL2R,
long _nHalfSpace, long* _pKernArray, const bool _bBidiPor) :
rInf( _rInf ),
rFont( _rFont ),
nCnt( _nCnt ),
bSwitchH2V( _bSwitchH2V ),
+ bSwitchH2VLRBT( _bSwitchH2VLRBT ),
bSwitchL2R( _bSwitchL2R ),
nHalfSpace( _nHalfSpace ),
pKernArray( _pKernArray ),
@@ -294,8 +296,9 @@ static void lcl_calcLinePos( const CalcLinePosData &rData,
sal_Int32 nKernStart = nStart ? rData.pKernArray[sal_Int32(nStart) - 1] : 0;
sal_Int32 nKernEnd = rData.pKernArray[sal_Int32(nEnd) - 1];
- const sal_uInt16 nDir = rData.bBidiPor ? 1800 :
- UnMapDirection( rData.rFont.GetOrientation(), rData.bSwitchH2V );
+ const sal_uInt16 nDir = rData.bBidiPor ? 1800
+ : UnMapDirection(rData.rFont.GetOrientation(),
+ rData.bSwitchH2V, rData.bSwitchH2VLRBT);
switch ( nDir )
{
@@ -934,6 +937,7 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
// line of the ExtendedAttributeSets will appear in the font color first
const bool bSwitchH2V = rInf.GetFrame() && rInf.GetFrame()->IsVertical();
+ const bool bSwitchH2VLRBT = rInf.GetFrame() && rInf.GetFrame()->IsVertLRBT();
const bool bSwitchL2R = rInf.GetFrame() && rInf.GetFrame()->IsRightToLeft() &&
! rInf.IsIgnoreFrameRTL();
const ComplexTextLayoutFlags nMode = rInf.GetOut().GetLayoutMode();
@@ -1724,11 +1728,10 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
Point aEnd;
long nKernVal = pKernArray[sal_Int32(rInf.GetLen()) - 1];
- const sal_uInt16 nDir = bBidiPor ?
- 1800 :
- UnMapDirection(
- GetFont().GetOrientation(),
- bSwitchH2V );
+ const sal_uInt16 nDir = bBidiPor
+ ? 1800
+ : UnMapDirection(GetFont().GetOrientation(),
+ bSwitchH2V, bSwitchH2VLRBT);
switch ( nDir )
{
@@ -1778,9 +1781,9 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
// anything to do?
if (rInf.GetWrong() || rInf.GetGrammarCheck() || rInf.GetSmartTags())
{
- CalcLinePosData aCalcLinePosData(rInf, GetFont(),
- nCnt, bSwitchH2V, bSwitchL2R,
- nHalfSpace, pKernArray.get(), bBidiPor);
+ CalcLinePosData aCalcLinePosData(rInf, GetFont(), nCnt, bSwitchH2V,
+ bSwitchH2VLRBT, bSwitchL2R, nHalfSpace,
+ pKernArray.get(), bBidiPor);
SwForbidden aForbidden;
// draw line for smart tag data
diff --git a/sw/source/core/txtnode/swfont.cxx b/sw/source/core/txtnode/swfont.cxx
index 8c0e97cd30a7..4de9b2b2ee90 100644
--- a/sw/source/core/txtnode/swfont.cxx
+++ b/sw/source/core/txtnode/swfont.cxx
@@ -125,9 +125,9 @@ void SwFont::SetLeftBorder( const editeng::SvxBorderLine* pLeftBorder )
}
const boost::optional<editeng::SvxBorderLine>&
-SwFont::GetAbsTopBorder( const bool bVertLayout ) const
+SwFont::GetAbsTopBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const
{
- switch( GetOrientation( bVertLayout ) )
+ switch (GetOrientation(bVertLayout, bVertLayoutLRBT))
{
case 0 :
return m_aTopBorder;
@@ -149,9 +149,9 @@ SwFont::GetAbsTopBorder( const bool bVertLayout ) const
}
const boost::optional<editeng::SvxBorderLine>&
-SwFont::GetAbsBottomBorder( const bool bVertLayout ) const
+SwFont::GetAbsBottomBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const
{
- switch( GetOrientation( bVertLayout ) )
+ switch (GetOrientation(bVertLayout, bVertLayoutLRBT))
{
case 0 :
return m_aBottomBorder;
@@ -173,9 +173,9 @@ SwFont::GetAbsBottomBorder( const bool bVertLayout ) const
}
const boost::optional<editeng::SvxBorderLine>&
-SwFont::GetAbsLeftBorder( const bool bVertLayout ) const
+SwFont::GetAbsLeftBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const
{
- switch( GetOrientation( bVertLayout ) )
+ switch (GetOrientation(bVertLayout, bVertLayoutLRBT))
{
case 0 :
return m_aLeftBorder;
@@ -197,9 +197,9 @@ SwFont::GetAbsLeftBorder( const bool bVertLayout ) const
}
const boost::optional<editeng::SvxBorderLine>&
-SwFont::GetAbsRightBorder( const bool bVertLayout ) const
+SwFont::GetAbsRightBorder(const bool bVertLayout, const bool bVertLayoutLRBT) const
{
- switch( GetOrientation( bVertLayout ) )
+ switch (GetOrientation(bVertLayout, bVertLayoutLRBT))
{
case 0 :
return m_aRightBorder;
@@ -220,10 +220,11 @@ SwFont::GetAbsRightBorder( const bool bVertLayout ) const
}
}
-SvxShadowLocation SwFont::GetAbsShadowLocation( const bool bVertLayout ) const
+SvxShadowLocation SwFont::GetAbsShadowLocation(const bool bVertLayout,
+ const bool bVertLayoutLRBT) const
{
SvxShadowLocation aLocation = SvxShadowLocation::NONE;
- switch( GetOrientation( bVertLayout ) )
+ switch (GetOrientation(bVertLayout, bVertLayoutLRBT))
{
case 0:
aLocation = m_aShadowLocation;
@@ -302,13 +303,13 @@ SvxShadowLocation SwFont::GetAbsShadowLocation( const bool bVertLayout ) const
return aLocation;
}
-sal_uInt16 SwFont::CalcShadowSpace(
- const SvxShadowItemSide nShadow, const bool bVertLayout,
- const bool bSkipLeft, const bool bSkipRight ) const
+sal_uInt16 SwFont::CalcShadowSpace(const SvxShadowItemSide nShadow, const bool bVertLayout,
+ const bool bVertLayoutLRBT, const bool bSkipLeft,
+ const bool bSkipRight) const
{
sal_uInt16 nSpace = 0;
- const sal_uInt16 nOrient = GetOrientation( bVertLayout );
- const SvxShadowLocation aLoc = GetAbsShadowLocation( bVertLayout );
+ const sal_uInt16 nOrient = GetOrientation(bVertLayout, bVertLayoutLRBT);
+ const SvxShadowLocation aLoc = GetAbsShadowLocation(bVertLayout, bVertLayoutLRBT);
switch( nShadow )
{
case SvxShadowItemSide::TOP:
@@ -393,8 +394,22 @@ static sal_uInt16 MapDirection(sal_uInt16 nDir, const bool bVertFormat, const bo
// maps the absolute direction set at the font to its logical counterpart
// in the rotated environment
-sal_uInt16 UnMapDirection( sal_uInt16 nDir, const bool bVertFormat )
+sal_uInt16 UnMapDirection(sal_uInt16 nDir, const bool bVertFormat, const bool bVertFormatLRBT)
{
+ if (bVertFormatLRBT)
+ {
+ switch (nDir)
+ {
+ case 900:
+ nDir = 0;
+ break;
+ default:
+ SAL_WARN("sw.core", "unsupported direction for VertLRBT");
+ break;
+ }
+ return nDir;
+ }
+
if ( bVertFormat )
{
switch ( nDir )
@@ -418,9 +433,9 @@ sal_uInt16 UnMapDirection( sal_uInt16 nDir, const bool bVertFormat )
return nDir;
}
-sal_uInt16 SwFont::GetOrientation( const bool bVertFormat ) const
+sal_uInt16 SwFont::GetOrientation(const bool bVertFormat, const bool bVertFormatLRBT) const
{
- return UnMapDirection( m_aSub[m_nActual].GetOrientation(), bVertFormat );
+ return UnMapDirection(m_aSub[m_nActual].GetOrientation(), bVertFormat, bVertFormatLRBT);
}
void SwFont::SetVertical(sal_uInt16 nDir, const bool bVertFormat, const bool bVertLayoutLRBT)
@@ -1382,8 +1397,14 @@ void SwSubFont::CalcEsc( SwDrawTextInfo const & rInf, Point& rPos )
{
long nOfst;
- const sal_uInt16 nDir = UnMapDirection(
- GetOrientation(), rInf.GetFrame() && rInf.GetFrame()->IsVertical() );
+ bool bVert = false;
+ bool bVertLRBT = false;
+ if (rInf.GetFrame())
+ {
+ bVert = rInf.GetFrame()->IsVertical();
+ bVertLRBT = rInf.GetFrame()->IsVertLRBT();
+ }
+ const sal_uInt16 nDir = UnMapDirection(GetOrientation(), bVert, bVertLRBT);
switch ( GetEscapement() )
{
@@ -1453,9 +1474,14 @@ void SwDrawTextInfo::Shift( sal_uInt16 nDir )
const bool bBidiPor = ( GetFrame() && GetFrame()->IsRightToLeft() ) !=
( ComplexTextLayoutFlags::Default != ( ComplexTextLayoutFlags::BiDiRtl & GetpOut()->GetLayoutMode() ) );
- nDir = bBidiPor ?
- 1800 :
- UnMapDirection( nDir, GetFrame() && GetFrame()->IsVertical() );
+ bool bVert = false;
+ bool bVertLRBT = false;
+ if (GetFrame())
+ {
+ bVert = GetFrame()->IsVertical();
+ bVertLRBT = GetFrame()->IsVertLRBT();
+ }
+ nDir = bBidiPor ? 1800 : UnMapDirection(nDir, bVert, bVertLRBT);
switch ( nDir )
{
More information about the Libreoffice-commits
mailing list