LCOV - code coverage report
Current view: top level - sw/source/core/txtnode - swfont.cxx (source / functions) Hit Total Coverage
Test: commit 10e77ab3ff6f4314137acd6e2702a6e5c1ce1fae Lines: 687 910 75.5 %
Date: 2014-11-03 Functions: 39 41 95.1 %
Legend: Lines: hit not hit

          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             : 
      20             : #include <hintids.hxx>
      21             : 
      22             : #include <com/sun/star/i18n/ScriptType.hpp>
      23             : #include <vcl/outdev.hxx>
      24             : #include <unotools/localedatawrapper.hxx>
      25             : #include <editeng/unolingu.hxx>
      26             : #include <editeng/brushitem.hxx>
      27             : #include <editeng/wrlmitem.hxx>
      28             : #include <editeng/blinkitem.hxx>
      29             : #include <editeng/nhypitem.hxx>
      30             : #include <editeng/kernitem.hxx>
      31             : #include <editeng/cmapitem.hxx>
      32             : #include <editeng/langitem.hxx>
      33             : #include <editeng/escapementitem.hxx>
      34             : #include <editeng/autokernitem.hxx>
      35             : #include <editeng/shdditem.hxx>
      36             : #include <editeng/charreliefitem.hxx>
      37             : #include <editeng/contouritem.hxx>
      38             : #include <editeng/colritem.hxx>
      39             : #include <editeng/charsetcoloritem.hxx>
      40             : #include <editeng/crossedoutitem.hxx>
      41             : #include <editeng/udlnitem.hxx>
      42             : #include <editeng/wghtitem.hxx>
      43             : #include <editeng/postitem.hxx>
      44             : #include <editeng/fhgtitem.hxx>
      45             : #include <editeng/fontitem.hxx>
      46             : #include <editeng/emphasismarkitem.hxx>
      47             : #include <editeng/charscaleitem.hxx>
      48             : #include <editeng/charrotateitem.hxx>
      49             : #include <editeng/twolinesitem.hxx>
      50             : #include <editeng/charhiddenitem.hxx>
      51             : #include <editeng/boxitem.hxx>
      52             : #include <editeng/shaditem.hxx>
      53             : #include <IDocumentSettingAccess.hxx>
      54             : #include <vcl/window.hxx>
      55             : #include <charatr.hxx>
      56             : #include <viewsh.hxx>
      57             : #include <swfont.hxx>
      58             : #include <fntcache.hxx>
      59             : #include <txtfrm.hxx>
      60             : #include <scriptinfo.hxx>
      61             : 
      62             : #ifdef DBG_UTIL
      63             : // global Variable
      64             : SvStatistics g_SvStat;
      65             : #endif
      66             : 
      67             : using namespace ::com::sun::star;
      68             : 
      69             : // Hintergrundbrush setzen, z.B. bei Zeichenvorlagen
      70        3848 : void SwFont::SetBackColor( Color* pNewColor )
      71             : {
      72        3848 :     delete pBackColor;
      73        3848 :     pBackColor = pNewColor;
      74        3848 :     bFntChg = true;
      75        3848 :     aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
      76        3848 : }
      77             : 
      78      103962 : void SwFont::SetTopBorder( const editeng::SvxBorderLine* pTopBorder )
      79             : {
      80      103962 :     if( pTopBorder )
      81         464 :         m_aTopBorder = *pTopBorder;
      82             :     else
      83             :     {
      84      103498 :         m_aTopBorder = boost::none;
      85      103498 :         m_nTopBorderDist = 0;
      86             :     }
      87      103962 :     bFntChg = true;
      88      103962 :     aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
      89      103962 : }
      90             : 
      91      103962 : void SwFont::SetBottomBorder( const editeng::SvxBorderLine* pBottomBorder )
      92             : {
      93      103962 :     if( pBottomBorder )
      94         464 :         m_aBottomBorder = *pBottomBorder;
      95             :     else
      96             :     {
      97      103498 :         m_aBottomBorder = boost::none;
      98      103498 :         m_nBottomBorderDist = 0;
      99             :     }
     100      103962 :     bFntChg = true;
     101      103962 :     aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
     102      103962 : }
     103             : 
     104      103962 : void SwFont::SetRightBorder( const editeng::SvxBorderLine* pRightBorder )
     105             : {
     106      103962 :     if( pRightBorder )
     107         450 :         m_aRightBorder = *pRightBorder;
     108             :     else
     109             :     {
     110      103512 :         m_aRightBorder = boost::none;
     111      103512 :         m_nRightBorderDist = 0;
     112             :     }
     113      103962 :     bFntChg = true;
     114      103962 :     aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
     115      103962 : }
     116             : 
     117      103962 : void SwFont::SetLeftBorder( const editeng::SvxBorderLine* pLeftBorder )
     118             : {
     119      103962 :     if( pLeftBorder )
     120         464 :         m_aLeftBorder = *pLeftBorder;
     121             :     else
     122             :     {
     123      103498 :         m_aLeftBorder = boost::none;
     124      103498 :         m_nLeftBorderDist = 0;
     125             :     }
     126      103962 :     bFntChg = true;
     127      103962 :     aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
     128      103962 : }
     129             : 
     130             : const boost::optional<editeng::SvxBorderLine>&
     131       44479 : SwFont::GetAbsTopBorder( const bool bVertLayout ) const
     132             : {
     133       44479 :     switch( GetOrientation( bVertLayout ) )
     134             :     {
     135             :         case 0 :
     136       44477 :             return m_aTopBorder;
     137             :             break;
     138             :         case 900 :
     139           2 :             return m_aRightBorder;
     140             :             break;
     141             :         case 1800 :
     142           0 :             return m_aBottomBorder;
     143             :             break;
     144             :         case 2700 :
     145           0 :             return m_aLeftBorder;
     146             :             break;
     147             :         default :
     148             :             assert(false);
     149           0 :             return m_aTopBorder;
     150             :             break;
     151             :     }
     152             : }
     153             : 
     154             : const boost::optional<editeng::SvxBorderLine>&
     155       44479 : SwFont::GetAbsBottomBorder( const bool bVertLayout ) const
     156             : {
     157       44479 :     switch( GetOrientation( bVertLayout ) )
     158             :     {
     159             :         case 0 :
     160       44477 :             return m_aBottomBorder;
     161             :             break;
     162             :         case 900 :
     163           2 :             return m_aLeftBorder;
     164             :             break;
     165             :         case 1800 :
     166           0 :             return m_aTopBorder;
     167             :             break;
     168             :         case 2700 :
     169           0 :             return m_aRightBorder;
     170             :             break;
     171             :         default :
     172             :             assert(false);
     173           0 :             return m_aBottomBorder;
     174             :             break;
     175             :     }
     176             : }
     177             : 
     178             : const boost::optional<editeng::SvxBorderLine>&
     179       44479 : SwFont::GetAbsLeftBorder( const bool bVertLayout ) const
     180             : {
     181       44479 :     switch( GetOrientation( bVertLayout ) )
     182             :     {
     183             :         case 0 :
     184       44477 :             return m_aLeftBorder;
     185             :             break;
     186             :         case 900 :
     187           2 :             return m_aTopBorder;
     188             :             break;
     189             :         case 1800 :
     190           0 :             return m_aRightBorder;
     191             :             break;
     192             :         case 2700 :
     193           0 :             return m_aBottomBorder;
     194             :             break;
     195             :         default :
     196             :             assert(false);
     197           0 :             return m_aLeftBorder;
     198             :             break;
     199             :     }
     200             : }
     201             : 
     202             : const boost::optional<editeng::SvxBorderLine>&
     203       44479 : SwFont::GetAbsRightBorder( const bool bVertLayout ) const
     204             : {
     205       44479 :     switch( GetOrientation( bVertLayout ) )
     206             :     {
     207             :         case 0 :
     208       44477 :             return m_aRightBorder;
     209             :             break;
     210             :         case 900 :
     211           2 :             return m_aBottomBorder;
     212             :             break;
     213             :         case 1800 :
     214           0 :             return m_aLeftBorder;
     215             :             break;
     216             :         case 2700 :
     217           0 :             return m_aTopBorder;
     218             :             break;
     219             :         default :
     220             :             assert(false);
     221           0 :             return m_aRightBorder;
     222             :             break;
     223             :     }
     224             : }
     225             : 
     226      407271 : SvxShadowLocation SwFont::GetAbsShadowLocation( const bool bVertLayout ) const
     227             : {
     228      407271 :     SvxShadowLocation aLocation = SVX_SHADOW_NONE;
     229      407271 :     switch( GetOrientation( bVertLayout ) )
     230             :     {
     231             :         case 0:
     232      407253 :             aLocation = m_aShadowLocation;
     233      407253 :             break;
     234             : 
     235             :         case 900:
     236          18 :             switch ( m_aShadowLocation )
     237             :             {
     238             :                 case SVX_SHADOW_TOPLEFT:
     239           0 :                     aLocation = SVX_SHADOW_BOTTOMLEFT;
     240           0 :                     break;
     241             :                 case SVX_SHADOW_TOPRIGHT:
     242           0 :                     aLocation = SVX_SHADOW_TOPLEFT;
     243           0 :                     break;
     244             :                 case SVX_SHADOW_BOTTOMLEFT:
     245           0 :                     aLocation = SVX_SHADOW_BOTTOMRIGHT;
     246           0 :                     break;
     247             :                 case SVX_SHADOW_BOTTOMRIGHT:
     248           0 :                     aLocation = SVX_SHADOW_TOPRIGHT;
     249           0 :                     break;
     250             :                 case SVX_SHADOW_NONE:
     251             :                 case SVX_SHADOW_END:
     252          18 :                     aLocation = m_aShadowLocation;
     253          18 :                     break;
     254             :             }
     255          18 :             break;
     256             : 
     257             :         case 1800:
     258           0 :             switch ( m_aShadowLocation )
     259             :             {
     260             :                 case SVX_SHADOW_TOPLEFT:
     261           0 :                     aLocation = SVX_SHADOW_BOTTOMRIGHT;
     262           0 :                     break;
     263             :                 case SVX_SHADOW_TOPRIGHT:
     264           0 :                     aLocation = SVX_SHADOW_BOTTOMLEFT;
     265           0 :                     break;
     266             :                 case SVX_SHADOW_BOTTOMLEFT:
     267           0 :                     aLocation = SVX_SHADOW_TOPRIGHT;
     268           0 :                     break;
     269             :                 case SVX_SHADOW_BOTTOMRIGHT:
     270           0 :                     aLocation = SVX_SHADOW_TOPLEFT;
     271           0 :                     break;
     272             :                 case SVX_SHADOW_NONE:
     273             :                 case SVX_SHADOW_END:
     274           0 :                     aLocation = m_aShadowLocation;
     275           0 :                     break;
     276             :             }
     277           0 :             break;
     278             : 
     279             :         case 2700:
     280           0 :             switch ( m_aShadowLocation )
     281             :             {
     282             :                 case SVX_SHADOW_TOPLEFT:
     283           0 :                     aLocation = SVX_SHADOW_TOPRIGHT;
     284           0 :                     break;
     285             :                 case SVX_SHADOW_TOPRIGHT:
     286           0 :                     aLocation = SVX_SHADOW_BOTTOMRIGHT;
     287           0 :                     break;
     288             :                 case SVX_SHADOW_BOTTOMLEFT:
     289           0 :                     aLocation = SVX_SHADOW_TOPLEFT;
     290           0 :                     break;
     291             :                 case SVX_SHADOW_BOTTOMRIGHT:
     292           0 :                     aLocation = SVX_SHADOW_BOTTOMLEFT;
     293           0 :                     break;
     294             :                 case SVX_SHADOW_NONE:
     295             :                 case SVX_SHADOW_END:
     296           0 :                     aLocation = m_aShadowLocation;
     297           0 :                     break;
     298             :             }
     299           0 :             break;
     300             : 
     301             :         default:
     302             :             assert(false);
     303           0 :             break;
     304             :     }
     305      407271 :     return aLocation;
     306             : }
     307             : 
     308      362792 : sal_uInt16 SwFont::CalcShadowSpace(
     309             :         const sal_uInt16 nShadow, const bool bVertLayout,
     310             :         const bool bSkipLeft, const bool bSkipRight ) const
     311             : {
     312      362792 :     sal_uInt16 nSpace = 0;
     313      362792 :     const sal_uInt16 nOrient = GetOrientation( bVertLayout );
     314      362792 :     const SvxShadowLocation aLoc = GetAbsShadowLocation( bVertLayout );
     315      362792 :     switch( nShadow )
     316             :     {
     317             :         case SHADOW_TOP:
     318       90698 :             if(( aLoc == SVX_SHADOW_TOPLEFT ||
     319           4 :                aLoc == SVX_SHADOW_TOPRIGHT ) &&
     320           0 :                ( nOrient == 0 || nOrient == 1800 ||
     321           0 :                ( nOrient == 900 && !bSkipRight ) ||
     322           0 :                ( nOrient == 2700 && !bSkipLeft )))
     323             :             {
     324           4 :                 nSpace = m_nShadowWidth;
     325             :             }
     326       90698 :             break;
     327             : 
     328             :         case SHADOW_BOTTOM:
     329       90698 :             if(( aLoc == SVX_SHADOW_BOTTOMLEFT ||
     330          16 :                aLoc == SVX_SHADOW_BOTTOMRIGHT ) &&
     331           0 :                ( nOrient == 0 || nOrient == 1800 ||
     332           0 :                ( nOrient == 900 && !bSkipLeft ) ||
     333           0 :                ( nOrient == 2700 && !bSkipRight )))
     334             :             {
     335          16 :                 nSpace = m_nShadowWidth;
     336             :             }
     337       90698 :             break;
     338             : 
     339             :         case SHADOW_LEFT:
     340       90698 :             if(( aLoc == SVX_SHADOW_TOPLEFT ||
     341           4 :                aLoc == SVX_SHADOW_BOTTOMLEFT ) &&
     342           4 :                ( nOrient == 900 || nOrient == 2700 ||
     343           4 :                ( nOrient == 0 && !bSkipLeft ) ||
     344           0 :                ( nOrient == 1800 && !bSkipRight )))
     345             :             {
     346           4 :                 nSpace = m_nShadowWidth;
     347             :             }
     348       90698 :             break;
     349             : 
     350             :          case SHADOW_RIGHT:
     351       90698 :             if(( aLoc == SVX_SHADOW_TOPRIGHT ||
     352          16 :                aLoc == SVX_SHADOW_BOTTOMRIGHT ) &&
     353          16 :                ( nOrient == 900 || nOrient == 2700 ||
     354          16 :                ( nOrient == 0 && !bSkipRight ) ||
     355           0 :                ( nOrient == 1800 && !bSkipLeft )))
     356             :             {
     357          16 :                 nSpace = m_nShadowWidth;
     358             :             }
     359       90698 :             break;
     360             :         default:
     361             :             assert(false);
     362           0 :             break;
     363             :     }
     364             : 
     365      362792 :     return nSpace;
     366             : }
     367             : 
     368             : // maps directions for vertical layout
     369      117126 : sal_uInt16 MapDirection( sal_uInt16 nDir, const bool bVertFormat )
     370             : {
     371      117126 :     if ( bVertFormat )
     372             :     {
     373           4 :         switch ( nDir )
     374             :         {
     375             :         case 0 :
     376           4 :             nDir = 2700;
     377           4 :             break;
     378             :         case 900 :
     379           0 :             nDir = 0;
     380           0 :             break;
     381             :         case 2700 :
     382           0 :             nDir = 1800;
     383           0 :             break;
     384             : #if OSL_DEBUG_LEVEL > 0
     385             :         default :
     386             :             OSL_FAIL( "Unsupported direction" );
     387             :             break;
     388             : #endif
     389             :         }
     390             :     }
     391      117126 :     return nDir;
     392             : }
     393             : 
     394             : // maps the absolute direction set at the font to its logical conterpart
     395             : // in the rotated environment
     396     1049998 : sal_uInt16 UnMapDirection( sal_uInt16 nDir, const bool bVertFormat )
     397             : {
     398     1049998 :     if ( bVertFormat )
     399             :     {
     400           0 :         switch ( nDir )
     401             :         {
     402             :         case 0 :
     403           0 :             nDir = 900;
     404           0 :             break;
     405             :         case 1800 :
     406           0 :             nDir = 2700;
     407           0 :             break;
     408             :         case 2700 :
     409           0 :             nDir = 0;
     410           0 :             break;
     411             : #if OSL_DEBUG_LEVEL > 0
     412             :         default :
     413             :             OSL_FAIL( "Unsupported direction" );
     414             :             break;
     415             : #endif
     416             :         }
     417             :     }
     418     1049998 :     return nDir;
     419             : }
     420             : 
     421     1048370 : sal_uInt16 SwFont::GetOrientation( const bool bVertFormat ) const
     422             : {
     423     1048370 :     return UnMapDirection( aSub[nActual].GetOrientation(), bVertFormat );
     424             : }
     425             : 
     426      117126 : void SwFont::SetVertical( sal_uInt16 nDir, const bool bVertFormat )
     427             : {
     428             :     // map direction if frame has vertical layout
     429      117126 :     nDir = MapDirection( nDir, bVertFormat );
     430             : 
     431      117126 :     if( nDir != aSub[0].GetOrientation() )
     432             :     {
     433        1606 :         bFntChg = true;
     434        1606 :         aSub[0].SetVertical( nDir, bVertFormat );
     435        1606 :         aSub[1].SetVertical( nDir, bVertFormat || nDir > 1000 );
     436        1606 :         aSub[2].SetVertical( nDir, bVertFormat );
     437             :     }
     438      117126 : }
     439             : 
     440             : /*
     441             :  Escapement:
     442             :     frEsc:  Fraction, Grad des Escapements
     443             :     Esc = resultierendes Escapement
     444             :     A1 = Original-Ascent            (nOrgAscent)
     445             :     A2 = verkleinerter Ascent       (nEscAscent)
     446             :     Ax = resultierender Ascent      (GetAscent())
     447             :     H1 = Original-Hoehe             (nOrgHeight)
     448             :     H2 = verkleinerter Hoehe        (nEscHeight)
     449             :     Hx = resultierender Hoehe       (GetHeight())
     450             :     Bx = resultierende Baseline fuer die Textausgabe (CalcPos())
     451             :          (Vorsicht: Y - A1!)
     452             : 
     453             :     Escapement:
     454             :         Esc = H1 * frEsc;
     455             : 
     456             :     Hochstellung:
     457             :         Ax = A2 + Esc;
     458             :         Hx = H2 + Esc;
     459             :         Bx = A1 - Esc;
     460             : 
     461             :     Tiefstellung:
     462             :         Ax = A1;
     463             :         Hx = A1 + Esc + (H2 - A2);
     464             :         Bx = A1 + Esc;
     465             : */
     466             : 
     467             : // nEsc ist der Prozentwert
     468       12164 : sal_uInt16 SwSubFont::CalcEscAscent( const sal_uInt16 nOldAscent ) const
     469             : {
     470       23162 :     if( DFLT_ESC_AUTO_SUPER != GetEscapement() &&
     471       10998 :         DFLT_ESC_AUTO_SUB != GetEscapement() )
     472             :     {
     473       10906 :         const long nAscent = nOldAscent +
     474       10906 :                              ( (long) nOrgHeight * GetEscapement() ) / 100L;
     475       10906 :         if ( nAscent>0 )
     476       10906 :             return std::max<sal_uInt16>( nAscent, nOrgAscent );
     477             :     }
     478        1258 :     return nOrgAscent;
     479             : }
     480             : 
     481        6286 : void SwFont::SetDiffFnt( const SfxItemSet *pAttrSet,
     482             :                          const IDocumentSettingAccess *pIDocumentSettingAccess )
     483             : {
     484        6286 :     delete pBackColor;
     485        6286 :     pBackColor = NULL;
     486             : 
     487        6286 :     if( pAttrSet )
     488             :     {
     489             :         const SfxPoolItem* pItem;
     490        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_FONT,
     491        6286 :             true, &pItem ))
     492             :         {
     493        1816 :             const SvxFontItem *pFont = (const SvxFontItem *)pItem;
     494        1816 :             aSub[SW_LATIN].SetFamily( pFont->GetFamily() );
     495        1816 :             aSub[SW_LATIN].Font::SetName( pFont->GetFamilyName() );
     496        1816 :             aSub[SW_LATIN].Font::SetStyleName( pFont->GetStyleName() );
     497        1816 :             aSub[SW_LATIN].Font::SetPitch( pFont->GetPitch() );
     498        1816 :             aSub[SW_LATIN].Font::SetCharSet( pFont->GetCharSet() );
     499             :         }
     500        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_FONTSIZE,
     501        6286 :             true, &pItem ))
     502             :         {
     503        3274 :             const SvxFontHeightItem *pHeight = (const SvxFontHeightItem *)pItem;
     504        3274 :             aSub[SW_LATIN].SvxFont::SetPropr( 100 );
     505        3274 :             aSub[SW_LATIN].aSize = aSub[SW_LATIN].Font::GetSize();
     506        3274 :             Size aTmpSize = aSub[SW_LATIN].aSize;
     507        3274 :             aTmpSize.Height() = pHeight->GetHeight();
     508        3274 :             aSub[SW_LATIN].SetSize( aTmpSize );
     509             :         }
     510        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_POSTURE,
     511        6286 :             true, &pItem ))
     512         276 :             aSub[SW_LATIN].Font::SetItalic( ((SvxPostureItem*)pItem)->GetPosture() );
     513        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_WEIGHT,
     514        6286 :             true, &pItem ))
     515        1454 :             aSub[SW_LATIN].Font::SetWeight( ((SvxWeightItem*)pItem)->GetWeight() );
     516        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_LANGUAGE,
     517        6286 :             true, &pItem ))
     518         482 :             aSub[SW_LATIN].SetLanguage( ((SvxLanguageItem*)pItem)->GetLanguage() );
     519             : 
     520        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CJK_FONT,
     521        6286 :             true, &pItem ))
     522             :         {
     523         186 :             const SvxFontItem *pFont = (const SvxFontItem *)pItem;
     524         186 :             aSub[SW_CJK].SetFamily( pFont->GetFamily() );
     525         186 :             aSub[SW_CJK].Font::SetName( pFont->GetFamilyName() );
     526         186 :             aSub[SW_CJK].Font::SetStyleName( pFont->GetStyleName() );
     527         186 :             aSub[SW_CJK].Font::SetPitch( pFont->GetPitch() );
     528         186 :             aSub[SW_CJK].Font::SetCharSet( pFont->GetCharSet() );
     529             :         }
     530        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CJK_FONTSIZE,
     531        6286 :             true, &pItem ))
     532             :         {
     533        1584 :             const SvxFontHeightItem *pHeight = (const SvxFontHeightItem *)pItem;
     534        1584 :             aSub[SW_CJK].SvxFont::SetPropr( 100 );
     535        1584 :             aSub[SW_CJK].aSize = aSub[SW_CJK].Font::GetSize();
     536        1584 :             Size aTmpSize = aSub[SW_CJK].aSize;
     537        1584 :             aTmpSize.Height() = pHeight->GetHeight();
     538        1584 :             aSub[SW_CJK].SetSize( aTmpSize );
     539             :         }
     540        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CJK_POSTURE,
     541        6286 :             true, &pItem ))
     542         276 :             aSub[SW_CJK].Font::SetItalic( ((SvxPostureItem*)pItem)->GetPosture() );
     543        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CJK_WEIGHT,
     544        6286 :             true, &pItem ))
     545        1010 :             aSub[SW_CJK].Font::SetWeight( ((SvxWeightItem*)pItem)->GetWeight() );
     546        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CJK_LANGUAGE,
     547        6286 :             true, &pItem ))
     548             :         {
     549           0 :             LanguageType eNewLang = ((SvxLanguageItem*)pItem)->GetLanguage();
     550           0 :             aSub[SW_CJK].SetLanguage( eNewLang );
     551           0 :             aSub[SW_LATIN].SetCJKContextLanguage( eNewLang );
     552           0 :             aSub[SW_CJK].SetCJKContextLanguage( eNewLang );
     553           0 :             aSub[SW_CTL].SetCJKContextLanguage( eNewLang );
     554             :         }
     555             : 
     556        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CTL_FONT,
     557        6286 :             true, &pItem ))
     558             :         {
     559        3264 :             const SvxFontItem *pFont = (const SvxFontItem *)pItem;
     560        3264 :             aSub[SW_CTL].SetFamily( pFont->GetFamily() );
     561        3264 :             aSub[SW_CTL].Font::SetName( pFont->GetFamilyName() );
     562        3264 :             aSub[SW_CTL].Font::SetStyleName( pFont->GetStyleName() );
     563        3264 :             aSub[SW_CTL].Font::SetPitch( pFont->GetPitch() );
     564        3264 :             aSub[SW_CTL].Font::SetCharSet( pFont->GetCharSet() );
     565             :         }
     566        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CTL_FONTSIZE,
     567        6286 :             true, &pItem ))
     568             :         {
     569        1402 :             const SvxFontHeightItem *pHeight = (const SvxFontHeightItem *)pItem;
     570        1402 :             aSub[SW_CTL].SvxFont::SetPropr( 100 );
     571        1402 :             aSub[SW_CTL].aSize = aSub[SW_CTL].Font::GetSize();
     572        1402 :             Size aTmpSize = aSub[SW_CTL].aSize;
     573        1402 :             aTmpSize.Height() = pHeight->GetHeight();
     574        1402 :             aSub[SW_CTL].SetSize( aTmpSize );
     575             :         }
     576        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CTL_POSTURE,
     577        6286 :             true, &pItem ))
     578         114 :             aSub[SW_CTL].Font::SetItalic( ((SvxPostureItem*)pItem)->GetPosture() );
     579        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CTL_WEIGHT,
     580        6286 :             true, &pItem ))
     581         340 :             aSub[SW_CTL].Font::SetWeight( ((SvxWeightItem*)pItem)->GetWeight() );
     582        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CTL_LANGUAGE,
     583        6286 :             true, &pItem ))
     584          66 :             aSub[SW_CTL].SetLanguage( ((SvxLanguageItem*)pItem)->GetLanguage() );
     585             : 
     586        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_UNDERLINE,
     587        6286 :             true, &pItem ))
     588             :         {
     589         650 :             SetUnderline( ((SvxUnderlineItem*)pItem)->GetLineStyle() );
     590         650 :             SetUnderColor( ((SvxUnderlineItem*)pItem)->GetColor() );
     591             :         }
     592        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_OVERLINE,
     593        6286 :             true, &pItem ))
     594             :         {
     595           0 :             SetOverline( ((SvxOverlineItem*)pItem)->GetLineStyle() );
     596           0 :             SetOverColor( ((SvxOverlineItem*)pItem)->GetColor() );
     597             :         }
     598        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CROSSEDOUT,
     599        6286 :             true, &pItem ))
     600          74 :             SetStrikeout( ((SvxCrossedOutItem*)pItem)->GetStrikeout() );
     601        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_COLOR,
     602        6286 :             true, &pItem ))
     603         678 :             SetColor( ((SvxColorItem*)pItem)->GetValue() );
     604        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_EMPHASIS_MARK,
     605        6286 :             true, &pItem ))
     606         330 :             SetEmphasisMark( ((SvxEmphasisMarkItem*)pItem)->GetEmphasisMark() );
     607             : 
     608        6286 :         SetTransparent( true );
     609        6286 :         SetAlign( ALIGN_BASELINE );
     610        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CONTOUR,
     611        6286 :             true, &pItem ))
     612          62 :             SetOutline( ((SvxContourItem*)pItem)->GetValue() );
     613        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_SHADOWED,
     614        6286 :             true, &pItem ))
     615          62 :             SetShadow( ((SvxShadowedItem*)pItem)->GetValue() );
     616        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_RELIEF,
     617        6286 :             true, &pItem ))
     618          54 :             SetRelief( (FontRelief)((SvxCharReliefItem*)pItem)->GetValue() );
     619        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_SHADOWED,
     620        6286 :             true, &pItem ))
     621          62 :             SetPropWidth(((SvxShadowedItem*)pItem)->GetValue() ? 50 : 100 );
     622        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_AUTOKERN,
     623        6286 :             true, &pItem ))
     624             :         {
     625         172 :             if( ((SvxAutoKernItem*)pItem)->GetValue() )
     626             :             {
     627           0 :                 SetAutoKern( ( !pIDocumentSettingAccess ||
     628           0 :                                !pIDocumentSettingAccess->get(IDocumentSettingAccess::KERN_ASIAN_PUNCTUATION) ) ?
     629             :                                 KERNING_FONTSPECIFIC :
     630           0 :                                 KERNING_ASIAN );
     631             :             }
     632             :             else
     633         172 :                 SetAutoKern( 0 );
     634             :         }
     635        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_WORDLINEMODE,
     636        6286 :             true, &pItem ))
     637           0 :             SetWordLineMode( ((SvxWordLineModeItem*)pItem)->GetValue() );
     638             : 
     639        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_ESCAPEMENT,
     640        6286 :             true, &pItem ))
     641             :         {
     642         614 :             const SvxEscapementItem *pEsc = (const SvxEscapementItem *)pItem;
     643         614 :             SetEscapement( pEsc->GetEsc() );
     644         614 :             if( aSub[SW_LATIN].IsEsc() )
     645         552 :                 SetProportion( pEsc->GetProp() );
     646             :         }
     647        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CASEMAP,
     648        6286 :             true, &pItem ))
     649          64 :             SetCaseMap( ((SvxCaseMapItem*)pItem)->GetCaseMap() );
     650        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_KERNING,
     651        6286 :             true, &pItem ))
     652         168 :             SetFixKerning( ((SvxKerningItem*)pItem)->GetValue() );
     653        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_NOHYPHEN,
     654        6286 :             true, &pItem ))
     655           0 :             SetNoHyph( ((SvxNoHyphenItem*)pItem)->GetValue() );
     656        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_BLINK,
     657        6286 :             true, &pItem ))
     658          54 :             SetBlink( ((SvxBlinkItem*)pItem)->GetValue() );
     659        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_ROTATE,
     660        6286 :             true, &pItem ))
     661           0 :             SetVertical( ((SvxCharRotateItem*)pItem)->GetValue() );
     662        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_BACKGROUND,
     663        6286 :             true, &pItem ))
     664          60 :             pBackColor = new Color( ((SvxBrushItem*)pItem)->GetColor() );
     665        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_HIGHLIGHT,
     666        6286 :             true, &pItem ))
     667           0 :             SetHighlightColor(((SvxBrushItem*)pItem)->GetColor());
     668        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_BOX,
     669        6286 :             true, &pItem ))
     670             :         {
     671           0 :             const SvxBoxItem* pBoxItem = static_cast<const SvxBoxItem*>(pItem);
     672           0 :             SetTopBorder(pBoxItem->GetTop());
     673           0 :             SetBottomBorder(pBoxItem->GetBottom());
     674           0 :             SetRightBorder(pBoxItem->GetRight());
     675           0 :             SetLeftBorder(pBoxItem->GetLeft());
     676           0 :             SetTopBorderDist(pBoxItem->GetDistance(BOX_LINE_TOP));
     677           0 :             SetBottomBorderDist(pBoxItem->GetDistance(BOX_LINE_BOTTOM));
     678           0 :             SetRightBorderDist(pBoxItem->GetDistance(BOX_LINE_RIGHT));
     679           0 :             SetLeftBorderDist(pBoxItem->GetDistance(BOX_LINE_LEFT));
     680             :         }
     681        6286 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_SHADOW,
     682        6286 :             true, &pItem ))
     683             :         {
     684           0 :             const SvxShadowItem* pShadowItem = static_cast<const SvxShadowItem*>(pItem);
     685           0 :             SetShadowColor(pShadowItem->GetColor());
     686           0 :             SetShadowWidth(pShadowItem->GetWidth());
     687           0 :             SetShadowLocation(pShadowItem->GetLocation());
     688             :         }
     689        6286 :         const SfxPoolItem* pTwoLinesItem = 0;
     690        6286 :         if( SfxItemState::SET ==
     691        6286 :                 pAttrSet->GetItemState( RES_CHRATR_TWO_LINES, true, &pTwoLinesItem ))
     692           0 :             if ( ((SvxTwoLinesItem*)pTwoLinesItem)->GetValue() )
     693           0 :                 SetVertical( 0 );
     694             :     }
     695             :     else
     696             :     {
     697           0 :         Invalidate();
     698           0 :         bNoHyph = false;
     699           0 :         bBlink = false;
     700             :     }
     701        6286 :     bPaintBlank = false;
     702        6286 :     bPaintWrong = false;
     703             :     OSL_ENSURE( aSub[SW_LATIN].IsTransparent(), "SwFont: Transparent revolution" );
     704        6286 : }
     705             : 
     706      934711 : SwFont::SwFont( const SwFont &rFont )
     707             : {
     708      934711 :     aSub[SW_LATIN] = rFont.aSub[SW_LATIN];
     709      934711 :     aSub[SW_CJK] = rFont.aSub[SW_CJK];
     710      934711 :     aSub[SW_CTL] = rFont.aSub[SW_CTL];
     711      934711 :     nActual = rFont.nActual;
     712      934711 :     pBackColor = rFont.pBackColor ? new Color( *rFont.pBackColor ) : NULL;
     713      934711 :     m_aHighlightColor = rFont.m_aHighlightColor;
     714      934711 :     m_aTopBorder = rFont.m_aTopBorder;
     715      934711 :     m_aBottomBorder = rFont.m_aBottomBorder;
     716      934711 :     m_aRightBorder = rFont.m_aRightBorder;
     717      934711 :     m_aLeftBorder = rFont.m_aLeftBorder;
     718      934711 :     m_nTopBorderDist = rFont.m_nTopBorderDist;
     719      934711 :     m_nBottomBorderDist = rFont.m_nBottomBorderDist;
     720      934711 :     m_nRightBorderDist = rFont.m_nRightBorderDist;
     721      934711 :     m_nLeftBorderDist = rFont.m_nLeftBorderDist;
     722      934711 :     m_aShadowColor = rFont.m_aShadowColor;
     723      934711 :     m_nShadowWidth = rFont.m_nShadowWidth;
     724      934711 :     m_aShadowLocation = rFont.m_aShadowLocation;
     725      934711 :     aUnderColor = rFont.GetUnderColor();
     726      934711 :     aOverColor  = rFont.GetOverColor();
     727      934711 :     nToxCnt = 0;
     728      934711 :     nRefCnt = 0;
     729      934711 :     m_nMetaCount = 0;
     730      934711 :     m_nInputFieldCount = 0;
     731      934711 :     bFntChg = rFont.bFntChg;
     732      934711 :     bOrgChg = rFont.bOrgChg;
     733      934711 :     bPaintBlank = rFont.bPaintBlank;
     734      934711 :     bPaintWrong = false;
     735      934711 :     bURL = rFont.bURL;
     736      934711 :     bGreyWave = rFont.bGreyWave;
     737      934711 :     bNoColReplace = rFont.bNoColReplace;
     738      934711 :     bNoHyph = rFont.bNoHyph;
     739      934711 :     bBlink = rFont.bBlink;
     740      934711 : }
     741             : 
     742      103178 : SwFont::SwFont( const SwAttrSet* pAttrSet,
     743      103178 :                 const IDocumentSettingAccess* pIDocumentSettingAccess )
     744             : {
     745      103178 :     nActual = SW_LATIN;
     746      103178 :     nToxCnt = 0;
     747      103178 :     nRefCnt = 0;
     748      103178 :     m_nMetaCount = 0;
     749      103178 :     m_nInputFieldCount = 0;
     750      103178 :     bPaintBlank = false;
     751      103178 :     bPaintWrong = false;
     752      103178 :     bURL = false;
     753      103178 :     bGreyWave = false;
     754      103178 :     bNoColReplace = false;
     755      103178 :     bNoHyph = pAttrSet->GetNoHyphenHere().GetValue();
     756      103178 :     bBlink = pAttrSet->GetBlink().GetValue();
     757      103178 :     bOrgChg = true;
     758             :     {
     759      103178 :         const SvxFontItem& rFont = pAttrSet->GetFont();
     760      103178 :         aSub[SW_LATIN].SetFamily( rFont.GetFamily() );
     761      103178 :         aSub[SW_LATIN].SetName( rFont.GetFamilyName() );
     762      103178 :         aSub[SW_LATIN].SetStyleName( rFont.GetStyleName() );
     763      103178 :         aSub[SW_LATIN].SetPitch( rFont.GetPitch() );
     764      103178 :         aSub[SW_LATIN].SetCharSet( rFont.GetCharSet() );
     765      103178 :         aSub[SW_LATIN].SvxFont::SetPropr( 100 );   // 100% der FontSize
     766      103178 :         Size aTmpSize = aSub[SW_LATIN].aSize;
     767      103178 :         aTmpSize.Height() = pAttrSet->GetSize().GetHeight();
     768      103178 :         aSub[SW_LATIN].SetSize( aTmpSize );
     769      103178 :         aSub[SW_LATIN].SetItalic( pAttrSet->GetPosture().GetPosture() );
     770      103178 :         aSub[SW_LATIN].SetWeight( pAttrSet->GetWeight().GetWeight() );
     771      103178 :         aSub[SW_LATIN].SetLanguage( pAttrSet->GetLanguage().GetLanguage() );
     772             :     }
     773             : 
     774             :     {
     775      103178 :         const SvxFontItem& rFont = pAttrSet->GetCJKFont();
     776      103178 :         aSub[SW_CJK].SetFamily( rFont.GetFamily() );
     777      103178 :         aSub[SW_CJK].SetName( rFont.GetFamilyName() );
     778      103178 :         aSub[SW_CJK].SetStyleName( rFont.GetStyleName() );
     779      103178 :         aSub[SW_CJK].SetPitch( rFont.GetPitch() );
     780      103178 :         aSub[SW_CJK].SetCharSet( rFont.GetCharSet() );
     781      103178 :         aSub[SW_CJK].SvxFont::SetPropr( 100 );   // 100% der FontSize
     782      103178 :         Size aTmpSize = aSub[SW_CJK].aSize;
     783      103178 :         aTmpSize.Height() = pAttrSet->GetCJKSize().GetHeight();
     784      103178 :         aSub[SW_CJK].SetSize( aTmpSize );
     785      103178 :         aSub[SW_CJK].SetItalic( pAttrSet->GetCJKPosture().GetPosture() );
     786      103178 :         aSub[SW_CJK].SetWeight( pAttrSet->GetCJKWeight().GetWeight() );
     787      103178 :         LanguageType eNewLang = pAttrSet->GetCJKLanguage().GetLanguage();
     788      103178 :         aSub[SW_CJK].SetLanguage( eNewLang );
     789      103178 :         aSub[SW_LATIN].SetCJKContextLanguage( eNewLang );
     790      103178 :         aSub[SW_CJK].SetCJKContextLanguage( eNewLang );
     791      103178 :         aSub[SW_CTL].SetCJKContextLanguage( eNewLang );
     792             :     }
     793             : 
     794             :     {
     795      103178 :         const SvxFontItem& rFont = pAttrSet->GetCTLFont();
     796      103178 :         aSub[SW_CTL].SetFamily( rFont.GetFamily() );
     797      103178 :         aSub[SW_CTL].SetName( rFont.GetFamilyName() );
     798      103178 :         aSub[SW_CTL].SetStyleName( rFont.GetStyleName() );
     799      103178 :         aSub[SW_CTL].SetPitch( rFont.GetPitch() );
     800      103178 :         aSub[SW_CTL].SetCharSet( rFont.GetCharSet() );
     801      103178 :         aSub[SW_CTL].SvxFont::SetPropr( 100 );   // 100% der FontSize
     802      103178 :         Size aTmpSize = aSub[SW_CTL].aSize;
     803      103178 :         aTmpSize.Height() = pAttrSet->GetCTLSize().GetHeight();
     804      103178 :         aSub[SW_CTL].SetSize( aTmpSize );
     805      103178 :         aSub[SW_CTL].SetItalic( pAttrSet->GetCTLPosture().GetPosture() );
     806      103178 :         aSub[SW_CTL].SetWeight( pAttrSet->GetCTLWeight().GetWeight() );
     807      103178 :         aSub[SW_CTL].SetLanguage( pAttrSet->GetCTLLanguage().GetLanguage() );
     808             :     }
     809      103178 :     if ( pAttrSet->GetCharHidden().GetValue() )
     810         658 :         SetUnderline( UNDERLINE_DOTTED );
     811             :     else
     812      102520 :         SetUnderline( pAttrSet->GetUnderline().GetLineStyle() );
     813      103178 :     SetUnderColor( pAttrSet->GetUnderline().GetColor() );
     814      103178 :     SetOverline( pAttrSet->GetOverline().GetLineStyle() );
     815      103178 :     SetOverColor( pAttrSet->GetOverline().GetColor() );
     816      103178 :     SetEmphasisMark( pAttrSet->GetEmphasisMark().GetEmphasisMark() );
     817      103178 :     SetStrikeout( pAttrSet->GetCrossedOut().GetStrikeout() );
     818      103178 :     SetColor( pAttrSet->GetColor().GetValue() );
     819      103178 :     SetTransparent( true );
     820      103178 :     SetAlign( ALIGN_BASELINE );
     821      103178 :     SetOutline( pAttrSet->GetContour().GetValue() );
     822      103178 :     SetShadow( pAttrSet->GetShadowed().GetValue() );
     823      103178 :     SetPropWidth( pAttrSet->GetCharScaleW().GetValue() );
     824      103178 :     SetRelief( (FontRelief)pAttrSet->GetCharRelief().GetValue() );
     825      103178 :     if( pAttrSet->GetAutoKern().GetValue() )
     826             :     {
     827       92360 :         SetAutoKern( ( !pIDocumentSettingAccess ||
     828       92360 :                        !pIDocumentSettingAccess->get(IDocumentSettingAccess::KERN_ASIAN_PUNCTUATION) ) ?
     829             :                         KERNING_FONTSPECIFIC :
     830      184702 :                         KERNING_ASIAN );
     831             :     }
     832             :     else
     833       10818 :         SetAutoKern( 0 );
     834      103178 :     SetWordLineMode( pAttrSet->GetWordLineMode().GetValue() );
     835      103178 :     const SvxEscapementItem &rEsc = pAttrSet->GetEscapement();
     836      103178 :     SetEscapement( rEsc.GetEsc() );
     837      103178 :     if( aSub[SW_LATIN].IsEsc() )
     838        4092 :         SetProportion( rEsc.GetProp() );
     839      103178 :     SetCaseMap( pAttrSet->GetCaseMap().GetCaseMap() );
     840      103178 :     SetFixKerning( pAttrSet->GetKerning().GetValue() );
     841             :     const SfxPoolItem* pItem;
     842      103178 :     if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_BACKGROUND,
     843      103178 :         true, &pItem ))
     844        3594 :         pBackColor = new Color( ((SvxBrushItem*)pItem)->GetColor() );
     845             :     else
     846       99584 :         pBackColor = NULL;
     847      103178 :     if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_HIGHLIGHT,
     848      103178 :         true, &pItem ))
     849           0 :         SetHighlightColor(((SvxBrushItem*)pItem)->GetColor());
     850             :     else
     851      103178 :         SetHighlightColor(COL_TRANSPARENT);
     852      103178 :     if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_BOX,
     853      103178 :         true, &pItem ))
     854             :     {
     855         528 :         const SvxBoxItem* pBoxItem = static_cast<const SvxBoxItem*>(pItem);
     856         528 :         SetTopBorder(pBoxItem->GetTop());
     857         528 :         SetBottomBorder(pBoxItem->GetBottom());
     858         528 :         SetRightBorder(pBoxItem->GetRight());
     859         528 :         SetLeftBorder(pBoxItem->GetLeft());
     860         528 :         SetTopBorderDist(pBoxItem->GetDistance(BOX_LINE_TOP));
     861         528 :         SetBottomBorderDist(pBoxItem->GetDistance(BOX_LINE_BOTTOM));
     862         528 :         SetRightBorderDist(pBoxItem->GetDistance(BOX_LINE_RIGHT));
     863         528 :         SetLeftBorderDist(pBoxItem->GetDistance(BOX_LINE_LEFT));
     864             :     }
     865             :     else
     866             :     {
     867      102650 :         SetTopBorder(0);
     868      102650 :         SetBottomBorder(0);
     869      102650 :         SetRightBorder(0);
     870      102650 :         SetLeftBorder(0);
     871      102650 :         SetTopBorderDist(0);
     872      102650 :         SetBottomBorderDist(0);
     873      102650 :         SetRightBorderDist(0);
     874      102650 :         SetLeftBorderDist(0);
     875             :     }
     876             : 
     877      103178 :     if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_SHADOW,
     878      103178 :         true, &pItem ))
     879             :     {
     880         276 :         const SvxShadowItem* pShadowItem = static_cast<const SvxShadowItem*>(pItem);
     881         276 :         SetShadowColor(pShadowItem->GetColor());
     882         276 :         SetShadowWidth(pShadowItem->GetWidth());
     883         276 :         SetShadowLocation(pShadowItem->GetLocation());
     884             :     }
     885             :     else
     886             :     {
     887      102902 :         SetShadowColor(COL_TRANSPARENT);
     888      102902 :         SetShadowWidth(0);
     889      102902 :         SetShadowLocation(SVX_SHADOW_NONE);
     890             :     }
     891             : 
     892      103178 :     const SvxTwoLinesItem& rTwoLinesItem = pAttrSet->Get2Lines();
     893      103178 :     if ( ! rTwoLinesItem.GetValue() )
     894      100964 :         SetVertical( pAttrSet->GetCharRotate().GetValue() );
     895             :     else
     896        2214 :         SetVertical( 0 );
     897      103178 :     if( pIDocumentSettingAccess && pIDocumentSettingAccess->get( IDocumentSettingAccess::SMALL_CAPS_PERCENTAGE_66 ))
     898             :     {
     899        1122 :         aSub[ SW_LATIN ].smallCapsPercentage66 = true;
     900        1122 :         aSub[ SW_CJK ].smallCapsPercentage66 = true;
     901        1122 :         aSub[ SW_CTL ].smallCapsPercentage66 = true;
     902             :     }
     903      103178 : }
     904             : 
     905     2075726 : SwFont::~SwFont()
     906             : {
     907     1037863 :     delete pBackColor;
     908     1037863 : }
     909             : 
     910     3154230 : SwSubFont& SwSubFont::operator=( const SwSubFont &rFont )
     911             : {
     912     3154230 :     SvxFont::operator=( rFont );
     913     3154230 :     pMagic = rFont.pMagic;
     914     3154230 :     nFntIndex = rFont.nFntIndex;
     915     3154230 :     nOrgHeight = rFont.nOrgHeight;
     916     3154230 :     nOrgAscent = rFont.nOrgAscent;
     917     3154230 :     nPropWidth = rFont.nPropWidth;
     918     3154230 :     aSize = rFont.aSize;
     919     3154230 :     smallCapsPercentage66 = rFont.smallCapsPercentage66;
     920     3154230 :     return *this;
     921             : }
     922             : 
     923      116699 : SwFont& SwFont::operator=( const SwFont &rFont )
     924             : {
     925      116699 :     aSub[SW_LATIN] = rFont.aSub[SW_LATIN];
     926      116699 :     aSub[SW_CJK] = rFont.aSub[SW_CJK];
     927      116699 :     aSub[SW_CTL] = rFont.aSub[SW_CTL];
     928      116699 :     nActual = rFont.nActual;
     929      116699 :     delete pBackColor;
     930      116699 :     pBackColor = rFont.pBackColor ? new Color( *rFont.pBackColor ) : NULL;
     931      116699 :     m_aHighlightColor = rFont.m_aHighlightColor;
     932      116699 :     m_aTopBorder = rFont.m_aTopBorder;
     933      116699 :     m_aBottomBorder = rFont.m_aBottomBorder;
     934      116699 :     m_aRightBorder = rFont.m_aRightBorder;
     935      116699 :     m_aLeftBorder = rFont.m_aLeftBorder;
     936      116699 :     m_nTopBorderDist = rFont.m_nTopBorderDist;
     937      116699 :     m_nBottomBorderDist = rFont.m_nBottomBorderDist;
     938      116699 :     m_nRightBorderDist = rFont.m_nRightBorderDist;
     939      116699 :     m_nLeftBorderDist = rFont.m_nLeftBorderDist;
     940      116699 :     m_aShadowColor = rFont.m_aShadowColor;
     941      116699 :     m_nShadowWidth = rFont.m_nShadowWidth;
     942      116699 :     m_aShadowLocation = rFont.m_aShadowLocation;
     943      116699 :     aUnderColor = rFont.GetUnderColor();
     944      116699 :     aOverColor  = rFont.GetOverColor();
     945      116699 :     nToxCnt = 0;
     946      116699 :     nRefCnt = 0;
     947      116699 :     m_nMetaCount = 0;
     948      116699 :     m_nInputFieldCount = 0;
     949      116699 :     bFntChg = rFont.bFntChg;
     950      116699 :     bOrgChg = rFont.bOrgChg;
     951      116699 :     bPaintBlank = rFont.bPaintBlank;
     952      116699 :     bPaintWrong = false;
     953      116699 :     bURL = rFont.bURL;
     954      116699 :     bGreyWave = rFont.bGreyWave;
     955      116699 :     bNoColReplace = rFont.bNoColReplace;
     956      116699 :     bNoHyph = rFont.bNoHyph;
     957      116699 :     bBlink = rFont.bBlink;
     958      116699 :     return *this;
     959             : }
     960             : 
     961       59768 : void SwFont::GoMagic( SwViewShell *pSh, sal_uInt8 nWhich )
     962             : {
     963             :     SwFntAccess aFntAccess( aSub[nWhich].pMagic, aSub[nWhich].nFntIndex,
     964       59768 :                             &aSub[nWhich], pSh, true );
     965       59768 : }
     966             : 
     967           0 : bool SwSubFont::IsSymbol( SwViewShell *pSh )
     968             : {
     969           0 :     SwFntAccess aFntAccess( pMagic, nFntIndex, this, pSh, false );
     970           0 :     return aFntAccess.Get()->IsSymbol();
     971             : }
     972             : 
     973      926909 : bool SwSubFont::ChgFnt( SwViewShell const *pSh, OutputDevice& rOut )
     974             : {
     975      926909 :     if ( pLastFont )
     976      917076 :         pLastFont->Unlock();
     977      926909 :     SwFntAccess aFntAccess( pMagic, nFntIndex, this, pSh, true );
     978             :     SV_STAT( nChangeFont );
     979             : 
     980      926909 :     pLastFont = aFntAccess.Get();
     981             : 
     982      926909 :     pLastFont->SetDevFont( pSh, rOut );
     983             : 
     984      926909 :     pLastFont->Lock();
     985     1796339 :     return UNDERLINE_NONE != GetUnderline() ||
     986     1796309 :            UNDERLINE_NONE != GetOverline()  ||
     987     1796309 :            STRIKEOUT_NONE != GetStrikeout();
     988             : }
     989             : 
     990      706941 : void SwFont::ChgPhysFnt( SwViewShell *pSh, OutputDevice& rOut )
     991             : {
     992      706941 :     if( bOrgChg && aSub[nActual].IsEsc() )
     993             :     {
     994        8692 :         const sal_uInt8 nOldProp = aSub[nActual].GetPropr();
     995        8692 :         SetProportion( 100 );
     996        8692 :         ChgFnt( pSh, rOut );
     997             :         SwFntAccess aFntAccess( aSub[nActual].pMagic, aSub[nActual].nFntIndex,
     998        8692 :                                 &aSub[nActual], pSh );
     999        8692 :         aSub[nActual].nOrgHeight = aFntAccess.Get()->GetFontHeight( pSh, rOut );
    1000        8692 :         aSub[nActual].nOrgAscent = aFntAccess.Get()->GetFontAscent( pSh, rOut );
    1001        8692 :         SetProportion( nOldProp );
    1002        8692 :         bOrgChg = false;
    1003             :     }
    1004             : 
    1005      706941 :     if( bFntChg )
    1006             :     {
    1007      706939 :         ChgFnt( pSh, rOut );
    1008      706939 :         bFntChg = bOrgChg;
    1009             :     }
    1010      706941 :     if( rOut.GetTextLineColor() != aUnderColor )
    1011         476 :         rOut.SetTextLineColor( aUnderColor );
    1012      706941 :     if( rOut.GetOverlineColor() != aOverColor )
    1013         260 :         rOut.SetOverlineColor( aOverColor );
    1014      706941 : }
    1015             : 
    1016             : //         Height = MaxAscent + MaxDescent
    1017             : //      MaxAscent = Max (T1_ascent, T2_ascent + (Esc * T1_height) );
    1018             : //     MaxDescent = Max (T1_height-T1_ascent,
    1019             : //                       T2_height-T2_ascent - (Esc * T1_height)
    1020       10106 : sal_uInt16 SwSubFont::CalcEscHeight( const sal_uInt16 nOldHeight,
    1021             :                               const sal_uInt16 nOldAscent  ) const
    1022             : {
    1023       18222 :     if( DFLT_ESC_AUTO_SUPER != GetEscapement() &&
    1024        8116 :         DFLT_ESC_AUTO_SUB != GetEscapement() )
    1025             :     {
    1026        7926 :         long nDescent = nOldHeight - nOldAscent -
    1027        7926 :                              ( (long) nOrgHeight * GetEscapement() ) / 100L;
    1028             :         const sal_uInt16 nDesc = nDescent>0
    1029       38318 :                 ? std::max<sal_uInt16>( nDescent, nOrgHeight - nOrgAscent)
    1030       31048 :                 : nOrgHeight - nOrgAscent;
    1031        7926 :         return ( nDesc + CalcEscAscent( nOldAscent ) );
    1032             :     }
    1033        2180 :     return nOrgHeight;
    1034             : }
    1035             : 
    1036          72 : short SwSubFont::_CheckKerning( )
    1037             : {
    1038          72 :     short nKernx = - short( Font::GetSize().Height() / 6 );
    1039             : 
    1040          72 :     if ( nKernx < GetFixKerning() )
    1041          72 :         return GetFixKerning();
    1042           0 :     return nKernx;
    1043             : }
    1044             : 
    1045      381527 : sal_uInt16 SwSubFont::GetAscent( SwViewShell *pSh, const OutputDevice& rOut )
    1046             : {
    1047      381527 :     SwFntAccess aFntAccess( pMagic, nFntIndex, this, pSh );
    1048      381527 :     const sal_uInt16 nAscent = aFntAccess.Get()->GetFontAscent( pSh, rOut );
    1049      381527 :     return GetEscapement() ? CalcEscAscent( nAscent ) : nAscent;
    1050             : }
    1051             : 
    1052      525407 : sal_uInt16 SwSubFont::GetHeight( SwViewShell *pSh, const OutputDevice& rOut )
    1053             : {
    1054             :     SV_STAT( nGetTextSize );
    1055      525407 :     SwFntAccess aFntAccess( pMagic, nFntIndex, this, pSh );
    1056      525407 :     const sal_uInt16 nHeight = aFntAccess.Get()->GetFontHeight( pSh, rOut );
    1057      525407 :     if ( GetEscapement() )
    1058             :     {
    1059        8300 :         const sal_uInt16 nAscent = aFntAccess.Get()->GetFontAscent( pSh, rOut );
    1060        8300 :         return CalcEscHeight( nHeight, nAscent ); // + nLeading;
    1061             :     }
    1062      517107 :     return nHeight; // + nLeading;
    1063             : }
    1064             : 
    1065      163738 : Size SwSubFont::_GetTxtSize( SwDrawTextInfo& rInf )
    1066             : {
    1067             :     // Robust: Eigentlich sollte der Font bereits eingestellt sein, aber
    1068             :     // sicher ist sicher ...
    1069      327452 :     if ( !pLastFont || pLastFont->GetOwner()!=pMagic ||
    1070      163714 :          !IsSameInstance( rInf.GetpOut()->GetFont() ) )
    1071      144389 :         ChgFnt( rInf.GetShell(), rInf.GetOut() );
    1072             : 
    1073      163738 :     SwDigitModeModifier aDigitModeModifier( rInf.GetOut(), rInf.GetFont()->GetLanguage() );
    1074             : 
    1075      163738 :     Size aTxtSize;
    1076      163738 :     sal_Int32 nLn = ( rInf.GetLen() == COMPLETE_STRING ? rInf.GetText().getLength()
    1077      163738 :                                                    : rInf.GetLen() );
    1078      163738 :     rInf.SetLen( nLn );
    1079      163738 :     if( IsCapital() && nLn )
    1080         322 :         aTxtSize = GetCapitalSize( rInf );
    1081             :     else
    1082             :     {
    1083             :         SV_STAT( nGetTextSize );
    1084      163416 :         long nOldKern = rInf.GetKern();
    1085      163416 :         const OUString oldTxt = rInf.GetText();
    1086      163416 :         rInf.SetKern( CheckKerning() );
    1087      163416 :         if ( !IsCaseMap() )
    1088      162916 :             aTxtSize = pLastFont->GetTextSize( rInf );
    1089             :         else
    1090             :         {
    1091         500 :             OUString aTmp = CalcCaseMap( rInf.GetText() );
    1092        1000 :             const OUString oldStr = rInf.GetText();
    1093         500 :             bool bCaseMapLengthDiffers(aTmp.getLength() != oldStr.getLength());
    1094             : 
    1095         500 :             if(bCaseMapLengthDiffers && rInf.GetLen())
    1096             :             {
    1097             :                 // #108203#
    1098             :                 // If the length of the original string and the CaseMapped one
    1099             :                 // are different, it is necessary to handle the given text part as
    1100             :                 // a single snippet since its size may differ, too.
    1101           0 :                 sal_Int32 nOldIdx(rInf.GetIdx());
    1102           0 :                 sal_Int32 nOldLen(rInf.GetLen());
    1103           0 :                 const OUString aSnippet(oldStr.copy(nOldIdx, nOldLen));
    1104           0 :                 OUString aNewText(CalcCaseMap(aSnippet));
    1105             : 
    1106           0 :                 rInf.SetText( aNewText );
    1107           0 :                 rInf.SetIdx( 0 );
    1108           0 :                 rInf.SetLen( aNewText.getLength() );
    1109             : 
    1110           0 :                 aTxtSize = pLastFont->GetTextSize( rInf );
    1111             : 
    1112           0 :                 rInf.SetIdx( nOldIdx );
    1113           0 :                 rInf.SetLen( nOldLen );
    1114             :             }
    1115             :             else
    1116             :             {
    1117         500 :                 rInf.SetText( aTmp );
    1118         500 :                 aTxtSize = pLastFont->GetTextSize( rInf );
    1119             :             }
    1120             : 
    1121        1000 :             rInf.SetText(oldStr);
    1122             :         }
    1123      163416 :         rInf.SetKern( nOldKern );
    1124      163416 :         rInf.SetText(oldTxt);
    1125             :         // 15142: Ein Wort laenger als eine Zeile, beim Zeilenumbruch
    1126             :         //        hochgestellt, muss seine effektive Hoehe melden.
    1127      163416 :         if( GetEscapement() )
    1128             :         {
    1129             :             const sal_uInt16 nAscent = pLastFont->GetFontAscent( rInf.GetShell(),
    1130        1806 :                                                              rInf.GetOut() );
    1131        1806 :             aTxtSize.Height() =
    1132        1806 :                 (long)CalcEscHeight( (sal_uInt16)aTxtSize.Height(), nAscent);
    1133      163416 :         }
    1134             :     }
    1135             : 
    1136      163738 :     if (1==rInf.GetLen() && CH_TXT_ATR_FIELDSTART==rInf.GetText()[rInf.GetIdx()])
    1137             :     {
    1138           0 :         sal_Int32 nOldIdx(rInf.GetIdx());
    1139           0 :         sal_Int32 nOldLen(rInf.GetLen());
    1140           0 :         OUString aNewText(CH_TXT_ATR_SUBST_FIELDSTART);
    1141           0 :         rInf.SetText( aNewText );
    1142           0 :         rInf.SetIdx( 0 );
    1143           0 :         rInf.SetLen( aNewText.getLength() );
    1144           0 :         aTxtSize = pLastFont->GetTextSize( rInf );
    1145           0 :         rInf.SetIdx( nOldIdx );
    1146           0 :         rInf.SetLen( nOldLen );
    1147             :     }
    1148      163738 :     else if (1==rInf.GetLen() && CH_TXT_ATR_FIELDEND==rInf.GetText()[ rInf.GetIdx() ])
    1149             :     {
    1150           0 :         sal_Int32 nOldIdx(rInf.GetIdx());
    1151           0 :         sal_Int32 nOldLen(rInf.GetLen());
    1152           0 :         OUString aNewText(CH_TXT_ATR_SUBST_FIELDEND);
    1153           0 :         rInf.SetText( aNewText );
    1154           0 :         rInf.SetIdx( 0 );
    1155           0 :         rInf.SetLen( aNewText.getLength() );
    1156           0 :         aTxtSize = pLastFont->GetTextSize( rInf );
    1157           0 :         rInf.SetIdx( nOldIdx );
    1158           0 :         rInf.SetLen( nOldLen );
    1159             :     }
    1160             : 
    1161      163738 :     return aTxtSize;
    1162             : }
    1163             : 
    1164       43859 : void SwSubFont::_DrawText( SwDrawTextInfo &rInf, const bool bGrey )
    1165             : {
    1166       43859 :     rInf.SetGreyWave( bGrey );
    1167       43859 :     sal_Int32 nLn = rInf.GetText().getLength();
    1168       43859 :     if( !rInf.GetLen() || !nLn )
    1169       43859 :         return;
    1170       43859 :     if( COMPLETE_STRING == rInf.GetLen() )
    1171          24 :         rInf.SetLen( nLn );
    1172             : 
    1173       43859 :     FontUnderline nOldUnder = UNDERLINE_NONE;
    1174       43859 :     SwUnderlineFont* pUnderFnt = 0;
    1175             : 
    1176       43859 :     if( rInf.GetUnderFnt() )
    1177             :     {
    1178         130 :         nOldUnder = GetUnderline();
    1179         130 :         SetUnderline( UNDERLINE_NONE );
    1180         130 :         pUnderFnt = rInf.GetUnderFnt();
    1181             :     }
    1182             : 
    1183       43859 :     if( !pLastFont || pLastFont->GetOwner()!=pMagic )
    1184         150 :         ChgFnt( rInf.GetShell(), rInf.GetOut() );
    1185             : 
    1186       43859 :     SwDigitModeModifier aDigitModeModifier( rInf.GetOut(), rInf.GetFont()->GetLanguage() );
    1187             : 
    1188       43859 :     const Point aOldPos(rInf.GetPos());
    1189       43859 :     Point aPos( rInf.GetPos() );
    1190             : 
    1191       43859 :     if( GetEscapement() )
    1192         606 :         CalcEsc( rInf, aPos );
    1193             : 
    1194       43859 :     rInf.SetPos( aPos );
    1195       43859 :     rInf.SetKern( CheckKerning() + rInf.GetSperren() / SPACING_PRECISION_FACTOR );
    1196             : 
    1197       43859 :     if( IsCapital() )
    1198         114 :         DrawCapital( rInf );
    1199             :     else
    1200             :     {
    1201             :         SV_STAT( nDrawText );
    1202       43745 :         if ( !IsCaseMap() )
    1203       43605 :             pLastFont->DrawText( rInf );
    1204             :         else
    1205             :         {
    1206         140 :             const OUString oldStr = rInf.GetText();
    1207         280 :             OUString aString( CalcCaseMap(oldStr) );
    1208         140 :             bool bCaseMapLengthDiffers(aString.getLength() != oldStr.getLength());
    1209             : 
    1210         140 :             if(bCaseMapLengthDiffers && rInf.GetLen())
    1211             :             {
    1212             :                 // #108203#
    1213             :                 // If the length of the original string and the CaseMapped one
    1214             :                 // are different, it is necessary to handle the given text part as
    1215             :                 // a single snippet since its size may differ, too.
    1216           0 :                 sal_Int32 nOldIdx(rInf.GetIdx());
    1217           0 :                 sal_Int32 nOldLen(rInf.GetLen());
    1218           0 :                 const OUString aSnippet(oldStr.copy(nOldIdx, nOldLen));
    1219           0 :                 OUString aNewText = CalcCaseMap(aSnippet);
    1220             : 
    1221           0 :                 rInf.SetText( aNewText );
    1222           0 :                 rInf.SetIdx( 0 );
    1223           0 :                 rInf.SetLen( aNewText.getLength() );
    1224             : 
    1225           0 :                 pLastFont->DrawText( rInf );
    1226             : 
    1227           0 :                 rInf.SetIdx( nOldIdx );
    1228           0 :                 rInf.SetLen( nOldLen );
    1229             :             }
    1230             :             else
    1231             :             {
    1232         140 :                 rInf.SetText( aString );
    1233         140 :                 pLastFont->DrawText( rInf );
    1234             :             }
    1235             : 
    1236         280 :             rInf.SetText(oldStr);
    1237             :         }
    1238             :     }
    1239             : 
    1240       43859 :     if( pUnderFnt && nOldUnder != UNDERLINE_NONE )
    1241             :     {
    1242         130 :         Size aFontSize = _GetTxtSize( rInf );
    1243         130 :         const OUString oldStr = rInf.GetText();
    1244         260 :         OUString aStr("  ");
    1245             : 
    1246         130 :         sal_Int32 nOldIdx = rInf.GetIdx();
    1247         130 :         sal_Int32 nOldLen = rInf.GetLen();
    1248         130 :         long nSpace = 0;
    1249         130 :         if( rInf.GetSpace() )
    1250             :         {
    1251           0 :             sal_Int32 nTmpEnd = nOldIdx + nOldLen;
    1252           0 :             if (nTmpEnd > oldStr.getLength())
    1253           0 :                 nTmpEnd = oldStr.getLength();
    1254             : 
    1255           0 :             const SwScriptInfo* pSI = rInf.GetScriptInfo();
    1256             : 
    1257             :             const bool bAsianFont =
    1258           0 :                 ( rInf.GetFont() && SW_CJK == rInf.GetFont()->GetActual() );
    1259           0 :             for( sal_Int32 nTmp = nOldIdx; nTmp < nTmpEnd; ++nTmp )
    1260             :             {
    1261           0 :                 if (CH_BLANK == oldStr[nTmp] || bAsianFont ||
    1262           0 :                     ( nTmp + 1 < oldStr.getLength() && pSI &&
    1263           0 :                       i18n::ScriptType::ASIAN == pSI->ScriptType( nTmp + 1 ) ) )
    1264           0 :                     ++nSpace;
    1265             :             }
    1266             : 
    1267             :             // if next portion if a hole portion we do not consider any
    1268             :             // extra space added because the last character was ASIAN
    1269           0 :             if ( nSpace && rInf.IsSpaceStop() && bAsianFont )
    1270           0 :                  --nSpace;
    1271             : 
    1272           0 :             nSpace *= rInf.GetSpace() / SPACING_PRECISION_FACTOR;
    1273             :         }
    1274             : 
    1275         130 :         rInf.SetWidth( sal_uInt16(aFontSize.Width() + nSpace) );
    1276         130 :         rInf.SetText( aStr );
    1277         130 :         rInf.SetIdx( 0 );
    1278         130 :         rInf.SetLen( 2 );
    1279         130 :         SetUnderline( nOldUnder );
    1280         130 :         rInf.SetUnderFnt( 0 );
    1281             : 
    1282             :         // set position for underline font
    1283         130 :         rInf.SetPos( pUnderFnt->GetPos() );
    1284             : 
    1285         130 :         pUnderFnt->GetFont()._DrawStretchText( rInf );
    1286             : 
    1287         130 :         rInf.SetUnderFnt( pUnderFnt );
    1288         130 :         rInf.SetText(oldStr);
    1289         130 :         rInf.SetIdx( nOldIdx );
    1290         260 :         rInf.SetLen( nOldLen );
    1291             :     }
    1292             : 
    1293       43859 :     rInf.SetPos(aOldPos);
    1294             : }
    1295             : 
    1296         272 : void SwSubFont::_DrawStretchText( SwDrawTextInfo &rInf )
    1297             : {
    1298         272 :     if( !rInf.GetLen() || !rInf.GetText().getLength() )
    1299         272 :         return;
    1300             : 
    1301         272 :     FontUnderline nOldUnder = UNDERLINE_NONE;
    1302         272 :     SwUnderlineFont* pUnderFnt = 0;
    1303             : 
    1304         272 :     if( rInf.GetUnderFnt() )
    1305             :     {
    1306           0 :         nOldUnder = GetUnderline();
    1307           0 :         SetUnderline( UNDERLINE_NONE );
    1308           0 :         pUnderFnt = rInf.GetUnderFnt();
    1309             :     }
    1310             : 
    1311         272 :     if ( !pLastFont || pLastFont->GetOwner() != pMagic )
    1312         130 :         ChgFnt( rInf.GetShell(), rInf.GetOut() );
    1313             : 
    1314         272 :     SwDigitModeModifier aDigitModeModifier( rInf.GetOut(), rInf.GetFont()->GetLanguage() );
    1315             : 
    1316         272 :     rInf.ApplyAutoColor();
    1317             : 
    1318         272 :     const Point aOldPos(rInf.GetPos());
    1319         272 :     Point aPos( rInf.GetPos() );
    1320             : 
    1321         272 :     if( GetEscapement() )
    1322           0 :         CalcEsc( rInf, aPos );
    1323             : 
    1324         272 :     rInf.SetKern( CheckKerning() + rInf.GetSperren() / SPACING_PRECISION_FACTOR );
    1325         272 :     rInf.SetPos( aPos );
    1326             : 
    1327         272 :     if( IsCapital() )
    1328           0 :         DrawStretchCapital( rInf );
    1329             :     else
    1330             :     {
    1331             :         SV_STAT( nDrawStretchText );
    1332             : 
    1333         272 :         if ( rInf.GetFrm() )
    1334             :         {
    1335         272 :             if ( rInf.GetFrm()->IsRightToLeft() )
    1336           0 :                 rInf.GetFrm()->SwitchLTRtoRTL( aPos );
    1337             : 
    1338         272 :             if ( rInf.GetFrm()->IsVertical() )
    1339           0 :                 rInf.GetFrm()->SwitchHorizontalToVertical( aPos );
    1340             : 
    1341         272 :             rInf.SetPos( aPos );
    1342             :         }
    1343             : 
    1344         272 :         if ( !IsCaseMap() )
    1345         544 :             rInf.GetOut().DrawStretchText( aPos, rInf.GetWidth(),
    1346         816 :                             rInf.GetText(), rInf.GetIdx(), rInf.GetLen() );
    1347             :         else
    1348           0 :             rInf.GetOut().DrawStretchText( aPos, rInf.GetWidth(), CalcCaseMap(
    1349           0 :                             rInf.GetText() ), rInf.GetIdx(), rInf.GetLen() );
    1350             :     }
    1351             : 
    1352         272 :     if( pUnderFnt && nOldUnder != UNDERLINE_NONE )
    1353             :     {
    1354           0 :         const OUString oldStr = rInf.GetText();
    1355           0 :         OUString aStr("  ");
    1356           0 :         sal_Int32 nOldIdx = rInf.GetIdx();
    1357           0 :         sal_Int32 nOldLen = rInf.GetLen();
    1358           0 :         rInf.SetText( aStr );
    1359           0 :         rInf.SetIdx( 0 );
    1360           0 :         rInf.SetLen( 2 );
    1361           0 :         SetUnderline( nOldUnder );
    1362           0 :         rInf.SetUnderFnt( 0 );
    1363             : 
    1364             :         // set position for underline font
    1365           0 :         rInf.SetPos( pUnderFnt->GetPos() );
    1366             : 
    1367           0 :         pUnderFnt->GetFont()._DrawStretchText( rInf );
    1368             : 
    1369           0 :         rInf.SetUnderFnt( pUnderFnt );
    1370           0 :         rInf.SetText(oldStr);
    1371           0 :         rInf.SetIdx( nOldIdx );
    1372           0 :         rInf.SetLen( nOldLen );
    1373             :     }
    1374             : 
    1375         272 :     rInf.SetPos(aOldPos);
    1376             : }
    1377             : 
    1378           6 : sal_Int32 SwSubFont::_GetCrsrOfst( SwDrawTextInfo& rInf )
    1379             : {
    1380           6 :     if ( !pLastFont || pLastFont->GetOwner()!=pMagic )
    1381           0 :         ChgFnt( rInf.GetShell(), rInf.GetOut() );
    1382             : 
    1383           6 :     SwDigitModeModifier aDigitModeModifier( rInf.GetOut(), rInf.GetFont()->GetLanguage() );
    1384             : 
    1385           8 :     sal_Int32 nLn = rInf.GetLen() == COMPLETE_STRING ? rInf.GetText().getLength()
    1386           8 :                                                  : rInf.GetLen();
    1387           6 :     rInf.SetLen( nLn );
    1388           6 :     sal_Int32 nCrsr = 0;
    1389           6 :     if( IsCapital() && nLn )
    1390           0 :         nCrsr = GetCapitalCrsrOfst( rInf );
    1391             :     else
    1392             :     {
    1393           6 :         const OUString oldTxt = rInf.GetText();
    1394           6 :         long nOldKern = rInf.GetKern();
    1395           6 :         rInf.SetKern( CheckKerning() );
    1396             :         SV_STAT( nGetTextSize );
    1397           6 :         if ( !IsCaseMap() )
    1398           6 :             nCrsr = pLastFont->GetCrsrOfst( rInf );
    1399             :         else
    1400             :         {
    1401           0 :             OUString aTmp = CalcCaseMap( rInf.GetText() );
    1402           0 :             rInf.SetText( aTmp );
    1403           0 :             nCrsr = pLastFont->GetCrsrOfst( rInf );
    1404             :         }
    1405           6 :         rInf.SetKern( nOldKern );
    1406           6 :         rInf.SetText(oldTxt);
    1407             :     }
    1408           6 :     return nCrsr;
    1409             : }
    1410             : 
    1411         606 : void SwSubFont::CalcEsc( SwDrawTextInfo& rInf, Point& rPos )
    1412             : {
    1413             :     long nOfst;
    1414             : 
    1415             :     const sal_uInt16 nDir = UnMapDirection(
    1416         606 :                 GetOrientation(), rInf.GetFrm() && rInf.GetFrm()->IsVertical() );
    1417             : 
    1418         606 :     switch ( GetEscapement() )
    1419             :     {
    1420             :     case DFLT_ESC_AUTO_SUB :
    1421           0 :         nOfst = nOrgHeight - nOrgAscent -
    1422           0 :             pLastFont->GetFontHeight( rInf.GetShell(), rInf.GetOut() ) +
    1423           0 :             pLastFont->GetFontAscent( rInf.GetShell(), rInf.GetOut() );
    1424             : 
    1425           0 :         switch ( nDir )
    1426             :         {
    1427             :         case 0 :
    1428           0 :             rPos.Y() += nOfst;
    1429           0 :             break;
    1430             :         case 900 :
    1431           0 :             rPos.X() += nOfst;
    1432           0 :             break;
    1433             :         case 2700 :
    1434           0 :             rPos.X() -= nOfst;
    1435           0 :             break;
    1436             :         }
    1437             : 
    1438           0 :         break;
    1439             :     case DFLT_ESC_AUTO_SUPER :
    1440         290 :         nOfst = pLastFont->GetFontAscent( rInf.GetShell(), rInf.GetOut() ) -
    1441         290 :                 nOrgAscent;
    1442             : 
    1443         290 :         switch ( nDir )
    1444             :         {
    1445             :         case 0 :
    1446         290 :             rPos.Y() += nOfst;
    1447         290 :             break;
    1448             :         case 900 :
    1449           0 :             rPos.X() += nOfst;
    1450           0 :             break;
    1451             :         case 2700 :
    1452           0 :             rPos.X() -= nOfst;
    1453           0 :             break;
    1454             :         }
    1455             : 
    1456         290 :         break;
    1457             :     default :
    1458         316 :         nOfst = ((long)nOrgHeight * GetEscapement()) / 100L;
    1459             : 
    1460         316 :         switch ( nDir )
    1461             :         {
    1462             :         case 0 :
    1463         316 :             rPos.Y() -= nOfst;
    1464         316 :             break;
    1465             :         case 900 :
    1466           0 :             rPos.X() -= nOfst;
    1467           0 :             break;
    1468             :         case 2700 :
    1469           0 :             rPos.X() += nOfst;
    1470           0 :             break;
    1471             :         }
    1472             :     }
    1473         606 : }
    1474             : 
    1475             : // used during painting of small capitals
    1476        1014 : void SwDrawTextInfo::Shift( sal_uInt16 nDir )
    1477             : {
    1478             : #ifdef DBG_UTIL
    1479             :     OSL_ENSURE( m_bPos, "DrawTextInfo: Undefined Position" );
    1480             :     OSL_ENSURE( m_bSize, "DrawTextInfo: Undefined Width" );
    1481             : #endif
    1482             : 
    1483        1014 :     const bool bBidiPor = ( GetFrm() && GetFrm()->IsRightToLeft() ) !=
    1484        1014 :                           ( TEXT_LAYOUT_DEFAULT != ( TEXT_LAYOUT_BIDI_RTL & GetpOut()->GetLayoutMode() ) );
    1485             : 
    1486             :     nDir = bBidiPor ?
    1487             :             1800 :
    1488        1014 :             UnMapDirection( nDir, GetFrm() && GetFrm()->IsVertical() );
    1489             : 
    1490        1014 :     switch ( nDir )
    1491             :     {
    1492             :     case 0 :
    1493        1014 :         m_aPos.X() += GetSize().Width();
    1494        1014 :         break;
    1495             :     case 900 :
    1496             :         OSL_ENSURE( m_aPos.Y() >= GetSize().Width(), "Going underground" );
    1497           0 :         m_aPos.Y() -= GetSize().Width();
    1498           0 :         break;
    1499             :     case 1800 :
    1500           0 :         m_aPos.X() -= GetSize().Width();
    1501           0 :         break;
    1502             :     case 2700 :
    1503           0 :         m_aPos.Y() += GetSize().Width();
    1504           0 :         break;
    1505             :     }
    1506        1014 : }
    1507             : 
    1508             : /**
    1509             :  * @note Used for the "continuous underline" feature.
    1510             :  **/
    1511         128 : SwUnderlineFont::SwUnderlineFont( SwFont& rFnt, const Point& rPoint )
    1512         128 :         : aPos( rPoint ), pFnt( &rFnt )
    1513             : {
    1514         128 : };
    1515             : 
    1516         128 : SwUnderlineFont::~SwUnderlineFont()
    1517             : {
    1518         128 :      delete pFnt;
    1519         128 : }
    1520             : 
    1521             : /// Helper for filters to find true lineheight of a font
    1522           0 : long AttrSetToLineHeight( const IDocumentSettingAccess& rIDocumentSettingAccess,
    1523             :                           const SwAttrSet &rSet,
    1524             :                           const OutputDevice &rOut, sal_Int16 nScript)
    1525             : {
    1526           0 :     SwFont aFont(&rSet, &rIDocumentSettingAccess);
    1527             :     sal_uInt8 nActual;
    1528           0 :     switch (nScript)
    1529             :     {
    1530             :         default:
    1531             :         case i18n::ScriptType::LATIN:
    1532           0 :             nActual = SW_LATIN;
    1533           0 :             break;
    1534             :         case i18n::ScriptType::ASIAN:
    1535           0 :             nActual = SW_CJK;
    1536           0 :             break;
    1537             :         case i18n::ScriptType::COMPLEX:
    1538           0 :             nActual = SW_CTL;
    1539           0 :             break;
    1540             :     }
    1541           0 :     aFont.SetActual(nActual);
    1542             : 
    1543           0 :     OutputDevice &rMutableOut = const_cast<OutputDevice &>(rOut);
    1544           0 :     const vcl::Font aOldFont(rMutableOut.GetFont());
    1545             : 
    1546           0 :     rMutableOut.SetFont(aFont.GetActualFont());
    1547           0 :     long nHeight = rMutableOut.GetTextHeight();
    1548             : 
    1549           0 :     rMutableOut.SetFont(aOldFont);
    1550           0 :     return nHeight;
    1551         270 : }
    1552             : 
    1553             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.10