Line data Source code
1 : /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 : /*
3 : * This file is part of the LibreOffice project.
4 : *
5 : * This Source Code Form is subject to the terms of the Mozilla Public
6 : * License, v. 2.0. If a copy of the MPL was not distributed with this
7 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
8 : *
9 : * This file incorporates work covered by the following license notice:
10 : *
11 : * Licensed to the Apache Software Foundation (ASF) under one or more
12 : * contributor license agreements. See the NOTICE file distributed
13 : * with this work for additional information regarding copyright
14 : * ownership. The ASF licenses this file to you under the Apache
15 : * License, Version 2.0 (the "License"); you may not use this file
16 : * except in compliance with the License. You may obtain a copy of
17 : * the License at http://www.apache.org/licenses/LICENSE-2.0 .
18 : */
19 : #ifndef INCLUDED_SW_SOURCE_CORE_INC_SWFONT_HXX
20 : #define INCLUDED_SW_SOURCE_CORE_INC_SWFONT_HXX
21 :
22 : #include <i18nlangtag/lang.h>
23 : #include <tools/color.hxx>
24 : #include <tools/stream.hxx>
25 : #include <tools/gen.hxx>
26 : #include <editeng/svxfont.hxx>
27 : #include <swtypes.hxx>
28 : #include <drawfont.hxx>
29 : #include <editeng/borderline.hxx>
30 : #include <boost/optional.hpp>
31 :
32 : class SfxItemSet;
33 : class SwAttrSet;
34 : class SwDoCapitals; // DoCapitals
35 : class SwDrawTextInfo; // _DrawText
36 : class SwScriptInfo; // _GetTxtSize
37 : class SwViewShell;
38 : class IDocumentSettingAccess;
39 :
40 : const sal_Unicode CH_BLANK = ' '; // ' ' blank spaces
41 : const sal_Unicode CH_BREAK = 0x0A;
42 : const sal_Unicode CH_TAB = '\t'; // \t
43 : const sal_Unicode CH_PAR = 0xB6; // paragraph
44 : const sal_Unicode CH_BULLET = 0xB7; // centered dot
45 :
46 : sal_uInt16 UnMapDirection( sal_uInt16 nDir, const bool bVertFormat );
47 :
48 3114469 : class SwSubFont : public SvxFont
49 : {
50 : friend class SwFont;
51 : const void *pMagic; // "MagicNumber" within the font cache
52 : Size aSize; // foreigners only see this size
53 : sal_uInt16 nFntIndex; // index in the font cache
54 : sal_uInt16 nOrgHeight; // height including escapement/proportion
55 : sal_uInt16 nOrgAscent; // ascent including escapement/proportion
56 : sal_uInt16 nPropWidth; // proportional width
57 : bool smallCapsPercentage66;
58 3113667 : inline SwSubFont() : aSize(0,0)
59 3113667 : { pMagic = NULL; nFntIndex = nOrgHeight = nOrgAscent = 0; nPropWidth =100; smallCapsPercentage66 = false; }
60 :
61 : sal_uInt16 CalcEscAscent( const sal_uInt16 nOldAscent ) const;
62 : sal_uInt16 CalcEscHeight( const sal_uInt16 nOldHeight,
63 : const sal_uInt16 nOldAscent ) const;
64 : void CalcEsc( SwDrawTextInfo& rInf, Point& rPos );
65 :
66 : inline void CopyMagic( const SwSubFont& rFnt )
67 : { pMagic = rFnt.pMagic; nFntIndex = rFnt.nFntIndex; }
68 :
69 : SwSubFont& operator=( const SwSubFont &rFont );
70 :
71 : short _CheckKerning( );
72 :
73 : bool ChgFnt( SwViewShell const *pSh, OutputDevice& rOut );
74 : bool IsSymbol( SwViewShell *pSh );
75 : sal_uInt16 GetAscent( SwViewShell *pSh, const OutputDevice& rOut );
76 : sal_uInt16 GetHeight( SwViewShell *pSh, const OutputDevice& rOut );
77 : Size _GetTxtSize( SwDrawTextInfo& rInf );
78 : Size GetCapitalSize( SwDrawTextInfo& rInf );
79 : void _DrawText( SwDrawTextInfo &rInf, const bool bGrey );
80 : void DrawCapital( SwDrawTextInfo &rInf );
81 : void DrawStretchCapital( SwDrawTextInfo &rInf );
82 : void DoOnCapitals( SwDoCapitals &rDo );
83 : void _DrawStretchText( SwDrawTextInfo &rInf );
84 : sal_Int32 _GetCrsrOfst( SwDrawTextInfo& rInf );
85 : sal_Int32 GetCapitalCrsrOfst( SwDrawTextInfo& rInf );
86 :
87 : inline void SetColor( const Color& rColor );
88 : inline void SetFillColor( const Color& rColor );
89 : inline void SetCharSet( const rtl_TextEncoding eCharSet );
90 : inline void SetPitch( const FontPitch ePitch );
91 : inline void SetAlign( const FontAlign eAlign );
92 : inline void SetUnderline( const FontUnderline eUnderline );
93 : inline void SetOverline( const FontUnderline eOverline );
94 : inline void SetStrikeout( const FontStrikeout eStrikeout );
95 : inline void SetItalic( const FontItalic eItalic );
96 : inline void SetOutline( const bool bOutline );
97 : inline void SetVertical( const sal_uInt16 nDir, const bool bVertFormat );
98 : inline void SetShadow( const bool bShadow );
99 : inline void SetAutoKern( const sal_uInt8 nAutoKern );
100 : inline void SetWordLineMode( const bool bWordLineMode );
101 : inline void SetEmphasisMark( const FontEmphasisMark eValue );
102 : inline void SetRelief( const FontRelief eNew );
103 :
104 : // methods for sub-/superscript
105 : inline void SetEscapement( const short nNewEsc );
106 : inline void SetProportion( const sal_uInt8 nNewPropr );
107 :
108 : inline void SetFamily( const FontFamily eFamily );
109 : inline void SetName( const OUString& rName );
110 : inline void SetStyleName( const OUString& rStyleName );
111 : inline void SetSize( const Size& rSize );
112 : inline void SetWeight( const FontWeight eWeight );
113 : inline void SetLanguage( LanguageType eNewLang );
114 379879 : inline short CheckKerning()
115 379879 : { return GetFixKerning() >= 0 ? GetFixKerning() : _CheckKerning( ); }
116 5928 : inline void SetPropWidth( const sal_uInt16 nNew )
117 5928 : { pMagic = 0; nPropWidth = nNew; }
118 : public:
119 1098475 : sal_uInt16 GetPropWidth() const { return nPropWidth; }
120 : };
121 :
122 : #define SW_LATIN 0
123 : #define SW_CJK 1
124 : #define SW_CTL 2
125 : #define SW_SCRIPTS 3
126 :
127 : class SwFont
128 : {
129 : // CJK == Chinese, Japanese, Korean
130 : // CTL == Complex text layout ( Hebrew, Arabic )
131 : SwSubFont aSub[SW_SCRIPTS]; // Latin-, CJK- and CTL-font
132 :
133 : Color* pBackColor; // background color (i.e. at character styles)
134 : Color m_aHighlightColor; // highlight color
135 : Color aUnderColor; // color of the underlining
136 : Color aOverColor; // color of the overlining
137 :
138 : // character borders
139 : boost::optional<editeng::SvxBorderLine> m_aTopBorder;
140 : boost::optional<editeng::SvxBorderLine> m_aBottomBorder;
141 : boost::optional<editeng::SvxBorderLine> m_aRightBorder;
142 : boost::optional<editeng::SvxBorderLine> m_aLeftBorder;
143 :
144 : // border distance
145 : sal_uInt16 m_nTopBorderDist;
146 : sal_uInt16 m_nBottomBorderDist;
147 : sal_uInt16 m_nRightBorderDist;
148 : sal_uInt16 m_nLeftBorderDist;
149 :
150 : Color m_aShadowColor;
151 : sal_uInt16 m_nShadowWidth;
152 : SvxShadowLocation m_aShadowLocation;
153 :
154 : sal_uInt8 nToxCnt; // counts the nesting depth of the Tox
155 : sal_uInt8 nRefCnt; // counts the nesting depth of the Refs
156 : sal_uInt8 m_nMetaCount; // count META/METAFIELD
157 : sal_uInt8 m_nInputFieldCount; // count INPUTFIELD
158 :
159 : sal_uInt8 nActual; // actual font (Latin, CJK or CTL)
160 :
161 : // switch for the font-extensions
162 : bool bNoHyph :1; // SwTxtNoHyphenHere: no separator
163 : bool bBlink :1; // blinking font
164 : bool bPaintBlank :1; // blanks not with DrawRect
165 : bool bFntChg :1;
166 : bool bOrgChg :1; // nOrgHeight/Ascent are invalid
167 : bool bURL :1;
168 : bool bPaintWrong :1; // flag for spelling mistakes
169 : bool bGreyWave :1; // for the extended TextInput: gray waveline
170 : bool bNoColReplace :1; // Replacement without colormanipulation
171 :
172 : public:
173 : SwFont( const SwAttrSet* pSet, const IDocumentSettingAccess* pIDocumentSettingAccess );
174 : SwFont( const SwFont& rFont );
175 :
176 782240 : inline void ChgFnt( SwViewShell const *pSh, OutputDevice& rOut )
177 782240 : { bPaintBlank = aSub[nActual].ChgFnt( pSh, rOut ); }
178 :
179 : ~SwFont();
180 :
181 : SwFont& operator=( const SwFont &rFont );
182 :
183 1774106 : inline sal_uInt8 GetActual() const { return nActual; }
184 : inline void SetActual( sal_uInt8 nNew );
185 0 : inline const SvxFont& GetActualFont() const { return aSub[nActual]; }
186 :
187 : // gets a MagicNumber via SwFntAccess
188 : void GoMagic( SwViewShell *pSh, sal_uInt8 nWhich );
189 : // set background color
190 : void SetBackColor( Color* pNewColor );
191 104196 : inline const Color* GetBackColor() const{ return pBackColor; }
192 : void SetHighlightColor( const Color& aNewColor );
193 42434 : const Color& GetHighlightColor() const { return m_aHighlightColor; }
194 :
195 377202 : inline void ChkMagic( SwViewShell *pSh, sal_uInt8 nWhich )
196 377202 : { if( !aSub[ nWhich ].pMagic ) GoMagic( pSh, nWhich ); }
197 : // assumes the MagicNumber of a (hopefully not identical) colleague
198 : inline void CopyMagic( const SwFont* pFnt, sal_uInt8 nWhich )
199 : { aSub[nWhich].CopyMagic( pFnt->aSub[nWhich] ); }
200 319086 : inline void GetMagic( const void* &rMagic, sal_uInt16 &rIdx, sal_uInt8 nWhich )
201 319086 : { rMagic = aSub[nWhich].pMagic; rIdx = aSub[nWhich].nFntIndex; }
202 297283 : inline void SetMagic( const void* pNew, const sal_uInt16 nIdx, sal_uInt8 nWhich )
203 297283 : { aSub[nWhich].pMagic = pNew; aSub[nWhich].nFntIndex = nIdx; }
204 35344 : inline bool DifferentMagic( const SwFont* pFnt, sal_uInt8 nWhich )
205 40656 : { return aSub[nWhich].pMagic != pFnt->aSub[nWhich].pMagic ||
206 40656 : !aSub[nWhich].pMagic || !pFnt->aSub[nWhich].pMagic; }
207 :
208 368 : inline const Size &GetSize( sal_uInt8 nWhich ) const
209 368 : { return aSub[nWhich].aSize; }
210 673402 : inline bool IsFntChg() const { return bFntChg; }
211 250804 : inline void SetFntChg( const bool bNew ) { bFntChg = bNew; }
212 :
213 : // the encapsulated SV-Font-methods (set bFntChg to sal_True)
214 : inline void SetColor( const Color& rColor );
215 : inline void SetFillColor( const Color& rColor );
216 : inline void SetAlign( const FontAlign eAlign );
217 : inline void SetUnderline( const FontUnderline eUnderline );
218 128938 : inline void SetUnderColor( const Color &rColor ) { aUnderColor = rColor; }
219 : inline void SetOverline( const FontUnderline eOverline );
220 103378 : inline void SetOverColor( const Color &rColor ) { aOverColor = rColor; }
221 : inline void SetStrikeout( const FontStrikeout eStrikeout );
222 : inline void SetOutline( const bool bOutline );
223 : void SetVertical( sal_uInt16 nDir, const bool nVertLayout = false );
224 : inline void SetShadow( const bool bShadow );
225 : inline void SetAutoKern( sal_uInt8 nAutoKern );
226 : inline void SetTransparent( const bool bTrans );
227 : inline void SetWordLineMode( const bool bWordLineMode );
228 : inline void SetFixKerning( const short nNewKern );
229 : inline void SetCaseMap( const SvxCaseMap eNew );
230 : inline void SetEmphasisMark( const FontEmphasisMark eValue );
231 :
232 : // methods for sub-/superscript
233 : inline void SetEscapement( const short nNewEsc );
234 : inline void SetProportion( const sal_uInt8 nNewPropr );
235 :
236 : inline void SetPropWidth( const sal_uInt16 nNew );
237 :
238 : inline void SetFamily( const FontFamily eFamily, const sal_uInt8 nWhich );
239 : inline void SetName( const OUString& rName, const sal_uInt8 nWhich );
240 : inline void SetStyleName( const OUString& rStyleName, const sal_uInt8 nWhich );
241 : inline void SetSize( const Size& rSize, const sal_uInt8 nWhich );
242 : inline void SetWeight( const FontWeight eWeight, const sal_uInt8 nWhich );
243 : inline void SetItalic( const FontItalic eItalic, const sal_uInt8 nWhich );
244 : inline void SetLanguage( LanguageType eNewLang, const sal_uInt8 nWhich );
245 : inline void SetCharSet( const rtl_TextEncoding eCharSet, const sal_uInt8 nWhich );
246 : inline void SetPitch( const FontPitch ePitch, const sal_uInt8 nWhich );
247 : inline void SetRelief( const FontRelief eNew );
248 :
249 : // Get/Set-methods for the current setting
250 : inline void SetNoHyph( const bool bNew );
251 : inline bool IsNoHyph() const { return bNoHyph; }
252 : inline void SetBlink( const bool bBlink );
253 43941 : inline bool IsBlink() const { return bBlink; }
254 3050 : inline sal_uInt8 &GetTox() { return nToxCnt; }
255 : inline sal_uInt8 GetTox() const { return nToxCnt; }
256 146419 : inline bool IsTox() const { return ( 0 != nToxCnt ); }
257 310 : inline sal_uInt8 &GetRef() { return nRefCnt; }
258 : inline sal_uInt8 GetRef() const { return nRefCnt; }
259 146345 : inline bool IsRef() const { return ( 0 != nRefCnt ); }
260 2324 : inline sal_uInt8 &GetMeta() { return m_nMetaCount; }
261 : inline sal_uInt8 GetMeta() const { return m_nMetaCount; }
262 146309 : inline bool IsMeta() const { return (0 != m_nMetaCount); }
263 134 : inline sal_uInt8 &GetInputField() { return m_nInputFieldCount; }
264 : inline sal_uInt8 GetInputField() const { return m_nInputFieldCount; }
265 146377 : inline bool IsInputField() const { return (0 != m_nInputFieldCount); }
266 : inline void SetURL( const bool bURL );
267 205441 : inline bool IsURL() const { return bURL; }
268 : inline void SetGreyWave( const bool bNew );
269 43859 : inline bool IsGreyWave() const { return bGreyWave; }
270 : inline void SetNoCol( const bool bNew );
271 : inline bool IsNoCol() const { return bNoColReplace; }
272 :
273 : inline void SetPaintBlank( const bool bNew );
274 856 : inline bool IsPaintBlank() const { return bPaintBlank; }
275 : inline void SetPaintWrong( const bool bNew );
276 : inline bool IsPaintWrong() const { return bPaintWrong; }
277 :
278 : // setting of the base class font for SwTxtCharFmt
279 : void SetDiffFnt( const SfxItemSet* pSet,
280 : const IDocumentSettingAccess* pIDocumentSettingAccess );
281 :
282 0 : inline const SvxFont &GetFnt( const sal_uInt8 nWhich ) const
283 0 : { return aSub[nWhich]; };
284 :
285 0 : bool IsSymbol( SwViewShell *pSh )
286 0 : { return aSub[nActual].IsSymbol( pSh ); }
287 483982 : FontUnderline GetUnderline() const { return aSub[nActual].GetUnderline(); }
288 1051538 : const Color& GetUnderColor() const { return aUnderColor; }
289 654 : FontUnderline GetOverline() const { return aSub[nActual].GetOverline(); }
290 1051410 : const Color& GetOverColor() const { return aOverColor; }
291 : short GetFixKerning() const { return aSub[nActual].GetFixKerning(); }
292 654 : FontStrikeout GetStrikeout() const { return aSub[nActual].GetStrikeout(); }
293 : const Color& GetColor() const { return aSub[nActual].GetColor(); }
294 : bool IsShadow() const { return aSub[nActual].IsShadow(); }
295 15014 : bool IsWordLineMode() const { return aSub[nActual].IsWordLineMode(); }
296 : bool IsOutline() const { return aSub[nActual].IsOutline(); }
297 : bool IsKerning() const { return aSub[nActual].IsKerning(); }
298 17112 : short GetEscapement() const { return aSub[nActual].GetEscapement(); }
299 13952 : SvxCaseMap GetCaseMap() const { return aSub[nActual].GetCaseMap(); }
300 580 : sal_uInt8 GetPropr() const { return aSub[nActual].GetPropr(); }
301 164319 : FontItalic GetItalic() const { return aSub[nActual].GetItalic(); }
302 267832 : LanguageType GetLanguage() const { return aSub[nActual].GetLanguage(); }
303 : FontAlign GetAlign() const { return aSub[nActual].GetAlign(); }
304 : const OUString& GetName() const { return aSub[nActual].GetName(); }
305 : const OUString& GetStyleName() const {return aSub[nActual].GetStyleName();}
306 : FontFamily GetFamily() const { return aSub[nActual].GetFamily(); }
307 : FontPitch GetPitch() const { return aSub[nActual].GetPitch(); }
308 : rtl_TextEncoding GetCharSet() const { return aSub[nActual].GetCharSet(); }
309 42472 : long GetHeight() const { return aSub[nActual].GetSize().Height(); }
310 474 : FontWeight GetWeight() const { return aSub[nActual].GetWeight(); }
311 0 : FontEmphasisMark GetEmphasisMark() const
312 0 : { return aSub[nActual].GetEmphasisMark(); }
313 : sal_uInt16 GetPropWidth() const { return aSub[nActual].GetPropWidth(); }
314 : sal_uInt16 GetOrientation( const bool nVertLayout = false ) const;
315 :
316 0 : inline const OUString& GetName( const sal_uInt8 nWhich ) const
317 0 : { return aSub[nWhich].GetName(); }
318 0 : inline LanguageType GetLanguage( const sal_uInt8 nWhich ) const
319 0 : { return aSub[nWhich].GetLanguage(); }
320 : inline const OUString& GetStyleName( const sal_uInt8 nWhich ) const
321 : { return aSub[nWhich].GetStyleName(); }
322 : inline FontFamily GetFamily( const sal_uInt8 nWhich ) const
323 : { return aSub[nWhich].GetFamily(); }
324 : inline FontItalic GetItalic( const sal_uInt8 nWhich ) const
325 : { return aSub[nWhich].GetItalic(); }
326 : inline FontPitch GetPitch( const sal_uInt8 nWhich ) const
327 : { return aSub[nWhich].GetPitch(); }
328 20 : inline rtl_TextEncoding GetCharSet( const sal_uInt8 nWhich ) const
329 20 : { return aSub[nWhich].GetCharSet(); }
330 66 : inline long GetHeight( const sal_uInt8 nWhich ) const
331 66 : { return aSub[nWhich].GetSize().Height(); }
332 : inline FontWeight GetWeight( const sal_uInt8 nWhich ) const
333 : { return aSub[nWhich].GetWeight(); }
334 : inline FontEmphasisMark GetEmphasisMark( const sal_uInt8 nWhich ) const
335 : { return aSub[nWhich].GetEmphasisMark(); }
336 :
337 : // makes the logical font be effective in the OutputDevice
338 : void ChgPhysFnt( SwViewShell *pSh, OutputDevice& rOut );
339 :
340 : Size GetCapitalSize( SwDrawTextInfo& rInf )
341 : { return aSub[nActual].GetCapitalSize( rInf ); }
342 :
343 : sal_Int32 GetCapitalBreak( SwViewShell const* pSh, const OutputDevice* pOut,
344 : const SwScriptInfo* pScript, const OUString& rTxt,
345 : long nTextWidth, const sal_Int32 nIdx,
346 : const sal_Int32 nLen );
347 :
348 : sal_Int32 GetCapitalCrsrOfst( SwDrawTextInfo& rInf )
349 : { return aSub[nActual].GetCapitalCrsrOfst( rInf ); }
350 :
351 : void DrawCapital( SwDrawTextInfo &rInf )
352 : { aSub[nActual].DrawCapital( rInf ); }
353 :
354 : void DrawStretchCapital( SwDrawTextInfo &rInf )
355 : { aSub[nActual].DrawStretchCapital( rInf ); }
356 :
357 4 : void DoOnCapitals( SwDoCapitals &rDo )
358 4 : { aSub[nActual].DoOnCapitals( rDo ); }
359 :
360 163608 : Size _GetTxtSize( SwDrawTextInfo& rInf )
361 163608 : { rInf.SetFont( this ); return aSub[nActual]._GetTxtSize( rInf ); }
362 :
363 : sal_Int32 GetTxtBreak( SwDrawTextInfo& rInf, long nTextWidth );
364 :
365 6 : sal_Int32 _GetCrsrOfst( SwDrawTextInfo& rInf )
366 6 : { return aSub[nActual]._GetCrsrOfst( rInf ); }
367 :
368 43859 : inline void _DrawText( SwDrawTextInfo &rInf )
369 43859 : { aSub[nActual]._DrawText( rInf, IsGreyWave() ); }
370 :
371 272 : inline void _DrawStretchText( SwDrawTextInfo &rInf )
372 272 : { aSub[nActual]._DrawStretchText( rInf ); }
373 :
374 172004 : inline short CheckKerning()
375 172004 : { return aSub[nActual].CheckKerning(); }
376 :
377 381527 : inline sal_uInt16 GetAscent( SwViewShell *pSh, const OutputDevice& rOut )
378 381527 : { return aSub[nActual].GetAscent( pSh, rOut ); }
379 525407 : inline sal_uInt16 GetHeight( SwViewShell *pSh, const OutputDevice& rOut )
380 525407 : { return aSub[nActual].GetHeight( pSh, rOut ); }
381 :
382 68560 : inline void Invalidate()
383 68560 : { bFntChg = bOrgChg = true; }
384 :
385 : void SetTopBorder( const editeng::SvxBorderLine* pTopBorder );
386 : void SetBottomBorder( const editeng::SvxBorderLine* pBottomBorder );
387 : void SetRightBorder( const editeng::SvxBorderLine* pRightBorder );
388 : void SetLeftBorder( const editeng::SvxBorderLine* pLeftBorder );
389 :
390 44 : const boost::optional<editeng::SvxBorderLine>& GetTopBorder() const { return m_aTopBorder; }
391 44 : const boost::optional<editeng::SvxBorderLine>& GetBottomBorder() const { return m_aBottomBorder; }
392 3927 : const boost::optional<editeng::SvxBorderLine>& GetRightBorder() const { return m_aRightBorder; }
393 43859 : const boost::optional<editeng::SvxBorderLine>& GetLeftBorder() const { return m_aLeftBorder; }
394 :
395 : // Get absolute border correspond to the layout verticality and orientation.
396 : const boost::optional<editeng::SvxBorderLine>& GetAbsTopBorder( const bool bVertLayout ) const;
397 : const boost::optional<editeng::SvxBorderLine>& GetAbsBottomBorder( const bool bVertLayout ) const;
398 : const boost::optional<editeng::SvxBorderLine>& GetAbsRightBorder( const bool bVertLayout ) const;
399 : const boost::optional<editeng::SvxBorderLine>& GetAbsLeftBorder( const bool bVertLayout ) const;
400 :
401 : void SetTopBorderDist( const sal_uInt16 nTopDist );
402 : void SetBottomBorderDist( const sal_uInt16 nBottomDist );
403 : void SetRightBorderDist( const sal_uInt16 nRightDist );
404 : void SetLeftBorderDist( const sal_uInt16 nLeftDist );
405 :
406 20 : sal_uInt16 GetTopBorderDist() const { return m_nTopBorderDist; }
407 20 : sal_uInt16 GetBottomBorderDist() const { return m_nBottomBorderDist; }
408 20 : sal_uInt16 GetRightBorderDist() const { return m_nRightBorderDist; }
409 20 : sal_uInt16 GetLeftBorderDist() const { return m_nLeftBorderDist; }
410 :
411 : // Return with the whole space which border holed (border width, spacing and shadow width)
412 : sal_uInt16 GetTopBorderSpace() const;
413 : sal_uInt16 GetBottomBorderSpace() const;
414 : sal_uInt16 GetRightBorderSpace() const;
415 : sal_uInt16 GetLeftBorderSpace() const;
416 :
417 : /// Check whether font has any border on any side
418 : bool HasBorder() const;
419 :
420 : void SetShadowColor( const Color& rColor );
421 : void SetShadowWidth( const sal_uInt16 nWidth );
422 : void SetShadowLocation( const SvxShadowLocation aLocation );
423 :
424 44499 : const Color& GetShadowColor() const { return m_aShadowColor; }
425 44499 : sal_uInt16 GetShadowWidth() const { return m_nShadowWidth; }
426 20 : SvxShadowLocation GetShadowLocation() const { return m_aShadowLocation; }
427 :
428 : /**
429 : * Get the absolute shadow location dependent from orientation.
430 : *
431 : * @param[in] bVertLayout true, if the container layout is vertical
432 : * false, otherwise
433 : * @return absolute location
434 : **/
435 : SvxShadowLocation GetAbsShadowLocation( const bool bVertLayout ) const;
436 :
437 : /**
438 : * Calculate the shadow space on the specified side dependent from
439 : * the orientation and connection with neightbours.
440 : * @see shaditem.hxx for integer constants of sides
441 : *
442 : * @param[in] nShadow specify the side
443 : * @param[in] bVertLayout true, if the container layout is vertical
444 : * false, otherwise
445 : * @param[in] bSkipLeft relative left shadow space is skipped
446 : * @param[in] bSkipRight relative right shadow space is skipped
447 : * @return the shadow space
448 : **/
449 : sal_uInt16 CalcShadowSpace(
450 : const sal_uInt16 nShadow, const bool bVertLayout,
451 : const bool bSkipLeft, const bool bSkipRight ) const;
452 : };
453 :
454 173940 : inline void SwFont::SetColor( const Color& rColor )
455 : {
456 173940 : bFntChg = true;
457 173940 : aSub[0].SetColor( rColor );
458 173940 : aSub[1].SetColor( rColor );
459 173940 : aSub[2].SetColor( rColor );
460 173940 : }
461 :
462 : // encapsulated SV-Font-method
463 521820 : inline void SwSubFont::SetColor( const Color& rColor )
464 : {
465 521820 : pMagic = 0;
466 521820 : Font::SetColor( rColor );
467 521820 : }
468 :
469 : // encapsulated SV-Font-method
470 384 : inline void SwSubFont::SetFillColor( const Color& rColor )
471 : {
472 384 : pMagic = 0;
473 384 : Font::SetFillColor( rColor );
474 384 : }
475 :
476 128 : inline void SwFont::SetFillColor( const Color& rColor )
477 : {
478 128 : bFntChg = true;
479 128 : aSub[0].SetFillColor( rColor );
480 128 : aSub[1].SetFillColor( rColor );
481 128 : aSub[2].SetFillColor( rColor );
482 128 : }
483 :
484 : // encapsulated SV-Font-method
485 465474 : inline void SwSubFont::SetFamily( const FontFamily eFamily )
486 : {
487 465474 : pMagic = 0;
488 465474 : Font::SetFamily( eFamily );
489 465474 : }
490 :
491 150674 : inline void SwFont::SetFamily( const FontFamily eFamily, const sal_uInt8 nWhich )
492 : {
493 150674 : bFntChg = true;
494 150674 : aSub[nWhich].SetFamily( eFamily );
495 150674 : }
496 :
497 : // encapsulated SV-Font-method
498 460208 : inline void SwSubFont::SetName( const OUString& rName )
499 : {
500 460208 : pMagic = 0;
501 460208 : Font::SetName( rName );
502 460208 : }
503 :
504 150674 : inline void SwFont::SetName( const OUString& rName, const sal_uInt8 nWhich )
505 : {
506 150674 : bFntChg = true;
507 150674 : aSub[nWhich].SetName( rName );
508 150674 : }
509 :
510 : // encapsulated SV-Font-method
511 460208 : inline void SwSubFont::SetStyleName( const OUString& rStyleName )
512 : {
513 460208 : pMagic = 0;
514 460208 : Font::SetStyleName( rStyleName );
515 460208 : }
516 :
517 150674 : inline void SwFont::SetStyleName( const OUString& rStyle, const sal_uInt8 nWhich )
518 : {
519 150674 : bFntChg = true;
520 150674 : aSub[nWhich].SetStyleName( rStyle );
521 150674 : }
522 :
523 : // encapsulated SV-Font-method
524 460208 : inline void SwSubFont::SetCharSet( const rtl_TextEncoding eCharSet )
525 : {
526 460208 : pMagic = 0;
527 460208 : Font::SetCharSet( eCharSet );
528 460208 : }
529 :
530 150674 : inline void SwFont::SetCharSet( const rtl_TextEncoding eCharSet, const sal_uInt8 nWhich )
531 : {
532 150674 : bFntChg = true;
533 150674 : aSub[nWhich].SetCharSet( eCharSet );
534 150674 : }
535 :
536 : // encapsulated SV-Font-method
537 460202 : inline void SwSubFont::SetPitch( const FontPitch ePitch )
538 : {
539 460202 : pMagic = 0;
540 460202 : Font::SetPitch( ePitch );
541 460202 : }
542 :
543 : // encapsulated SV-Font-method
544 150668 : inline void SwFont::SetPitch( const FontPitch ePitch, const sal_uInt8 nWhich )
545 : {
546 150668 : bFntChg = true;
547 150668 : aSub[nWhich].SetPitch( ePitch );
548 150668 : }
549 :
550 : // encapsulated SV-Font-method
551 418752 : inline void SwSubFont::SetAlign( const FontAlign eAlign )
552 : {
553 418752 : pMagic = 0;
554 418752 : Font::SetAlign( eAlign );
555 418752 : }
556 :
557 139584 : inline void SwFont::SetAlign( const FontAlign eAlign )
558 : {
559 139584 : bFntChg = true;
560 139584 : aSub[0].SetAlign( eAlign );
561 139584 : aSub[1].SetAlign( eAlign );
562 139584 : aSub[2].SetAlign( eAlign );
563 139584 : }
564 :
565 : // encapsulated SV-Font-method
566 436716 : inline void SwSubFont::SetWeight( const FontWeight eWeight )
567 : {
568 436716 : pMagic = 0;
569 436716 : Font::SetWeight( eWeight );
570 436716 : }
571 :
572 127182 : inline void SwFont::SetWeight( const FontWeight eWeight, const sal_uInt8 nWhich )
573 : {
574 127182 : bFntChg = true;
575 127182 : aSub[nWhich].SetWeight( eWeight );
576 127182 : }
577 :
578 : // encapsulated SV-Font-method
579 413472 : inline void SwSubFont::SetUnderline( const FontUnderline eUnderline )
580 : {
581 413472 : pMagic = 0;
582 413472 : Font::SetUnderline( eUnderline );
583 413472 : }
584 :
585 137690 : inline void SwFont::SetUnderline( const FontUnderline eUnderline )
586 : {
587 137690 : bFntChg = true;
588 137690 : aSub[0].SetUnderline( eUnderline );
589 137690 : aSub[1].SetUnderline( eUnderline );
590 137690 : aSub[2].SetUnderline( eUnderline );
591 137690 : }
592 :
593 : // encapsulated SV-Font-method
594 336610 : inline void SwSubFont::SetOverline( const FontUnderline eOverline )
595 : {
596 336610 : pMagic = 0;
597 336610 : Font::SetOverline( eOverline );
598 336610 : }
599 :
600 112156 : inline void SwFont::SetOverline( const FontUnderline eOverline )
601 : {
602 112156 : bFntChg = true;
603 112156 : aSub[0].SetOverline( eOverline );
604 112156 : aSub[1].SetOverline( eOverline );
605 112156 : aSub[2].SetOverline( eOverline );
606 112156 : }
607 :
608 : // encapsulated SV-Font-method
609 326662 : inline void SwSubFont::SetStrikeout( const FontStrikeout eStrikeout )
610 : {
611 326662 : pMagic = 0;
612 326662 : Font::SetStrikeout( eStrikeout );
613 326662 : }
614 :
615 108840 : inline void SwFont::SetStrikeout( const FontStrikeout eStrikeout )
616 : {
617 108840 : bFntChg = true;
618 108840 : aSub[0].SetStrikeout( eStrikeout );
619 108840 : aSub[1].SetStrikeout( eStrikeout );
620 108840 : aSub[2].SetStrikeout( eStrikeout );
621 108840 : }
622 :
623 : // encapsulated SV-Font-method
624 375822 : inline void SwSubFont::SetItalic( const FontItalic eItalic )
625 : {
626 375822 : pMagic = 0;
627 375822 : Font::SetItalic( eItalic );
628 375822 : }
629 :
630 66288 : inline void SwFont::SetItalic( const FontItalic eItalic, const sal_uInt8 nWhich )
631 : {
632 66288 : bFntChg = true;
633 66288 : aSub[nWhich].SetItalic( eItalic );
634 66288 : }
635 :
636 : // encapsulated SV-Font-method
637 315702 : inline void SwSubFont::SetOutline( const bool bOutline )
638 : {
639 315702 : pMagic = 0;
640 315702 : Font::SetOutline( bOutline );
641 315702 : }
642 :
643 105234 : inline void SwFont::SetOutline( const bool bOutline )
644 : {
645 105234 : bFntChg = true;
646 105234 : aSub[0].SetOutline( bOutline );
647 105234 : aSub[1].SetOutline( bOutline );
648 105234 : aSub[2].SetOutline( bOutline );
649 105234 : }
650 :
651 : // encapsulated SV-Font-method
652 316632 : inline void SwSubFont::SetShadow( const bool bShadow )
653 : {
654 316632 : pMagic = 0;
655 316632 : Font::SetShadow( bShadow );
656 316632 : }
657 :
658 105544 : inline void SwFont::SetShadow( const bool bShadow )
659 : {
660 105544 : bFntChg = true;
661 105544 : aSub[0].SetShadow( bShadow );
662 105544 : aSub[1].SetShadow( bShadow );
663 105544 : aSub[2].SetShadow( bShadow );
664 105544 : }
665 :
666 : // encapsulated SV-Font-method
667 326658 : inline void SwSubFont::SetAutoKern( const sal_uInt8 nAutoKern )
668 : {
669 326658 : pMagic = 0;
670 326658 : Font::SetKerning( nAutoKern );
671 326658 : }
672 :
673 108886 : inline void SwFont::SetAutoKern( sal_uInt8 nAutoKern )
674 : {
675 108886 : bFntChg = true;
676 108886 : aSub[1].SetAutoKern( nAutoKern );
677 108886 : if( nAutoKern )
678 94240 : nAutoKern = KERNING_FONTSPECIFIC;
679 108886 : aSub[0].SetAutoKern( nAutoKern );
680 108886 : aSub[2].SetAutoKern( nAutoKern );
681 108886 : }
682 :
683 139584 : inline void SwFont::SetTransparent( const bool bTrans )
684 : {
685 139584 : aSub[0].SetTransparent( bTrans );
686 139584 : aSub[1].SetTransparent( bTrans );
687 139584 : aSub[2].SetTransparent( bTrans );
688 139584 : }
689 :
690 107812 : inline void SwFont::SetFixKerning( const short nNewKern )
691 : {
692 107812 : aSub[SW_LATIN].SetFixKerning( nNewKern );
693 107812 : aSub[SW_CJK].SetFixKerning( nNewKern );
694 107812 : aSub[SW_CTL].SetFixKerning( nNewKern );
695 107812 : }
696 :
697 107478 : inline void SwFont::SetCaseMap( const SvxCaseMap eNew )
698 : {
699 107478 : aSub[SW_LATIN].SetCaseMap( eNew );
700 107478 : aSub[SW_CJK].SetCaseMap( eNew );
701 107478 : aSub[SW_CTL].SetCaseMap( eNew );
702 107478 : }
703 :
704 : // encapsulated SV-Font-method
705 316662 : inline void SwSubFont::SetWordLineMode( const bool bWordLineMode )
706 : {
707 316662 : pMagic = 0;
708 316662 : Font::SetWordLineMode( bWordLineMode );
709 316662 : }
710 :
711 105554 : inline void SwFont::SetWordLineMode( const bool bWordLineMode )
712 : {
713 105554 : bFntChg = true;
714 105554 : aSub[0].SetWordLineMode( bWordLineMode );
715 105554 : aSub[1].SetWordLineMode( bWordLineMode );
716 105554 : aSub[2].SetWordLineMode( bWordLineMode );
717 105554 : }
718 : // encapsulated SV-Font-method
719 315708 : inline void SwSubFont::SetEmphasisMark( const FontEmphasisMark eValue )
720 : {
721 315708 : pMagic = 0;
722 315708 : Font::SetEmphasisMark( eValue );
723 315708 : }
724 :
725 105236 : inline void SwFont::SetEmphasisMark( const FontEmphasisMark eValue )
726 : {
727 105236 : bFntChg = true;
728 105236 : aSub[0].SetEmphasisMark( eValue );
729 105236 : aSub[1].SetEmphasisMark( eValue );
730 105236 : aSub[2].SetEmphasisMark( eValue );
731 105236 : }
732 :
733 104112 : inline void SwFont::SetPropWidth( const sal_uInt16 nNew )
734 : {
735 104112 : if( nNew != aSub[0].GetPropWidth() )
736 : {
737 1976 : bFntChg = true;
738 1976 : aSub[0].SetPropWidth( nNew );
739 1976 : aSub[1].SetPropWidth( nNew );
740 1976 : aSub[2].SetPropWidth( nNew );
741 : }
742 104112 : }
743 :
744 : // encapsulated SV-Font-method
745 9936 : inline void SwSubFont::SetRelief( const FontRelief eNew )
746 : {
747 9936 : pMagic = 0;
748 9936 : Font::SetRelief( eNew );
749 9936 : }
750 :
751 104822 : inline void SwFont::SetRelief( const FontRelief eNew )
752 : {
753 104822 : if( eNew != aSub[0].GetRelief() )
754 : {
755 3312 : bFntChg = true;
756 3312 : aSub[0].SetRelief( eNew );
757 3312 : aSub[1].SetRelief( eNew );
758 3312 : aSub[2].SetRelief( eNew );
759 : }
760 104822 : }
761 :
762 : // overloaded font-method
763 519764 : inline void SwSubFont::SetSize( const Size& rSize )
764 : {
765 519764 : aSize = rSize;
766 519764 : if ( GetPropr() == 100 )
767 517042 : Font::SetSize( aSize );
768 : else
769 : {
770 : Font::SetSize( Size(
771 2722 : (long) aSize.Width() * GetPropr() / 100L,
772 5444 : (long) aSize.Height() * GetPropr() / 100L ) );
773 : }
774 519764 : pMagic = 0;
775 519764 : }
776 :
777 246898 : inline void SwFont::SetSize( const Size& rSize, const sal_uInt8 nWhich )
778 : {
779 246898 : if( aSub[nWhich].aSize != rSize )
780 : {
781 203970 : aSub[nWhich].SetSize( rSize );
782 203970 : bFntChg = true;
783 203970 : bOrgChg = true;
784 : }
785 246898 : }
786 :
787 802785 : inline void SwFont::SetActual( sal_uInt8 nNew )
788 : {
789 802785 : if ( nActual != nNew )
790 : {
791 808 : bFntChg = true;
792 808 : bOrgChg = true;
793 808 : nActual = nNew;
794 : }
795 802785 : }
796 :
797 34514 : inline void SwSubFont::SetProportion( const sal_uInt8 nNewPropr )
798 : {
799 34514 : pMagic = 0;
800 34514 : Font::SetSize( Size( (long) aSize.Width() * nNewPropr / 100L,
801 69028 : (long) aSize.Height() * nNewPropr / 100L ) );
802 34514 : SvxFont::SetPropr( nNewPropr );
803 34514 : }
804 :
805 29014 : inline void SwFont::SetProportion( const sal_uInt8 nNewPropr )
806 : {
807 29014 : if( nNewPropr != aSub[0].GetPropr() )
808 : {
809 11358 : bFntChg = true;
810 11358 : bOrgChg = true;
811 :
812 11358 : aSub[0].SetProportion( nNewPropr );
813 11358 : aSub[1].SetProportion( nNewPropr );
814 11358 : aSub[2].SetProportion( nNewPropr );
815 : }
816 29014 : }
817 :
818 31200 : inline void SwSubFont::SetEscapement( const short nNewEsc )
819 : {
820 31200 : pMagic = 0;
821 31200 : SvxFont::SetEscapement( nNewEsc );
822 31200 : }
823 :
824 109910 : inline void SwFont::SetEscapement( const short nNewEsc )
825 : {
826 109910 : if( nNewEsc != aSub[0].GetEscapement() )
827 : {
828 : // these have to be set, otherwise nOrgHeight and nOrgAscent will not
829 : // be calculated
830 10400 : bFntChg = true;
831 10400 : bOrgChg = true;
832 :
833 10400 : aSub[0].SetEscapement( nNewEsc );
834 10400 : aSub[1].SetEscapement( nNewEsc );
835 10400 : aSub[2].SetEscapement( nNewEsc );
836 : }
837 109910 : }
838 :
839 342616 : inline void SwSubFont::SetLanguage( LanguageType eNewLang )
840 : {
841 342616 : pMagic = 0;
842 342616 : if( eNewLang == LANGUAGE_SYSTEM )
843 222 : eNewLang = (LanguageType)GetAppLanguage();
844 342616 : SvxFont::SetLanguage( eNewLang );
845 342616 : }
846 :
847 32534 : inline void SwFont::SetLanguage( const LanguageType eNewLang, const sal_uInt8 nWhich )
848 : {
849 32534 : aSub[nWhich].SetLanguage( eNewLang );
850 32534 : if( SW_CJK == nWhich )
851 : {
852 5948 : aSub[SW_LATIN].SetCJKContextLanguage( eNewLang );
853 5948 : aSub[SW_CJK].SetCJKContextLanguage( eNewLang );
854 5948 : aSub[SW_CTL].SetCJKContextLanguage( eNewLang );
855 : }
856 32534 : }
857 :
858 : inline void SwFont::SetPaintBlank( const bool bNew )
859 : {
860 : bPaintBlank = bNew;
861 : }
862 :
863 : inline void SwFont::SetPaintWrong( const bool bNew )
864 : {
865 : bPaintWrong = bNew;
866 : }
867 :
868 0 : inline void SwFont::SetNoHyph( const bool bNew )
869 : {
870 0 : bNoHyph = bNew;
871 0 : }
872 :
873 2550 : inline void SwFont::SetBlink( const bool bNew )
874 : {
875 2550 : bBlink = bNew;
876 2550 : }
877 :
878 : inline void SwFont::SetURL( const bool bNew )
879 : {
880 : bURL = bNew;
881 : }
882 :
883 0 : inline void SwFont::SetGreyWave( const bool bNew )
884 : {
885 0 : bGreyWave = bNew;
886 0 : }
887 :
888 5396 : inline void SwFont::SetNoCol( const bool bNew )
889 : {
890 5396 : bNoColReplace = bNew;
891 5396 : }
892 :
893 4818 : inline void SwSubFont::SetVertical( const sal_uInt16 nDir, const bool bVertFormat )
894 : {
895 4818 : pMagic = 0;
896 4818 : Font::SetVertical( bVertFormat );
897 4818 : Font::SetOrientation( nDir );
898 4818 : }
899 :
900 103962 : inline void SwFont::SetTopBorderDist( const sal_uInt16 nTopDist )
901 : {
902 103962 : m_nTopBorderDist = nTopDist;
903 103962 : bFntChg = true;
904 103962 : aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
905 103962 : }
906 :
907 103962 : inline void SwFont::SetBottomBorderDist( const sal_uInt16 nBottomDist )
908 : {
909 103962 : m_nBottomBorderDist = nBottomDist;
910 103962 : bFntChg = true;
911 103962 : aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
912 103962 : }
913 :
914 103962 : inline void SwFont::SetRightBorderDist( const sal_uInt16 nRightDist )
915 : {
916 103962 : m_nRightBorderDist = nRightDist;
917 103962 : bFntChg = true;
918 103962 : aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
919 103962 : }
920 :
921 103962 : inline void SwFont::SetLeftBorderDist( const sal_uInt16 nLeftDist )
922 : {
923 103962 : m_nLeftBorderDist = nLeftDist;
924 103962 : bFntChg = true;
925 103962 : aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
926 103962 : }
927 :
928 668617 : inline sal_uInt16 SwFont::GetTopBorderSpace() const
929 : {
930 668617 : sal_uInt16 nRet = 0;
931 668617 : if( m_aTopBorder )
932 : {
933 200 : nRet += m_aTopBorder.get().GetScaledWidth() + m_nTopBorderDist;
934 : }
935 1337210 : if( m_aShadowLocation == SVX_SHADOW_TOPLEFT ||
936 668593 : m_aShadowLocation == SVX_SHADOW_TOPRIGHT )
937 : {
938 60 : nRet += m_nShadowWidth;
939 : }
940 668617 : return nRet;
941 : }
942 :
943 337512 : inline sal_uInt16 SwFont::GetBottomBorderSpace() const
944 : {
945 337512 : sal_uInt16 nRet = 0;
946 337512 : if( m_aBottomBorder )
947 : {
948 100 : nRet += m_aBottomBorder.get().GetScaledWidth() + m_nBottomBorderDist;
949 : }
950 675018 : if( m_aShadowLocation == SVX_SHADOW_BOTTOMLEFT ||
951 337506 : m_aShadowLocation == SVX_SHADOW_BOTTOMRIGHT )
952 : {
953 30 : nRet += m_nShadowWidth;
954 : }
955 337512 : return nRet;
956 : }
957 :
958 168230 : inline sal_uInt16 SwFont::GetRightBorderSpace() const
959 : {
960 168230 : sal_uInt16 nRet = 0;
961 168230 : if( m_aRightBorder )
962 : {
963 58 : nRet += m_aRightBorder.get().GetScaledWidth() + m_nRightBorderDist;
964 : }
965 336448 : if( m_aShadowLocation == SVX_SHADOW_TOPRIGHT ||
966 168218 : m_aShadowLocation == SVX_SHADOW_BOTTOMRIGHT )
967 : {
968 30 : nRet += m_nShadowWidth;
969 : }
970 168230 : return nRet;
971 : }
972 :
973 168260 : inline sal_uInt16 SwFont::GetLeftBorderSpace() const
974 : {
975 168260 : sal_uInt16 nRet = 0;
976 168260 : if( m_aLeftBorder )
977 : {
978 94 : nRet += m_aLeftBorder.get().GetScaledWidth() + m_nLeftBorderDist;
979 : }
980 336514 : if( m_aShadowLocation == SVX_SHADOW_TOPLEFT ||
981 168254 : m_aShadowLocation == SVX_SHADOW_BOTTOMLEFT )
982 : {
983 14 : nRet += m_nShadowWidth;
984 : }
985 168260 : return nRet;
986 : }
987 :
988 206939 : inline bool SwFont::HasBorder() const
989 : {
990 206939 : return m_aTopBorder || m_aBottomBorder || m_aLeftBorder || m_aRightBorder;
991 : }
992 :
993 103760 : inline void SwFont::SetShadowColor( const Color& rColor )
994 : {
995 103760 : m_aShadowColor = rColor;
996 103760 : bFntChg = true;
997 103760 : aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
998 103760 : }
999 :
1000 103760 : inline void SwFont::SetShadowWidth( const sal_uInt16 nWidth )
1001 : {
1002 103760 : m_nShadowWidth = nWidth;
1003 103760 : bFntChg = true;
1004 103760 : aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
1005 103760 : }
1006 :
1007 103760 : inline void SwFont::SetShadowLocation( const SvxShadowLocation aLocation )
1008 : {
1009 103760 : m_aShadowLocation = aLocation;
1010 103760 : bFntChg = true;
1011 103760 : aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
1012 103760 : }
1013 :
1014 103266 : inline void SwFont::SetHighlightColor( const Color& aNewColor )
1015 : {
1016 103266 : m_aHighlightColor = aNewColor;
1017 103266 : bFntChg = true;
1018 103266 : aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
1019 103266 : }
1020 :
1021 : // Used for the "continuous underline" feature.
1022 : class SwUnderlineFont
1023 : {
1024 : Point aPos;
1025 : SwFont* pFnt;
1026 :
1027 : public:
1028 : // sets the font which should paint the common baseline
1029 : // and the starting point of the common baseline
1030 : SwUnderlineFont( SwFont& rFnt, const Point& rPoint );
1031 : ~SwUnderlineFont();
1032 :
1033 258 : SwFont& GetFont()
1034 : {
1035 : OSL_ENSURE( pFnt, "No underline font" );
1036 258 : return *pFnt;
1037 : }
1038 154 : const Point& GetPos() const { return aPos; }
1039 : // the x coordinate of the starting point has to be set for each portion
1040 128 : void SetPos( const Point& rPoint ) { aPos = rPoint; }
1041 : };
1042 :
1043 : #ifdef DBG_UTIL
1044 :
1045 : class SvStatistics
1046 : {
1047 : public:
1048 : sal_uInt16 nGetTextSize;
1049 : sal_uInt16 nDrawText;
1050 : sal_uInt16 nGetStretchTextSize;
1051 : sal_uInt16 nDrawStretchText;
1052 : sal_uInt16 nChangeFont;
1053 : sal_uInt16 nGetFontMetric;
1054 :
1055 : inline void Reset()
1056 : {
1057 : nGetTextSize = nDrawText = nGetStretchTextSize =
1058 : nDrawStretchText = nChangeFont = nGetFontMetric = 0;
1059 : }
1060 :
1061 : inline SvStatistics() { Reset(); }
1062 :
1063 : inline void PrintOn( SvStream &rOS ) const; //$ ostream
1064 : inline bool IsEmpty() const
1065 : {
1066 : return !( nGetTextSize || nDrawText ||
1067 : nDrawStretchText || nChangeFont || nGetFontMetric );
1068 : }
1069 : };
1070 :
1071 : // global variable, implemented in swfont.cxx
1072 : extern SvStatistics g_SvStat;
1073 :
1074 : #define SV_STAT(nWhich) ++(g_SvStat.nWhich);
1075 :
1076 : inline void SvStatistics::PrintOn( SvStream &rOS ) const //$ ostream
1077 : {
1078 : if( IsEmpty() )
1079 : return;
1080 :
1081 : rOS.WriteCharPtr( "{ SV called:\n" );
1082 : if( nGetTextSize )
1083 : rOS.WriteCharPtr( "\tnGetTextSize: " ).WriteUInt16( nGetTextSize ).WriteChar( '\n' );
1084 : if( nDrawText )
1085 : rOS.WriteCharPtr( "\tnDrawText: " ).WriteUInt16( nDrawText ).WriteChar( '\n' );
1086 : if( nGetStretchTextSize )
1087 : rOS.WriteCharPtr( "\tnGetStretchTextSize: " ).WriteUInt16( nGetStretchTextSize ).WriteChar( '\n' );
1088 : if( nDrawStretchText )
1089 : rOS.WriteCharPtr( "\tnDrawStretchText: " ).WriteUInt16( nDrawStretchText ).WriteChar( '\n' );
1090 : if( nChangeFont )
1091 : rOS.WriteCharPtr( "\tnChangeFont: " ).WriteUInt16( nChangeFont ).WriteChar( '\n' );
1092 : if( nGetFontMetric )
1093 : rOS.WriteCharPtr( "\tnGetFontMetric: " ).WriteUInt16( nGetFontMetric ).WriteChar( '\n' );
1094 : rOS.WriteCharPtr( "}\n" );
1095 : }
1096 : #else
1097 : #define SV_STAT(nWhich)
1098 : #endif /* DBG_UTIL */
1099 :
1100 : #endif
1101 :
1102 : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|