1 /************************************************************************* 2 * 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * Copyright 2000, 2010 Oracle and/or its affiliates. 6 * 7 * OpenOffice.org - a multi-platform office productivity suite 8 * 9 * This file is part of OpenOffice.org. 10 * 11 * OpenOffice.org is free software: you can redistribute it and/or modify 12 * it under the terms of the GNU Lesser General Public License version 3 13 * only, as published by the Free Software Foundation. 14 * 15 * OpenOffice.org is distributed in the hope that it will be useful, 16 * but WITHOUT ANY WARRANTY; without even the implied warranty of 17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 18 * GNU Lesser General Public License version 3 for more details 19 * (a copy is included in the LICENSE file that accompanied this code). 20 * 21 * You should have received a copy of the GNU Lesser General Public License 22 * version 3 along with OpenOffice.org. If not, see 23 * <http://www.openoffice.org/license.html> 24 * for a copy of the LGPLv3 License. 25 * 26 ************************************************************************/ 27 #ifndef _SWFONT_HXX 28 #define _SWFONT_HXX 29 30 #include <i18npool/lang.h> 31 #include <tools/color.hxx> 32 #ifndef _TOOLS_STREAM_HXX //autogen 33 #include <tools/stream.hxx> 34 #endif 35 #include <editeng/svxfont.hxx> 36 #include <swtypes.hxx> 37 #include <drawfont.hxx> // SwDrawTextInfo 38 39 class SfxItemSet; 40 class SwAttrSet; 41 class SwDoCapitals; // DoCapitals 42 class SwDrawTextInfo; // _DrawText 43 class SwScriptInfo; // _GetTxtSize 44 class ViewShell; 45 class IDocumentSettingAccess; 46 47 const xub_Unicode CH_BLANK = ' '; // ' ' Leerzeichen 48 const xub_Unicode CH_BREAK = 0x0A; // 49 const xub_Unicode CH_TAB = '\t'; // \t 50 const xub_Unicode CH_PAR = 0xB6; // Paragraph 51 const xub_Unicode CH_BULLET = 0xB7; // mittiger Punkt 52 53 class SwSubFont : public SvxFont 54 { 55 friend class SwFont; 56 const void *pMagic; // "MagicNumber" innerhalb des Fontcaches 57 Size aSize; // Fremde kriegen nur diese Size zu sehen 58 sal_uInt16 nFntIndex; // Index im Fontcache 59 sal_uInt16 nOrgHeight; // Hoehe inkl. Escapement/Proportion 60 sal_uInt16 nOrgAscent; // Ascent inkl. Escapement/Proportion 61 sal_uInt16 nPropWidth; // proportional width 62 inline SwSubFont() : aSize(0,0) 63 { pMagic = NULL; nFntIndex = nOrgHeight = nOrgAscent = 0; nPropWidth =100; } 64 65 sal_uInt16 CalcEscAscent( const sal_uInt16 nOldAscent ) const; 66 sal_uInt16 CalcEscHeight( const sal_uInt16 nOldHeight, 67 const sal_uInt16 nOldAscent ) const; 68 void CalcEsc( SwDrawTextInfo& rInf, Point& rPos ); 69 70 inline void CopyMagic( const SwSubFont& rFnt ) 71 { pMagic = rFnt.pMagic; nFntIndex = rFnt.nFntIndex; } 72 73 sal_Bool operator==( const SwFont &rFnt ) const; 74 SwSubFont& operator=( const SwSubFont &rFont ); 75 76 short _CheckKerning( ); 77 78 sal_Bool ChgFnt( ViewShell *pSh, OutputDevice& rOut ); 79 sal_Bool IsSymbol( ViewShell *pSh ); 80 sal_uInt16 GetAscent( ViewShell *pSh, const OutputDevice& rOut ); 81 sal_uInt16 GetHeight( ViewShell *pSh, const OutputDevice& rOut ); 82 Size _GetTxtSize( SwDrawTextInfo& rInf ); 83 Size GetCapitalSize( SwDrawTextInfo& rInf ); 84 void _DrawText( SwDrawTextInfo &rInf, const sal_Bool bGrey ); 85 void DrawCapital( SwDrawTextInfo &rInf ); 86 void DrawStretchCapital( SwDrawTextInfo &rInf ); 87 void DoOnCapitals( SwDoCapitals &rDo ); 88 void _DrawStretchText( SwDrawTextInfo &rInf ); 89 xub_StrLen _GetCrsrOfst( SwDrawTextInfo& rInf ); 90 xub_StrLen GetCapitalCrsrOfst( SwDrawTextInfo& rInf ); 91 92 inline void SetColor( const Color& rColor ); 93 inline void SetFillColor( const Color& rColor ); 94 inline void SetCharSet( const CharSet eCharSet ); 95 inline void SetPitch( const FontPitch ePitch ); 96 inline void SetAlign( const FontAlign eAlign ); 97 inline void SetUnderline( const FontUnderline eUnderline ); 98 inline void SetOverline( const FontUnderline eOverline ); 99 inline void SetStrikeout( const FontStrikeout eStrikeout ); 100 inline void SetItalic( const FontItalic eItalic ); 101 inline void SetOutline( const sal_Bool bOutline ); 102 inline void SetVertical( const sal_uInt16 nDir, const sal_Bool bVertFormat ); 103 inline void SetShadow( const sal_Bool bShadow ); 104 inline void SetAutoKern( const sal_uInt8 nAutoKern ); 105 inline void SetWordLineMode( const sal_Bool bWordLineMode ); 106 inline void SetEmphasisMark( const FontEmphasisMark eValue ); 107 inline void SetRelief( const FontRelief eNew ); 108 109 // Methoden fuer die Hoch-/Tiefstellung 110 inline void SetEscapement( const short nNewEsc ); 111 inline void SetProportion( const sal_uInt8 nNewPropr ); 112 113 inline void SetFamily( const FontFamily eFamily ); 114 inline void SetName( const XubString& rName ); 115 inline void SetStyleName( const XubString& rStyleName ); 116 inline void SetSize( const Size& rSize ); 117 inline void SetWeight( const FontWeight eWeight ); 118 inline void SetLanguage( LanguageType eNewLang ); 119 inline short CheckKerning() 120 { return GetFixKerning() >= 0 ? GetFixKerning() : _CheckKerning( ); } 121 inline void SetPropWidth( const sal_uInt16 nNew ) 122 { pMagic = 0; nPropWidth = nNew; } 123 public: 124 sal_uInt16 GetPropWidth() const { return nPropWidth; } 125 }; 126 127 #define SW_LATIN 0 128 #define SW_CJK 1 129 #define SW_CTL 2 130 #define SW_SCRIPTS 3 131 132 class SwFont 133 { // CJK == Chinese, Japanese, Korean 134 // CTL == Complex text layout ( Hebrew, Arabic ) 135 SwSubFont aSub[SW_SCRIPTS]; // Latin-, CJK- and CTL-font 136 Color* pBackColor; // background color (i.e. at character styles) 137 Color aUnderColor; // color of the underlining 138 Color aOverColor; // color of the overlining 139 sal_uInt8 nToxCnt; // Zaehlt die Schachtelungstiefe der Tox 140 sal_uInt8 nRefCnt; // Zaehlt die Schachtelungstiefe der Refs 141 sal_uInt8 m_nMetaCount; // count META/METAFIELD 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 void SetURL( const sal_Bool bURL ); 250 inline sal_Bool IsURL() const { return bURL; } 251 inline void SetGreyWave( const sal_Bool bNew ); 252 inline sal_Bool IsGreyWave() const { return bGreyWave; } 253 inline void SetNoCol( const sal_Bool bNew ); 254 inline sal_Bool IsNoCol() const { return bNoColReplace; } 255 256 inline void SetPaintBlank( const sal_Bool bNew ); 257 inline sal_Bool IsPaintBlank() const { return bPaintBlank; } 258 inline void SetPaintWrong( const sal_Bool bNew ); 259 inline sal_Bool IsPaintWrong() const { return bPaintWrong; } 260 261 // Setzen der Basisklasse Font fuer SwTxtCharFmt 262 void SetDiffFnt( const SfxItemSet* pSet, 263 const IDocumentSettingAccess* pIDocumentSettingAccess ); 264 265 inline const SvxFont &GetFnt( const sal_uInt8 nWhich ) const 266 { return aSub[nWhich]; }; 267 268 sal_Bool IsSymbol( ViewShell *pSh ) 269 { return aSub[nActual].IsSymbol( pSh ); } 270 FontUnderline GetUnderline() const { return aSub[nActual].GetUnderline(); } 271 const Color& GetUnderColor() const { return aUnderColor; } 272 FontUnderline GetOverline() const { return aSub[nActual].GetOverline(); } 273 const Color& GetOverColor() const { return aOverColor; } 274 short GetFixKerning() const { return aSub[nActual].GetFixKerning(); } 275 FontStrikeout GetStrikeout() const { return aSub[nActual].GetStrikeout(); } 276 const Color& GetColor() const { return aSub[nActual].GetColor(); } 277 sal_Bool IsShadow() const { return aSub[nActual].IsShadow(); } 278 sal_Bool IsWordLineMode() const { return aSub[nActual].IsWordLineMode(); } 279 sal_Bool IsOutline() const { return aSub[nActual].IsOutline(); } 280 sal_Bool IsKerning() const { return aSub[nActual].IsKerning(); } 281 short GetEscapement() const { return aSub[nActual].GetEscapement(); } 282 SvxCaseMap GetCaseMap() const { return aSub[nActual].GetCaseMap(); } 283 sal_uInt8 GetPropr() const { return aSub[nActual].GetPropr(); } 284 FontItalic GetItalic() const { return aSub[nActual].GetItalic(); } 285 LanguageType GetLanguage() const { return aSub[nActual].GetLanguage(); } 286 FontAlign GetAlign() const { return aSub[nActual].GetAlign(); } 287 const XubString& GetName() const { return aSub[nActual].GetName(); } 288 const XubString& GetStyleName() const {return aSub[nActual].GetStyleName();} 289 FontFamily GetFamily() const { return aSub[nActual].GetFamily(); } 290 FontPitch GetPitch() const { return aSub[nActual].GetPitch(); } 291 rtl_TextEncoding GetCharSet() const { return aSub[nActual].GetCharSet(); } 292 long GetHeight() const { return aSub[nActual].GetSize().Height(); } 293 FontWeight GetWeight() const { return aSub[nActual].GetWeight(); } 294 FontEmphasisMark GetEmphasisMark() const 295 { return aSub[nActual].GetEmphasisMark(); } 296 sal_uInt16 GetPropWidth() const { return aSub[nActual].GetPropWidth(); } 297 sal_uInt16 GetOrientation( const sal_Bool nVertLayout = sal_False ) const; 298 299 inline const XubString& GetName( const sal_uInt8 nWhich ) const 300 { return aSub[nWhich].GetName(); } 301 inline LanguageType GetLanguage( const sal_uInt8 nWhich ) const 302 { return aSub[nWhich].GetLanguage(); } 303 inline const XubString& GetStyleName( const sal_uInt8 nWhich ) const 304 { return aSub[nWhich].GetStyleName(); } 305 inline FontFamily GetFamily( const sal_uInt8 nWhich ) const 306 { return aSub[nWhich].GetFamily(); } 307 inline FontItalic GetItalic( const sal_uInt8 nWhich ) const 308 { return aSub[nWhich].GetItalic(); } 309 inline FontPitch GetPitch( const sal_uInt8 nWhich ) const 310 { return aSub[nWhich].GetPitch(); } 311 inline rtl_TextEncoding GetCharSet( const sal_uInt8 nWhich ) const 312 { return aSub[nWhich].GetCharSet(); } 313 inline long GetHeight( const sal_uInt8 nWhich ) const 314 { return aSub[nWhich].GetSize().Height(); } 315 inline FontWeight GetWeight( const sal_uInt8 nWhich ) const 316 { return aSub[nWhich].GetWeight(); } 317 inline FontEmphasisMark GetEmphasisMark( const sal_uInt8 nWhich ) const 318 { return aSub[nWhich].GetEmphasisMark(); } 319 320 // Macht den logischen Font im OutputDevice wirksam. 321 void ChgPhysFnt( ViewShell *pSh, OutputDevice& rOut ); 322 323 Size GetCapitalSize( SwDrawTextInfo& rInf ) 324 { return aSub[nActual].GetCapitalSize( rInf ); } 325 326 xub_StrLen GetCapitalBreak( ViewShell* pSh, const OutputDevice* pOut, 327 const SwScriptInfo* pScript, const XubString& rTxt, 328 long nTextWidth, xub_StrLen* pExtra, const xub_StrLen nIdx, 329 const xub_StrLen nLen ); 330 331 xub_StrLen GetCapitalCrsrOfst( SwDrawTextInfo& rInf ) 332 { return aSub[nActual].GetCapitalCrsrOfst( rInf ); } 333 334 void DrawCapital( SwDrawTextInfo &rInf ) 335 { aSub[nActual].DrawCapital( rInf ); } 336 337 void DrawStretchCapital( SwDrawTextInfo &rInf ) 338 { aSub[nActual].DrawStretchCapital( rInf ); } 339 340 void DoOnCapitals( SwDoCapitals &rDo ) 341 { aSub[nActual].DoOnCapitals( rDo ); } 342 343 Size _GetTxtSize( SwDrawTextInfo& rInf ) 344 { rInf.SetFont( this ); return aSub[nActual]._GetTxtSize( rInf ); } 345 346 xub_StrLen GetTxtBreak( SwDrawTextInfo& rInf, long nTextWidth ); 347 348 xub_StrLen _GetCrsrOfst( SwDrawTextInfo& rInf ) 349 { return aSub[nActual]._GetCrsrOfst( rInf ); } 350 351 inline void _DrawText( SwDrawTextInfo &rInf ) 352 { aSub[nActual]._DrawText( rInf, IsGreyWave() ); } 353 354 inline void _DrawStretchText( SwDrawTextInfo &rInf ) 355 { aSub[nActual]._DrawStretchText( rInf ); } 356 357 inline short CheckKerning() 358 { return aSub[nActual].CheckKerning(); } 359 360 inline sal_uInt16 GetAscent( ViewShell *pSh, const OutputDevice& rOut ) 361 { return aSub[nActual].GetAscent( pSh, rOut ); } 362 inline sal_uInt16 GetHeight( ViewShell *pSh, const OutputDevice& rOut ) 363 { return aSub[nActual].GetHeight( pSh, rOut ); } 364 365 inline void Invalidate() 366 { bFntChg = bOrgChg = sal_True; } 367 }; 368 369 inline void SwFont::SetColor( const Color& rColor ) 370 { 371 bFntChg = sal_True; 372 aSub[0].SetColor( rColor ); 373 aSub[1].SetColor( rColor ); 374 aSub[2].SetColor( rColor ); 375 } 376 377 // gekapselte SV-Font-Methode 378 inline void SwSubFont::SetColor( const Color& rColor ) 379 { 380 pMagic = 0; 381 Font::SetColor( rColor ); 382 } 383 384 385 // gekapselte SV-Font-Methode 386 inline void SwSubFont::SetFillColor( const Color& rColor ) 387 { 388 pMagic = 0; 389 Font::SetFillColor( rColor ); 390 } 391 392 inline void SwFont::SetFillColor( const Color& rColor ) 393 { 394 bFntChg = sal_True; 395 aSub[0].SetFillColor( rColor ); 396 aSub[1].SetFillColor( rColor ); 397 aSub[2].SetFillColor( rColor ); 398 } 399 400 // gekapselte SV-Font-Methode 401 inline void SwSubFont::SetFamily( const FontFamily eFamily ) 402 { 403 pMagic = 0; 404 Font::SetFamily( eFamily ); 405 } 406 407 inline void SwFont::SetFamily( const FontFamily eFamily, const sal_uInt8 nWhich ) 408 { 409 bFntChg = sal_True; 410 aSub[nWhich].SetFamily( eFamily ); 411 } 412 413 // gekapselte SV-Font-Methode 414 inline void SwSubFont::SetName( const XubString& rName ) 415 { 416 pMagic = 0; 417 Font::SetName( rName ); 418 } 419 420 inline void SwFont::SetName( const XubString& rName, const sal_uInt8 nWhich ) 421 { 422 bFntChg = sal_True; 423 aSub[nWhich].SetName( rName ); 424 } 425 426 // gekapselte SV-Font-Methode 427 inline void SwSubFont::SetStyleName( const XubString& rStyleName ) 428 { 429 pMagic = 0; 430 Font::SetStyleName( rStyleName ); 431 } 432 433 inline void SwFont::SetStyleName( const XubString& rStyle, const sal_uInt8 nWhich ) 434 { 435 bFntChg = sal_True; 436 aSub[nWhich].SetStyleName( rStyle ); 437 } 438 439 // gekapselte SV-Font-Methode 440 inline void SwSubFont::SetCharSet( const CharSet eCharSet ) 441 { 442 pMagic = 0; 443 Font::SetCharSet( eCharSet ); 444 } 445 446 inline void SwFont::SetCharSet( const CharSet eCharSet, const sal_uInt8 nWhich ) 447 { 448 bFntChg = sal_True; 449 aSub[nWhich].SetCharSet( eCharSet ); 450 } 451 452 // gekapselte SV-Font-Methode 453 inline void SwSubFont::SetPitch( const FontPitch ePitch ) 454 { 455 pMagic = 0; 456 Font::SetPitch( ePitch ); 457 } 458 459 // gekapselte SV-Font-Methode 460 inline void SwFont::SetPitch( const FontPitch ePitch, const sal_uInt8 nWhich ) 461 { 462 bFntChg = sal_True; 463 aSub[nWhich].SetPitch( ePitch ); 464 } 465 466 // gekapselte SV-Font-Methode 467 inline void SwSubFont::SetAlign( const FontAlign eAlign ) 468 { 469 pMagic = 0; 470 Font::SetAlign( eAlign ); 471 } 472 473 inline void SwFont::SetAlign( const FontAlign eAlign ) 474 { 475 bFntChg = sal_True; 476 aSub[0].SetAlign( eAlign ); 477 aSub[1].SetAlign( eAlign ); 478 aSub[2].SetAlign( eAlign ); 479 } 480 481 // gekapselte SV-Font-Methode 482 inline void SwSubFont::SetWeight( const FontWeight eWeight ) 483 { 484 pMagic = 0; 485 Font::SetWeight( eWeight ); 486 } 487 488 inline void SwFont::SetWeight( const FontWeight eWeight, const sal_uInt8 nWhich ) 489 { 490 bFntChg = sal_True; 491 aSub[nWhich].SetWeight( eWeight ); 492 } 493 494 // gekapselte SV-Font-Methode 495 inline void SwSubFont::SetUnderline( const FontUnderline eUnderline ) 496 { 497 pMagic = 0; 498 Font::SetUnderline( eUnderline ); 499 } 500 501 inline void SwFont::SetUnderline( const FontUnderline eUnderline ) 502 { 503 bFntChg = sal_True; 504 aSub[0].SetUnderline( eUnderline ); 505 aSub[1].SetUnderline( eUnderline ); 506 aSub[2].SetUnderline( eUnderline ); 507 } 508 509 // gekapselte SV-Font-Methode 510 inline void SwSubFont::SetOverline( const FontUnderline eOverline ) 511 { 512 pMagic = 0; 513 Font::SetOverline( eOverline ); 514 } 515 516 inline void SwFont::SetOverline( const FontUnderline eOverline ) 517 { 518 bFntChg = sal_True; 519 aSub[0].SetOverline( eOverline ); 520 aSub[1].SetOverline( eOverline ); 521 aSub[2].SetOverline( eOverline ); 522 } 523 524 // gekapselte SV-Font-Methode 525 inline void SwSubFont::SetStrikeout( const FontStrikeout eStrikeout ) 526 { 527 pMagic = 0; 528 Font::SetStrikeout( eStrikeout ); 529 } 530 531 inline void SwFont::SetStrikeout( const FontStrikeout eStrikeout ) 532 { 533 bFntChg = sal_True; 534 aSub[0].SetStrikeout( eStrikeout ); 535 aSub[1].SetStrikeout( eStrikeout ); 536 aSub[2].SetStrikeout( eStrikeout ); 537 } 538 539 // gekapselte SV-Font-Methode 540 inline void SwSubFont::SetItalic( const FontItalic eItalic ) 541 { 542 pMagic = 0; 543 Font::SetItalic( eItalic ); 544 } 545 546 inline void SwFont::SetItalic( const FontItalic eItalic, const sal_uInt8 nWhich ) 547 { 548 bFntChg = sal_True; 549 aSub[nWhich].SetItalic( eItalic ); 550 } 551 552 // gekapselte SV-Font-Methode 553 inline void SwSubFont::SetOutline( const sal_Bool bOutline ) 554 { 555 pMagic = 0; 556 Font::SetOutline( bOutline ); 557 } 558 559 inline void SwFont::SetOutline( const sal_Bool bOutline ) 560 { 561 bFntChg = sal_True; 562 aSub[0].SetOutline( bOutline ); 563 aSub[1].SetOutline( bOutline ); 564 aSub[2].SetOutline( bOutline ); 565 } 566 567 // gekapselte SV-Font-Methode 568 inline void SwSubFont::SetShadow( const sal_Bool bShadow ) 569 { 570 pMagic = 0; 571 Font::SetShadow( bShadow ); 572 } 573 574 inline void SwFont::SetShadow( const sal_Bool bShadow ) 575 { 576 bFntChg = sal_True; 577 aSub[0].SetShadow( bShadow ); 578 aSub[1].SetShadow( bShadow ); 579 aSub[2].SetShadow( bShadow ); 580 } 581 582 // gekapselte SV-Font-Methode 583 inline void SwSubFont::SetAutoKern( const sal_uInt8 nAutoKern ) 584 { 585 pMagic = 0; 586 Font::SetKerning( nAutoKern ); 587 } 588 589 inline void SwFont::SetAutoKern( sal_uInt8 nAutoKern ) 590 { 591 bFntChg = sal_True; 592 aSub[1].SetAutoKern( nAutoKern ); 593 if( nAutoKern ) 594 nAutoKern = KERNING_FONTSPECIFIC; 595 aSub[0].SetAutoKern( nAutoKern ); 596 aSub[2].SetAutoKern( nAutoKern ); 597 } 598 599 inline void SwFont::SetTransparent( const sal_Bool bTrans ) 600 { 601 aSub[0].SetTransparent( bTrans ); 602 aSub[1].SetTransparent( bTrans ); 603 aSub[2].SetTransparent( bTrans ); 604 } 605 606 inline void SwFont::SetFixKerning( const short nNewKern ) 607 { 608 aSub[SW_LATIN].SetFixKerning( nNewKern ); 609 aSub[SW_CJK].SetFixKerning( nNewKern ); 610 aSub[SW_CTL].SetFixKerning( nNewKern ); 611 } 612 613 inline void SwFont::SetCaseMap( const SvxCaseMap eNew ) 614 { 615 aSub[SW_LATIN].SetCaseMap( eNew ); 616 aSub[SW_CJK].SetCaseMap( eNew ); 617 aSub[SW_CTL].SetCaseMap( eNew ); 618 } 619 620 // gekapselte SV-Font-Methode 621 inline void SwSubFont::SetWordLineMode( const sal_Bool bWordLineMode ) 622 { 623 pMagic = 0; 624 Font::SetWordLineMode( bWordLineMode ); 625 } 626 627 inline void SwFont::SetWordLineMode( const sal_Bool bWordLineMode ) 628 { 629 bFntChg = sal_True; 630 aSub[0].SetWordLineMode( bWordLineMode ); 631 aSub[1].SetWordLineMode( bWordLineMode ); 632 aSub[2].SetWordLineMode( bWordLineMode ); 633 } 634 // gekapselte SV-Font-Methode 635 inline void SwSubFont::SetEmphasisMark( const FontEmphasisMark eValue ) 636 { 637 pMagic = 0; 638 Font::SetEmphasisMark( eValue ); 639 } 640 641 inline void SwFont::SetEmphasisMark( const FontEmphasisMark eValue ) 642 { 643 bFntChg = sal_True; 644 aSub[0].SetEmphasisMark( eValue ); 645 aSub[1].SetEmphasisMark( eValue ); 646 aSub[2].SetEmphasisMark( eValue ); 647 } 648 649 inline void SwFont::SetPropWidth( const sal_uInt16 nNew ) 650 { 651 if( nNew != aSub[0].GetPropWidth() ) 652 { 653 bFntChg = sal_True; 654 aSub[0].SetPropWidth( nNew ); 655 aSub[1].SetPropWidth( nNew ); 656 aSub[2].SetPropWidth( nNew ); 657 } 658 } 659 660 // gekapselte SV-Font-Methode 661 inline void SwSubFont::SetRelief( const FontRelief eNew ) 662 { 663 pMagic = 0; 664 Font::SetRelief( eNew ); 665 } 666 667 inline void SwFont::SetRelief( const FontRelief eNew ) 668 { 669 if( eNew != aSub[0].GetRelief() ) 670 { 671 bFntChg = sal_True; 672 aSub[0].SetRelief( eNew ); 673 aSub[1].SetRelief( eNew ); 674 aSub[2].SetRelief( eNew ); 675 } 676 } 677 678 // ueberladene Font-Methode 679 inline void SwSubFont::SetSize( const Size& rSize ) 680 { 681 aSize = rSize; 682 if ( GetPropr() == 100 ) 683 Font::SetSize( aSize ); 684 else 685 { 686 Font::SetSize( Size( 687 (long) aSize.Width() * GetPropr() / 100L, 688 (long) aSize.Height() * GetPropr() / 100L ) ); 689 } 690 pMagic = 0; 691 } 692 693 inline void SwFont::SetSize( const Size& rSize, const sal_uInt8 nWhich ) 694 { 695 if( aSub[nWhich].aSize != rSize ) 696 { 697 aSub[nWhich].SetSize( rSize ); 698 bFntChg = sal_True; 699 bOrgChg = sal_True; 700 } 701 } 702 703 inline void SwFont::SetActual( sal_uInt8 nNew ) 704 { 705 if ( nActual != nNew ) 706 { 707 bFntChg = sal_True; 708 bOrgChg = sal_True; 709 nActual = nNew; 710 } 711 } 712 713 inline void SwSubFont::SetProportion( const sal_uInt8 nNewPropr ) 714 { 715 pMagic = 0; 716 Font::SetSize( Size( (long) aSize.Width() * nNewPropr / 100L, 717 (long) aSize.Height() * nNewPropr / 100L ) ); 718 SvxFont::SetPropr( nNewPropr ); 719 } 720 721 inline void SwFont::SetProportion( const sal_uInt8 nNewPropr ) 722 { 723 if( nNewPropr != aSub[0].GetPropr() ) 724 { 725 bFntChg = sal_True; 726 bOrgChg = sal_True; 727 728 aSub[0].SetProportion( nNewPropr ); 729 aSub[1].SetProportion( nNewPropr ); 730 aSub[2].SetProportion( nNewPropr ); 731 } 732 } 733 734 inline void SwSubFont::SetEscapement( const short nNewEsc ) 735 { 736 pMagic = 0; 737 SvxFont::SetEscapement( nNewEsc ); 738 } 739 740 inline void SwFont::SetEscapement( const short nNewEsc ) 741 { 742 if( nNewEsc != aSub[0].GetEscapement() ) 743 { 744 // these have to be set, otherwise nOrgHeight and nOrgAscent will not 745 // be calculated 746 bFntChg = sal_True; 747 bOrgChg = sal_True; 748 749 aSub[0].SetEscapement( nNewEsc ); 750 aSub[1].SetEscapement( nNewEsc ); 751 aSub[2].SetEscapement( nNewEsc ); 752 } 753 } 754 755 inline void SwSubFont::SetLanguage( LanguageType eNewLang ) 756 { 757 if( eNewLang == LANGUAGE_SYSTEM ) 758 eNewLang = (LanguageType)GetAppLanguage(); 759 SvxFont::SetLanguage( eNewLang ); 760 } 761 762 inline void SwFont::SetLanguage( const LanguageType eNewLang, const sal_uInt8 nWhich ) 763 { 764 aSub[nWhich].SetLanguage( eNewLang ); 765 if( SW_CJK == nWhich ) 766 { 767 aSub[SW_LATIN].SetCJKContextLanguage( eNewLang ); 768 aSub[SW_CJK].SetCJKContextLanguage( eNewLang ); 769 aSub[SW_CTL].SetCJKContextLanguage( eNewLang ); 770 } 771 } 772 773 inline void SwFont::SetPaintBlank( const sal_Bool bNew ) 774 { 775 bPaintBlank = bNew; 776 } 777 778 inline void SwFont::SetPaintWrong( const sal_Bool bNew ) 779 { 780 bPaintWrong = bNew; 781 } 782 783 inline void SwFont::SetNoHyph( const sal_Bool bNew ) 784 { 785 bNoHyph = bNew; 786 } 787 788 inline void SwFont::SetBlink( const sal_Bool bNew ) 789 { 790 bBlink = bNew; 791 } 792 793 inline void SwFont::SetURL( const sal_Bool bNew ) 794 { 795 bURL = bNew; 796 } 797 798 inline void SwFont::SetGreyWave( const sal_Bool bNew ) 799 { 800 bGreyWave = bNew; 801 } 802 803 inline void SwFont::SetNoCol( const sal_Bool bNew ) 804 { 805 bNoColReplace = bNew; 806 } 807 808 inline void SwSubFont::SetVertical( const sal_uInt16 nDir, const sal_Bool bVertFormat ) 809 { 810 pMagic = 0; 811 Font::SetVertical( bVertFormat ); 812 Font::SetOrientation( nDir ); 813 } 814 815 816 /************************************************************************* 817 * class SwUnderlineFont 818 * 819 * Used for the "continuous underline" feature. 820 *************************************************************************/ 821 822 class SwUnderlineFont 823 { 824 Point aPos; 825 SwFont* pFnt; 826 827 public: 828 // sets the font which should paint the common baseline 829 // and the starting point of the common baseline 830 SwUnderlineFont( SwFont& rFnt, const Point& rPoint ); 831 ~SwUnderlineFont(); 832 833 SwFont& GetFont() 834 { 835 ASSERT( pFnt, "No underline font" ) 836 return *pFnt; 837 } 838 const Point& GetPos() const { return aPos; } 839 // the x coordinate of the starting point has to be set for each portion 840 void SetPos( const Point& rPoint ) { aPos = rPoint; } 841 }; 842 843 844 /************************************************************************* 845 * class SvStatistics 846 *************************************************************************/ 847 848 #ifndef DBG_UTIL 849 #define SV_STAT(nWhich) 850 #else 851 852 class SvStatistics 853 { 854 public: 855 sal_uInt16 nGetTextSize; 856 sal_uInt16 nDrawText; 857 sal_uInt16 nGetStretchTextSize; 858 sal_uInt16 nDrawStretchText; 859 sal_uInt16 nChangeFont; 860 sal_uInt16 nGetFontMetric; 861 862 inline void Reset() 863 { 864 nGetTextSize = nDrawText = nGetStretchTextSize = 865 nDrawStretchText = nChangeFont = nGetFontMetric = 0; 866 } 867 868 inline SvStatistics() { Reset(); } 869 870 inline void PrintOn( SvStream &rOS ) const; //$ ostream 871 inline sal_Bool IsEmpty() const 872 { 873 return !( nGetTextSize || nDrawText || 874 nDrawStretchText || nChangeFont || nGetFontMetric ); 875 } 876 }; 877 878 // globale Variable, implementiert in swfont.cxx 879 extern SvStatistics aSvStat; 880 881 #define SV_STAT(nWhich) ++(aSvStat.nWhich); 882 883 inline void SvStatistics::PrintOn( SvStream &rOS ) const //$ ostream 884 { 885 if( IsEmpty() ) 886 return; 887 888 rOS << "{ SV called:" << '\n'; 889 if( nGetTextSize ) 890 rOS << "\tnGetTextSize: " << nGetTextSize << '\n'; if( nDrawText ) 891 rOS << "\tnDrawText: " << nDrawText << '\n'; if( nGetStretchTextSize ) 892 rOS << "\tnGetStretchTextSize: " << nGetStretchTextSize << '\n'; if( nDrawStretchText ) 893 rOS << "\tnDrawStretchText: " << nDrawStretchText << '\n'; if( nChangeFont ) 894 rOS << "\tnChangeFont: " << nChangeFont << '\n'; if( nGetFontMetric ) 895 rOS << "\tnGetFontMetric: " << nGetFontMetric << '\n'; rOS << "}" << '\n'; } 896 #endif /* PRODUCT */ 897 898 #endif 899 900