xref: /trunk/main/toolkit/source/awt/vclxfont.cxx (revision b0724fc6)
1 /**************************************************************
2  *
3  * Licensed to the Apache Software Foundation (ASF) under one
4  * or more contributor license agreements.  See the NOTICE file
5  * distributed with this work for additional information
6  * regarding copyright ownership.  The ASF licenses this file
7  * to you under the Apache License, Version 2.0 (the
8  * "License"); you may not use this file except in compliance
9  * with the License.  You may obtain a copy of the License at
10  *
11  *   http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  *
20  *************************************************************/
21 
22 
23 
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_toolkit.hxx"
26 
27 
28 #include <toolkit/awt/vclxfont.hxx>
29 #include <toolkit/helper/vclunohelper.hxx>
30 #include <toolkit/helper/macros.hxx>
31 #include <cppuhelper/typeprovider.hxx>
32 #include <rtl/memory.h>
33 #include <rtl/uuid.h>
34 #include <rtl/ustring.h>
35 
36 #include <vcl/outdev.hxx>
37 
38 //	----------------------------------------------------
39 //	class VCLXFont
40 //	----------------------------------------------------
VCLXFont()41 VCLXFont::VCLXFont()
42 {
43 	mpFontMetric = NULL;
44 }
45 
~VCLXFont()46 VCLXFont::~VCLXFont()
47 {
48 	delete mpFontMetric;
49 }
50 
Init(::com::sun::star::awt::XDevice & rxDev,const Font & rFont)51 void VCLXFont::Init( ::com::sun::star::awt::XDevice& rxDev, const Font& rFont )
52 {
53 	mxDevice = &rxDev;
54 
55 	delete mpFontMetric;
56 	mpFontMetric = NULL;
57 
58 	maFont = rFont;
59 }
60 
ImplAssertValidFontMetric()61 sal_Bool VCLXFont::ImplAssertValidFontMetric()
62 {
63 	if ( !mpFontMetric && mxDevice.is() )
64 	{
65 		OutputDevice* pOutDev = VCLUnoHelper::GetOutputDevice( mxDevice );
66 		if ( pOutDev )
67 		{
68 			Font aOldFont = pOutDev->GetFont();
69 			pOutDev->SetFont( maFont );
70 			mpFontMetric = new FontMetric( pOutDev->GetFontMetric() );
71 			pOutDev->SetFont( aOldFont );
72 		}
73 	}
74 	return mpFontMetric ? sal_True : sal_False;
75 }
76 
77 
78 // ::com::sun::star::uno::XInterface
queryInterface(const::com::sun::star::uno::Type & rType)79 ::com::sun::star::uno::Any VCLXFont::queryInterface( const ::com::sun::star::uno::Type & rType ) throw(::com::sun::star::uno::RuntimeException)
80 {
81 	::com::sun::star::uno::Any aRet = ::cppu::queryInterface( rType,
82 										SAL_STATIC_CAST( ::com::sun::star::awt::XFont*, this ),
83                                         SAL_STATIC_CAST( ::com::sun::star::awt::XFont2*, this ),
84 										SAL_STATIC_CAST( ::com::sun::star::lang::XUnoTunnel*, this ),
85 										SAL_STATIC_CAST( ::com::sun::star::lang::XTypeProvider*, this ) );
86 	return (aRet.hasValue() ? aRet : OWeakObject::queryInterface( rType ));
87 }
88 
89 // ::com::sun::star::lang::XUnoTunnel
90 IMPL_XUNOTUNNEL( VCLXFont )
91 
92 // ::com::sun::star::lang::XTypeProvider
IMPL_XTYPEPROVIDER_START(VCLXFont)93 IMPL_XTYPEPROVIDER_START( VCLXFont )
94     getCppuType( ( ::com::sun::star::uno::Reference< ::com::sun::star::awt::XFont2>* ) NULL )
95 IMPL_XTYPEPROVIDER_END
96 
97 
98 ::com::sun::star::awt::FontDescriptor VCLXFont::getFontDescriptor(  ) throw(::com::sun::star::uno::RuntimeException)
99 {
100 	::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
101 
102 	return VCLUnoHelper::CreateFontDescriptor( maFont );
103 
104 }
105 
getFontMetric()106 ::com::sun::star::awt::SimpleFontMetric VCLXFont::getFontMetric(  ) throw(::com::sun::star::uno::RuntimeException)
107 {
108 	::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
109 
110 	::com::sun::star::awt::SimpleFontMetric aFM;
111 	if ( ImplAssertValidFontMetric() )
112 		aFM = VCLUnoHelper::CreateFontMetric( *mpFontMetric );
113 	return aFM;
114 }
115 
getCharWidth(sal_Unicode c)116 sal_Int16 VCLXFont::getCharWidth( sal_Unicode c ) throw(::com::sun::star::uno::RuntimeException)
117 {
118 	::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
119 
120 	sal_Int16 nRet = -1;
121 	OutputDevice* pOutDev = VCLUnoHelper::GetOutputDevice( mxDevice );
122 	if ( pOutDev )
123 	{
124 		Font aOldFont = pOutDev->GetFont();
125 		pOutDev->SetFont( maFont );
126 
127 		nRet = sal::static_int_cast< sal_Int16 >(
128             pOutDev->GetTextWidth( String(c) ));
129 
130 		pOutDev->SetFont( aOldFont );
131 	}
132 	return nRet;
133 }
134 
getCharWidths(sal_Unicode nFirst,sal_Unicode nLast)135 ::com::sun::star::uno::Sequence< sal_Int16 > VCLXFont::getCharWidths( sal_Unicode nFirst, sal_Unicode nLast ) throw(::com::sun::star::uno::RuntimeException)
136 {
137 	::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
138 
139 	::com::sun::star::uno::Sequence<sal_Int16> aSeq;
140 	OutputDevice* pOutDev = VCLUnoHelper::GetOutputDevice( mxDevice );
141 	if ( pOutDev )
142 	{
143 		Font aOldFont = pOutDev->GetFont();
144 		pOutDev->SetFont( maFont );
145 
146 		sal_Int16 nCount = nLast-nFirst + 1;
147 		aSeq = ::com::sun::star::uno::Sequence<sal_Int16>( nCount );
148 		for ( sal_uInt16 n = 0; n < nCount; n++ )
149 		{
150 			aSeq.getArray()[n] = sal::static_int_cast< sal_Int16 >(
151                 pOutDev->GetTextWidth(
152                     String(static_cast< sal_Unicode >(nFirst+n)) ));
153 		}
154 
155 		pOutDev->SetFont( aOldFont );
156 	}
157 	return aSeq;
158 }
159 
getStringWidth(const::rtl::OUString & str)160 sal_Int32 VCLXFont::getStringWidth( const ::rtl::OUString& str ) throw(::com::sun::star::uno::RuntimeException)
161 {
162 	::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
163 
164 	sal_Int32 nRet = -1;
165 	OutputDevice* pOutDev = VCLUnoHelper::GetOutputDevice( mxDevice );
166 	if ( pOutDev )
167 	{
168 		Font aOldFont = pOutDev->GetFont();
169 		pOutDev->SetFont( maFont );
170 		nRet = pOutDev->GetTextWidth( str );
171 		pOutDev->SetFont( aOldFont );
172 	}
173 	return nRet;
174 }
175 
getStringWidthArray(const::rtl::OUString & str,::com::sun::star::uno::Sequence<sal_Int32> & rDXArray)176 sal_Int32 VCLXFont::getStringWidthArray( const ::rtl::OUString& str, ::com::sun::star::uno::Sequence< sal_Int32 >& rDXArray ) throw(::com::sun::star::uno::RuntimeException)
177 {
178 	::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
179 
180 	sal_Int32 nRet = -1;
181 	OutputDevice* pOutDev = VCLUnoHelper::GetOutputDevice( mxDevice );
182 	if ( pOutDev )
183 	{
184 		Font aOldFont = pOutDev->GetFont();
185 		pOutDev->SetFont( maFont );
186 		rDXArray = ::com::sun::star::uno::Sequence<sal_Int32>( str.getLength() );
187 		nRet = pOutDev->GetTextArray( str, rDXArray.getArray() );
188 		pOutDev->SetFont( aOldFont );
189 	}
190 	return nRet;
191 }
192 
getKernPairs(::com::sun::star::uno::Sequence<sal_Unicode> &,::com::sun::star::uno::Sequence<sal_Unicode> &,::com::sun::star::uno::Sequence<sal_Int16> &)193 void VCLXFont::getKernPairs( ::com::sun::star::uno::Sequence< sal_Unicode >& /*rnChars1*/, ::com::sun::star::uno::Sequence< sal_Unicode >& /*rnChars2*/, ::com::sun::star::uno::Sequence< sal_Int16 >& /*rnKerns*/ ) throw(::com::sun::star::uno::RuntimeException)
194 {
195 	// NOTE: this empty method is just used for keeping the related UNO-API stable
196 }
197 
198 // ::com::sun::star::awt::XFont2
hasGlyphs(const::rtl::OUString & aText)199 sal_Bool VCLXFont::hasGlyphs( const ::rtl::OUString& aText )
200     throw(::com::sun::star::uno::RuntimeException)
201 {
202 	::osl::Guard< ::osl::Mutex > aGuard( GetMutex() );
203 
204     OutputDevice* pOutDev = VCLUnoHelper::GetOutputDevice( mxDevice );
205     if ( pOutDev )
206     {
207         String aStr( aText );
208         if ( pOutDev->HasGlyphs( maFont, aStr, 0, aStr.Len() ) == STRING_LEN )
209         {
210             return sal_True;
211         }
212     }
213 
214     return sal_False;
215 }
216