xref: /AOO41X/main/sw/source/core/inc/swfont.hxx (revision 41163fb6bc5f228f840590e3b299c791cded5b6e)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 #ifndef _SWFONT_HXX
24 #define _SWFONT_HXX
25 
26 #include <i18npool/lang.h>
27 #include <tools/color.hxx>
28 #ifndef _TOOLS_STREAM_HXX //autogen
29 #include <tools/stream.hxx>
30 #endif
31 #include <editeng/svxfont.hxx>
32 #include <swtypes.hxx>
33 #include <drawfont.hxx>     // SwDrawTextInfo
34 
35 class SfxItemSet;
36 class SwAttrSet;
37 class SwDoCapitals;     // DoCapitals
38 class SwDrawTextInfo;   // _DrawText
39 class SwScriptInfo;     // _GetTxtSize
40 class ViewShell;
41 class IDocumentSettingAccess;
42 
43 const xub_Unicode CH_BLANK = ' ';   // ' ' Leerzeichen
44 const xub_Unicode CH_BREAK = 0x0A;  //
45 const xub_Unicode CH_TAB   = '\t';  // \t
46 const xub_Unicode CH_PAR    = 0xB6;     // Paragraph
47 const xub_Unicode CH_BULLET = 0xB7;     // mittiger Punkt
48 
49 class SwSubFont : public SvxFont
50 {
51     friend class SwFont;
52     const void *pMagic;         // "MagicNumber" innerhalb des Fontcaches
53     Size        aSize;          // Fremde kriegen nur diese Size zu sehen
54     sal_uInt16      nFntIndex;      // Index im Fontcache
55     sal_uInt16      nOrgHeight;     // Hoehe inkl. Escapement/Proportion
56     sal_uInt16      nOrgAscent;     // Ascent inkl. Escapement/Proportion
57     sal_uInt16      nPropWidth;     // proportional width
58     inline SwSubFont() : aSize(0,0)
59     { pMagic = NULL; nFntIndex = nOrgHeight = nOrgAscent = 0; nPropWidth =100; }
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     sal_Bool operator==( const SwFont &rFnt ) const;
70     SwSubFont& operator=( const SwSubFont &rFont );
71 
72     short _CheckKerning( );
73 
74     sal_Bool ChgFnt( ViewShell *pSh, OutputDevice& rOut );
75     sal_Bool IsSymbol( ViewShell *pSh );
76     sal_uInt16 GetAscent( ViewShell *pSh, const OutputDevice& rOut );
77     sal_uInt16 GetHeight( ViewShell *pSh, const OutputDevice& rOut );
78     Size _GetTxtSize( SwDrawTextInfo& rInf );
79     Size GetCapitalSize( SwDrawTextInfo& rInf );
80     void _DrawText( SwDrawTextInfo &rInf, const sal_Bool bGrey );
81     void DrawCapital( SwDrawTextInfo &rInf );
82     void DrawStretchCapital( SwDrawTextInfo &rInf );
83     void DoOnCapitals( SwDoCapitals &rDo );
84     void _DrawStretchText( SwDrawTextInfo &rInf );
85     xub_StrLen _GetCrsrOfst( SwDrawTextInfo& rInf );
86     xub_StrLen GetCapitalCrsrOfst( SwDrawTextInfo& rInf );
87 
88     inline void SetColor( const Color& rColor );
89     inline void SetFillColor( const Color& rColor );
90     inline void SetCharSet( const CharSet eCharSet );
91     inline void SetPitch( const FontPitch ePitch );
92     inline void SetAlign( const FontAlign eAlign );
93     inline void SetUnderline( const FontUnderline eUnderline );
94     inline void SetOverline( const FontUnderline eOverline );
95     inline void SetStrikeout( const FontStrikeout eStrikeout );
96     inline void SetItalic( const FontItalic eItalic );
97     inline void SetOutline( const sal_Bool bOutline );
98     inline void SetVertical( const sal_uInt16 nDir, const sal_Bool bVertFormat );
99     inline void SetShadow( const sal_Bool bShadow );
100     inline void SetAutoKern( const sal_uInt8 nAutoKern );
101     inline void SetWordLineMode( const sal_Bool bWordLineMode );
102     inline void SetEmphasisMark( const FontEmphasisMark eValue );
103     inline void SetRelief( const FontRelief eNew );
104 
105     // Methoden fuer die Hoch-/Tiefstellung
106     inline void SetEscapement( const short nNewEsc );
107     inline void SetProportion( const sal_uInt8 nNewPropr );
108 
109     inline void SetFamily( const FontFamily eFamily );
110     inline void SetName( const XubString& rName );
111     inline void SetStyleName( const XubString& rStyleName );
112     inline void SetSize( const Size& rSize );
113     inline void SetWeight( const FontWeight eWeight );
114     inline void SetLanguage( LanguageType eNewLang );
115     inline short CheckKerning()
116     {   return GetFixKerning() >= 0 ? GetFixKerning() : _CheckKerning( ); }
117     inline void SetPropWidth( const sal_uInt16 nNew )
118         { pMagic = 0; nPropWidth = nNew; }
119 public:
120     sal_uInt16 GetPropWidth() const { return nPropWidth; }
121 };
122 
123 #define SW_LATIN 0
124 #define SW_CJK 1
125 #define SW_CTL 2
126 #define SW_SCRIPTS 3
127 
128 class SwFont
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  aUnderColor;    // color of the underlining
135     Color  aOverColor;     // color of the overlining
136 
137     sal_uInt8   nToxCnt;        // Zaehlt die Schachtelungstiefe der Tox
138     sal_uInt8   nRefCnt;        // Zaehlt die Schachtelungstiefe der Refs
139     sal_uInt8   m_nMetaCount;   // count META/METAFIELD
140     sal_uInt8   m_nInputFieldCount; // count INPUTFIELD
141 
142         sal_uInt8   nActual;        // actual font (Latin, CJK or CTL)
143 
144     // Schalter fuer die Font-Extensions
145     sal_Bool bNoHyph        :1;  // SwTxtNoHyphenHere:    keine Trennstelle
146     sal_Bool bBlink         :1;  // blinkender Font
147     sal_Bool bPaintBlank    :1;  // Blanks nicht mit DrawRect
148     sal_Bool bFntChg        :1;
149     sal_Bool bOrgChg        :1;  // nOrgHeight/Ascent sind invalid
150     sal_Bool bURL           :1;
151     sal_Bool bPaintWrong    :1;  // Flag fuer Rechtschreibfehler
152     sal_Bool bGreyWave      :1;  // Fuers extended TextInput: Graue Wellenlinie
153     sal_Bool bNoColReplace  :1;  // Replacement without colormanipulation
154 
155     sal_Bool operator==( const SwFont &rFnt ) const;
156 
157 protected:
158     inline SwFont() { pBackColor = NULL; nActual = SW_LATIN; }
159 
160 public:
161     SwFont( const SwAttrSet* pSet, const IDocumentSettingAccess* pIDocumentSettingAccess );
162     SwFont( const SwFont& rFont );
163 
164     inline void ChgFnt( ViewShell *pSh, OutputDevice& rOut )
165         { bPaintBlank = aSub[nActual].ChgFnt( pSh, rOut ); }
166 
167     ~SwFont(){ delete pBackColor; }
168 
169     SwFont& operator=( const SwFont &rFont );
170 
171     inline sal_uInt8 GetActual() const {    return nActual; }
172     inline void SetActual( sal_uInt8 nNew );
173     inline const SvxFont& GetActualFont() const { return aSub[nActual]; }
174 
175     // holt sich eine MagicNumber ueber SwFntAccess
176     void GoMagic( ViewShell *pSh, sal_uInt8 nWhich );
177     // set background color
178     void SetBackColor( Color* pNewColor );
179     inline const Color* GetBackColor() const{ return pBackColor; }
180 
181     inline void ChkMagic( ViewShell *pSh, sal_uInt8 nWhich )
182         { if( !aSub[ nWhich ].pMagic ) GoMagic( pSh, nWhich ); }
183     // uebernimmt die MagicNumber eines (hoffentlich ident.) Kollegen
184     inline void CopyMagic( const SwFont* pFnt, sal_uInt8 nWhich )
185         { aSub[nWhich].CopyMagic( pFnt->aSub[nWhich] ); }
186     inline void GetMagic( const void* &rMagic, sal_uInt16 &rIdx, sal_uInt8 nWhich )
187         { rMagic = aSub[nWhich].pMagic; rIdx = aSub[nWhich].nFntIndex; }
188     inline void SetMagic( const void* pNew, const sal_uInt16 nIdx, sal_uInt8 nWhich )
189         { aSub[nWhich].pMagic = pNew; aSub[nWhich].nFntIndex = nIdx; }
190     inline sal_Bool DifferentMagic( const SwFont* pFnt, sal_uInt8 nWhich )
191         { return aSub[nWhich].pMagic != pFnt->aSub[nWhich].pMagic ||
192           !aSub[nWhich].pMagic || !pFnt->aSub[nWhich].pMagic; }
193 
194     inline const Size &GetSize( sal_uInt8 nWhich ) const
195         { return aSub[nWhich].aSize; }
196     inline sal_Bool IsFntChg() const { return bFntChg; }
197     inline void SetFntChg( const sal_Bool bNew ) { bFntChg = bNew; }
198 
199     // die gekapselten SV-Font-Methoden (setzen bFntChg auf sal_True)
200     inline void SetColor( const Color& rColor );
201     inline void SetFillColor( const Color& rColor );
202     inline void SetAlign( const FontAlign eAlign );
203     inline void SetUnderline( const FontUnderline eUnderline );
204     inline void SetUnderColor( const Color &rColor ) { aUnderColor = rColor; }
205     inline void SetOverline( const FontUnderline eOverline );
206     inline void SetOverColor( const Color &rColor ) { aOverColor = rColor; }
207     inline void SetStrikeout( const FontStrikeout eStrikeout );
208     inline void SetOutline( const sal_Bool bOutline );
209            void SetVertical( sal_uInt16 nDir, const sal_Bool nVertLayout = sal_False );
210     inline void SetShadow( const sal_Bool bShadow );
211     inline void SetAutoKern( sal_uInt8 nAutoKern );
212     inline void SetTransparent( const sal_Bool bTrans );
213     inline void SetWordLineMode( const sal_Bool bWordLineMode );
214     inline void SetFixKerning( const short nNewKern );
215     inline void SetCaseMap( const SvxCaseMap eNew );
216     inline void SetEmphasisMark( const FontEmphasisMark eValue );
217 
218     // Methoden fuer die Hoch-/Tiefstellung
219     inline void SetEscapement( const short nNewEsc );
220     inline void SetProportion( const sal_uInt8 nNewPropr );
221 
222     inline void SetPropWidth( const sal_uInt16 nNew );
223 
224     inline void SetFamily( const FontFamily eFamily, const sal_uInt8 nWhich );
225     inline void SetName( const XubString& rName, const sal_uInt8 nWhich );
226     inline void SetStyleName( const XubString& rStyleName, const sal_uInt8 nWhich );
227     inline void SetSize( const Size& rSize, const sal_uInt8 nWhich );
228     inline void SetWeight( const FontWeight eWeight, const sal_uInt8 nWhich );
229     inline void SetItalic( const FontItalic eItalic, const sal_uInt8 nWhich );
230     inline void SetLanguage( LanguageType eNewLang, const sal_uInt8 nWhich );
231     inline void SetCharSet( const CharSet eCharSet, const sal_uInt8 nWhich );
232     inline void SetPitch( const FontPitch ePitch, const sal_uInt8 nWhich );
233     inline void SetRelief( const FontRelief eNew );
234 
235     // Get/Set-Methoden fuer die aktuelle Einstellung
236     inline void SetNoHyph( const sal_Bool bNew );
237     inline sal_Bool IsNoHyph() const { return bNoHyph; }
238     inline void SetBlink( const sal_Bool bBlink );
239     inline sal_Bool IsBlink() const { return bBlink; }
240     inline sal_uInt8 &GetTox() { return nToxCnt; }
241     inline sal_uInt8 GetTox() const { return nToxCnt; }
242     inline sal_Bool IsTox() const { return ( 0 != nToxCnt ); }
243     inline sal_uInt8 &GetRef() { return nRefCnt; }
244     inline sal_uInt8 GetRef() const { return nRefCnt; }
245     inline sal_Bool IsRef() const { return ( 0 != nRefCnt ); }
246     inline sal_uInt8 &GetMeta() { return m_nMetaCount; }
247     inline sal_uInt8 GetMeta() const { return m_nMetaCount; }
248     inline bool IsMeta() const { return (0 != m_nMetaCount); }
249     inline sal_uInt8 &GetInputField() { return m_nInputFieldCount; }
250     inline sal_uInt8 GetInputField() const { return m_nInputFieldCount; }
251     inline bool IsInputField() const { return (0 != m_nInputFieldCount); }
252     inline void SetURL( const sal_Bool bURL );
253     inline sal_Bool IsURL() const { return bURL; }
254     inline void SetGreyWave( const sal_Bool bNew );
255     inline sal_Bool IsGreyWave() const { return bGreyWave; }
256     inline void SetNoCol( const sal_Bool bNew );
257     inline sal_Bool IsNoCol() const { return bNoColReplace; }
258 
259     inline void SetPaintBlank( const sal_Bool bNew );
260     inline sal_Bool IsPaintBlank() const { return bPaintBlank; }
261     inline void SetPaintWrong( const sal_Bool bNew );
262     inline sal_Bool IsPaintWrong() const { return bPaintWrong; }
263 
264     // Setzen der Basisklasse Font fuer SwTxtCharFmt
265     void SetDiffFnt( const SfxItemSet* pSet,
266                      const IDocumentSettingAccess* pIDocumentSettingAccess );
267 
268     inline const SvxFont &GetFnt( const sal_uInt8 nWhich ) const
269         { return aSub[nWhich]; };
270 
271     sal_Bool IsSymbol( ViewShell *pSh )
272         { return aSub[nActual].IsSymbol( pSh ); }
273     FontUnderline GetUnderline() const { return aSub[nActual].GetUnderline(); }
274     const Color& GetUnderColor() const { return aUnderColor; }
275     FontUnderline GetOverline() const { return aSub[nActual].GetOverline(); }
276     const Color& GetOverColor() const { return aOverColor; }
277     short GetFixKerning() const { return aSub[nActual].GetFixKerning(); }
278     FontStrikeout GetStrikeout() const { return aSub[nActual].GetStrikeout(); }
279     const Color& GetColor() const { return aSub[nActual].GetColor(); }
280     sal_Bool IsShadow() const { return aSub[nActual].IsShadow(); }
281     sal_Bool IsWordLineMode() const { return aSub[nActual].IsWordLineMode(); }
282     sal_Bool IsOutline() const { return aSub[nActual].IsOutline(); }
283     sal_Bool IsKerning() const { return aSub[nActual].IsKerning(); }
284     short GetEscapement() const { return aSub[nActual].GetEscapement(); }
285     SvxCaseMap GetCaseMap() const { return aSub[nActual].GetCaseMap(); }
286     sal_uInt8 GetPropr() const { return aSub[nActual].GetPropr(); }
287     FontItalic GetItalic() const { return aSub[nActual].GetItalic(); }
288     LanguageType GetLanguage() const { return aSub[nActual].GetLanguage(); }
289     FontAlign GetAlign() const { return aSub[nActual].GetAlign(); }
290     const XubString& GetName() const { return aSub[nActual].GetName(); }
291     const XubString& GetStyleName() const {return aSub[nActual].GetStyleName();}
292     FontFamily GetFamily() const { return aSub[nActual].GetFamily(); }
293     FontPitch GetPitch() const { return aSub[nActual].GetPitch(); }
294     rtl_TextEncoding GetCharSet() const { return aSub[nActual].GetCharSet(); }
295     long GetHeight() const { return aSub[nActual].GetSize().Height(); }
296     FontWeight GetWeight() const { return aSub[nActual].GetWeight(); }
297     FontEmphasisMark GetEmphasisMark() const
298         { return aSub[nActual].GetEmphasisMark(); }
299     sal_uInt16 GetPropWidth() const { return aSub[nActual].GetPropWidth(); }
300     sal_uInt16 GetOrientation( const sal_Bool nVertLayout = sal_False ) const;
301 
302     inline const XubString& GetName( const sal_uInt8 nWhich ) const
303         { return aSub[nWhich].GetName(); }
304     inline LanguageType GetLanguage( const sal_uInt8 nWhich ) const
305         { return aSub[nWhich].GetLanguage(); }
306     inline const XubString& GetStyleName( const sal_uInt8 nWhich ) const
307         { return aSub[nWhich].GetStyleName(); }
308     inline FontFamily GetFamily( const sal_uInt8 nWhich ) const
309         { return aSub[nWhich].GetFamily(); }
310     inline FontItalic GetItalic( const sal_uInt8 nWhich ) const
311         { return aSub[nWhich].GetItalic(); }
312     inline FontPitch GetPitch( const sal_uInt8 nWhich ) const
313         { return aSub[nWhich].GetPitch(); }
314     inline rtl_TextEncoding GetCharSet( const sal_uInt8 nWhich ) const
315         { return aSub[nWhich].GetCharSet(); }
316     inline long GetHeight( const sal_uInt8 nWhich ) const
317         { return aSub[nWhich].GetSize().Height(); }
318     inline FontWeight GetWeight( const sal_uInt8 nWhich ) const
319         { return aSub[nWhich].GetWeight(); }
320     inline FontEmphasisMark GetEmphasisMark( const sal_uInt8 nWhich ) const
321         { return aSub[nWhich].GetEmphasisMark(); }
322 
323     // Macht den logischen Font im OutputDevice wirksam.
324     void ChgPhysFnt( ViewShell *pSh, OutputDevice& rOut );
325 
326     Size GetCapitalSize( SwDrawTextInfo& rInf )
327         { return aSub[nActual].GetCapitalSize( rInf ); }
328 
329     xub_StrLen GetCapitalBreak( ViewShell* pSh,  const OutputDevice* pOut,
330         const SwScriptInfo* pScript, const XubString& rTxt,
331         long nTextWidth, xub_StrLen* pExtra, const xub_StrLen nIdx,
332         const xub_StrLen nLen );
333 
334     xub_StrLen GetCapitalCrsrOfst( SwDrawTextInfo& rInf )
335         { return aSub[nActual].GetCapitalCrsrOfst( rInf ); }
336 
337     void DrawCapital( SwDrawTextInfo &rInf )
338         { aSub[nActual].DrawCapital( rInf ); }
339 
340     void DrawStretchCapital( SwDrawTextInfo &rInf )
341         { aSub[nActual].DrawStretchCapital( rInf ); }
342 
343     void DoOnCapitals( SwDoCapitals &rDo )
344         { aSub[nActual].DoOnCapitals( rDo ); }
345 
346     Size _GetTxtSize( SwDrawTextInfo& rInf )
347         { rInf.SetFont( this ); return aSub[nActual]._GetTxtSize( rInf ); }
348 
349     xub_StrLen GetTxtBreak( SwDrawTextInfo& rInf, long nTextWidth );
350 
351     xub_StrLen _GetCrsrOfst( SwDrawTextInfo& rInf )
352         { return aSub[nActual]._GetCrsrOfst( rInf ); }
353 
354     inline void _DrawText( SwDrawTextInfo &rInf )
355         { aSub[nActual]._DrawText( rInf, IsGreyWave() ); }
356 
357     inline void _DrawStretchText( SwDrawTextInfo &rInf )
358         { aSub[nActual]._DrawStretchText( rInf ); }
359 
360     inline short CheckKerning()
361         { return aSub[nActual].CheckKerning(); }
362 
363     inline sal_uInt16 GetAscent( ViewShell *pSh, const OutputDevice& rOut )
364         { return aSub[nActual].GetAscent( pSh, rOut ); }
365     inline sal_uInt16 GetHeight( ViewShell *pSh, const OutputDevice& rOut )
366         { return aSub[nActual].GetHeight( pSh, rOut ); }
367 
368     inline void Invalidate()
369         { bFntChg = bOrgChg = sal_True; }
370 };
371 
372 inline void SwFont::SetColor( const Color& rColor )
373 {
374     bFntChg = sal_True;
375     aSub[0].SetColor( rColor );
376     aSub[1].SetColor( rColor );
377     aSub[2].SetColor( rColor );
378 }
379 
380 // gekapselte SV-Font-Methode
381 inline void SwSubFont::SetColor( const Color& rColor )
382 {
383     pMagic = 0;
384     Font::SetColor( rColor );
385 }
386 
387 
388 // gekapselte SV-Font-Methode
389 inline void SwSubFont::SetFillColor( const Color& rColor )
390 {
391     pMagic = 0;
392     Font::SetFillColor( rColor );
393 }
394 
395 inline void SwFont::SetFillColor( const Color& rColor )
396 {
397     bFntChg = sal_True;
398     aSub[0].SetFillColor( rColor );
399     aSub[1].SetFillColor( rColor );
400     aSub[2].SetFillColor( rColor );
401 }
402 
403 // gekapselte SV-Font-Methode
404 inline void SwSubFont::SetFamily( const FontFamily eFamily )
405 {
406     pMagic = 0;
407     Font::SetFamily( eFamily );
408 }
409 
410 inline void SwFont::SetFamily( const FontFamily eFamily, const sal_uInt8 nWhich )
411 {
412     bFntChg = sal_True;
413     aSub[nWhich].SetFamily( eFamily );
414 }
415 
416 // gekapselte SV-Font-Methode
417 inline void SwSubFont::SetName( const XubString& rName )
418 {
419     pMagic = 0;
420     Font::SetName( rName );
421 }
422 
423 inline void SwFont::SetName( const XubString& rName, const sal_uInt8 nWhich )
424 {
425     bFntChg = sal_True;
426     aSub[nWhich].SetName( rName );
427 }
428 
429 // gekapselte SV-Font-Methode
430 inline void SwSubFont::SetStyleName( const XubString& rStyleName )
431 {
432     pMagic = 0;
433     Font::SetStyleName( rStyleName );
434 }
435 
436 inline void SwFont::SetStyleName( const XubString& rStyle, const sal_uInt8 nWhich )
437 {
438     bFntChg = sal_True;
439     aSub[nWhich].SetStyleName( rStyle );
440 }
441 
442 // gekapselte SV-Font-Methode
443 inline void SwSubFont::SetCharSet( const CharSet eCharSet )
444 {
445     pMagic = 0;
446     Font::SetCharSet( eCharSet );
447 }
448 
449 inline void SwFont::SetCharSet( const CharSet eCharSet, const sal_uInt8 nWhich )
450 {
451     bFntChg = sal_True;
452     aSub[nWhich].SetCharSet( eCharSet );
453 }
454 
455 // gekapselte SV-Font-Methode
456 inline void SwSubFont::SetPitch( const FontPitch ePitch )
457 {
458     pMagic = 0;
459     Font::SetPitch( ePitch );
460 }
461 
462 // gekapselte SV-Font-Methode
463 inline void SwFont::SetPitch( const FontPitch ePitch, const sal_uInt8 nWhich )
464 {
465     bFntChg = sal_True;
466     aSub[nWhich].SetPitch( ePitch );
467 }
468 
469 // gekapselte SV-Font-Methode
470 inline void SwSubFont::SetAlign( const FontAlign eAlign )
471 {
472     pMagic = 0;
473     Font::SetAlign( eAlign );
474 }
475 
476 inline void SwFont::SetAlign( const FontAlign eAlign )
477 {
478     bFntChg = sal_True;
479     aSub[0].SetAlign( eAlign );
480     aSub[1].SetAlign( eAlign );
481     aSub[2].SetAlign( eAlign );
482 }
483 
484 // gekapselte SV-Font-Methode
485 inline void SwSubFont::SetWeight( const FontWeight eWeight )
486 {
487     pMagic = 0;
488     Font::SetWeight( eWeight );
489 }
490 
491 inline void SwFont::SetWeight( const FontWeight eWeight, const sal_uInt8 nWhich )
492 {
493     bFntChg = sal_True;
494     aSub[nWhich].SetWeight( eWeight );
495 }
496 
497 // gekapselte SV-Font-Methode
498 inline void SwSubFont::SetUnderline( const FontUnderline eUnderline )
499 {
500     pMagic = 0;
501     Font::SetUnderline( eUnderline );
502 }
503 
504 inline void SwFont::SetUnderline( const FontUnderline eUnderline )
505 {
506     bFntChg = sal_True;
507     aSub[0].SetUnderline( eUnderline );
508     aSub[1].SetUnderline( eUnderline );
509     aSub[2].SetUnderline( eUnderline );
510 }
511 
512 // gekapselte SV-Font-Methode
513 inline void SwSubFont::SetOverline( const FontUnderline eOverline )
514 {
515     pMagic = 0;
516     Font::SetOverline( eOverline );
517 }
518 
519 inline void SwFont::SetOverline( const FontUnderline eOverline )
520 {
521     bFntChg = sal_True;
522     aSub[0].SetOverline( eOverline );
523     aSub[1].SetOverline( eOverline );
524     aSub[2].SetOverline( eOverline );
525 }
526 
527 // gekapselte SV-Font-Methode
528 inline void SwSubFont::SetStrikeout( const FontStrikeout eStrikeout )
529 {
530     pMagic = 0;
531     Font::SetStrikeout( eStrikeout );
532 }
533 
534 inline void SwFont::SetStrikeout( const FontStrikeout eStrikeout )
535 {
536     bFntChg = sal_True;
537     aSub[0].SetStrikeout( eStrikeout );
538     aSub[1].SetStrikeout( eStrikeout );
539     aSub[2].SetStrikeout( eStrikeout );
540 }
541 
542 // gekapselte SV-Font-Methode
543 inline void SwSubFont::SetItalic( const FontItalic eItalic )
544 {
545     pMagic = 0;
546     Font::SetItalic( eItalic );
547 }
548 
549 inline void SwFont::SetItalic( const FontItalic eItalic, const sal_uInt8 nWhich )
550 {
551     bFntChg = sal_True;
552     aSub[nWhich].SetItalic( eItalic );
553 }
554 
555 // gekapselte SV-Font-Methode
556 inline void SwSubFont::SetOutline( const sal_Bool bOutline )
557 {
558     pMagic = 0;
559     Font::SetOutline( bOutline );
560 }
561 
562 inline void SwFont::SetOutline( const sal_Bool bOutline )
563 {
564     bFntChg = sal_True;
565     aSub[0].SetOutline( bOutline );
566     aSub[1].SetOutline( bOutline );
567     aSub[2].SetOutline( bOutline );
568 }
569 
570 // gekapselte SV-Font-Methode
571 inline void SwSubFont::SetShadow( const sal_Bool bShadow )
572 {
573     pMagic = 0;
574     Font::SetShadow( bShadow );
575 }
576 
577 inline void SwFont::SetShadow( const sal_Bool bShadow )
578 {
579     bFntChg = sal_True;
580     aSub[0].SetShadow( bShadow );
581     aSub[1].SetShadow( bShadow );
582     aSub[2].SetShadow( bShadow );
583 }
584 
585 // gekapselte SV-Font-Methode
586 inline void SwSubFont::SetAutoKern( const sal_uInt8 nAutoKern )
587 {
588     pMagic = 0;
589     Font::SetKerning( nAutoKern );
590 }
591 
592 inline void SwFont::SetAutoKern( sal_uInt8 nAutoKern )
593 {
594     bFntChg = sal_True;
595     aSub[1].SetAutoKern( nAutoKern );
596     if( nAutoKern )
597         nAutoKern = KERNING_FONTSPECIFIC;
598     aSub[0].SetAutoKern( nAutoKern );
599     aSub[2].SetAutoKern( nAutoKern );
600 }
601 
602 inline void SwFont::SetTransparent( const sal_Bool bTrans )
603 {
604     aSub[0].SetTransparent( bTrans );
605     aSub[1].SetTransparent( bTrans );
606     aSub[2].SetTransparent( bTrans );
607 }
608 
609 inline void SwFont::SetFixKerning( const short nNewKern )
610 {
611     aSub[SW_LATIN].SetFixKerning( nNewKern );
612     aSub[SW_CJK].SetFixKerning( nNewKern );
613     aSub[SW_CTL].SetFixKerning( nNewKern );
614 }
615 
616 inline void SwFont::SetCaseMap( const SvxCaseMap eNew )
617 {
618     aSub[SW_LATIN].SetCaseMap( eNew );
619     aSub[SW_CJK].SetCaseMap( eNew );
620     aSub[SW_CTL].SetCaseMap( eNew );
621 }
622 
623 // gekapselte SV-Font-Methode
624 inline void SwSubFont::SetWordLineMode( const sal_Bool bWordLineMode )
625 {
626     pMagic = 0;
627     Font::SetWordLineMode( bWordLineMode );
628 }
629 
630 inline void SwFont::SetWordLineMode( const sal_Bool bWordLineMode )
631 {
632     bFntChg = sal_True;
633     aSub[0].SetWordLineMode( bWordLineMode );
634     aSub[1].SetWordLineMode( bWordLineMode );
635     aSub[2].SetWordLineMode( bWordLineMode );
636 }
637 // gekapselte SV-Font-Methode
638 inline void SwSubFont::SetEmphasisMark( const FontEmphasisMark eValue )
639 {
640     pMagic = 0;
641     Font::SetEmphasisMark( eValue );
642 }
643 
644 inline void SwFont::SetEmphasisMark( const FontEmphasisMark eValue )
645 {
646     bFntChg = sal_True;
647     aSub[0].SetEmphasisMark( eValue );
648     aSub[1].SetEmphasisMark( eValue );
649     aSub[2].SetEmphasisMark( eValue );
650 }
651 
652 inline void SwFont::SetPropWidth( const sal_uInt16 nNew )
653 {
654     if( nNew != aSub[0].GetPropWidth() )
655     {
656         bFntChg = sal_True;
657         aSub[0].SetPropWidth( nNew );
658         aSub[1].SetPropWidth( nNew );
659         aSub[2].SetPropWidth( nNew );
660     }
661 }
662 
663 // gekapselte SV-Font-Methode
664 inline void SwSubFont::SetRelief( const FontRelief eNew )
665 {
666     pMagic = 0;
667     Font::SetRelief( eNew );
668 }
669 
670 inline void SwFont::SetRelief( const FontRelief eNew )
671 {
672     if( eNew != aSub[0].GetRelief() )
673     {
674         bFntChg = sal_True;
675         aSub[0].SetRelief( eNew );
676         aSub[1].SetRelief( eNew );
677         aSub[2].SetRelief( eNew );
678     }
679 }
680 
681 // ueberladene Font-Methode
682 inline void SwSubFont::SetSize( const Size& rSize )
683 {
684     aSize = rSize;
685     if ( GetPropr() == 100 )
686         Font::SetSize( aSize );
687     else
688     {
689         Font::SetSize( Size(
690             (long) aSize.Width() * GetPropr() / 100L,
691             (long) aSize.Height() * GetPropr() / 100L ) );
692     }
693     pMagic = 0;
694 }
695 
696 inline void SwFont::SetSize( const Size& rSize, const sal_uInt8 nWhich )
697 {
698     if( aSub[nWhich].aSize != rSize )
699     {
700         aSub[nWhich].SetSize( rSize );
701         bFntChg = sal_True;
702         bOrgChg = sal_True;
703     }
704 }
705 
706 inline void SwFont::SetActual( sal_uInt8 nNew )
707 {
708      if ( nActual != nNew )
709      {
710         bFntChg = sal_True;
711         bOrgChg = sal_True;
712         nActual = nNew;
713      }
714 }
715 
716 inline void SwSubFont::SetProportion( const sal_uInt8 nNewPropr )
717 {
718     pMagic = 0;
719     Font::SetSize( Size( (long) aSize.Width() * nNewPropr / 100L,
720                          (long) aSize.Height() * nNewPropr / 100L ) );
721     SvxFont::SetPropr( nNewPropr );
722 }
723 
724 inline void SwFont::SetProportion( const sal_uInt8 nNewPropr )
725 {
726     if( nNewPropr != aSub[0].GetPropr() )
727     {
728         bFntChg = sal_True;
729         bOrgChg = sal_True;
730 
731         aSub[0].SetProportion( nNewPropr );
732         aSub[1].SetProportion( nNewPropr );
733         aSub[2].SetProportion( nNewPropr );
734     }
735 }
736 
737 inline void SwSubFont::SetEscapement( const short nNewEsc )
738 {
739     pMagic = 0;
740     SvxFont::SetEscapement( nNewEsc );
741 }
742 
743 inline void SwFont::SetEscapement( const short nNewEsc )
744 {
745     if( nNewEsc != aSub[0].GetEscapement() )
746     {
747         // these have to be set, otherwise nOrgHeight and nOrgAscent will not
748         // be calculated
749         bFntChg = sal_True;
750         bOrgChg = sal_True;
751 
752         aSub[0].SetEscapement( nNewEsc );
753         aSub[1].SetEscapement( nNewEsc );
754         aSub[2].SetEscapement( nNewEsc );
755     }
756 }
757 
758 inline void SwSubFont::SetLanguage( LanguageType eNewLang )
759 {
760     if( eNewLang == LANGUAGE_SYSTEM )
761         eNewLang = (LanguageType)GetAppLanguage();
762     SvxFont::SetLanguage( eNewLang );
763 }
764 
765 inline void SwFont::SetLanguage( const LanguageType eNewLang, const sal_uInt8 nWhich )
766 {
767     aSub[nWhich].SetLanguage( eNewLang );
768     if( SW_CJK == nWhich )
769     {
770         aSub[SW_LATIN].SetCJKContextLanguage( eNewLang );
771         aSub[SW_CJK].SetCJKContextLanguage( eNewLang );
772         aSub[SW_CTL].SetCJKContextLanguage( eNewLang );
773     }
774 }
775 
776 inline void SwFont::SetPaintBlank( const sal_Bool bNew )
777 {
778     bPaintBlank = bNew;
779 }
780 
781 inline void SwFont::SetPaintWrong( const sal_Bool bNew )
782 {
783     bPaintWrong = bNew;
784 }
785 
786 inline void SwFont::SetNoHyph( const sal_Bool bNew )
787 {
788     bNoHyph = bNew;
789 }
790 
791 inline void SwFont::SetBlink( const sal_Bool bNew )
792 {
793     bBlink = bNew;
794 }
795 
796 inline void SwFont::SetURL( const sal_Bool bNew )
797 {
798     bURL = bNew;
799 }
800 
801 inline void SwFont::SetGreyWave( const sal_Bool bNew )
802 {
803     bGreyWave = bNew;
804 }
805 
806 inline void SwFont::SetNoCol( const sal_Bool bNew )
807 {
808     bNoColReplace = bNew;
809 }
810 
811 inline void SwSubFont::SetVertical( const sal_uInt16 nDir, const sal_Bool bVertFormat )
812 {
813     pMagic = 0;
814     Font::SetVertical( bVertFormat );
815     Font::SetOrientation( nDir );
816 }
817 
818 
819 /*************************************************************************
820  *                      class SwUnderlineFont
821  *
822  * Used for the "continuous underline" feature.
823  *************************************************************************/
824 
825 class SwUnderlineFont
826 {
827     Point aPos;
828     SwFont* pFnt;
829 
830 public:
831     // sets the font which should paint the common baseline
832     // and the starting point of the common baseline
833     SwUnderlineFont( SwFont& rFnt, const Point& rPoint );
834     ~SwUnderlineFont();
835 
836     SwFont& GetFont()
837     {
838         ASSERT( pFnt, "No underline font" )
839         return *pFnt;
840     }
841     const Point& GetPos() const { return aPos; }
842     // the x coordinate of the starting point has to be set for each portion
843     void SetPos( const Point& rPoint ) { aPos = rPoint;  }
844 };
845 
846 
847 /*************************************************************************
848  *                      class SvStatistics
849  *************************************************************************/
850 
851 #ifndef DBG_UTIL
852 #define SV_STAT(nWhich)
853 #else
854 
855 class SvStatistics
856 {
857 public:
858     sal_uInt16 nGetTextSize;
859     sal_uInt16 nDrawText;
860     sal_uInt16 nGetStretchTextSize;
861     sal_uInt16 nDrawStretchText;
862     sal_uInt16 nChangeFont;
863     sal_uInt16 nGetFontMetric;
864 
865     inline void Reset()
866     {
867         nGetTextSize = nDrawText = nGetStretchTextSize =
868         nDrawStretchText = nChangeFont = nGetFontMetric = 0;
869     }
870 
871     inline SvStatistics() { Reset(); }
872 
873     inline void PrintOn( SvStream &rOS ) const; //$ ostream
874     inline sal_Bool IsEmpty() const
875     {
876         return !( nGetTextSize || nDrawText ||
877                   nDrawStretchText || nChangeFont || nGetFontMetric );
878     }
879 };
880 
881 // globale Variable, implementiert in swfont.cxx
882 extern SvStatistics aSvStat;
883 
884 #define SV_STAT(nWhich) ++(aSvStat.nWhich);
885 
886 inline void SvStatistics::PrintOn( SvStream &rOS ) const //$ ostream
887 {
888     if( IsEmpty() )
889         return;
890 
891     rOS << "{   SV called:" << '\n';
892     if( nGetTextSize )
893         rOS << "\tnGetTextSize: " <<    nGetTextSize    << '\n';        if( nDrawText   )
894         rOS << "\tnDrawText: "  << nDrawText    << '\n';        if( nGetStretchTextSize )
895         rOS << "\tnGetStretchTextSize: "    << nGetStretchTextSize  << '\n';        if( nDrawStretchText    )
896         rOS << "\tnDrawStretchText: "   << nDrawStretchText << '\n';        if( nChangeFont )
897         rOS << "\tnChangeFont: "    << nChangeFont  << '\n';        if( nGetFontMetric  )
898         rOS << "\tnGetFontMetric: " << nGetFontMetric   << '\n';        rOS << "}"  << '\n';    }
899 #endif  /*  PRODUCT */
900 
901 #endif
902 
903