summaryrefslogtreecommitdiff
path: root/editeng/source/items/svxfont.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'editeng/source/items/svxfont.cxx')
-rw-r--r--editeng/source/items/svxfont.cxx809
1 files changed, 0 insertions, 809 deletions
diff --git a/editeng/source/items/svxfont.cxx b/editeng/source/items/svxfont.cxx
deleted file mode 100644
index 909f2c580e..0000000000
--- a/editeng/source/items/svxfont.cxx
+++ /dev/null
@@ -1,809 +0,0 @@
-/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_editeng.hxx"
-
-// include ----------------------------------------------------------------
-
-#include <vcl/outdev.hxx>
-#include <vcl/print.hxx>
-#include <tools/poly.hxx>
-#include <unotools/charclass.hxx>
-#include <editeng/unolingu.hxx>
-#include <com/sun/star/i18n/KCharacterType.hpp>
-
-#define _SVX_SVXFONT_CXX
-
-#include <editeng/svxfont.hxx>
-#include <editeng/escpitem.hxx>
-
-// Minimum: Percentage of kernel
-#define MINKERNPERCENT 5
-
-#ifndef REDUCEDSVXFONT
- const sal_Unicode CH_BLANK = sal_Unicode(' '); // ' ' Space character
- static sal_Char const sDoubleSpace[] = " ";
-#endif
-
-
-SvxFont::SvxFont()
-{
- nKern = nEsc = 0;
- nPropr = 100;
- eCaseMap = SVX_CASEMAP_NOT_MAPPED;
- eLang = LANGUAGE_SYSTEM;
-}
-
-SvxFont::SvxFont( const Font &rFont )
- : Font( rFont )
-{
- nKern = nEsc = 0;
- nPropr = 100;
- eCaseMap = SVX_CASEMAP_NOT_MAPPED;
- eLang = LANGUAGE_SYSTEM;
-}
-
-SvxFont::SvxFont( const SvxFont &rFont )
- : Font( rFont )
-{
- nKern = rFont.GetFixKerning();
- nEsc = rFont.GetEscapement();
- nPropr = rFont.GetPropr();
- eCaseMap = rFont.GetCaseMap();
- eLang = rFont.GetLanguage();
-}
-
-
-void SvxFont::DrawArrow( OutputDevice &rOut, const Rectangle& rRect,
- const Size& rSize, const Color& rCol, sal_Bool bLeft )
-{
- long nLeft = ( rRect.Left() + rRect.Right() - rSize.Width() )/ 2;
- long nRight = nLeft + rSize.Width();
- long nMid = ( rRect.Top() + rRect.Bottom() ) / 2;
- long nTop = nMid - rSize.Height() / 2;
- long nBottom = nTop + rSize.Height();
- if( nLeft < rRect.Left() )
- {
- nLeft = rRect.Left();
- nRight = rRect.Right();
- }
- if( nTop < rRect.Top() )
- {
- nTop = rRect.Top();
- nBottom = rRect.Bottom();
- }
- Polygon aPoly;
- Point aTmp( bLeft ? nLeft : nRight, nMid );
- Point aNxt( bLeft ? nRight : nLeft, nTop );
- aPoly.Insert( 0, aTmp );
- aPoly.Insert( 0, aNxt );
- aNxt.Y() = nBottom;
- aPoly.Insert( 0, aNxt );
- aPoly.Insert( 0, aTmp );
- Color aOldLineColor = rOut.GetLineColor();
- Color aOldFillColor = rOut.GetFillColor();
- rOut.SetFillColor( rCol );
- rOut.SetLineColor( Color( COL_BLACK ) );
- rOut.DrawPolygon( aPoly );
- rOut.DrawLine( aTmp, aNxt );
- rOut.SetLineColor( aOldLineColor );
- rOut.SetFillColor( aOldFillColor );
-}
-
-
-XubString SvxFont::CalcCaseMap( const XubString &rTxt ) const
-{
- if( !IsCaseMap() || !rTxt.Len() ) return rTxt;
- XubString aTxt( rTxt );
- // I still have to get the language
- const LanguageType eLng = LANGUAGE_DONTKNOW == eLang
- ? LANGUAGE_SYSTEM : eLang;
-
- CharClass aCharClass( SvxCreateLocale( eLng ) );
-
- switch( eCaseMap )
- {
- case SVX_CASEMAP_KAPITAELCHEN:
- case SVX_CASEMAP_VERSALIEN:
- {
- aCharClass.toUpper( aTxt );
- break;
- }
-
- case SVX_CASEMAP_GEMEINE:
- {
- aCharClass.toLower( aTxt );
- break;
- }
- case SVX_CASEMAP_TITEL:
- {
- // Every beginning of a word is capitalized, the rest of the word
- // is taken over as is.
- // Bug: if the attribute starts in the middle of the word.
- sal_Bool bBlank = sal_True;
-
- for( sal_uInt16 i = 0; i < aTxt.Len(); ++i )
- {
- if( sal_Unicode(' ') == aTxt.GetChar(i) || sal_Unicode('\t') == aTxt.GetChar(i) )
- bBlank = sal_True;
- else
- {
- if( bBlank )
- {
- String aTemp( aTxt.GetChar( i ) );
- aCharClass.toUpper( aTemp );
- aTxt.Replace( i, 1, aTemp );
- }
- bBlank = sal_False;
- }
- }
- break;
- }
- default:
- {
- DBG_ASSERT(!this, "SvxFont::CaseMapTxt: unknown casemap");
- break;
- }
- }
- return aTxt;
-}
-
-/*************************************************************************
-* Starting form here are the methods that can not be used in Writer,
-* so we put this section to be excluded by REDUCEDSVXFONT.
- *************************************************************************/
-#ifndef REDUCEDSVXFONT
-
-/*************************************************************************
- * class SvxDoCapitals
- * The virtual Method Do si called by SvxFont::DoOnCapitals alternately
- * the uppercase and lowercase parts. The derivate of SvxDoCapitals fills
- * this method with life.
- *************************************************************************/
-
-class SvxDoCapitals
-{
-protected:
- OutputDevice *pOut;
- const XubString &rTxt;
- const xub_StrLen nIdx;
- const xub_StrLen nLen;
-
-public:
- SvxDoCapitals( OutputDevice *_pOut, const XubString &_rTxt,
- const xub_StrLen _nIdx, const xub_StrLen _nLen )
- : pOut(_pOut), rTxt(_rTxt), nIdx(_nIdx), nLen(_nLen)
- { }
-
- virtual void DoSpace( const sal_Bool bDraw );
- virtual void SetSpace();
- virtual void Do( const XubString &rTxt,
- const xub_StrLen nIdx, const xub_StrLen nLen,
- const sal_Bool bUpper ) = 0;
-
- inline OutputDevice *GetOut() { return pOut; }
- inline const XubString &GetTxt() const { return rTxt; }
- xub_StrLen GetIdx() const { return nIdx; }
- xub_StrLen GetLen() const { return nLen; }
-};
-
-void SvxDoCapitals::DoSpace( const sal_Bool /*bDraw*/ ) { }
-
-void SvxDoCapitals::SetSpace() { }
-
-void SvxDoCapitals::Do( const XubString &/*_rTxt*/, const xub_StrLen /*_nIdx*/,
- const xub_StrLen /*_nLen*/, const sal_Bool /*bUpper*/ ) { }
-
-/*************************************************************************
- * SvxFont::DoOnCapitals() const
- * Decomposes the String into uppercase and lowercase letters and then
- * calls the method SvxDoCapitals::Do( ).
- *************************************************************************/
-
-void SvxFont::DoOnCapitals(SvxDoCapitals &rDo, const xub_StrLen nPartLen) const
-{
- const XubString &rTxt = rDo.GetTxt();
- const xub_StrLen nIdx = rDo.GetIdx();
- const xub_StrLen nLen = STRING_LEN == nPartLen ? rDo.GetLen() : nPartLen;
-
- const XubString aTxt( CalcCaseMap( rTxt ) );
- const sal_uInt16 nTxtLen = Min( rTxt.Len(), nLen );
- sal_uInt16 nPos = 0;
- sal_uInt16 nOldPos = nPos;
-
- // #108210#
- // Test if string length differ between original and CaseMapped
- sal_Bool bCaseMapLengthDiffers(aTxt.Len() != rTxt.Len());
-
- const LanguageType eLng = LANGUAGE_DONTKNOW == eLang
- ? LANGUAGE_SYSTEM : eLang;
-
- CharClass aCharClass( SvxCreateLocale( eLng ) );
- String aCharString;
-
- while( nPos < nTxtLen )
- {
- // first in turn are teh uppercase letters
-
- // There are characters that are both upper- and lower-case L (eg blank)
- // Such ambiguities lead to chaos, this is why these characters are
- // allocated to the lowercase characters!
-
- while( nPos < nTxtLen )
- {
- aCharString = rTxt.GetChar( nPos + nIdx );
- sal_Int32 nCharacterType = aCharClass.getCharacterType( aCharString, 0 );
- if ( nCharacterType & ::com::sun::star::i18n::KCharacterType::LOWER )
- break;
- if ( ! ( nCharacterType & ::com::sun::star::i18n::KCharacterType::UPPER ) )
- break;
- ++nPos;
- }
- if( nOldPos != nPos )
- {
- if(bCaseMapLengthDiffers)
- {
- // #108210#
- // If strings differ work preparing the necessary snippet to address that
- // potential difference
- const XubString aSnippet(rTxt, nIdx + nOldPos, nPos-nOldPos);
- XubString aNewText = CalcCaseMap(aSnippet);
-
- rDo.Do( aNewText, 0, aNewText.Len(), sal_True );
- }
- else
- {
- rDo.Do( aTxt, nIdx + nOldPos, nPos-nOldPos, sal_True );
- }
-
- nOldPos = nPos;
- }
- // Now the lowercase are processed (without blanks)
- while( nPos < nTxtLen )
- {
- sal_uInt32 nCharacterType = aCharClass.getCharacterType( aCharString, 0 );
- if ( ( nCharacterType & ::com::sun::star::i18n::KCharacterType::UPPER ) )
- break;
- if ( CH_BLANK == aCharString )
- break;
- if( ++nPos < nTxtLen )
- aCharString = rTxt.GetChar( nPos + nIdx );
- }
- if( nOldPos != nPos )
- {
- if(bCaseMapLengthDiffers)
- {
- // #108210#
- // If strings differ work preparing the necessary snippet to address that
- // potential difference
- const XubString aSnippet(rTxt, nIdx + nOldPos, nPos - nOldPos);
- XubString aNewText = CalcCaseMap(aSnippet);
-
- rDo.Do( aNewText, 0, aNewText.Len(), sal_False );
- }
- else
- {
- rDo.Do( aTxt, nIdx + nOldPos, nPos-nOldPos, sal_False );
- }
-
- nOldPos = nPos;
- }
- // Now the blanks are<processed
- while( nPos < nTxtLen && CH_BLANK == aCharString && ++nPos < nTxtLen )
- aCharString = rTxt.GetChar( nPos + nIdx );
-
- if( nOldPos != nPos )
- {
- rDo.DoSpace( sal_False );
-
- if(bCaseMapLengthDiffers)
- {
- // #108210#
- // If strings differ work preparing the necessary snippet to address that
- // potential difference
- const XubString aSnippet(rTxt, nIdx + nOldPos, nPos - nOldPos);
- XubString aNewText = CalcCaseMap(aSnippet);
-
- rDo.Do( aNewText, 0, aNewText.Len(), sal_False );
- }
- else
- {
- rDo.Do( aTxt, nIdx + nOldPos, nPos - nOldPos, sal_False );
- }
-
- nOldPos = nPos;
- rDo.SetSpace();
- }
- }
- rDo.DoSpace( sal_True );
-}
-
-
-void SvxFont::SetPhysFont( OutputDevice *pOut ) const
-{
- const Font& rCurrentFont = pOut->GetFont();
- if ( nPropr == 100 )
- {
- if ( !rCurrentFont.IsSameInstance( *this ) )
- pOut->SetFont( *this );
- }
- else
- {
- Font aNewFont( *this );
- Size aSize( aNewFont.GetSize() );
- aNewFont.SetSize( Size( aSize.Width() * nPropr / 100L,
- aSize.Height() * nPropr / 100L ) );
- if ( !rCurrentFont.IsSameInstance( aNewFont ) )
- pOut->SetFont( aNewFont );
- }
-}
-
-
-Font SvxFont::ChgPhysFont( OutputDevice *pOut ) const
-{
- Font aOldFont( pOut->GetFont() );
- SetPhysFont( pOut );
- return aOldFont;
-}
-
-
-Size SvxFont::GetPhysTxtSize( const OutputDevice *pOut, const XubString &rTxt,
- const xub_StrLen nIdx, const xub_StrLen nLen ) const
-{
- if ( !IsCaseMap() && !IsKern() )
- return Size( pOut->GetTextWidth( rTxt, nIdx, nLen ),
- pOut->GetTextHeight() );
-
- Size aTxtSize;
- aTxtSize.setHeight( pOut->GetTextHeight() );
- if ( !IsCaseMap() )
- aTxtSize.setWidth( pOut->GetTextWidth( rTxt, nIdx, nLen ) );
- else
- {
- // #108210#
- const XubString aNewText = CalcCaseMap(rTxt);
- sal_Bool bCaseMapLengthDiffers(aNewText.Len() != rTxt.Len());
- sal_Int32 nWidth(0L);
-
- if(bCaseMapLengthDiffers)
- {
- // If strings differ work preparing the necessary snippet to address that
- // potential difference
- const XubString aSnippet(rTxt, nIdx, nLen);
- XubString _aNewText = CalcCaseMap(aSnippet);
- nWidth = pOut->GetTextWidth( _aNewText, 0, _aNewText.Len() );
- }
- else
- {
- nWidth = pOut->GetTextWidth( aNewText, nIdx, nLen );
- }
-
- aTxtSize.setWidth(nWidth);
- }
-
- if( IsKern() && ( nLen > 1 ) )
- aTxtSize.Width() += ( ( nLen-1 ) * long( nKern ) );
-
- return aTxtSize;
-}
-
-Size SvxFont::GetPhysTxtSize( const OutputDevice *pOut, const XubString &rTxt )
-{
- if ( !IsCaseMap() && !IsKern() )
- return Size( pOut->GetTextWidth( rTxt ), pOut->GetTextHeight() );
-
- Size aTxtSize;
- aTxtSize.setHeight( pOut->GetTextHeight() );
- if ( !IsCaseMap() )
- aTxtSize.setWidth( pOut->GetTextWidth( rTxt ) );
- else
- aTxtSize.setWidth( pOut->GetTextWidth( CalcCaseMap( rTxt ) ) );
-
- if( IsKern() && ( rTxt.Len() > 1 ) )
- aTxtSize.Width() += ( ( rTxt.Len()-1 ) * long( nKern ) );
-
- return aTxtSize;
-}
-
-Size SvxFont::QuickGetTextSize( const OutputDevice *pOut, const XubString &rTxt,
- const sal_uInt16 nIdx, const sal_uInt16 nLen, sal_Int32* pDXArray ) const
-{
- if ( !IsCaseMap() && !IsKern() )
- return Size( pOut->GetTextArray( rTxt, pDXArray, nIdx, nLen ),
- pOut->GetTextHeight() );
-
- Size aTxtSize;
- aTxtSize.setHeight( pOut->GetTextHeight() );
- if ( !IsCaseMap() )
- aTxtSize.setWidth( pOut->GetTextArray( rTxt, pDXArray, nIdx, nLen ) );
- else
- aTxtSize.setWidth( pOut->GetTextArray( CalcCaseMap( rTxt ),
- pDXArray, nIdx, nLen ) );
-
- if( IsKern() && ( nLen > 1 ) )
- {
- aTxtSize.Width() += ( ( nLen-1 ) * long( nKern ) );
-
- if ( pDXArray )
- {
- for ( xub_StrLen i = 0; i < nLen; i++ )
- pDXArray[i] += ( (i+1) * long( nKern ) );
- // The last one is a nKern too big:
- pDXArray[nLen-1] -= nKern;
- }
- }
- return aTxtSize;
-}
-
-
-Size SvxFont::GetTxtSize( const OutputDevice *pOut, const XubString &rTxt,
- const xub_StrLen nIdx, const xub_StrLen nLen )
-{
- xub_StrLen nTmp = nLen;
- if ( nTmp == STRING_LEN ) // already initialized?
- nTmp = rTxt.Len();
- Font aOldFont( ChgPhysFont((OutputDevice *)pOut) );
- Size aTxtSize;
- if( IsCapital() && rTxt.Len() )
- {
- aTxtSize = GetCapitalSize( pOut, rTxt, nIdx, nTmp );
- }
- else aTxtSize = GetPhysTxtSize(pOut,rTxt,nIdx,nTmp);
- ((OutputDevice *)pOut)->SetFont( aOldFont );
- return aTxtSize;
-}
-
-
-void SvxFont::DrawText( OutputDevice *pOut,
- const Point &rPos, const XubString &rTxt,
- const xub_StrLen nIdx, const xub_StrLen nLen ) const
-{
- if( !nLen || !rTxt.Len() ) return;
- xub_StrLen nTmp = nLen;
- if ( nTmp == STRING_LEN ) // already initialized?
- nTmp = rTxt.Len();
- Point aPos( rPos );
- if ( nEsc )
- {
- Size aSize = (this->GetSize());
- aPos.Y() -= ((nEsc*long(aSize.Height()))/ 100L);
- }
- Font aOldFont( ChgPhysFont( pOut ) );
-
- if ( IsCapital() )
- DrawCapital( pOut, aPos, rTxt, nIdx, nTmp );
- else
- {
- Size aSize = GetPhysTxtSize( pOut, rTxt, nIdx, nTmp );
-
- if ( !IsCaseMap() )
- pOut->DrawStretchText( aPos, aSize.Width(), rTxt, nIdx, nTmp );
- else
- pOut->DrawStretchText( aPos, aSize.Width(), CalcCaseMap( rTxt ),
- nIdx, nTmp );
- }
- pOut->SetFont(aOldFont);
-}
-
-void SvxFont::QuickDrawText( OutputDevice *pOut,
- const Point &rPos, const XubString &rTxt,
- const xub_StrLen nIdx, const xub_StrLen nLen, const sal_Int32* pDXArray ) const
-{
- // Font has to be selected in OutputDevice...
- if ( !IsCaseMap() && !IsCapital() && !IsKern() && !IsEsc() )
- {
- pOut->DrawTextArray( rPos, rTxt, pDXArray, nIdx, nLen );
- return;
- }
-
- Point aPos( rPos );
-
- if ( nEsc )
- {
- long nDiff = GetSize().Height();
- nDiff *= nEsc;
- nDiff /= 100;
-
- if ( !IsVertical() )
- aPos.Y() -= nDiff;
- else
- aPos.X() += nDiff;
- }
-
- if( IsCapital() )
- {
- DBG_ASSERT( !pDXArray, "DrawCapital not for TextArray!" );
- DrawCapital( pOut, aPos, rTxt, nIdx, nLen );
- }
- else
- {
- if ( IsKern() && !pDXArray )
- {
- Size aSize = GetPhysTxtSize( pOut, rTxt, nIdx, nLen );
-
- if ( !IsCaseMap() )
- pOut->DrawStretchText( aPos, aSize.Width(), rTxt, nIdx, nLen );
- else
- pOut->DrawStretchText( aPos, aSize.Width(), CalcCaseMap( rTxt ), nIdx, nLen );
- }
- else
- {
- if ( !IsCaseMap() )
- pOut->DrawTextArray( aPos, rTxt, pDXArray, nIdx, nLen );
- else
- pOut->DrawTextArray( aPos, CalcCaseMap( rTxt ), pDXArray, nIdx, nLen );
- }
- }
-}
-
-
-void SvxFont::DrawPrev( OutputDevice *pOut, Printer* pPrinter,
- const Point &rPos, const XubString &rTxt,
- const xub_StrLen nIdx, const xub_StrLen nLen ) const
-{
- if ( !nLen || !rTxt.Len() )
- return;
- xub_StrLen nTmp = nLen;
-
- if ( nTmp == STRING_LEN ) // already initialized?
- nTmp = rTxt.Len();
- Point aPos( rPos );
-
- if ( nEsc )
- {
- short nTmpEsc;
- if( DFLT_ESC_AUTO_SUPER == nEsc )
- nTmpEsc = 33;
- else if( DFLT_ESC_AUTO_SUB == nEsc )
- nTmpEsc = -20;
- else
- nTmpEsc = nEsc;
- Size aSize = ( this->GetSize() );
- aPos.Y() -= ( ( nTmpEsc * long( aSize.Height() ) ) / 100L );
- }
- Font aOldFont( ChgPhysFont( pOut ) );
- Font aOldPrnFont( ChgPhysFont( pPrinter ) );
-
- if ( IsCapital() )
- DrawCapital( pOut, aPos, rTxt, nIdx, nTmp );
- else
- {
- Size aSize = GetPhysTxtSize( pPrinter, rTxt, nIdx, nTmp );
-
- if ( !IsCaseMap() )
- pOut->DrawStretchText( aPos, aSize.Width(), rTxt, nIdx, nTmp );
- else
- {
- // #108210#
- const XubString aNewText = CalcCaseMap(rTxt);
- sal_Bool bCaseMapLengthDiffers(aNewText.Len() != rTxt.Len());
-
- if(bCaseMapLengthDiffers)
- {
- // If strings differ work preparing the necessary snippet to address that
- // potential difference
- const XubString aSnippet(rTxt, nIdx, nTmp);
- XubString _aNewText = CalcCaseMap(aSnippet);
-
- pOut->DrawStretchText( aPos, aSize.Width(), _aNewText, 0, _aNewText.Len() );
- }
- else
- {
- pOut->DrawStretchText( aPos, aSize.Width(), CalcCaseMap( rTxt ), nIdx, nTmp );
- }
- }
- }
- pOut->SetFont(aOldFont);
- pPrinter->SetFont( aOldPrnFont );
-}
-
-
-SvxFont& SvxFont::operator=( const Font& rFont )
-{
- Font::operator=( rFont );
- return *this;
-}
-
-SvxFont& SvxFont::operator=( const SvxFont& rFont )
-{
- Font::operator=( rFont );
- eLang = rFont.eLang;
- eCaseMap = rFont.eCaseMap;
- nEsc = rFont.nEsc;
- nPropr = rFont.nPropr;
- nKern = rFont.nKern;
- return *this;
-}
-
-class SvxDoGetCapitalSize : public SvxDoCapitals
-{
-protected:
- SvxFont* pFont;
- Size aTxtSize;
- short nKern;
-public:
- SvxDoGetCapitalSize( SvxFont *_pFnt, const OutputDevice *_pOut,
- const XubString &_rTxt, const xub_StrLen _nIdx,
- const xub_StrLen _nLen, const short _nKrn )
- : SvxDoCapitals( (OutputDevice*)_pOut, _rTxt, _nIdx, _nLen ),
- pFont( _pFnt ),
- nKern( _nKrn )
- { }
-
- virtual void Do( const XubString &rTxt, const xub_StrLen nIdx,
- const xub_StrLen nLen, const sal_Bool bUpper );
-
- inline const Size &GetSize() const { return aTxtSize; };
-};
-
-void SvxDoGetCapitalSize::Do( const XubString &_rTxt, const xub_StrLen _nIdx,
- const xub_StrLen _nLen, const sal_Bool bUpper )
-{
- Size aPartSize;
- if ( !bUpper )
- {
- sal_uInt8 nProp = pFont->GetPropr();
- pFont->SetProprRel( SMALL_CAPS_PERCENTAGE );
- pFont->SetPhysFont( pOut );
- aPartSize.setWidth( pOut->GetTextWidth( _rTxt, _nIdx, _nLen ) );
- aPartSize.setHeight( pOut->GetTextHeight() );
- aTxtSize.Height() = aPartSize.Height();
- pFont->SetPropr( nProp );
- pFont->SetPhysFont( pOut );
- }
- else
- {
- aPartSize.setWidth( pOut->GetTextWidth( _rTxt, _nIdx, _nLen ) );
- aPartSize.setHeight( pOut->GetTextHeight() );
- }
- aTxtSize.Width() += aPartSize.Width();
- aTxtSize.Width() += ( _nLen * long( nKern ) );
-}
-
-Size SvxFont::GetCapitalSize( const OutputDevice *pOut, const XubString &rTxt,
- const xub_StrLen nIdx, const xub_StrLen nLen) const
-{
- // Start:
- SvxDoGetCapitalSize aDo( (SvxFont *)this, pOut, rTxt, nIdx, nLen, nKern );
- DoOnCapitals( aDo );
- Size aTxtSize( aDo.GetSize() );
-
- // End:
- if( !aTxtSize.Height() )
- {
- aTxtSize.setWidth( 0 );
- aTxtSize.setHeight( pOut->GetTextHeight() );
- }
- return aTxtSize;
-}
-
-class SvxDoDrawCapital : public SvxDoCapitals
-{
-protected:
- SvxFont *pFont;
- Point aPos;
- Point aSpacePos;
- short nKern;
-public:
- SvxDoDrawCapital( SvxFont *pFnt, OutputDevice *_pOut, const XubString &_rTxt,
- const xub_StrLen _nIdx, const xub_StrLen _nLen,
- const Point &rPos, const short nKrn )
- : SvxDoCapitals( _pOut, _rTxt, _nIdx, _nLen ),
- pFont( pFnt ),
- aPos( rPos ),
- aSpacePos( rPos ),
- nKern( nKrn )
- { }
- virtual void DoSpace( const sal_Bool bDraw );
- virtual void SetSpace();
- virtual void Do( const XubString &rTxt, const xub_StrLen nIdx,
- const xub_StrLen nLen, const sal_Bool bUpper );
-};
-
-void SvxDoDrawCapital::DoSpace( const sal_Bool bDraw )
-{
- if ( bDraw || pFont->IsWordLineMode() )
- {
- sal_uInt16 nDiff = (sal_uInt16)(aPos.X() - aSpacePos.X());
- if ( nDiff )
- {
- sal_Bool bWordWise = pFont->IsWordLineMode();
- sal_Bool bTrans = pFont->IsTransparent();
- pFont->SetWordLineMode( sal_False );
- pFont->SetTransparent( sal_True );
- pFont->SetPhysFont( pOut );
- pOut->DrawStretchText( aSpacePos, nDiff, XubString( sDoubleSpace,
- RTL_TEXTENCODING_MS_1252 ), 0, 2 );
- pFont->SetWordLineMode( bWordWise );
- pFont->SetTransparent( bTrans );
- pFont->SetPhysFont( pOut );
- }
- }
-}
-
-void SvxDoDrawCapital::SetSpace()
-{
- if ( pFont->IsWordLineMode() )
- aSpacePos.X() = aPos.X();
-}
-
-void SvxDoDrawCapital::Do( const XubString &_rTxt, const xub_StrLen _nIdx,
- const xub_StrLen _nLen, const sal_Bool bUpper)
-{
- sal_uInt8 nProp = 0;
- Size aPartSize;
-
- // Set the desired font
- FontUnderline eUnder = pFont->GetUnderline();
- FontStrikeout eStrike = pFont->GetStrikeout();
- pFont->SetUnderline( UNDERLINE_NONE );
- pFont->SetStrikeout( STRIKEOUT_NONE );
- if ( !bUpper )
- {
- nProp = pFont->GetPropr();
- pFont->SetProprRel( SMALL_CAPS_PERCENTAGE );
- }
- pFont->SetPhysFont( pOut );
-
- aPartSize.setWidth( pOut->GetTextWidth( _rTxt, _nIdx, _nLen ) );
- aPartSize.setHeight( pOut->GetTextHeight() );
- long nWidth = aPartSize.Width();
- if ( nKern )
- {
- aPos.X() += (nKern/2);
- if ( _nLen ) nWidth += (_nLen*long(nKern));
- }
- pOut->DrawStretchText(aPos,nWidth-nKern,_rTxt,_nIdx,_nLen);
-
- // Restore Font
- pFont->SetUnderline( eUnder );
- pFont->SetStrikeout( eStrike );
- if ( !bUpper )
- pFont->SetPropr( nProp );
- pFont->SetPhysFont( pOut );
-
- aPos.X() += nWidth-(nKern/2);
-}
-
-/*************************************************************************
- * SvxFont::DrawCapital() draws the uppercase letter.
- *************************************************************************/
-
-void SvxFont::DrawCapital( OutputDevice *pOut,
- const Point &rPos, const XubString &rTxt,
- const xub_StrLen nIdx, const xub_StrLen nLen ) const
-{
- SvxDoDrawCapital aDo( (SvxFont *)this,pOut,rTxt,nIdx,nLen,rPos,nKern );
- DoOnCapitals( aDo );
-}
-
-#endif // !REDUCEDSVXFONT
-
-
-/* vim:set shiftwidth=4 softtabstop=4 expandtab: */