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