LCOV - code coverage report
Current view: top level - sw/source/core/txtnode - swfont.cxx (source / functions) Hit Total Coverage
Test: commit c8344322a7af75b84dd3ca8f78b05543a976dfd5 Lines: 712 910 78.2 %
Date: 2015-06-13 12:38:46 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        3112 : void SwFont::SetBackColor( Color* pNewColor )
      71             : {
      72        3112 :     delete pBackColor;
      73        3112 :     pBackColor = pNewColor;
      74        3112 :     bFntChg = true;
      75        3112 :     aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
      76        3112 : }
      77             : 
      78       57484 : void SwFont::SetTopBorder( const editeng::SvxBorderLine* pTopBorder )
      79             : {
      80       57484 :     if( pTopBorder )
      81         232 :         m_aTopBorder = *pTopBorder;
      82             :     else
      83             :     {
      84       57252 :         m_aTopBorder = boost::none;
      85       57252 :         m_nTopBorderDist = 0;
      86             :     }
      87       57484 :     bFntChg = true;
      88       57484 :     aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
      89       57484 : }
      90             : 
      91       57484 : void SwFont::SetBottomBorder( const editeng::SvxBorderLine* pBottomBorder )
      92             : {
      93       57484 :     if( pBottomBorder )
      94         232 :         m_aBottomBorder = *pBottomBorder;
      95             :     else
      96             :     {
      97       57252 :         m_aBottomBorder = boost::none;
      98       57252 :         m_nBottomBorderDist = 0;
      99             :     }
     100       57484 :     bFntChg = true;
     101       57484 :     aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
     102       57484 : }
     103             : 
     104       57484 : void SwFont::SetRightBorder( const editeng::SvxBorderLine* pRightBorder )
     105             : {
     106       57484 :     if( pRightBorder )
     107         225 :         m_aRightBorder = *pRightBorder;
     108             :     else
     109             :     {
     110       57259 :         m_aRightBorder = boost::none;
     111       57259 :         m_nRightBorderDist = 0;
     112             :     }
     113       57484 :     bFntChg = true;
     114       57484 :     aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
     115       57484 : }
     116             : 
     117       57484 : void SwFont::SetLeftBorder( const editeng::SvxBorderLine* pLeftBorder )
     118             : {
     119       57484 :     if( pLeftBorder )
     120         232 :         m_aLeftBorder = *pLeftBorder;
     121             :     else
     122             :     {
     123       57252 :         m_aLeftBorder = boost::none;
     124       57252 :         m_nLeftBorderDist = 0;
     125             :     }
     126       57484 :     bFntChg = true;
     127       57484 :     aSub[SW_LATIN].pMagic = aSub[SW_CJK].pMagic = aSub[SW_CTL].pMagic = 0;
     128       57484 : }
     129             : 
     130             : const boost::optional<editeng::SvxBorderLine>&
     131       20770 : SwFont::GetAbsTopBorder( const bool bVertLayout ) const
     132             : {
     133       20770 :     switch( GetOrientation( bVertLayout ) )
     134             :     {
     135             :         case 0 :
     136       20769 :             return m_aTopBorder;
     137             :             break;
     138             :         case 900 :
     139           1 :             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       20770 : SwFont::GetAbsBottomBorder( const bool bVertLayout ) const
     156             : {
     157       20770 :     switch( GetOrientation( bVertLayout ) )
     158             :     {
     159             :         case 0 :
     160       20769 :             return m_aBottomBorder;
     161             :             break;
     162             :         case 900 :
     163           1 :             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       20770 : SwFont::GetAbsLeftBorder( const bool bVertLayout ) const
     180             : {
     181       20770 :     switch( GetOrientation( bVertLayout ) )
     182             :     {
     183             :         case 0 :
     184       20769 :             return m_aLeftBorder;
     185             :             break;
     186             :         case 900 :
     187           1 :             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       20770 : SwFont::GetAbsRightBorder( const bool bVertLayout ) const
     204             : {
     205       20770 :     switch( GetOrientation( bVertLayout ) )
     206             :     {
     207             :         case 0 :
     208       20769 :             return m_aRightBorder;
     209             :             break;
     210             :         case 900 :
     211           1 :             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      191614 : SvxShadowLocation SwFont::GetAbsShadowLocation( const bool bVertLayout ) const
     227             : {
     228      191614 :     SvxShadowLocation aLocation = SVX_SHADOW_NONE;
     229      191614 :     switch( GetOrientation( bVertLayout ) )
     230             :     {
     231             :         case 0:
     232      191605 :             aLocation = m_aShadowLocation;
     233      191605 :             break;
     234             : 
     235             :         case 900:
     236           9 :             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           9 :                     aLocation = m_aShadowLocation;
     253           9 :                     break;
     254             :             }
     255           9 :             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      191614 :     return aLocation;
     306             : }
     307             : 
     308      170844 : sal_uInt16 SwFont::CalcShadowSpace(
     309             :         const SvxShadowItemSide nShadow, const bool bVertLayout,
     310             :         const bool bSkipLeft, const bool bSkipRight ) const
     311             : {
     312      170844 :     sal_uInt16 nSpace = 0;
     313      170844 :     const sal_uInt16 nOrient = GetOrientation( bVertLayout );
     314      170844 :     const SvxShadowLocation aLoc = GetAbsShadowLocation( bVertLayout );
     315      170844 :     switch( nShadow )
     316             :     {
     317             :         case SvxShadowItemSide::TOP:
     318       42711 :             if(( aLoc == SVX_SHADOW_TOPLEFT ||
     319           2 :                aLoc == SVX_SHADOW_TOPRIGHT ) &&
     320           0 :                ( nOrient == 0 || nOrient == 1800 ||
     321           0 :                ( nOrient == 900 && !bSkipRight ) ||
     322           0 :                ( nOrient == 2700 && !bSkipLeft )))
     323             :             {
     324           2 :                 nSpace = m_nShadowWidth;
     325             :             }
     326       42711 :             break;
     327             : 
     328             :         case SvxShadowItemSide::BOTTOM:
     329       42711 :             if(( aLoc == SVX_SHADOW_BOTTOMLEFT ||
     330           8 :                aLoc == SVX_SHADOW_BOTTOMRIGHT ) &&
     331           0 :                ( nOrient == 0 || nOrient == 1800 ||
     332           0 :                ( nOrient == 900 && !bSkipLeft ) ||
     333           0 :                ( nOrient == 2700 && !bSkipRight )))
     334             :             {
     335           8 :                 nSpace = m_nShadowWidth;
     336             :             }
     337       42711 :             break;
     338             : 
     339             :         case SvxShadowItemSide::LEFT:
     340       42711 :             if(( aLoc == SVX_SHADOW_TOPLEFT ||
     341           2 :                aLoc == SVX_SHADOW_BOTTOMLEFT ) &&
     342           2 :                ( nOrient == 900 || nOrient == 2700 ||
     343           2 :                ( nOrient == 0 && !bSkipLeft ) ||
     344           0 :                ( nOrient == 1800 && !bSkipRight )))
     345             :             {
     346           2 :                 nSpace = m_nShadowWidth;
     347             :             }
     348       42711 :             break;
     349             : 
     350             :          case SvxShadowItemSide::RIGHT:
     351       42711 :             if(( aLoc == SVX_SHADOW_TOPRIGHT ||
     352           8 :                aLoc == SVX_SHADOW_BOTTOMRIGHT ) &&
     353           8 :                ( nOrient == 900 || nOrient == 2700 ||
     354           8 :                ( nOrient == 0 && !bSkipRight ) ||
     355           0 :                ( nOrient == 1800 && !bSkipLeft )))
     356             :             {
     357           8 :                 nSpace = m_nShadowWidth;
     358             :             }
     359       42711 :             break;
     360             :         default:
     361             :             assert(false);
     362           0 :             break;
     363             :     }
     364             : 
     365      170844 :     return nSpace;
     366             : }
     367             : 
     368             : // maps directions for vertical layout
     369       66847 : sal_uInt16 MapDirection( sal_uInt16 nDir, const bool bVertFormat )
     370             : {
     371       66847 :     if ( bVertFormat )
     372             :     {
     373           5 :         switch ( nDir )
     374             :         {
     375             :         case 0 :
     376           5 :             nDir = 2700;
     377           5 :             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       66847 :     return nDir;
     392             : }
     393             : 
     394             : // maps the absolute direction set at the font to its logical conterpart
     395             : // in the rotated environment
     396      508806 : sal_uInt16 UnMapDirection( sal_uInt16 nDir, const bool bVertFormat )
     397             : {
     398      508806 :     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      508806 :     return nDir;
     419             : }
     420             : 
     421      507010 : sal_uInt16 SwFont::GetOrientation( const bool bVertFormat ) const
     422             : {
     423      507010 :     return UnMapDirection( aSub[nActual].GetOrientation(), bVertFormat );
     424             : }
     425             : 
     426       66847 : void SwFont::SetVertical( sal_uInt16 nDir, const bool bVertFormat )
     427             : {
     428             :     // map direction if frame has vertical layout
     429       66847 :     nDir = MapDirection( nDir, bVertFormat );
     430             : 
     431       66847 :     if( nDir != aSub[0].GetOrientation() )
     432             :     {
     433         878 :         bFntChg = true;
     434         878 :         aSub[0].SetVertical( nDir, bVertFormat );
     435         878 :         aSub[1].SetVertical( nDir, bVertFormat || nDir > 1000 );
     436         878 :         aSub[2].SetVertical( nDir, bVertFormat );
     437             :     }
     438       66847 : }
     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        5289 : sal_uInt16 SwSubFont::CalcEscAscent( const sal_uInt16 nOldAscent ) const
     469             : {
     470        9991 :     if( DFLT_ESC_AUTO_SUPER != GetEscapement() &&
     471        4702 :         DFLT_ESC_AUTO_SUB != GetEscapement() )
     472             :     {
     473        4656 :         const long nAscent = nOldAscent +
     474        4656 :                              ( (long) nOrgHeight * GetEscapement() ) / 100L;
     475        4656 :         if ( nAscent>0 )
     476        4656 :             return std::max<sal_uInt16>( nAscent, nOrgAscent );
     477             :     }
     478         633 :     return nOrgAscent;
     479             : }
     480             : 
     481        6386 : void SwFont::SetDiffFnt( const SfxItemSet *pAttrSet,
     482             :                          const IDocumentSettingAccess *pIDocumentSettingAccess )
     483             : {
     484        6386 :     delete pBackColor;
     485        6386 :     pBackColor = NULL;
     486             : 
     487        6386 :     if( pAttrSet )
     488             :     {
     489             :         const SfxPoolItem* pItem;
     490        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_FONT,
     491        6386 :             true, &pItem ))
     492             :         {
     493        1250 :             const SvxFontItem *pFont = static_cast<const SvxFontItem *>(pItem);
     494        1250 :             aSub[SW_LATIN].SetFamily( pFont->GetFamily() );
     495        1250 :             aSub[SW_LATIN].Font::SetName( pFont->GetFamilyName() );
     496        1250 :             aSub[SW_LATIN].Font::SetStyleName( pFont->GetStyleName() );
     497        1250 :             aSub[SW_LATIN].Font::SetPitch( pFont->GetPitch() );
     498        1250 :             aSub[SW_LATIN].Font::SetCharSet( pFont->GetCharSet() );
     499             :         }
     500        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_FONTSIZE,
     501        6386 :             true, &pItem ))
     502             :         {
     503        1570 :             const SvxFontHeightItem *pHeight = static_cast<const SvxFontHeightItem *>(pItem);
     504        1570 :             aSub[SW_LATIN].SvxFont::SetPropr( 100 );
     505        1570 :             aSub[SW_LATIN].aSize = aSub[SW_LATIN].Font::GetSize();
     506        1570 :             Size aTmpSize = aSub[SW_LATIN].aSize;
     507        1570 :             aTmpSize.Height() = pHeight->GetHeight();
     508        1570 :             aSub[SW_LATIN].SetSize( aTmpSize );
     509             :         }
     510        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_POSTURE,
     511        6386 :             true, &pItem ))
     512         125 :             aSub[SW_LATIN].Font::SetItalic( static_cast<const SvxPostureItem*>(pItem)->GetPosture() );
     513        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_WEIGHT,
     514        6386 :             true, &pItem ))
     515         979 :             aSub[SW_LATIN].Font::SetWeight( static_cast<const SvxWeightItem*>(pItem)->GetWeight() );
     516        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_LANGUAGE,
     517        6386 :             true, &pItem ))
     518         253 :             aSub[SW_LATIN].SetLanguage( static_cast<const SvxLanguageItem*>(pItem)->GetLanguage() );
     519             : 
     520        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CJK_FONT,
     521        6386 :             true, &pItem ))
     522             :         {
     523         872 :             const SvxFontItem *pFont = static_cast<const SvxFontItem *>(pItem);
     524         872 :             aSub[SW_CJK].SetFamily( pFont->GetFamily() );
     525         872 :             aSub[SW_CJK].Font::SetName( pFont->GetFamilyName() );
     526         872 :             aSub[SW_CJK].Font::SetStyleName( pFont->GetStyleName() );
     527         872 :             aSub[SW_CJK].Font::SetPitch( pFont->GetPitch() );
     528         872 :             aSub[SW_CJK].Font::SetCharSet( pFont->GetCharSet() );
     529             :         }
     530        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CJK_FONTSIZE,
     531        6386 :             true, &pItem ))
     532             :         {
     533        1126 :             const SvxFontHeightItem *pHeight = static_cast<const SvxFontHeightItem *>(pItem);
     534        1126 :             aSub[SW_CJK].SvxFont::SetPropr( 100 );
     535        1126 :             aSub[SW_CJK].aSize = aSub[SW_CJK].Font::GetSize();
     536        1126 :             Size aTmpSize = aSub[SW_CJK].aSize;
     537        1126 :             aTmpSize.Height() = pHeight->GetHeight();
     538        1126 :             aSub[SW_CJK].SetSize( aTmpSize );
     539             :         }
     540        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CJK_POSTURE,
     541        6386 :             true, &pItem ))
     542         125 :             aSub[SW_CJK].Font::SetItalic( static_cast<const SvxPostureItem*>(pItem)->GetPosture() );
     543        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CJK_WEIGHT,
     544        6386 :             true, &pItem ))
     545         534 :             aSub[SW_CJK].Font::SetWeight( static_cast<const SvxWeightItem*>(pItem)->GetWeight() );
     546        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CJK_LANGUAGE,
     547        6386 :             true, &pItem ))
     548             :         {
     549          14 :             LanguageType eNewLang = static_cast<const SvxLanguageItem*>(pItem)->GetLanguage();
     550          14 :             aSub[SW_CJK].SetLanguage( eNewLang );
     551          14 :             aSub[SW_LATIN].SetCJKContextLanguage( eNewLang );
     552          14 :             aSub[SW_CJK].SetCJKContextLanguage( eNewLang );
     553          14 :             aSub[SW_CTL].SetCJKContextLanguage( eNewLang );
     554             :         }
     555             : 
     556        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CTL_FONT,
     557        6386 :             true, &pItem ))
     558             :         {
     559        3861 :             const SvxFontItem *pFont = static_cast<const SvxFontItem *>(pItem);
     560        3861 :             aSub[SW_CTL].SetFamily( pFont->GetFamily() );
     561        3861 :             aSub[SW_CTL].Font::SetName( pFont->GetFamilyName() );
     562        3861 :             aSub[SW_CTL].Font::SetStyleName( pFont->GetStyleName() );
     563        3861 :             aSub[SW_CTL].Font::SetPitch( pFont->GetPitch() );
     564        3861 :             aSub[SW_CTL].Font::SetCharSet( pFont->GetCharSet() );
     565             :         }
     566        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CTL_FONTSIZE,
     567        6386 :             true, &pItem ))
     568             :         {
     569         966 :             const SvxFontHeightItem *pHeight = static_cast<const SvxFontHeightItem *>(pItem);
     570         966 :             aSub[SW_CTL].SvxFont::SetPropr( 100 );
     571         966 :             aSub[SW_CTL].aSize = aSub[SW_CTL].Font::GetSize();
     572         966 :             Size aTmpSize = aSub[SW_CTL].aSize;
     573         966 :             aTmpSize.Height() = pHeight->GetHeight();
     574         966 :             aSub[SW_CTL].SetSize( aTmpSize );
     575             :         }
     576        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CTL_POSTURE,
     577        6386 :             true, &pItem ))
     578          44 :             aSub[SW_CTL].Font::SetItalic( static_cast<const SvxPostureItem*>(pItem)->GetPosture() );
     579        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CTL_WEIGHT,
     580        6386 :             true, &pItem ))
     581         176 :             aSub[SW_CTL].Font::SetWeight( static_cast<const SvxWeightItem*>(pItem)->GetWeight() );
     582        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CTL_LANGUAGE,
     583        6386 :             true, &pItem ))
     584          24 :             aSub[SW_CTL].SetLanguage( static_cast<const SvxLanguageItem*>(pItem)->GetLanguage() );
     585             : 
     586        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_UNDERLINE,
     587        6386 :             true, &pItem ))
     588             :         {
     589         215 :             SetUnderline( static_cast<const SvxUnderlineItem*>(pItem)->GetLineStyle() );
     590         215 :             SetUnderColor( static_cast<const SvxUnderlineItem*>(pItem)->GetColor() );
     591             :         }
     592        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_OVERLINE,
     593        6386 :             true, &pItem ))
     594             :         {
     595           0 :             SetOverline( static_cast<const SvxOverlineItem*>(pItem)->GetLineStyle() );
     596           0 :             SetOverColor( static_cast<const SvxOverlineItem*>(pItem)->GetColor() );
     597             :         }
     598        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CROSSEDOUT,
     599        6386 :             true, &pItem ))
     600          37 :             SetStrikeout( static_cast<const SvxCrossedOutItem*>(pItem)->GetStrikeout() );
     601        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_COLOR,
     602        6386 :             true, &pItem ))
     603         161 :             SetColor( static_cast<const SvxColorItem*>(pItem)->GetValue() );
     604        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_EMPHASIS_MARK,
     605        6386 :             true, &pItem ))
     606         169 :             SetEmphasisMark( static_cast<const SvxEmphasisMarkItem*>(pItem)->GetEmphasisMark() );
     607             : 
     608        6386 :         SetTransparent( true );
     609        6386 :         SetAlign( ALIGN_BASELINE );
     610        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CONTOUR,
     611        6386 :             true, &pItem ))
     612          31 :             SetOutline( static_cast<const SvxContourItem*>(pItem)->GetValue() );
     613        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_SHADOWED,
     614        6386 :             true, &pItem ))
     615          31 :             SetShadow( static_cast<const SvxShadowedItem*>(pItem)->GetValue() );
     616        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_RELIEF,
     617        6386 :             true, &pItem ))
     618          27 :             SetRelief( (FontRelief)static_cast<const SvxCharReliefItem*>(pItem)->GetValue() );
     619        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_SHADOWED,
     620        6386 :             true, &pItem ))
     621          31 :             SetPropWidth(static_cast<const SvxShadowedItem*>(pItem)->GetValue() ? 50 : 100 );
     622        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_AUTOKERN,
     623        6386 :             true, &pItem ))
     624             :         {
     625          86 :             if( static_cast<const SvxAutoKernItem*>(pItem)->GetValue() )
     626             :             {
     627           0 :                 SetAutoKern( ( !pIDocumentSettingAccess ||
     628           0 :                                !pIDocumentSettingAccess->get(DocumentSettingId::KERN_ASIAN_PUNCTUATION) ) ?
     629             :                                 FontKerning::FontSpecific :
     630           0 :                                 FontKerning::Asian );
     631             :             }
     632             :             else
     633          86 :                 SetAutoKern( FontKerning::NONE );
     634             :         }
     635        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_WORDLINEMODE,
     636        6386 :             true, &pItem ))
     637           0 :             SetWordLineMode( static_cast<const SvxWordLineModeItem*>(pItem)->GetValue() );
     638             : 
     639        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_ESCAPEMENT,
     640        6386 :             true, &pItem ))
     641             :         {
     642         331 :             const SvxEscapementItem *pEsc = static_cast<const SvxEscapementItem *>(pItem);
     643         331 :             SetEscapement( pEsc->GetEsc() );
     644         331 :             if( aSub[SW_LATIN].IsEsc() )
     645         300 :                 SetProportion( pEsc->GetProp() );
     646             :         }
     647        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_CASEMAP,
     648        6386 :             true, &pItem ))
     649          32 :             SetCaseMap( static_cast<const SvxCaseMapItem*>(pItem)->GetCaseMap() );
     650        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_KERNING,
     651        6386 :             true, &pItem ))
     652          84 :             SetFixKerning( static_cast<const SvxKerningItem*>(pItem)->GetValue() );
     653        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_NOHYPHEN,
     654        6386 :             true, &pItem ))
     655           0 :             SetNoHyph( static_cast<const SvxNoHyphenItem*>(pItem)->GetValue() );
     656        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_BLINK,
     657        6386 :             true, &pItem ))
     658          27 :             SetBlink( static_cast<const SvxBlinkItem*>(pItem)->GetValue() );
     659        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_ROTATE,
     660        6386 :             true, &pItem ))
     661           0 :             SetVertical( static_cast<const SvxCharRotateItem*>(pItem)->GetValue() );
     662        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_BACKGROUND,
     663        6386 :             true, &pItem ))
     664          13 :             pBackColor = new Color( static_cast<const SvxBrushItem*>(pItem)->GetColor() );
     665        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_HIGHLIGHT,
     666        6386 :             true, &pItem ))
     667           3 :             SetHighlightColor(static_cast<const SvxBrushItem*>(pItem)->GetColor());
     668        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_BOX,
     669        6386 :             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(SvxBoxItemLine::TOP));
     677           0 :             SetBottomBorderDist(pBoxItem->GetDistance(SvxBoxItemLine::BOTTOM));
     678           0 :             SetRightBorderDist(pBoxItem->GetDistance(SvxBoxItemLine::RIGHT));
     679           0 :             SetLeftBorderDist(pBoxItem->GetDistance(SvxBoxItemLine::LEFT));
     680             :         }
     681        6386 :         if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_SHADOW,
     682        6386 :             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        6386 :         const SfxPoolItem* pTwoLinesItem = 0;
     690        6386 :         if( SfxItemState::SET ==
     691        6386 :                 pAttrSet->GetItemState( RES_CHRATR_TWO_LINES, true, &pTwoLinesItem ))
     692           0 :             if ( static_cast<const SvxTwoLinesItem*>(pTwoLinesItem)->GetValue() )
     693           0 :                 SetVertical( 0 );
     694             :     }
     695             :     else
     696             :     {
     697           0 :         Invalidate();
     698           0 :         bNoHyph = false;
     699           0 :         bBlink = false;
     700             :     }
     701        6386 :     bPaintBlank = false;
     702        6386 :     bPaintWrong = false;
     703             :     OSL_ENSURE( aSub[SW_LATIN].IsTransparent(), "SwFont: Transparent revolution" );
     704        6386 : }
     705             : 
     706      554476 : SwFont::SwFont( const SwFont &rFont )
     707             : {
     708      554476 :     aSub[SW_LATIN] = rFont.aSub[SW_LATIN];
     709      554476 :     aSub[SW_CJK] = rFont.aSub[SW_CJK];
     710      554476 :     aSub[SW_CTL] = rFont.aSub[SW_CTL];
     711      554476 :     nActual = rFont.nActual;
     712      554476 :     pBackColor = rFont.pBackColor ? new Color( *rFont.pBackColor ) : NULL;
     713      554476 :     m_aHighlightColor = rFont.m_aHighlightColor;
     714      554476 :     m_aTopBorder = rFont.m_aTopBorder;
     715      554476 :     m_aBottomBorder = rFont.m_aBottomBorder;
     716      554476 :     m_aRightBorder = rFont.m_aRightBorder;
     717      554476 :     m_aLeftBorder = rFont.m_aLeftBorder;
     718      554476 :     m_nTopBorderDist = rFont.m_nTopBorderDist;
     719      554476 :     m_nBottomBorderDist = rFont.m_nBottomBorderDist;
     720      554476 :     m_nRightBorderDist = rFont.m_nRightBorderDist;
     721      554476 :     m_nLeftBorderDist = rFont.m_nLeftBorderDist;
     722      554476 :     m_aShadowColor = rFont.m_aShadowColor;
     723      554476 :     m_nShadowWidth = rFont.m_nShadowWidth;
     724      554476 :     m_aShadowLocation = rFont.m_aShadowLocation;
     725      554476 :     aUnderColor = rFont.GetUnderColor();
     726      554476 :     aOverColor  = rFont.GetOverColor();
     727      554476 :     nToxCnt = 0;
     728      554476 :     nRefCnt = 0;
     729      554476 :     m_nMetaCount = 0;
     730      554476 :     m_nInputFieldCount = 0;
     731      554476 :     bFntChg = rFont.bFntChg;
     732      554476 :     bOrgChg = rFont.bOrgChg;
     733      554476 :     bPaintBlank = rFont.bPaintBlank;
     734      554476 :     bPaintWrong = false;
     735      554476 :     bURL = rFont.bURL;
     736      554476 :     bGreyWave = rFont.bGreyWave;
     737      554476 :     bNoColReplace = rFont.bNoColReplace;
     738      554476 :     bNoHyph = rFont.bNoHyph;
     739      554476 :     bBlink = rFont.bBlink;
     740      554476 : }
     741             : 
     742       57092 : SwFont::SwFont( const SwAttrSet* pAttrSet,
     743       57092 :                 const IDocumentSettingAccess* pIDocumentSettingAccess )
     744             : {
     745       57092 :     nActual = SW_LATIN;
     746       57092 :     nToxCnt = 0;
     747       57092 :     nRefCnt = 0;
     748       57092 :     m_nMetaCount = 0;
     749       57092 :     m_nInputFieldCount = 0;
     750       57092 :     bPaintBlank = false;
     751       57092 :     bPaintWrong = false;
     752       57092 :     bURL = false;
     753       57092 :     bGreyWave = false;
     754       57092 :     bNoColReplace = false;
     755       57092 :     bNoHyph = pAttrSet->GetNoHyphenHere().GetValue();
     756       57092 :     bBlink = pAttrSet->GetBlink().GetValue();
     757       57092 :     bOrgChg = true;
     758             :     {
     759       57092 :         const SvxFontItem& rFont = pAttrSet->GetFont();
     760       57092 :         aSub[SW_LATIN].SetFamily( rFont.GetFamily() );
     761       57092 :         aSub[SW_LATIN].SetName( rFont.GetFamilyName() );
     762       57092 :         aSub[SW_LATIN].SetStyleName( rFont.GetStyleName() );
     763       57092 :         aSub[SW_LATIN].SetPitch( rFont.GetPitch() );
     764       57092 :         aSub[SW_LATIN].SetCharSet( rFont.GetCharSet() );
     765       57092 :         aSub[SW_LATIN].SvxFont::SetPropr( 100 );   // 100% der FontSize
     766       57092 :         Size aTmpSize = aSub[SW_LATIN].aSize;
     767       57092 :         aTmpSize.Height() = pAttrSet->GetSize().GetHeight();
     768       57092 :         aSub[SW_LATIN].SetSize( aTmpSize );
     769       57092 :         aSub[SW_LATIN].SetItalic( pAttrSet->GetPosture().GetPosture() );
     770       57092 :         aSub[SW_LATIN].SetWeight( pAttrSet->GetWeight().GetWeight() );
     771       57092 :         aSub[SW_LATIN].SetLanguage( pAttrSet->GetLanguage().GetLanguage() );
     772             :     }
     773             : 
     774             :     {
     775       57092 :         const SvxFontItem& rFont = pAttrSet->GetCJKFont();
     776       57092 :         aSub[SW_CJK].SetFamily( rFont.GetFamily() );
     777       57092 :         aSub[SW_CJK].SetName( rFont.GetFamilyName() );
     778       57092 :         aSub[SW_CJK].SetStyleName( rFont.GetStyleName() );
     779       57092 :         aSub[SW_CJK].SetPitch( rFont.GetPitch() );
     780       57092 :         aSub[SW_CJK].SetCharSet( rFont.GetCharSet() );
     781       57092 :         aSub[SW_CJK].SvxFont::SetPropr( 100 );   // 100% der FontSize
     782       57092 :         Size aTmpSize = aSub[SW_CJK].aSize;
     783       57092 :         aTmpSize.Height() = pAttrSet->GetCJKSize().GetHeight();
     784       57092 :         aSub[SW_CJK].SetSize( aTmpSize );
     785       57092 :         aSub[SW_CJK].SetItalic( pAttrSet->GetCJKPosture().GetPosture() );
     786       57092 :         aSub[SW_CJK].SetWeight( pAttrSet->GetCJKWeight().GetWeight() );
     787       57092 :         LanguageType eNewLang = pAttrSet->GetCJKLanguage().GetLanguage();
     788       57092 :         aSub[SW_CJK].SetLanguage( eNewLang );
     789       57092 :         aSub[SW_LATIN].SetCJKContextLanguage( eNewLang );
     790       57092 :         aSub[SW_CJK].SetCJKContextLanguage( eNewLang );
     791       57092 :         aSub[SW_CTL].SetCJKContextLanguage( eNewLang );
     792             :     }
     793             : 
     794             :     {
     795       57092 :         const SvxFontItem& rFont = pAttrSet->GetCTLFont();
     796       57092 :         aSub[SW_CTL].SetFamily( rFont.GetFamily() );
     797       57092 :         aSub[SW_CTL].SetName( rFont.GetFamilyName() );
     798       57092 :         aSub[SW_CTL].SetStyleName( rFont.GetStyleName() );
     799       57092 :         aSub[SW_CTL].SetPitch( rFont.GetPitch() );
     800       57092 :         aSub[SW_CTL].SetCharSet( rFont.GetCharSet() );
     801       57092 :         aSub[SW_CTL].SvxFont::SetPropr( 100 );   // 100% der FontSize
     802       57092 :         Size aTmpSize = aSub[SW_CTL].aSize;
     803       57092 :         aTmpSize.Height() = pAttrSet->GetCTLSize().GetHeight();
     804       57092 :         aSub[SW_CTL].SetSize( aTmpSize );
     805       57092 :         aSub[SW_CTL].SetItalic( pAttrSet->GetCTLPosture().GetPosture() );
     806       57092 :         aSub[SW_CTL].SetWeight( pAttrSet->GetCTLWeight().GetWeight() );
     807       57092 :         aSub[SW_CTL].SetLanguage( pAttrSet->GetCTLLanguage().GetLanguage() );
     808             :     }
     809       57092 :     if ( pAttrSet->GetCharHidden().GetValue() )
     810         330 :         SetUnderline( UNDERLINE_DOTTED );
     811             :     else
     812       56762 :         SetUnderline( pAttrSet->GetUnderline().GetLineStyle() );
     813       57092 :     SetUnderColor( pAttrSet->GetUnderline().GetColor() );
     814       57092 :     SetOverline( pAttrSet->GetOverline().GetLineStyle() );
     815       57092 :     SetOverColor( pAttrSet->GetOverline().GetColor() );
     816       57092 :     SetEmphasisMark( pAttrSet->GetEmphasisMark().GetEmphasisMark() );
     817       57092 :     SetStrikeout( pAttrSet->GetCrossedOut().GetStrikeout() );
     818       57092 :     SetColor( pAttrSet->GetColor().GetValue() );
     819       57092 :     SetTransparent( true );
     820       57092 :     SetAlign( ALIGN_BASELINE );
     821       57092 :     SetOutline( pAttrSet->GetContour().GetValue() );
     822       57092 :     SetShadow( pAttrSet->GetShadowed().GetValue() );
     823       57092 :     SetPropWidth( pAttrSet->GetCharScaleW().GetValue() );
     824       57092 :     SetRelief( (FontRelief)pAttrSet->GetCharRelief().GetValue() );
     825       57092 :     if( pAttrSet->GetAutoKern().GetValue() )
     826             :     {
     827       51334 :         SetAutoKern( ( !pIDocumentSettingAccess ||
     828       51334 :                        !pIDocumentSettingAccess->get(DocumentSettingId::KERN_ASIAN_PUNCTUATION) ) ?
     829             :                         FontKerning::FontSpecific :
     830      102167 :                         FontKerning::Asian );
     831             :     }
     832             :     else
     833        5758 :         SetAutoKern( FontKerning::NONE );
     834       57092 :     SetWordLineMode( pAttrSet->GetWordLineMode().GetValue() );
     835       57092 :     const SvxEscapementItem &rEsc = pAttrSet->GetEscapement();
     836       57092 :     SetEscapement( rEsc.GetEsc() );
     837       57092 :     if( aSub[SW_LATIN].IsEsc() )
     838        2046 :         SetProportion( rEsc.GetProp() );
     839       57092 :     SetCaseMap( pAttrSet->GetCaseMap().GetCaseMap() );
     840       57092 :     SetFixKerning( pAttrSet->GetKerning().GetValue() );
     841             :     const SfxPoolItem* pItem;
     842       57092 :     if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_BACKGROUND,
     843       57092 :         true, &pItem ))
     844        1824 :         pBackColor = new Color( static_cast<const SvxBrushItem*>(pItem)->GetColor() );
     845             :     else
     846       55268 :         pBackColor = NULL;
     847       57092 :     if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_HIGHLIGHT,
     848       57092 :         true, &pItem ))
     849           9 :         SetHighlightColor(static_cast<const SvxBrushItem*>(pItem)->GetColor());
     850             :     else
     851       57083 :         SetHighlightColor(COL_TRANSPARENT);
     852       57092 :     if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_BOX,
     853       57092 :         true, &pItem ))
     854             :     {
     855         264 :         const SvxBoxItem* pBoxItem = static_cast<const SvxBoxItem*>(pItem);
     856         264 :         SetTopBorder(pBoxItem->GetTop());
     857         264 :         SetBottomBorder(pBoxItem->GetBottom());
     858         264 :         SetRightBorder(pBoxItem->GetRight());
     859         264 :         SetLeftBorder(pBoxItem->GetLeft());
     860         264 :         SetTopBorderDist(pBoxItem->GetDistance(SvxBoxItemLine::TOP));
     861         264 :         SetBottomBorderDist(pBoxItem->GetDistance(SvxBoxItemLine::BOTTOM));
     862         264 :         SetRightBorderDist(pBoxItem->GetDistance(SvxBoxItemLine::RIGHT));
     863         264 :         SetLeftBorderDist(pBoxItem->GetDistance(SvxBoxItemLine::LEFT));
     864             :     }
     865             :     else
     866             :     {
     867       56828 :         SetTopBorder(0);
     868       56828 :         SetBottomBorder(0);
     869       56828 :         SetRightBorder(0);
     870       56828 :         SetLeftBorder(0);
     871       56828 :         SetTopBorderDist(0);
     872       56828 :         SetBottomBorderDist(0);
     873       56828 :         SetRightBorderDist(0);
     874       56828 :         SetLeftBorderDist(0);
     875             :     }
     876             : 
     877       57092 :     if( SfxItemState::SET == pAttrSet->GetItemState( RES_CHRATR_SHADOW,
     878       57092 :         true, &pItem ))
     879             :     {
     880         138 :         const SvxShadowItem* pShadowItem = static_cast<const SvxShadowItem*>(pItem);
     881         138 :         SetShadowColor(pShadowItem->GetColor());
     882         138 :         SetShadowWidth(pShadowItem->GetWidth());
     883         138 :         SetShadowLocation(pShadowItem->GetLocation());
     884             :     }
     885             :     else
     886             :     {
     887       56954 :         SetShadowColor(COL_TRANSPARENT);
     888       56954 :         SetShadowWidth(0);
     889       56954 :         SetShadowLocation(SVX_SHADOW_NONE);
     890             :     }
     891             : 
     892       57092 :     const SvxTwoLinesItem& rTwoLinesItem = pAttrSet->Get2Lines();
     893       57092 :     if ( ! rTwoLinesItem.GetValue() )
     894       55985 :         SetVertical( pAttrSet->GetCharRotate().GetValue() );
     895             :     else
     896        1107 :         SetVertical( 0 );
     897       57092 :     if( pIDocumentSettingAccess && pIDocumentSettingAccess->get( DocumentSettingId::SMALL_CAPS_PERCENTAGE_66 ))
     898             :     {
     899        1664 :         aSub[ SW_LATIN ].smallCapsPercentage66 = true;
     900        1664 :         aSub[ SW_CJK ].smallCapsPercentage66 = true;
     901        1664 :         aSub[ SW_CTL ].smallCapsPercentage66 = true;
     902             :     }
     903       57092 : }
     904             : 
     905     3057810 : SwFont::~SwFont()
     906             : {
     907      611562 :     delete pBackColor;
     908     2446248 : }
     909             : 
     910     1850640 : SwSubFont& SwSubFont::operator=( const SwSubFont &rFont )
     911             : {
     912     1850640 :     SvxFont::operator=( rFont );
     913     1850640 :     pMagic = rFont.pMagic;
     914     1850640 :     nFntIndex = rFont.nFntIndex;
     915     1850640 :     nOrgHeight = rFont.nOrgHeight;
     916     1850640 :     nOrgAscent = rFont.nOrgAscent;
     917     1850640 :     nPropWidth = rFont.nPropWidth;
     918     1850640 :     aSize = rFont.aSize;
     919     1850640 :     smallCapsPercentage66 = rFont.smallCapsPercentage66;
     920     1850640 :     return *this;
     921             : }
     922             : 
     923       62404 : SwFont& SwFont::operator=( const SwFont &rFont )
     924             : {
     925       62404 :     aSub[SW_LATIN] = rFont.aSub[SW_LATIN];
     926       62404 :     aSub[SW_CJK] = rFont.aSub[SW_CJK];
     927       62404 :     aSub[SW_CTL] = rFont.aSub[SW_CTL];
     928       62404 :     nActual = rFont.nActual;
     929       62404 :     delete pBackColor;
     930       62404 :     pBackColor = rFont.pBackColor ? new Color( *rFont.pBackColor ) : NULL;
     931       62404 :     m_aHighlightColor = rFont.m_aHighlightColor;
     932       62404 :     m_aTopBorder = rFont.m_aTopBorder;
     933       62404 :     m_aBottomBorder = rFont.m_aBottomBorder;
     934       62404 :     m_aRightBorder = rFont.m_aRightBorder;
     935       62404 :     m_aLeftBorder = rFont.m_aLeftBorder;
     936       62404 :     m_nTopBorderDist = rFont.m_nTopBorderDist;
     937       62404 :     m_nBottomBorderDist = rFont.m_nBottomBorderDist;
     938       62404 :     m_nRightBorderDist = rFont.m_nRightBorderDist;
     939       62404 :     m_nLeftBorderDist = rFont.m_nLeftBorderDist;
     940       62404 :     m_aShadowColor = rFont.m_aShadowColor;
     941       62404 :     m_nShadowWidth = rFont.m_nShadowWidth;
     942       62404 :     m_aShadowLocation = rFont.m_aShadowLocation;
     943       62404 :     aUnderColor = rFont.GetUnderColor();
     944       62404 :     aOverColor  = rFont.GetOverColor();
     945       62404 :     nToxCnt = 0;
     946       62404 :     nRefCnt = 0;
     947       62404 :     m_nMetaCount = 0;
     948       62404 :     m_nInputFieldCount = 0;
     949       62404 :     bFntChg = rFont.bFntChg;
     950       62404 :     bOrgChg = rFont.bOrgChg;
     951       62404 :     bPaintBlank = rFont.bPaintBlank;
     952       62404 :     bPaintWrong = false;
     953       62404 :     bURL = rFont.bURL;
     954       62404 :     bGreyWave = rFont.bGreyWave;
     955       62404 :     bNoColReplace = rFont.bNoColReplace;
     956       62404 :     bNoHyph = rFont.bNoHyph;
     957       62404 :     bBlink = rFont.bBlink;
     958       62404 :     return *this;
     959             : }
     960             : 
     961       37937 : void SwFont::GoMagic( SwViewShell *pSh, sal_uInt8 nWhich )
     962             : {
     963             :     SwFntAccess aFntAccess( aSub[nWhich].pMagic, aSub[nWhich].nFntIndex,
     964       37937 :                             &aSub[nWhich], pSh, true );
     965       37937 : }
     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      547592 : bool SwSubFont::ChgFnt( SwViewShell const *pSh, OutputDevice& rOut )
     974             : {
     975      547592 :     if ( pLastFont )
     976      541897 :         pLastFont->Unlock();
     977      547592 :     SwFntAccess aFntAccess( pMagic, nFntIndex, this, pSh, true );
     978             :     SV_STAT( nChangeFont );
     979             : 
     980      547592 :     pLastFont = aFntAccess.Get();
     981             : 
     982      547592 :     pLastFont->SetDevFont( pSh, rOut );
     983             : 
     984      547592 :     pLastFont->Lock();
     985     1066645 :     return UNDERLINE_NONE != GetUnderline() ||
     986     1066630 :            UNDERLINE_NONE != GetOverline()  ||
     987     1066630 :            STRIKEOUT_NONE != GetStrikeout();
     988             : }
     989             : 
     990      418316 : void SwFont::ChgPhysFnt( SwViewShell *pSh, OutputDevice& rOut )
     991             : {
     992      418316 :     if( bOrgChg && aSub[nActual].IsEsc() )
     993             :     {
     994        4151 :         const sal_uInt8 nOldProp = aSub[nActual].GetPropr();
     995        4151 :         SetProportion( 100 );
     996        4151 :         ChgFnt( pSh, rOut );
     997             :         SwFntAccess aFntAccess( aSub[nActual].pMagic, aSub[nActual].nFntIndex,
     998        4151 :                                 &aSub[nActual], pSh );
     999        4151 :         aSub[nActual].nOrgHeight = aFntAccess.Get()->GetFontHeight( pSh, rOut );
    1000        4151 :         aSub[nActual].nOrgAscent = aFntAccess.Get()->GetFontAscent( pSh, rOut );
    1001        4151 :         SetProportion( nOldProp );
    1002        4151 :         bOrgChg = false;
    1003             :     }
    1004             : 
    1005      418316 :     if( bFntChg )
    1006             :     {
    1007      418315 :         ChgFnt( pSh, rOut );
    1008      418315 :         bFntChg = bOrgChg;
    1009             :     }
    1010      418316 :     if( rOut.GetTextLineColor() != aUnderColor )
    1011         226 :         rOut.SetTextLineColor( aUnderColor );
    1012      418316 :     if( rOut.GetOverlineColor() != aOverColor )
    1013         128 :         rOut.SetOverlineColor( aOverColor );
    1014      418316 : }
    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        4617 : sal_uInt16 SwSubFont::CalcEscHeight( const sal_uInt16 nOldHeight,
    1021             :                               const sal_uInt16 nOldAscent  ) const
    1022             : {
    1023        8240 :     if( DFLT_ESC_AUTO_SUPER != GetEscapement() &&
    1024        3623 :         DFLT_ESC_AUTO_SUB != GetEscapement() )
    1025             :     {
    1026        3528 :         long nDescent = nOldHeight - nOldAscent -
    1027        3528 :                              ( (long) nOrgHeight * GetEscapement() ) / 100L;
    1028             :         const sal_uInt16 nDesc = nDescent>0
    1029       16972 :                 ? std::max<sal_uInt16>( nDescent, nOrgHeight - nOrgAscent)
    1030       13778 :                 : nOrgHeight - nOrgAscent;
    1031        3528 :         return ( nDesc + CalcEscAscent( nOldAscent ) );
    1032             :     }
    1033        1089 :     return nOrgHeight;
    1034             : }
    1035             : 
    1036          36 : short SwSubFont::_CheckKerning( )
    1037             : {
    1038          36 :     short nKernx = - short( Font::GetSize().Height() / 6 );
    1039             : 
    1040          36 :     if ( nKernx < GetFixKerning() )
    1041          36 :         return GetFixKerning();
    1042           0 :     return nKernx;
    1043             : }
    1044             : 
    1045      238186 : sal_uInt16 SwSubFont::GetAscent( SwViewShell *pSh, const OutputDevice& rOut )
    1046             : {
    1047      238186 :     SwFntAccess aFntAccess( pMagic, nFntIndex, this, pSh );
    1048      238186 :     const sal_uInt16 nAscent = aFntAccess.Get()->GetFontAscent( pSh, rOut );
    1049      238186 :     return GetEscapement() ? CalcEscAscent( nAscent ) : nAscent;
    1050             : }
    1051             : 
    1052      314463 : sal_uInt16 SwSubFont::GetHeight( SwViewShell *pSh, const OutputDevice& rOut )
    1053             : {
    1054             :     SV_STAT( nGetTextSize );
    1055      314463 :     SwFntAccess aFntAccess( pMagic, nFntIndex, this, pSh );
    1056      314463 :     const sal_uInt16 nHeight = aFntAccess.Get()->GetFontHeight( pSh, rOut );
    1057      314463 :     if ( GetEscapement() )
    1058             :     {
    1059        3799 :         const sal_uInt16 nAscent = aFntAccess.Get()->GetFontAscent( pSh, rOut );
    1060        3799 :         return CalcEscHeight( nHeight, nAscent ); // + nLeading;
    1061             :     }
    1062      310664 :     return nHeight; // + nLeading;
    1063             : }
    1064             : 
    1065      103563 : Size SwSubFont::_GetTextSize( SwDrawTextInfo& rInf )
    1066             : {
    1067             :     // Robust: Eigentlich sollte der Font bereits eingestellt sein, aber
    1068             :     // sicher ist sicher ...
    1069      207120 :     if ( !pLastFont || pLastFont->GetOwner()!=pMagic ||
    1070      103557 :          !IsSameInstance( rInf.GetpOut()->GetFont() ) )
    1071       84636 :         ChgFnt( rInf.GetShell(), rInf.GetOut() );
    1072             : 
    1073      103563 :     SwDigitModeModifier aDigitModeModifier( rInf.GetOut(), rInf.GetFont()->GetLanguage() );
    1074             : 
    1075      103563 :     Size aTextSize;
    1076      103563 :     sal_Int32 nLn = ( rInf.GetLen() == COMPLETE_STRING ? rInf.GetText().getLength()
    1077      103563 :                                                    : rInf.GetLen() );
    1078      103563 :     rInf.SetLen( nLn );
    1079      103563 :     if( IsCapital() && nLn )
    1080         161 :         aTextSize = GetCapitalSize( rInf );
    1081             :     else
    1082             :     {
    1083             :         SV_STAT( nGetTextSize );
    1084      103402 :         long nOldKern = rInf.GetKern();
    1085      103402 :         const OUString oldText = rInf.GetText();
    1086      103402 :         rInf.SetKern( CheckKerning() );
    1087      103402 :         if ( !IsCaseMap() )
    1088      103225 :             aTextSize = pLastFont->GetTextSize( rInf );
    1089             :         else
    1090             :         {
    1091         177 :             OUString aTmp = CalcCaseMap( rInf.GetText() );
    1092         354 :             const OUString oldStr = rInf.GetText();
    1093         177 :             bool bCaseMapLengthDiffers(aTmp.getLength() != oldStr.getLength());
    1094             : 
    1095         177 :             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 :                 aTextSize = pLastFont->GetTextSize( rInf );
    1111             : 
    1112           0 :                 rInf.SetIdx( nOldIdx );
    1113           0 :                 rInf.SetLen( nOldLen );
    1114             :             }
    1115             :             else
    1116             :             {
    1117         177 :                 rInf.SetText( aTmp );
    1118         177 :                 aTextSize = pLastFont->GetTextSize( rInf );
    1119             :             }
    1120             : 
    1121         354 :             rInf.SetText(oldStr);
    1122             :         }
    1123      103402 :         rInf.SetKern( nOldKern );
    1124      103402 :         rInf.SetText(oldText);
    1125             :         // 15142: Ein Wort laenger als eine Zeile, beim Zeilenumbruch
    1126             :         //        hochgestellt, muss seine effektive Hoehe melden.
    1127      103402 :         if( GetEscapement() )
    1128             :         {
    1129             :             const sal_uInt16 nAscent = pLastFont->GetFontAscent( rInf.GetShell(),
    1130         818 :                                                              rInf.GetOut() );
    1131         818 :             aTextSize.Height() =
    1132         818 :                 (long)CalcEscHeight( (sal_uInt16)aTextSize.Height(), nAscent);
    1133      103402 :         }
    1134             :     }
    1135             : 
    1136      103563 :     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 :         aTextSize = pLastFont->GetTextSize( rInf );
    1145           0 :         rInf.SetIdx( nOldIdx );
    1146           0 :         rInf.SetLen( nOldLen );
    1147             :     }
    1148      103563 :     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 :         aTextSize = pLastFont->GetTextSize( rInf );
    1157           0 :         rInf.SetIdx( nOldIdx );
    1158           0 :         rInf.SetLen( nOldLen );
    1159             :     }
    1160             : 
    1161      103563 :     return aTextSize;
    1162             : }
    1163             : 
    1164       20515 : void SwSubFont::_DrawText( SwDrawTextInfo &rInf, const bool bGrey )
    1165             : {
    1166       20515 :     rInf.SetGreyWave( bGrey );
    1167       20515 :     sal_Int32 nLn = rInf.GetText().getLength();
    1168       20515 :     if( !rInf.GetLen() || !nLn )
    1169       20515 :         return;
    1170       20515 :     if( COMPLETE_STRING == rInf.GetLen() )
    1171           6 :         rInf.SetLen( nLn );
    1172             : 
    1173       20515 :     FontUnderline nOldUnder = UNDERLINE_NONE;
    1174       20515 :     SwUnderlineFont* pUnderFnt = 0;
    1175             : 
    1176       20515 :     if( rInf.GetUnderFnt() )
    1177             :     {
    1178          67 :         nOldUnder = GetUnderline();
    1179          67 :         SetUnderline( UNDERLINE_NONE );
    1180          67 :         pUnderFnt = rInf.GetUnderFnt();
    1181             :     }
    1182             : 
    1183       20515 :     if( !pLastFont || pLastFont->GetOwner()!=pMagic )
    1184         108 :         ChgFnt( rInf.GetShell(), rInf.GetOut() );
    1185             : 
    1186       20515 :     SwDigitModeModifier aDigitModeModifier( rInf.GetOut(), rInf.GetFont()->GetLanguage() );
    1187             : 
    1188       20515 :     const Point aOldPos(rInf.GetPos());
    1189       20515 :     Point aPos( rInf.GetPos() );
    1190             : 
    1191       20515 :     if( GetEscapement() )
    1192         322 :         CalcEsc( rInf, aPos );
    1193             : 
    1194       20515 :     rInf.SetPos( aPos );
    1195       20515 :     rInf.SetKern( CheckKerning() + rInf.GetSperren() / SPACING_PRECISION_FACTOR );
    1196             : 
    1197       20515 :     if( IsCapital() )
    1198          57 :         DrawCapital( rInf );
    1199             :     else
    1200             :     {
    1201             :         SV_STAT( nDrawText );
    1202       20458 :         if ( !IsCaseMap() )
    1203       20381 :             pLastFont->DrawText( rInf );
    1204             :         else
    1205             :         {
    1206          77 :             const OUString oldStr = rInf.GetText();
    1207         154 :             OUString aString( CalcCaseMap(oldStr) );
    1208          77 :             bool bCaseMapLengthDiffers(aString.getLength() != oldStr.getLength());
    1209             : 
    1210          77 :             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          77 :                 rInf.SetText( aString );
    1233          77 :                 pLastFont->DrawText( rInf );
    1234             :             }
    1235             : 
    1236         154 :             rInf.SetText(oldStr);
    1237             :         }
    1238             :     }
    1239             : 
    1240       20515 :     if( pUnderFnt && nOldUnder != UNDERLINE_NONE )
    1241             :     {
    1242          67 :         Size aFontSize = _GetTextSize( rInf );
    1243          67 :         const OUString oldStr = rInf.GetText();
    1244         134 :         OUString aStr("  ");
    1245             : 
    1246          67 :         sal_Int32 nOldIdx = rInf.GetIdx();
    1247          67 :         sal_Int32 nOldLen = rInf.GetLen();
    1248          67 :         long nSpace = 0;
    1249          67 :         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          67 :         rInf.SetWidth( sal_uInt16(aFontSize.Width() + nSpace) );
    1276          67 :         rInf.SetText( aStr );
    1277          67 :         rInf.SetIdx( 0 );
    1278          67 :         rInf.SetLen( 2 );
    1279          67 :         SetUnderline( nOldUnder );
    1280          67 :         rInf.SetUnderFnt( 0 );
    1281             : 
    1282             :         // set position for underline font
    1283          67 :         rInf.SetPos( pUnderFnt->GetPos() );
    1284             : 
    1285          67 :         pUnderFnt->GetFont()._DrawStretchText( rInf );
    1286             : 
    1287          67 :         rInf.SetUnderFnt( pUnderFnt );
    1288          67 :         rInf.SetText(oldStr);
    1289          67 :         rInf.SetIdx( nOldIdx );
    1290         134 :         rInf.SetLen( nOldLen );
    1291             :     }
    1292             : 
    1293       20515 :     rInf.SetPos(aOldPos);
    1294             : }
    1295             : 
    1296         147 : void SwSubFont::_DrawStretchText( SwDrawTextInfo &rInf )
    1297             : {
    1298         147 :     if( !rInf.GetLen() || !rInf.GetText().getLength() )
    1299         147 :         return;
    1300             : 
    1301         147 :     FontUnderline nOldUnder = UNDERLINE_NONE;
    1302         147 :     SwUnderlineFont* pUnderFnt = 0;
    1303             : 
    1304         147 :     if( rInf.GetUnderFnt() )
    1305             :     {
    1306           1 :         nOldUnder = GetUnderline();
    1307           1 :         SetUnderline( UNDERLINE_NONE );
    1308           1 :         pUnderFnt = rInf.GetUnderFnt();
    1309             :     }
    1310             : 
    1311         147 :     if ( !pLastFont || pLastFont->GetOwner() != pMagic )
    1312          69 :         ChgFnt( rInf.GetShell(), rInf.GetOut() );
    1313             : 
    1314         147 :     SwDigitModeModifier aDigitModeModifier( rInf.GetOut(), rInf.GetFont()->GetLanguage() );
    1315             : 
    1316         147 :     rInf.ApplyAutoColor();
    1317             : 
    1318         147 :     const Point aOldPos(rInf.GetPos());
    1319         147 :     Point aPos( rInf.GetPos() );
    1320             : 
    1321         147 :     if( GetEscapement() )
    1322           0 :         CalcEsc( rInf, aPos );
    1323             : 
    1324         147 :     rInf.SetKern( CheckKerning() + rInf.GetSperren() / SPACING_PRECISION_FACTOR );
    1325         147 :     rInf.SetPos( aPos );
    1326             : 
    1327         147 :     if( IsCapital() )
    1328           0 :         DrawStretchCapital( rInf );
    1329             :     else
    1330             :     {
    1331             :         SV_STAT( nDrawStretchText );
    1332             : 
    1333         147 :         if ( rInf.GetFrm() )
    1334             :         {
    1335         147 :             if ( rInf.GetFrm()->IsRightToLeft() )
    1336           0 :                 rInf.GetFrm()->SwitchLTRtoRTL( aPos );
    1337             : 
    1338         147 :             if ( rInf.GetFrm()->IsVertical() )
    1339           0 :                 rInf.GetFrm()->SwitchHorizontalToVertical( aPos );
    1340             : 
    1341         147 :             rInf.SetPos( aPos );
    1342             :         }
    1343             : 
    1344         147 :         if ( !IsCaseMap() )
    1345         294 :             rInf.GetOut().DrawStretchText( aPos, rInf.GetWidth(),
    1346         441 :                             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         147 :     if( pUnderFnt && nOldUnder != UNDERLINE_NONE )
    1353             :     {
    1354           1 :         const OUString oldStr = rInf.GetText();
    1355           2 :         OUString aStr("  ");
    1356           1 :         sal_Int32 nOldIdx = rInf.GetIdx();
    1357           1 :         sal_Int32 nOldLen = rInf.GetLen();
    1358           1 :         rInf.SetText( aStr );
    1359           1 :         rInf.SetIdx( 0 );
    1360           1 :         rInf.SetLen( 2 );
    1361           1 :         SetUnderline( nOldUnder );
    1362           1 :         rInf.SetUnderFnt( 0 );
    1363             : 
    1364             :         // set position for underline font
    1365           1 :         rInf.SetPos( pUnderFnt->GetPos() );
    1366             : 
    1367           1 :         pUnderFnt->GetFont()._DrawStretchText( rInf );
    1368             : 
    1369           1 :         rInf.SetUnderFnt( pUnderFnt );
    1370           1 :         rInf.SetText(oldStr);
    1371           1 :         rInf.SetIdx( nOldIdx );
    1372           2 :         rInf.SetLen( nOldLen );
    1373             :     }
    1374             : 
    1375         147 :     rInf.SetPos(aOldPos);
    1376             : }
    1377             : 
    1378          16 : sal_Int32 SwSubFont::_GetCrsrOfst( SwDrawTextInfo& rInf )
    1379             : {
    1380          16 :     if ( !pLastFont || pLastFont->GetOwner()!=pMagic )
    1381           0 :         ChgFnt( rInf.GetShell(), rInf.GetOut() );
    1382             : 
    1383          16 :     SwDigitModeModifier aDigitModeModifier( rInf.GetOut(), rInf.GetFont()->GetLanguage() );
    1384             : 
    1385          16 :     sal_Int32 nLn = rInf.GetLen() == COMPLETE_STRING ? rInf.GetText().getLength()
    1386          16 :                                                  : rInf.GetLen();
    1387          16 :     rInf.SetLen( nLn );
    1388          16 :     sal_Int32 nCrsr = 0;
    1389          16 :     if( IsCapital() && nLn )
    1390           0 :         nCrsr = GetCapitalCrsrOfst( rInf );
    1391             :     else
    1392             :     {
    1393          16 :         const OUString oldText = rInf.GetText();
    1394          16 :         long nOldKern = rInf.GetKern();
    1395          16 :         rInf.SetKern( CheckKerning() );
    1396             :         SV_STAT( nGetTextSize );
    1397          16 :         if ( !IsCaseMap() )
    1398          16 :             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          16 :         rInf.SetKern( nOldKern );
    1406          16 :         rInf.SetText(oldText);
    1407             :     }
    1408          16 :     return nCrsr;
    1409             : }
    1410             : 
    1411         322 : void SwSubFont::CalcEsc( SwDrawTextInfo& rInf, Point& rPos )
    1412             : {
    1413             :     long nOfst;
    1414             : 
    1415             :     const sal_uInt16 nDir = UnMapDirection(
    1416         322 :                 GetOrientation(), rInf.GetFrm() && rInf.GetFrm()->IsVertical() );
    1417             : 
    1418         322 :     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         160 :         nOfst = pLastFont->GetFontAscent( rInf.GetShell(), rInf.GetOut() ) -
    1441         160 :                 nOrgAscent;
    1442             : 
    1443         160 :         switch ( nDir )
    1444             :         {
    1445             :         case 0 :
    1446         160 :             rPos.Y() += nOfst;
    1447         160 :             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         160 :         break;
    1457             :     default :
    1458         162 :         nOfst = ((long)nOrgHeight * GetEscapement()) / 100L;
    1459             : 
    1460         162 :         switch ( nDir )
    1461             :         {
    1462             :         case 0 :
    1463         162 :             rPos.Y() -= nOfst;
    1464         162 :             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         322 : }
    1474             : 
    1475             : // used during painting of small capitals
    1476         507 : 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         507 :     const bool bBidiPor = ( GetFrm() && GetFrm()->IsRightToLeft() ) !=
    1484         507 :                           ( TEXT_LAYOUT_DEFAULT != ( TEXT_LAYOUT_BIDI_RTL & GetpOut()->GetLayoutMode() ) );
    1485             : 
    1486             :     nDir = bBidiPor ?
    1487             :             1800 :
    1488         507 :             UnMapDirection( nDir, GetFrm() && GetFrm()->IsVertical() );
    1489             : 
    1490         507 :     switch ( nDir )
    1491             :     {
    1492             :     case 0 :
    1493         507 :         m_aPos.X() += GetSize().Width();
    1494         507 :         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         507 : }
    1507             : 
    1508             : /**
    1509             :  * @note Used for the "continuous underline" feature.
    1510             :  **/
    1511          67 : SwUnderlineFont::SwUnderlineFont( SwFont& rFnt, const Point& rPoint )
    1512          67 :         : aPos( rPoint ), pFnt( &rFnt )
    1513             : {
    1514          67 : };
    1515             : 
    1516          67 : SwUnderlineFont::~SwUnderlineFont()
    1517             : {
    1518          67 :      delete pFnt;
    1519          67 : }
    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 vcl::RenderContext &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 :     vcl::RenderContext &rMutableOut = const_cast<vcl::RenderContext &>(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         177 : }
    1552             : 
    1553             : /* vim:set shiftwidth=4 softtabstop=4 expandtab: */

Generated by: LCOV version 1.11