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