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