1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
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/.
9 * This file incorporates work covered by the following license notice:
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 .
20 #include <epptbase.hxx>
21 #include <epptdef.hxx>
23 #include <tools/color.hxx>
24 #include <editeng/svxenum.hxx>
26 using namespace ::com::sun::star
;
28 PPTExCharSheet::PPTExCharSheet( int nInstance
)
30 sal_uInt16 nFontHeight
= 24;
32 for ( int nDepth
= 0; nDepth
< 5; nDepth
++ )
34 PPTExCharLevel
& rLev
= maCharLevel
[ nDepth
];
37 case EPP_TEXTTYPE_Title
:
38 case EPP_TEXTTYPE_CenterTitle
:
41 case EPP_TEXTTYPE_Body
:
42 case EPP_TEXTTYPE_CenterBody
:
43 case EPP_TEXTTYPE_HalfBody
:
44 case EPP_TEXTTYPE_QuarterBody
:
48 case 0 : nFontHeight
= 32; break;
49 case 1 : nFontHeight
= 28; break;
50 case 2 : nFontHeight
= 24; break;
51 default :nFontHeight
= 20; break;
55 case EPP_TEXTTYPE_Notes
:
58 case EPP_TEXTTYPE_notUsed
:
59 case EPP_TEXTTYPE_Other
:
65 rLev
.mnAsianOrComplexFont
= 0xffff;
66 rLev
.mnFontHeight
= nFontHeight
;
68 rLev
.mnEscapement
= 0;
73 void PPTExCharSheet::SetStyleSheet( const ::com::sun::star::uno::Reference
< ::com::sun::star::beans::XPropertySet
> & rXPropSet
,
74 FontCollection
& rFontCollection
, int nLevel
)
76 PortionObj
aPortionObj( rXPropSet
, rFontCollection
);
78 PPTExCharLevel
& rLev
= maCharLevel
[ nLevel
];
80 if ( aPortionObj
.meCharColor
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
81 rLev
.mnFontColor
= aPortionObj
.mnCharColor
;
82 if ( aPortionObj
.meCharEscapement
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
83 rLev
.mnEscapement
= aPortionObj
.mnCharEscapement
;
84 if ( aPortionObj
.meCharHeight
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
85 rLev
.mnFontHeight
= aPortionObj
.mnCharHeight
;
86 if ( aPortionObj
.meFontName
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
87 rLev
.mnFont
= aPortionObj
.mnFont
;
88 if ( aPortionObj
.meAsianOrComplexFont
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
89 rLev
.mnAsianOrComplexFont
= aPortionObj
.mnAsianOrComplexFont
;
90 rLev
.mnFlags
= aPortionObj
.mnCharAttr
;
93 void PPTExCharSheet::Write( SvStream
& rSt
, PptEscherEx
*, sal_uInt16 nLev
, sal_Bool
, sal_Bool bSimpleText
,
94 const ::com::sun::star::uno::Reference
< ::com::sun::star::beans::XPropertySet
> & rPagePropSet
)
96 const PPTExCharLevel
& rLev
= maCharLevel
[ nLev
];
98 sal_uInt32 nCharFlags
= 0xefffff;
100 nCharFlags
= 0x7ffff;
106 sal_uInt32 nFontColor
= rLev
.mnFontColor
;
107 if ( nFontColor
== COL_AUTO
)
109 sal_Bool bIsDark
= sal_False
;
110 ::com::sun::star::uno::Any aAny
;
111 if ( PropValue::GetPropertyValue( aAny
, rPagePropSet
, OUString( "IsBackgroundDark" ), sal_True
) )
113 nFontColor
= bIsDark
? 0xffffff : 0x000000;
115 nFontColor
&= 0xffffff;
116 nFontColor
|= 0xfe000000;
119 rSt
<< rLev
.mnFontHeight
124 rSt
<< rLev
.mnAsianOrComplexFont
125 << (sal_uInt16
)0xffff // unknown
126 << (sal_uInt16
)0xffff // unknown
129 << rLev
.mnEscapement
;
133 PPTExParaSheet::PPTExParaSheet( int nInstance
, sal_uInt16 nDefaultTab
, PPTExBulletProvider
& rProv
) :
135 mnInstance ( nInstance
)
137 sal_Bool bHasBullet
= sal_False
;
139 sal_uInt16 nUpperDist
= 0;
140 sal_uInt16 nBulletChar
= 0x2022;
141 sal_uInt16 nBulletOfs
= 0;
142 sal_uInt16 nTextOfs
= 0;
144 for ( int nDepth
= 0; nDepth
< 5; nDepth
++ )
146 PPTExParaLevel
& rLev
= maParaLevel
[ nDepth
];
149 case EPP_TEXTTYPE_Title
:
150 case EPP_TEXTTYPE_CenterTitle
:
152 case EPP_TEXTTYPE_Body
:
153 case EPP_TEXTTYPE_CenterBody
:
154 case EPP_TEXTTYPE_HalfBody
:
155 case EPP_TEXTTYPE_QuarterBody
:
157 bHasBullet
= sal_True
;
161 case EPP_TEXTTYPE_Notes
:
170 nBulletChar
= 0x2022;
172 nTextOfs
= ( bHasBullet
) ? 0xd8 : 0;
177 nBulletChar
= 0x2013;
184 nBulletChar
= 0x2022;
191 nBulletChar
= 0x2013;
204 rLev
.mbIsBullet
= bHasBullet
;
205 rLev
.mnBulletChar
= nBulletChar
;
206 rLev
.mnBulletFont
= 0;
207 rLev
.mnBulletHeight
= 100;
208 rLev
.mnBulletColor
= 0;
210 rLev
.mnLineFeed
= 100;
211 rLev
.mnLowerDist
= 0;
212 rLev
.mnUpperDist
= nUpperDist
;
213 rLev
.mnTextOfs
= nTextOfs
;
214 rLev
.mnBulletOfs
= nBulletOfs
;
215 rLev
.mnDefaultTab
= nDefaultTab
;
216 rLev
.mnAsianSettings
= 2;
219 rLev
.mbExtendedBulletsUsed
= sal_False
;
220 rLev
.mnBulletId
= 0xffff;
221 rLev
.mnBulletStart
= 0;
222 rLev
.mnMappedNumType
= 0;
223 rLev
.mnNumberingType
= 0;
227 void PPTExParaSheet::SetStyleSheet( const ::com::sun::star::uno::Reference
< ::com::sun::star::beans::XPropertySet
> & rXPropSet
,
228 FontCollection
& rFontCollection
, int nLevel
, const PPTExCharLevel
& rCharLevel
)
230 ParagraphObj
aParagraphObj( rXPropSet
, rBuProv
);
231 aParagraphObj
.CalculateGraphicBulletSize( rCharLevel
.mnFontHeight
);
232 PPTExParaLevel
& rLev
= maParaLevel
[ nLevel
];
234 if ( aParagraphObj
.meTextAdjust
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
235 rLev
.mnAdjust
= aParagraphObj
.mnTextAdjust
;
236 if ( aParagraphObj
.meLineSpacing
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
238 sal_Int16 nLineSpacing
= aParagraphObj
.mnLineSpacing
;
239 if ( nLineSpacing
> 0 ) // if nLinespacing is < 0 the linespacing is an absolute spacing
241 sal_Bool bFixedLineSpacing
= sal_False
;
242 uno::Any aAny
= rXPropSet
->getPropertyValue( OUString( "FontIndependentLineSpacing" ) );
243 if( !(aAny
>>= bFixedLineSpacing
) || !bFixedLineSpacing
)
245 const FontCollectionEntry
* pDesc
= rFontCollection
.GetById( rCharLevel
.mnFont
);
247 nLineSpacing
= (sal_Int16
)( (double)nLineSpacing
* pDesc
->Scaling
+ 0.5 );
252 if ( rCharLevel
.mnFontHeight
> (sal_uInt16
)( ((double)-nLineSpacing
) * 0.001 * 72.0 / 2.54 ) ) // 1/100mm to point
254 const FontCollectionEntry
* pDesc
= rFontCollection
.GetById( rCharLevel
.mnFont
);
256 nLineSpacing
= (sal_Int16
)( (double)100.0 * pDesc
->Scaling
+ 0.5 );
261 nLineSpacing
= (sal_Int16
)( (double)nLineSpacing
/ 4.40972 );
263 rLev
.mnLineFeed
= nLineSpacing
;
265 if ( aParagraphObj
.meLineSpacingBottom
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
266 rLev
.mnLowerDist
= aParagraphObj
.mnLineSpacingBottom
;
267 if ( aParagraphObj
.meLineSpacingTop
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
268 rLev
.mnUpperDist
= aParagraphObj
.mnLineSpacingTop
;
269 if ( aParagraphObj
.meForbiddenRules
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
271 rLev
.mnAsianSettings
&=~1;
272 if ( aParagraphObj
.mbForbiddenRules
)
273 rLev
.mnAsianSettings
|= 1;
275 if ( aParagraphObj
.meParagraphPunctation
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
277 rLev
.mnAsianSettings
&=~4;
278 if ( aParagraphObj
.mbParagraphPunctation
)
279 rLev
.mnAsianSettings
|= 4;
282 if ( aParagraphObj
.meBiDi
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
283 rLev
.mnBiDi
= aParagraphObj
.mnBiDi
;
285 rLev
.mbIsBullet
= aParagraphObj
.mbIsBullet
; //( ( aParagraphObj.nBulletFlags & 1 ) != 0 );
289 if (aParagraphObj
.bExtendedParameters
&&
290 aParagraphObj
.meBullet
== ::com::sun::star::beans::PropertyState_DIRECT_VALUE
)
292 for ( sal_Int16 i
= 0; i
< 5; i
++ )
294 PPTExParaLevel
& rLevel
= maParaLevel
[ i
];
296 aParagraphObj
.ImplGetNumberingLevel( rBuProv
, i
, sal_False
);
297 rLevel
.mnTextOfs
= aParagraphObj
.nTextOfs
;
298 rLevel
.mnBulletOfs
= (sal_uInt16
)aParagraphObj
.nBulletOfs
;
299 rLevel
.mnBulletChar
= aParagraphObj
.cBulletId
;
300 FontCollectionEntry
aFontDescEntry( aParagraphObj
.aFontDesc
.Name
, aParagraphObj
.aFontDesc
.Family
,
301 aParagraphObj
.aFontDesc
.Pitch
, aParagraphObj
.aFontDesc
.CharSet
);
302 rLevel
.mnBulletFont
= (sal_uInt16
)rFontCollection
.GetId( aFontDescEntry
);
303 rLevel
.mnBulletHeight
= aParagraphObj
.nBulletRealSize
;
304 rLevel
.mnBulletColor
= aParagraphObj
.nBulletColor
;
306 rLevel
.mbExtendedBulletsUsed
= aParagraphObj
.bExtendedBulletsUsed
;
307 rLevel
.mnBulletId
= aParagraphObj
.nBulletId
;
308 rLevel
.mnNumberingType
= aParagraphObj
.nNumberingType
;
309 rLevel
.mnBulletStart
= aParagraphObj
.nStartWith
;
310 rLevel
.mnMappedNumType
= aParagraphObj
.nMappedNumType
;
316 void PPTExParaSheet::Write( SvStream
& rSt
, PptEscherEx
*, sal_uInt16 nLev
, sal_Bool
, sal_Bool bSimpleText
,
317 const ::com::sun::star::uno::Reference
< ::com::sun::star::beans::XPropertySet
> & rPagePropSet
)
319 const PPTExParaLevel
& rLev
= maParaLevel
[ nLev
];
321 if ( maParaLevel
[ 0 ].mbExtendedBulletsUsed
|| maParaLevel
[ 1 ].mbExtendedBulletsUsed
||
322 maParaLevel
[ 2 ].mbExtendedBulletsUsed
|| maParaLevel
[ 3 ].mbExtendedBulletsUsed
||
323 maParaLevel
[ 4 ].mbExtendedBulletsUsed
)
325 SvStream
& rOut
= rBuProv
.aBuExMasterStream
;
328 rOut
<< (sal_uInt32
)( ( EPP_PST_ExtendedParagraphMasterAtom
<< 16 ) | ( mnInstance
<< 4 ) )
329 << (sal_uInt32
)( 5 * 16 + 2 )
330 << (sal_uInt16
)5; // depth
332 sal_uInt16 nBulletId
= rLev
.mnBulletId
;
333 if ( rLev
.mnNumberingType
!= SVX_NUM_BITMAP
)
335 rOut
<< (sal_uInt32
)0x03800000
336 << (sal_uInt16
)nBulletId
337 << (sal_uInt32
)rLev
.mnMappedNumType
338 << (sal_uInt16
)rLev
.mnBulletStart
342 sal_uInt32 nParaFlags
= 0x3ffdff;
343 sal_uInt16 nBulletFlags
= ( rLev
.mbIsBullet
) ? 0xf : 0xe;
346 nParaFlags
&= 0x207fff;
348 nParaFlags
&= 0x7fff;
349 sal_uInt32 nBulletColor
= rLev
.mnBulletColor
;
350 if ( nBulletColor
== COL_AUTO
)
352 sal_Bool bIsDark
= sal_False
;
353 ::com::sun::star::uno::Any aAny
;
354 if ( PropValue::GetPropertyValue( aAny
, rPagePropSet
, OUString( "IsBackgroundDark" ), sal_True
) )
356 nBulletColor
= bIsDark
? 0xffffff : 0x000000;
358 nBulletColor
&= 0xffffff;
359 nBulletColor
|= 0xfe000000;
364 << rLev
.mnBulletHeight
373 if ( bSimpleText
|| nLev
)
375 if ( nParaFlags
& 0x200000 )
380 rSt
<< rLev
.mnDefaultTab
383 << rLev
.mnAsianSettings
389 PPTExStyleSheet::PPTExStyleSheet( sal_uInt16 nDefaultTab
, PPTExBulletProvider
& rBuProv
)
391 for ( int nInstance
= EPP_TEXTTYPE_Title
; nInstance
<= EPP_TEXTTYPE_QuarterBody
; nInstance
++ )
393 mpParaSheet
[ nInstance
] = ( nInstance
== EPP_TEXTTYPE_notUsed
) ? NULL
: new PPTExParaSheet( nInstance
, nDefaultTab
, rBuProv
);
394 mpCharSheet
[ nInstance
] = ( nInstance
== EPP_TEXTTYPE_notUsed
) ? NULL
: new PPTExCharSheet( nInstance
);
398 PPTExStyleSheet::~PPTExStyleSheet()
400 for ( int nInstance
= EPP_TEXTTYPE_Title
; nInstance
<= EPP_TEXTTYPE_QuarterBody
; nInstance
++ )
402 if ( nInstance
== EPP_TEXTTYPE_notUsed
)
405 delete mpParaSheet
[ nInstance
];
406 delete mpCharSheet
[ nInstance
];
410 void PPTExStyleSheet::SetStyleSheet( const ::com::sun::star::uno::Reference
< ::com::sun::star::beans::XPropertySet
> & rXPropSet
,
411 FontCollection
& rFontCollection
, int nInstance
, int nLevel
)
413 if ( nInstance
== EPP_TEXTTYPE_notUsed
)
415 mpCharSheet
[ nInstance
]->SetStyleSheet( rXPropSet
, rFontCollection
, nLevel
);
416 mpParaSheet
[ nInstance
]->SetStyleSheet( rXPropSet
, rFontCollection
, nLevel
, mpCharSheet
[ nInstance
]->maCharLevel
[ nLevel
] );
419 sal_Bool
PPTExStyleSheet::IsHardAttribute( sal_uInt32 nInstance
, sal_uInt32 nLevel
, PPTExTextAttr eAttr
, sal_uInt32 nValue
)
421 const PPTExParaLevel
& rPara
= mpParaSheet
[ nInstance
]->maParaLevel
[ nLevel
];
422 const PPTExCharLevel
& rChar
= mpCharSheet
[ nInstance
]->maCharLevel
[ nLevel
];
424 sal_uInt32 nFlag
= 0;
428 case ParaAttr_BulletOn
: return ( rPara
.mbIsBullet
) ? ( nValue
) ? sal_False
: sal_True
: ( nValue
) ? sal_True
: sal_False
;
429 case ParaAttr_BuHardFont
:
430 case ParaAttr_BulletFont
: return ( rPara
.mnBulletFont
!= nValue
);
431 case ParaAttr_BuHardColor
:
432 case ParaAttr_BulletColor
: return ( rPara
.mnBulletColor
!= nValue
);
433 case ParaAttr_BuHardHeight
:
434 case ParaAttr_BulletHeight
: return ( rPara
.mnBulletHeight
!= nValue
);
435 case ParaAttr_BulletChar
: return ( rPara
.mnBulletChar
!= nValue
);
436 case ParaAttr_Adjust
: return ( rPara
.mnAdjust
!= nValue
);
437 case ParaAttr_LineFeed
: return ( rPara
.mnLineFeed
!= nValue
);
438 case ParaAttr_UpperDist
: return ( rPara
.mnUpperDist
!= nValue
);
439 case ParaAttr_LowerDist
: return ( rPara
.mnLowerDist
!= nValue
);
440 case ParaAttr_TextOfs
: return ( rPara
.mnTextOfs
!= nValue
);
441 case ParaAttr_BulletOfs
: return ( rPara
.mnBulletOfs
!= nValue
);
442 case ParaAttr_DefaultTab
: return ( rPara
.mnDefaultTab
!= nValue
);
443 case ParaAttr_BiDi
: return ( rPara
.mnBiDi
!= nValue
);
444 case CharAttr_Bold
: nFlag
= 1; break;
445 case CharAttr_Italic
: nFlag
= 2; break;
446 case CharAttr_Underline
: nFlag
= 4; break;
447 case CharAttr_Shadow
: nFlag
= 16; break;
448 case CharAttr_Strikeout
: nFlag
= 256; break;
449 case CharAttr_Embossed
: nFlag
= 512; break;
450 case CharAttr_Font
: return ( rChar
.mnFont
!= nValue
);
451 case CharAttr_AsianOrComplexFont
: return ( rChar
.mnAsianOrComplexFont
!= nValue
);
452 case CharAttr_Symbol
: return sal_True
;
453 case CharAttr_FontHeight
: return ( rChar
.mnFontHeight
!= nValue
);
454 case CharAttr_FontColor
: return ( rChar
.mnFontColor
!= nValue
);
455 case CharAttr_Escapement
: return ( rChar
.mnEscapement
!= nValue
);
461 if ( rChar
.mnFlags
& nFlag
)
462 return ( ( nValue
& nFlag
) == 0 );
464 return ( ( nValue
& nFlag
) != 0 );
469 sal_uInt32
PPTExStyleSheet::SizeOfTxCFStyleAtom() const
474 // the TxCFStyleAtom stores the text properties that are used
475 // when creating new objects in PowerPoint.
477 void PPTExStyleSheet::WriteTxCFStyleAtom( SvStream
& rSt
)
479 const PPTExCharLevel
& rCharStyle
= mpCharSheet
[ EPP_TEXTTYPE_Other
]->maCharLevel
[ 0 ];
481 sal_uInt16 nFlags
= 0x60 // ??
485 sal_uInt32 nCharFlags
= rCharStyle
.mnFlags
;
486 nCharFlags
&= CharAttr_Italic
| CharAttr_Bold
| CharAttr_Underline
| CharAttr_Shadow
;
488 rSt
<< (sal_uInt32
)( EPP_TxCFStyleAtom
<< 16 ) // recordheader
489 << SizeOfTxCFStyleAtom() - 8
490 << (sal_uInt16
)( 0x80 | nCharFlags
)
491 << (sal_uInt16
)nFlags
492 << (sal_uInt16
)nCharFlags
493 << (sal_Int32
)-1 // ?
494 << rCharStyle
.mnFontHeight
495 << rCharStyle
.mnFontColor
;
498 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */