summaryrefslogtreecommitdiff
path: root/sw/source/core
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core')
-rw-r--r--sw/source/core/inc/frame.hxx15
-rw-r--r--sw/source/core/inc/swfont.hxx3
-rw-r--r--sw/source/core/layout/calcmove.cxx2
-rw-r--r--sw/source/core/layout/colfrm.cxx2
-rw-r--r--sw/source/core/layout/findfrm.cxx1
-rw-r--r--sw/source/core/layout/newfrm.cxx61
-rw-r--r--sw/source/core/layout/paintfrm.cxx4
-rw-r--r--sw/source/core/layout/ssfrm.cxx4
-rw-r--r--sw/source/core/layout/wsfrm.cxx14
-rw-r--r--sw/source/core/text/itratr.cxx9
-rw-r--r--sw/source/core/text/itratr.hxx3
-rw-r--r--sw/source/core/text/redlnitr.cxx16
-rw-r--r--sw/source/core/text/txtfrm.cxx15
-rw-r--r--sw/source/core/txtnode/swfont.cxx11
14 files changed, 135 insertions, 25 deletions
diff --git a/sw/source/core/inc/frame.hxx b/sw/source/core/inc/frame.hxx
index 0a9a1ea823c0..5f9a2cfcf886 100644
--- a/sw/source/core/inc/frame.hxx
+++ b/sw/source/core/inc/frame.hxx
@@ -404,6 +404,7 @@ protected:
bool mbVertical : 1;
bool mbVertLR : 1;
+ bool mbVertLRBT : 1;
bool mbValidLineNum : 1;
bool mbFixSize : 1;
@@ -602,6 +603,7 @@ public:
inline bool IsVertical() const;
inline bool IsVertLR() const;
+ inline bool IsVertLRBT() const;
void SetDerivedVert( bool bNew ){ mbDerivedVert = bNew; }
void SetInvalidVert( bool bNew) { mbInvalidVert = bNew; }
@@ -955,6 +957,10 @@ inline bool SwFrame::IsVertLR() const
{
return mbVertLR;
}
+inline bool SwFrame::IsVertLRBT() const
+{
+ return mbVertLRBT;
+}
inline bool SwFrame::IsRightToLeft() const
{
if( mbInvalidR2L )
@@ -1312,21 +1318,23 @@ struct SwRectFnCollection
typedef SwRectFnCollection* SwRectFn;
// This class allows to use proper methods regardless of orientation (LTR/RTL, horizontal or vertical)
-extern SwRectFn fnRectHori, fnRectVert, fnRectVertL2R;
+extern SwRectFn fnRectHori, fnRectVert, fnRectVertL2R, fnRectVertL2RB2T;
class SwRectFnSet {
public:
explicit SwRectFnSet(const SwFrame *pFrame)
: m_bVert(pFrame->IsVertical())
, m_bVertL2R(pFrame->IsVertLR())
+ , m_bVertL2RB2T(pFrame->IsVertLRBT())
{
- m_fnRect = m_bVert ? (m_bVertL2R ? fnRectVertL2R : fnRectVert) : fnRectHori;
+ m_fnRect = m_bVert ? (m_bVertL2R ? (m_bVertL2RB2T ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert) : fnRectHori;
}
void Refresh(const SwFrame *pFrame)
{
m_bVert = pFrame->IsVertical();
m_bVertL2R = pFrame->IsVertLR();
- m_fnRect = m_bVert ? (m_bVertL2R ? fnRectVertL2R : fnRectVert) : fnRectHori;
+ m_bVertL2RB2T = pFrame->IsVertLRBT();
+ m_fnRect = m_bVert ? (m_bVertL2R ? (m_bVertL2RB2T ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert) : fnRectHori;
}
bool IsVert() const { return m_bVert; }
@@ -1395,6 +1403,7 @@ public:
private:
bool m_bVert;
bool m_bVertL2R;
+ bool m_bVertL2RB2T;
SwRectFn m_fnRect;
};
diff --git a/sw/source/core/inc/swfont.hxx b/sw/source/core/inc/swfont.hxx
index ff0e5d8a0b9d..cc299a1d3fba 100644
--- a/sw/source/core/inc/swfont.hxx
+++ b/sw/source/core/inc/swfont.hxx
@@ -215,7 +215,8 @@ public:
void SetOverColor( const Color &rColor ) { m_aOverColor = rColor; }
inline void SetStrikeout( const FontStrikeout eStrikeout );
inline void SetOutline( const bool bOutline );
- void SetVertical( sal_uInt16 nDir, const bool bVertLayout = false );
+ void SetVertical(sal_uInt16 nDir, const bool bVertLayout = false,
+ const bool bVertLayoutLRBT = false);
inline void SetShadow( const bool bShadow );
inline void SetAutoKern( FontKerning nAutoKern );
inline void SetTransparent( const bool bTrans );
diff --git a/sw/source/core/layout/calcmove.cxx b/sw/source/core/layout/calcmove.cxx
index c8541459aeda..05260abf2dad 100644
--- a/sw/source/core/layout/calcmove.cxx
+++ b/sw/source/core/layout/calcmove.cxx
@@ -893,7 +893,7 @@ void SwLayoutFrame::MakeAll(vcl::RenderContext* /*pRenderContext*/)
const SwLayNotify aNotify( this );
bool bVert = IsVertical();
- SwRectFn fnRect = ( IsNeighbourFrame() == bVert )? fnRectHori : ( IsVertLR() ? fnRectVertL2R : fnRectVert );
+ SwRectFn fnRect = ( IsNeighbourFrame() == bVert )? fnRectHori : ( IsVertLR() ? (IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert );
std::unique_ptr<SwBorderAttrAccess> pAccess;
const SwBorderAttrs*pAttrs = nullptr;
diff --git a/sw/source/core/layout/colfrm.cxx b/sw/source/core/layout/colfrm.cxx
index 3a695b136734..6339d026fafb 100644
--- a/sw/source/core/layout/colfrm.cxx
+++ b/sw/source/core/layout/colfrm.cxx
@@ -300,7 +300,7 @@ void SwLayoutFrame::AdjustColumns( const SwFormatCol *pAttr, bool bAdjustAttribu
const bool bVert = IsVertical();
- SwRectFn fnRect = bVert ? ( IsVertLR() ? fnRectVertL2R : fnRectVert ) : fnRectHori;
+ SwRectFn fnRect = bVert ? ( IsVertLR() ? (IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert ) : fnRectHori;
//If we have a pointer or we have to configure an attribute, we set the
//column widths in any case. Otherwise we check if a configuration is needed.
diff --git a/sw/source/core/layout/findfrm.cxx b/sw/source/core/layout/findfrm.cxx
index 3ed0dede61f5..a0af09b2ad37 100644
--- a/sw/source/core/layout/findfrm.cxx
+++ b/sw/source/core/layout/findfrm.cxx
@@ -1476,6 +1476,7 @@ void SwFrame::SetDirFlags( bool bVert )
{
mbVertical = pAsk->IsVertical();
mbVertLR = pAsk->IsVertLR();
+ mbVertLRBT = pAsk->IsVertLRBT();
if ( !pAsk->mbInvalidVert )
mbInvalidVert = false;
diff --git a/sw/source/core/layout/newfrm.cxx b/sw/source/core/layout/newfrm.cxx
index adc2909c38a5..0971c2d95a8e 100644
--- a/sw/source/core/layout/newfrm.cxx
+++ b/sw/source/core/layout/newfrm.cxx
@@ -224,9 +224,70 @@ static SwRectFnCollection aVerticalLeftToRight = {
/*.fnSetTopAndHeight =*/&SwRect::SetLeftAndWidth
};
+/**
+ * This is the same as horizontal, but rotated counter-clockwise by 90 degrees.
+ * This means logical top is physical right, bottom is left, left is top,
+ * finally right is bottom.
+ */
+static SwRectFnCollection aVerticalLeftToRightBottomToTop = {
+ /*.fnGetTop =*/&SwRect::Right_,
+ /*.fnGetBottom =*/&SwRect::Left_,
+ /*.fnGetLeft =*/&SwRect::Top_,
+ /*.fnGetRight =*/&SwRect::Bottom_,
+ /*.fnGetWidth =*/&SwRect::Height_,
+ /*.fnGetHeight =*/&SwRect::Width_,
+ /*.fnGetPos =*/&SwRect::TopRight,
+ /*.fnGetSize =*/&SwRect::SwappedSize,
+
+ /*.fnSetTop =*/&SwRect::Right_,
+ /*.fnSetBottom =*/&SwRect::Left_,
+ /*.fnSetLeft =*/&SwRect::Top_,
+ /*.fnSetRight =*/&SwRect::Bottom_,
+ /*.fnSetWidth =*/&SwRect::Height_,
+ /*.fnSetHeight =*/&SwRect::Width_,
+
+ /*.fnSubTop =*/&SwRect::AddRight,
+ /*.fnAddBottom =*/&SwRect::SubLeft,
+ /*.fnSubLeft =*/&SwRect::SubTop,
+ /*.fnAddRight =*/&SwRect::AddBottom,
+ /*.fnAddWidth =*/&SwRect::AddHeight,
+ /*.fnAddHeight =*/&SwRect::AddWidth,
+
+ /*.fnSetPosX =*/&SwRect::SetPosY,
+ /*.fnSetPosY =*/&SwRect::SetPosX,
+
+ /*.fnGetTopMargin =*/&SwFrame::GetRightMargin,
+ /*.fnGetBottomMargin =*/&SwFrame::GetLeftMargin,
+ /*.fnGetLeftMargin =*/&SwFrame::GetTopMargin,
+ /*.fnGetRightMargin =*/&SwFrame::GetBottomMargin,
+ /*.fnSetXMargins =*/&SwFrame::SetTopBottomMargins,
+ /*.fnSetYMargins =*/&SwFrame::SetLeftRightMargins,
+ /*.fnGetPrtTop =*/&SwFrame::GetPrtRight,
+ /*.fnGetPrtBottom =*/&SwFrame::GetPrtLeft,
+ /*.fnGetPrtLeft =*/&SwFrame::GetPrtTop,
+ /*.fnGetPrtRight =*/&SwFrame::GetPrtBottom,
+ /*.fnTopDist =*/&SwRect::GetRightDistance,
+ /*.fnBottomDist =*/&SwRect::GetLeftDistance,
+ /*.fnLeftDist =*/&SwRect::GetTopDistance,
+ /*.fnRightDist =*/&SwRect::GetBottomDistance,
+ /*.fnSetLimit =*/&SwFrame::SetMinLeft,
+ /*.fnOverStep =*/&SwRect::OverStepLeft,
+
+ /*.fnSetPos =*/&SwRect::SetUpperRightCorner,
+ /*.fnMakePos =*/&SwFrame::MakeLeftPos,
+ /*.fnXDiff =*/&FirstMinusSecond,
+ /*.fnYDiff =*/&FirstMinusSecond,
+ /*.fnXInc =*/&SwIncrement,
+ /*.fnYInc =*/&SwIncrement,
+
+ /*.fnSetLeftAndWidth =*/&SwRect::SetTopAndHeight,
+ /*.fnSetTopAndHeight =*/&SwRect::SetRightAndWidth
+};
+
SwRectFn fnRectHori = &aHorizontal;
SwRectFn fnRectVert = &aVertical;
SwRectFn fnRectVertL2R = &aVerticalLeftToRight;
+SwRectFn fnRectVertL2RB2T = &aVerticalLeftToRightBottomToTop;
// #i65250#
sal_uInt32 SwFrameAreaDefinition::mnLastFrameId=0;
diff --git a/sw/source/core/layout/paintfrm.cxx b/sw/source/core/layout/paintfrm.cxx
index b3fc9e8843b3..9db67c8b292d 100644
--- a/sw/source/core/layout/paintfrm.cxx
+++ b/sw/source/core/layout/paintfrm.cxx
@@ -1255,7 +1255,7 @@ static void lcl_CalcBorderRect( SwRect &rRect, const SwFrame *pFrame,
rRect = pFrame->getFramePrintArea();
rRect.Pos() += pFrame->getFrameArea().Pos();
- SwRectFn fnRect = pFrame->IsVertical() ? ( pFrame->IsVertLR() ? fnRectVertL2R : fnRectVert ) : fnRectHori;
+ SwRectFn fnRect = pFrame->IsVertical() ? ( pFrame->IsVertLR() ? (pFrame->IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert ) : fnRectHori;
const SvxBoxItem &rBox = rAttrs.GetBox();
const bool bTop = 0 != (pFrame->*fnRect->fnGetTopMargin)();
@@ -5218,7 +5218,7 @@ void SwLayoutFrame::PaintColLines( const SwRect &rRect, const SwFormatCol &rForm
if ( !pCol || !pCol->IsColumnFrame() )
return;
- SwRectFn fnRect = pCol->IsVertical() ? ( pCol->IsVertLR() ? fnRectVertL2R : fnRectVert ) : fnRectHori;
+ SwRectFn fnRect = pCol->IsVertical() ? ( pCol->IsVertLR() ? (pCol->IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert ) : fnRectHori;
SwRect aLineRect = getFramePrintArea();
aLineRect += getFrameArea().Pos();
diff --git a/sw/source/core/layout/ssfrm.cxx b/sw/source/core/layout/ssfrm.cxx
index f309693befc2..46cf019acbc4 100644
--- a/sw/source/core/layout/ssfrm.cxx
+++ b/sw/source/core/layout/ssfrm.cxx
@@ -584,7 +584,7 @@ const SwRect SwFrame::GetPaintArea() const
// Cell frames may not leave their upper:
SwRect aRect = IsRowFrame() ? GetUpper()->getFrameArea() : getFrameArea();
const bool bVert = IsVertical();
- SwRectFn fnRect = bVert ? ( IsVertLR() ? fnRectVertL2R : fnRectVert ) : fnRectHori;
+ SwRectFn fnRect = bVert ? ( IsVertLR() ? (IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert ) : fnRectHori;
long nRight = (aRect.*fnRect->fnGetRight)();
long nLeft = (aRect.*fnRect->fnGetLeft)();
const SwFrame* pTmp = this;
@@ -675,7 +675,7 @@ const SwRect SwFrame::GetPaintArea() const
const SwRect SwFrame::UnionFrame( bool bBorder ) const
{
bool bVert = IsVertical();
- SwRectFn fnRect = bVert ? ( IsVertLR() ? fnRectVertL2R : fnRectVert ) : fnRectHori;
+ SwRectFn fnRect = bVert ? ( IsVertLR() ? (IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert ) : fnRectHori;
long nLeft = (getFrameArea().*fnRect->fnGetLeft)();
long nWidth = (getFrameArea().*fnRect->fnGetWidth)();
long nPrtLeft = (getFramePrintArea().*fnRect->fnGetLeft)();
diff --git a/sw/source/core/layout/wsfrm.cxx b/sw/source/core/layout/wsfrm.cxx
index 39b9fbb8009d..c76f70110990 100644
--- a/sw/source/core/layout/wsfrm.cxx
+++ b/sw/source/core/layout/wsfrm.cxx
@@ -300,6 +300,7 @@ SwFrame::SwFrame( SwModify *pMod, SwFrame* pSib )
mbDerivedVert(false),
mbVertical(false),
mbVertLR(false),
+ mbVertLRBT(false),
mbValidLineNum(false),
mbFixSize(false),
mbCompletePaint(true),
@@ -357,6 +358,11 @@ void SwFrame::CheckDir( SvxFrameDirection nDir, bool bVert, bool bOnlyBiDi, bool
mbVertLR = false;
else if(SvxFrameDirection::Vertical_LR_TB==nDir)
mbVertLR = true;
+ else if (nDir == SvxFrameDirection::Vertical_LR_BT)
+ {
+ mbVertLR = true;
+ mbVertLRBT = true;
+ }
}
}
else
@@ -712,7 +718,7 @@ Size SwFrame::ChgSize( const Size& aNewSize )
if ( GetUpper() )
{
bool bNeighb = IsNeighbourFrame();
- SwRectFn fnRect = IsVertical() == bNeighb ? fnRectHori : ( IsVertLR() ? fnRectVertL2R : fnRectVert );
+ SwRectFn fnRect = IsVertical() == bNeighb ? fnRectHori : ( IsVertLR() ? (IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert );
SwRect aNew( Point(0,0), aNewSize );
{
@@ -1319,9 +1325,9 @@ void SwLayoutFrame::Paste( SwFrame* pParent, SwFrame* pSibling)
if ( IsHeaderFrame() || IsFooterFrame() )
fnRect = fnRectHori;
else if ( IsCellFrame() || IsColumnFrame() )
- fnRect = GetUpper()->IsVertical() ? fnRectHori : ( GetUpper()->IsVertLR() ? fnRectVertL2R : fnRectVert );
+ fnRect = GetUpper()->IsVertical() ? fnRectHori : ( GetUpper()->IsVertLR() ? (GetUpper()->IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert );
else
- fnRect = GetUpper()->IsVertical() ? ( GetUpper()->IsVertLR() ? fnRectVertL2R : fnRectVert ) : fnRectHori;
+ fnRect = GetUpper()->IsVertical() ? ( GetUpper()->IsVertLR() ? (GetUpper()->IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert ) : fnRectHori;
if( (getFrameArea().*fnRect->fnGetWidth)() != (pParent->getFramePrintArea().*fnRect->fnGetWidth)())
InvalidateSize_();
@@ -3364,7 +3370,7 @@ void SwLayoutFrame::Format( vcl::RenderContext* /*pRenderContext*/, const SwBord
const sal_uInt16 nLower = bHideWhitespace ? 0 : pAttrs->CalcBottom();
const bool bVert = IsVertical() && !IsPageFrame();
- SwRectFn fnRect = bVert ? ( IsVertLR() ? fnRectVertL2R : fnRectVert ) : fnRectHori;
+ SwRectFn fnRect = bVert ? ( IsVertLR() ? (IsVertLRBT() ? fnRectVertL2RB2T : fnRectVertL2R) : fnRectVert ) : fnRectHori;
if ( !isFramePrintAreaValid() )
{
setFramePrintAreaValid(true);
diff --git a/sw/source/core/text/itratr.cxx b/sw/source/core/text/itratr.cxx
index d7d8f7a0aefc..28263abd9eaa 100644
--- a/sw/source/core/text/itratr.cxx
+++ b/sw/source/core/text/itratr.cxx
@@ -204,7 +204,8 @@ bool SwAttrIter::SeekStartAndChgAttrIter( OutputDevice* pOut, const bool bParaFo
{
assert(m_pMergedPara);
m_pTextNode = m_pMergedPara->pFirstNode;
- InitFontAndAttrHandler(*m_pMergedPara->pParaPropsNode, *m_pTextNode, m_pMergedPara->mergedText, nullptr);
+ InitFontAndAttrHandler(*m_pMergedPara->pParaPropsNode, *m_pTextNode,
+ m_pMergedPara->mergedText, nullptr, nullptr);
}
// reset font to its original state
@@ -338,7 +339,8 @@ bool SwAttrIter::Seek(TextFrameIndex const nNewPos)
// items at all; it can only apply a previously effective item.
// So do this by recreating the font from scratch.
// Apply new para items:
- InitFontAndAttrHandler(*m_pMergedPara->pParaPropsNode, *newPos.first, m_pMergedPara->mergedText, nullptr);
+ InitFontAndAttrHandler(*m_pMergedPara->pParaPropsNode, *newPos.first,
+ m_pMergedPara->mergedText, nullptr, nullptr);
// reset to next
m_pTextNode = newPos.first;
m_nStartIndex = 0;
@@ -360,7 +362,8 @@ bool SwAttrIter::Seek(TextFrameIndex const nNewPos)
m_pTextNode = newPos.first;
// sw_redlinehide: hope it's okay to use the current text node
// here; the AttrHandler shouldn't care about non-char items
- InitFontAndAttrHandler(*m_pMergedPara->pParaPropsNode, *m_pTextNode, m_pMergedPara->mergedText, nullptr);
+ InitFontAndAttrHandler(*m_pMergedPara->pParaPropsNode, *m_pTextNode,
+ m_pMergedPara->mergedText, nullptr, nullptr);
}
}
if (m_pMergedPara || m_pTextNode->GetpSwpHints())
diff --git a/sw/source/core/text/itratr.hxx b/sw/source/core/text/itratr.hxx
index 2dddd1265d8c..dd3a755c7bfd 100644
--- a/sw/source/core/text/itratr.hxx
+++ b/sw/source/core/text/itratr.hxx
@@ -67,7 +67,8 @@ private:
void SetFnt( SwFont* pNew ) { m_pFont = pNew; }
void InitFontAndAttrHandler(
SwTextNode const& rPropsNode, SwTextNode const& rTextNode,
- OUString const& rText, bool const* pbVertLayout);
+ OUString const& rText, bool const* pbVertLayout,
+ bool const* pbVertLayoutLRBT);
protected:
void Chg( SwTextAttr const *pHt );
diff --git a/sw/source/core/text/redlnitr.cxx b/sw/source/core/text/redlnitr.cxx
index 3b481b762914..95ce480d11b5 100644
--- a/sw/source/core/text/redlnitr.cxx
+++ b/sw/source/core/text/redlnitr.cxx
@@ -307,7 +307,8 @@ void SwAttrIter::InitFontAndAttrHandler(
SwTextNode const& rPropsNode,
SwTextNode const& rTextNode,
OUString const& rText,
- bool const*const pbVertLayout)
+ bool const*const pbVertLayout,
+ bool const*const pbVertLayoutLRBT)
{
// Build a font matching the default paragraph style:
SwFontAccess aFontAccess( &rPropsNode.GetAnyFormatColl(), m_pViewShell );
@@ -328,7 +329,10 @@ void SwAttrIter::InitFontAndAttrHandler(
// if it's a re-init, the vert flag never changes
if (pbVertLayout ? *pbVertLayout : m_aAttrHandler.IsVertLayout())
{
- m_pFont->SetVertical( m_pFont->GetOrientation(), true );
+ bool bVertLayoutLRBT = false;
+ if (pbVertLayoutLRBT)
+ bVertLayoutLRBT = *pbVertLayoutLRBT;
+ m_pFont->SetVertical(m_pFont->GetOrientation(), true, bVertLayoutLRBT);
}
// Initialize the default attribute of the attribute handler
@@ -385,6 +389,7 @@ void SwAttrIter::CtorInitAttrIter(SwTextNode & rTextNode,
// set font to vertical if frame layout is vertical
bool bVertLayout = false;
+ bool bVertLayoutLRBT = false;
bool bRTL = false;
if ( pFrame )
{
@@ -392,6 +397,10 @@ void SwAttrIter::CtorInitAttrIter(SwTextNode & rTextNode,
{
bVertLayout = true;
}
+ if (pFrame->IsVertLRBT())
+ {
+ bVertLayoutLRBT = true;
+ }
bRTL = pFrame->IsRightToLeft();
m_pMergedPara = pFrame->GetMergedPara();
}
@@ -405,7 +414,8 @@ void SwAttrIter::CtorInitAttrIter(SwTextNode & rTextNode,
m_pMergedPara ? *m_pMergedPara->pParaPropsNode : rTextNode,
rTextNode,
m_pMergedPara ? m_pMergedPara->mergedText : rTextNode.GetText(),
- & bVertLayout);
+ & bVertLayout,
+ & bVertLayoutLRBT);
m_nStartIndex = m_nEndIndex = m_nPosition = m_nChgCnt = 0;
m_nPropFont = 0;
diff --git a/sw/source/core/text/txtfrm.cxx b/sw/source/core/text/txtfrm.cxx
index 557a5f226afb..17d1d6f321fc 100644
--- a/sw/source/core/text/txtfrm.cxx
+++ b/sw/source/core/text/txtfrm.cxx
@@ -512,6 +512,21 @@ void SwTextFrame::SwitchHorizontalToVertical( SwRect& rRect ) const
*/
void SwTextFrame::SwitchHorizontalToVertical( Point& rPoint ) const
{
+ if (IsVertLRBT())
+ {
+ // The horizontal origo is the top left corner, the LRBT origo is the
+ // bottom left corner. Finally x and y has to be swapped.
+ SAL_WARN_IF(!mbIsSwapped, "sw.core",
+ "SwTextFrame::SwitchHorizontalToVertical, IsVertLRBT, not swapped");
+ Point aPoint(rPoint);
+ rPoint.setX(getFrameArea().Left() + (aPoint.Y() - getFrameArea().Top()));
+ // This would be bottom - x delta, but bottom is top + height, finally
+ // width (and not height), as it's swapped.
+ rPoint.setY(getFrameArea().Top() + getFrameArea().Width()
+ - (aPoint.X() - getFrameArea().Left()));
+ return;
+ }
+
// calc offset inside frame
const long nOfstX = rPoint.X() - getFrameArea().Left();
const long nOfstY = rPoint.Y() - getFrameArea().Top();
diff --git a/sw/source/core/txtnode/swfont.cxx b/sw/source/core/txtnode/swfont.cxx
index 33fefa32b833..8c0e97cd30a7 100644
--- a/sw/source/core/txtnode/swfont.cxx
+++ b/sw/source/core/txtnode/swfont.cxx
@@ -363,14 +363,17 @@ sal_uInt16 SwFont::CalcShadowSpace(
}
// maps directions for vertical layout
-static sal_uInt16 MapDirection( sal_uInt16 nDir, const bool bVertFormat )
+static sal_uInt16 MapDirection(sal_uInt16 nDir, const bool bVertFormat, const bool bVertFormatLRBT)
{
if ( bVertFormat )
{
switch ( nDir )
{
case 0 :
- nDir = 2700;
+ if (bVertFormatLRBT)
+ nDir = 900;
+ else
+ nDir = 2700;
break;
case 900 :
nDir = 0;
@@ -420,10 +423,10 @@ sal_uInt16 SwFont::GetOrientation( const bool bVertFormat ) const
return UnMapDirection( m_aSub[m_nActual].GetOrientation(), bVertFormat );
}
-void SwFont::SetVertical( sal_uInt16 nDir, const bool bVertFormat )
+void SwFont::SetVertical(sal_uInt16 nDir, const bool bVertFormat, const bool bVertLayoutLRBT)
{
// map direction if frame has vertical layout
- nDir = MapDirection( nDir, bVertFormat );
+ nDir = MapDirection(nDir, bVertFormat, bVertLayoutLRBT);
if( nDir != m_aSub[SwFontScript::Latin].GetOrientation() )
{