summaryrefslogtreecommitdiffstats
path: root/sw/source/core/inc/drawfont.hxx
diff options
context:
space:
mode:
Diffstat (limited to 'sw/source/core/inc/drawfont.hxx')
-rw-r--r--sw/source/core/inc/drawfont.hxx622
1 files changed, 622 insertions, 0 deletions
diff --git a/sw/source/core/inc/drawfont.hxx b/sw/source/core/inc/drawfont.hxx
new file mode 100644
index 000000000..c40ff1044
--- /dev/null
+++ b/sw/source/core/inc/drawfont.hxx
@@ -0,0 +1,622 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_SW_SOURCE_CORE_INC_DRAWFONT_HXX
+#define INCLUDED_SW_SOURCE_CORE_INC_DRAWFONT_HXX
+
+#include <osl/diagnose.h>
+#include <vcl/vclptr.hxx>
+#include <vcl/outdev.hxx>
+#include <swtypes.hxx>
+#include "TextFrameIndex.hxx"
+#include <swdllapi.h>
+
+class SwTextFrame;
+class SwViewShell;
+class SwScriptInfo;
+namespace sw { class WrongListIterator; }
+class SwFont;
+namespace vcl {
+ class Font;
+ namespace text {
+ class TextLayoutCache;
+ }
+ typedef OutputDevice RenderContext;
+}
+class SwUnderlineFont;
+
+// encapsulates information for drawing text
+class SW_DLLPUBLIC SwDrawTextInfo
+{
+ const SwTextFrame* m_pFrame;
+ VclPtr<OutputDevice> m_pOut;
+ SwViewShell const * m_pSh;
+ const SwScriptInfo* m_pScriptInfo;
+ Point m_aPos;
+ vcl::text::TextLayoutCache const* m_pCachedVclData;
+ OUString m_aText;
+ sw::WrongListIterator* m_pWrong;
+ sw::WrongListIterator* m_pGrammarCheck;
+ sw::WrongListIterator* m_pSmartTags;
+ Size m_aSize;
+ SwFont *m_pFnt;
+ SwUnderlineFont* m_pUnderFnt;
+ TextFrameIndex* m_pHyphPos;
+ tools::Long m_nKanaDiff;
+ TextFrameIndex m_nIdx;
+ TextFrameIndex m_nLen;
+ /// this is not a string index
+ sal_Int32 m_nOfst;
+ sal_uInt16 m_nWidth;
+ sal_uInt16 m_nAscent;
+ sal_uInt16 m_nCompress;
+ tools::Long m_nCharacterSpacing;
+ tools::Long m_nSpace;
+ tools::Long m_nKern;
+ TextFrameIndex m_nNumberOfBlanks;
+ sal_uInt8 m_nCursorBidiLevel;
+ bool m_bBullet : 1;
+ bool m_bUpper : 1; // for small caps: upper case flag
+ bool m_bDrawSpace : 1; // for small caps: underline/ line through
+ bool m_bGreyWave : 1; // grey wave line for extended text input
+ // For underlining we need to know, if a section is right in front of a
+ // whole block or a fix margin section.
+ bool m_bSpaceStop : 1;
+ bool m_bSnapToGrid : 1; // Does paragraph snap to grid?
+ // Paint text as if text has LTR direction, used for line numbering
+ bool m_bIgnoreFrameRTL : 1;
+ // GetModelPositionForViewPoint should not return the next position if screen position is
+ // inside second half of bound rect, used for Accessibility
+ bool m_bPosMatchesBounds :1;
+
+public:
+
+#ifdef DBG_UTIL
+ // These flags should control that the appropriate Set-function has been
+ // called before calling the Get-function of a member
+ bool m_bPos : 1;
+ bool m_bWrong : 1;
+ bool m_bGrammarCheck : 1;
+ bool m_bSize : 1;
+ bool m_bFnt : 1;
+ bool m_bHyph : 1;
+ bool m_bKana : 1;
+ bool m_bOfst : 1;
+ bool m_bAscent: 1;
+ bool m_bCharacterSpacing : 1;
+ bool m_bSpace : 1;
+ bool m_bNumberOfBlanks : 1;
+ bool m_bUppr : 1;
+ bool m_bDrawSp: 1;
+#endif
+
+ /// constructor for simple strings
+ SwDrawTextInfo( SwViewShell const *pSh, OutputDevice &rOut,
+ const OUString &rText, sal_Int32 const nIdx, sal_Int32 const nLen,
+ sal_uInt16 nWidth = 0, bool bBullet = false)
+ : SwDrawTextInfo(pSh, rOut, nullptr, rText, TextFrameIndex(nIdx), TextFrameIndex(nLen), nWidth, bBullet)
+ {}
+ /// constructor for text frame contents
+ SwDrawTextInfo( SwViewShell const *pSh, OutputDevice &rOut, const SwScriptInfo* pSI,
+ const OUString &rText, TextFrameIndex const nIdx, TextFrameIndex const nLen,
+ sal_uInt16 nWidth = 0, bool bBullet = false,
+ vcl::text::TextLayoutCache const*const pCachedVclData = nullptr)
+ : m_pCachedVclData(pCachedVclData)
+ {
+ assert( (nLen == TextFrameIndex(COMPLETE_STRING)) ? (nIdx.get() < rText.getLength()) : (nIdx + nLen).get() <= rText.getLength() );
+ m_pFrame = nullptr;
+ m_pSh = pSh;
+ m_pOut = &rOut;
+ m_pScriptInfo = pSI;
+ m_aText = rText;
+ m_nIdx = nIdx;
+ m_nLen = nLen;
+ m_nKern = 0;
+ m_nCompress = 0;
+ m_nWidth = nWidth;
+ m_nNumberOfBlanks = TextFrameIndex(0);
+ m_nCursorBidiLevel = 0;
+ m_bBullet = bBullet;
+ m_pUnderFnt = nullptr;
+ m_bGreyWave = false;
+ m_bSpaceStop = false;
+ m_bSnapToGrid = false;
+ m_bIgnoreFrameRTL = false;
+ m_bPosMatchesBounds = false;
+
+ // These values are initialized but have to be set explicitly via their
+ // Set-function before they may be accessed by their Get-function:
+ m_pWrong = nullptr;
+ m_pGrammarCheck = nullptr;
+ m_pSmartTags = nullptr;
+ m_pFnt = nullptr;
+ m_pHyphPos = nullptr;
+ m_nKanaDiff = 0;
+ m_nOfst = 0;
+ m_nAscent = 0;
+ m_nCharacterSpacing = 0;
+ m_nSpace = 0;
+ m_bUpper = false;
+ m_bDrawSpace = false;
+
+#ifdef DBG_UTIL
+ // these flags control whether the matching member variables have been
+ // set by using the Set-function before they may be accessed by their
+ // Get-function:
+ m_bPos = m_bWrong = m_bGrammarCheck = m_bSize = m_bFnt = m_bAscent =
+ m_bSpace = m_bNumberOfBlanks = m_bUppr =
+ m_bDrawSp = m_bKana = m_bOfst = m_bHyph =
+ m_bCharacterSpacing = false;
+#endif
+ }
+
+ const SwTextFrame* GetFrame() const
+ {
+ return m_pFrame;
+ }
+
+ void SetFrame( const SwTextFrame* pNewFrame )
+ {
+ m_pFrame = pNewFrame;
+ }
+
+ SwViewShell const *GetShell() const
+ {
+ return m_pSh;
+ }
+
+ vcl::RenderContext& GetOut() const
+ {
+ return *m_pOut;
+ }
+
+ vcl::RenderContext *GetpOut() const
+ {
+ return m_pOut;
+ }
+
+ const SwScriptInfo* GetScriptInfo() const
+ {
+ return m_pScriptInfo;
+ }
+
+ const Point &GetPos() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bPos, "DrawTextInfo: Undefined Position" );
+#endif
+ return m_aPos;
+ }
+
+ TextFrameIndex *GetHyphPos() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bHyph, "DrawTextInfo: Undefined Hyph Position" );
+#endif
+ return m_pHyphPos;
+ }
+
+ vcl::text::TextLayoutCache const* GetVclCache() const
+ {
+ return m_pCachedVclData;
+ }
+
+ const OUString &GetText() const
+ {
+ return m_aText;
+ }
+
+ sw::WrongListIterator* GetWrong() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bWrong, "DrawTextInfo: Undefined WrongList" );
+#endif
+ return m_pWrong;
+ }
+
+ sw::WrongListIterator* GetGrammarCheck() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bGrammarCheck, "DrawTextInfo: Undefined GrammarCheck List" );
+#endif
+ return m_pGrammarCheck;
+ }
+
+ sw::WrongListIterator* GetSmartTags() const
+ {
+ return m_pSmartTags;
+ }
+
+ const Size &GetSize() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bSize, "DrawTextInfo: Undefined Size" );
+#endif
+ return m_aSize;
+ }
+
+ SwFont* GetFont() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bFnt, "DrawTextInfo: Undefined Font" );
+#endif
+ return m_pFnt;
+ }
+
+ SwUnderlineFont* GetUnderFnt() const
+ {
+ return m_pUnderFnt;
+ }
+
+ TextFrameIndex GetIdx() const
+ {
+ return m_nIdx;
+ }
+
+ TextFrameIndex GetLen() const
+ {
+ return m_nLen;
+ }
+
+ sal_Int32 GetOffset() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bOfst, "DrawTextInfo: Undefined Offset" );
+#endif
+ return m_nOfst;
+ }
+
+ TextFrameIndex GetEnd() const
+ {
+ return m_nIdx + m_nLen;
+ }
+
+ tools::Long GetKanaDiff() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bKana, "DrawTextInfo: Undefined kana difference" );
+#endif
+ return m_nKanaDiff;
+ }
+
+ sal_uInt16 GetWidth() const
+ {
+ return m_nWidth;
+ }
+
+ sal_uInt16 GetAscent() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bAscent, "DrawTextInfo: Undefined Ascent" );
+#endif
+ return m_nAscent;
+ }
+
+ sal_uInt16 GetKanaComp() const
+ {
+ return m_nCompress;
+ }
+
+ tools::Long GetCharacterSpacing() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bCharacterSpacing, "DrawTextInfo: Undefined CharacterSpacing" );
+#endif
+ return m_nCharacterSpacing;
+ }
+
+ tools::Long GetKern() const
+ {
+ return m_nKern;
+ }
+
+ tools::Long GetSpace() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bSpace, "DrawTextInfo: Undefined Spacing" );
+#endif
+ return m_nSpace;
+ }
+
+ TextFrameIndex GetNumberOfBlanks() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bNumberOfBlanks, "DrawTextInfo::Undefined NumberOfBlanks" );
+#endif
+ return m_nNumberOfBlanks;
+ }
+
+ sal_uInt8 GetCursorBidiLevel() const
+ {
+ return m_nCursorBidiLevel;
+ }
+
+ bool GetBullet() const
+ {
+ return m_bBullet;
+ }
+
+ bool GetUpper() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bUppr, "DrawTextInfo: Undefined Upperflag" );
+#endif
+ return m_bUpper;
+ }
+
+ bool GetDrawSpace() const
+ {
+#ifdef DBG_UTIL
+ OSL_ENSURE( m_bDrawSp, "DrawTextInfo: Undefined DrawSpaceflag" );
+#endif
+ return m_bDrawSpace;
+ }
+
+ bool GetGreyWave() const
+ {
+ return m_bGreyWave;
+ }
+
+ bool IsSpaceStop() const
+ {
+ return m_bSpaceStop;
+ }
+
+ bool SnapToGrid() const
+ {
+ return m_bSnapToGrid;
+ }
+
+ bool IsIgnoreFrameRTL() const
+ {
+ return m_bIgnoreFrameRTL;
+ }
+
+ bool IsPosMatchesBounds() const
+ {
+ return m_bPosMatchesBounds;
+ }
+
+ void SetOut( OutputDevice &rNew )
+ {
+ m_pOut = &rNew;
+ }
+
+ void SetPos( const Point &rNew )
+ {
+ m_aPos = rNew;
+#ifdef DBG_UTIL
+ m_bPos = true;
+#endif
+ }
+
+ void SetHyphPos(TextFrameIndex *const pNew)
+ {
+ m_pHyphPos = pNew;
+#ifdef DBG_UTIL
+ m_bHyph = true;
+#endif
+ }
+
+ void SetText( const OUString &rNew )
+ {
+ assert( (m_nLen == TextFrameIndex(COMPLETE_STRING)) ? (m_nIdx.get() < rNew.getLength()) : (m_nIdx + m_nLen).get() <= rNew.getLength() );
+ m_aText = rNew;
+ m_pCachedVclData = nullptr; // would any case benefit from save/restore?
+ }
+
+ // These methods are here so we can set all the related fields together to preserve the invariants that we assert
+ void SetTextIdxLen( const OUString &rNewStr, TextFrameIndex const nNewIdx, TextFrameIndex const nNewLen )
+ {
+ assert( (nNewLen == TextFrameIndex(COMPLETE_STRING)) ? (nNewIdx.get() < rNewStr.getLength()) : (nNewIdx + nNewLen).get() <= rNewStr.getLength() );
+ m_aText = rNewStr;
+ m_nIdx = nNewIdx;
+ m_nLen = nNewLen;
+ m_pCachedVclData = nullptr; // would any case benefit from save/restore?
+ }
+
+ // These methods are here so we can set all the related fields together to preserve the invariants that we assert
+ void SetIdxLen( TextFrameIndex const nNewIdx, TextFrameIndex const nNewLen )
+ {
+ assert( (nNewLen == TextFrameIndex(COMPLETE_STRING)) ? (nNewIdx.get() < m_aText.getLength()) : (nNewIdx + nNewLen).get() <= m_aText.getLength() );
+ m_nIdx = nNewIdx;
+ m_nLen = nNewLen;
+ }
+
+ void SetWrong(sw::WrongListIterator *const pNew)
+ {
+ m_pWrong = pNew;
+#ifdef DBG_UTIL
+ m_bWrong = true;
+#endif
+ }
+
+ void SetGrammarCheck(sw::WrongListIterator *const pNew)
+ {
+ m_pGrammarCheck = pNew;
+#ifdef DBG_UTIL
+ m_bGrammarCheck = true;
+#endif
+ }
+
+ void SetSmartTags(sw::WrongListIterator *const pNew)
+ {
+ m_pSmartTags = pNew;
+ }
+
+ void SetSize( const Size &rNew )
+ {
+ m_aSize = rNew;
+#ifdef DBG_UTIL
+ m_bSize = true;
+#endif
+ }
+
+ void SetFont( SwFont* pNew )
+ {
+ m_pFnt = pNew;
+#ifdef DBG_UTIL
+ m_bFnt = true;
+#endif
+ }
+
+ void SetIdx(TextFrameIndex const nNew)
+ {
+ assert( (m_nLen == TextFrameIndex(COMPLETE_STRING)) ? (nNew.get() < m_aText.getLength()) : (nNew + m_nLen).get() <= m_aText.getLength() );
+ m_nIdx = nNew;
+ }
+
+ void SetLen(TextFrameIndex const nNew)
+ {
+ assert( (nNew == TextFrameIndex(COMPLETE_STRING)) ? (m_nIdx.get() < m_aText.getLength()) : (m_nIdx + nNew).get() <= m_aText.getLength() );
+ m_nLen = nNew;
+ }
+
+ void SetOffset( sal_Int32 nNew )
+ {
+ m_nOfst = nNew;
+#ifdef DBG_UTIL
+ m_bOfst = true;
+#endif
+ }
+
+ void SetKanaDiff( tools::Long nNew )
+ {
+ m_nKanaDiff = nNew;
+#ifdef DBG_UTIL
+ m_bKana = true;
+#endif
+ }
+
+ void SetWidth( sal_uInt16 nNew )
+ {
+ m_nWidth = nNew;
+ }
+
+ void SetAscent( sal_uInt16 nNew )
+ {
+ m_nAscent = nNew;
+#ifdef DBG_UTIL
+ m_bAscent = true;
+#endif
+ }
+
+ void SetKern( tools::Long nNew )
+ {
+ m_nKern = nNew;
+ }
+
+ void SetSpace( tools::Long nNew )
+ {
+ if( nNew < 0 )
+ {
+ m_nCharacterSpacing = -nNew;
+ m_nSpace = 0;
+ }
+ else
+ {
+ m_nSpace = nNew;
+ m_nCharacterSpacing = 0;
+ }
+#ifdef DBG_UTIL
+ m_bSpace = true;
+ m_bCharacterSpacing = true;
+#endif
+ }
+
+ void SetNumberOfBlanks( TextFrameIndex const nNew )
+ {
+#ifdef DBG_UTIL
+ m_bNumberOfBlanks = true;
+#endif
+ m_nNumberOfBlanks = nNew;
+ }
+
+ void SetCursorBidiLevel( sal_uInt8 nNew )
+ {
+ m_nCursorBidiLevel = nNew;
+ }
+
+ void SetKanaComp( short nNew )
+ {
+ m_nCompress = nNew;
+ }
+
+ void SetBullet( bool bNew )
+ {
+ m_bBullet = bNew;
+ }
+
+ void SetUnderFnt( SwUnderlineFont* pULFnt )
+ {
+ m_pUnderFnt = pULFnt;
+ }
+
+ void SetUpper( bool bNew )
+ {
+ m_bUpper = bNew;
+#ifdef DBG_UTIL
+ m_bUppr = true;
+#endif
+ }
+
+ void SetDrawSpace( bool bNew )
+ {
+ m_bDrawSpace = bNew;
+#ifdef DBG_UTIL
+ m_bDrawSp = true;
+#endif
+ }
+
+ void SetGreyWave( bool bNew )
+ {
+ m_bGreyWave = bNew;
+ }
+
+ void SetSpaceStop( bool bNew )
+ {
+ m_bSpaceStop = bNew;
+ }
+
+ void SetSnapToGrid( bool bNew )
+ {
+ m_bSnapToGrid = bNew;
+ }
+
+ void SetIgnoreFrameRTL( bool bNew )
+ {
+ m_bIgnoreFrameRTL = bNew;
+ }
+
+ void SetPosMatchesBounds( bool bNew )
+ {
+ m_bPosMatchesBounds = bNew;
+ }
+
+ void Shift( Degree10 nDir );
+
+ // sets a new color at the output device if necessary if a font is passed
+ // as argument, the change if made to the font otherwise the font at the
+ // output device is changed returns if the font has been changed
+ bool ApplyAutoColor( vcl::Font* pFnt = nullptr );
+};
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */