Coverage Report

Created: 2026-04-09 11:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libreoffice/oox/source/ppt/slidetransition.cxx
Line
Count
Source
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 <oox/ppt/slidetransition.hxx>
21
22
#include <com/sun/star/animations/TransitionType.hpp>
23
#include <com/sun/star/animations/TransitionSubType.hpp>
24
#include <com/sun/star/animations/XTransitionFilter.hpp>
25
26
#include <sal/log.hxx>
27
#include <tools/color.hxx>
28
#include <comphelper/diagnose_ex.hxx>
29
30
#include <oox/helper/propertymap.hxx>
31
#include <oox/token/namespaces.hxx>
32
#include <oox/token/properties.hxx>
33
#include <oox/token/tokens.hxx>
34
#include <oox/ppt/pptfilterhelpers.hxx>
35
36
using namespace ::com::sun::star::uno;
37
using namespace ::com::sun::star::animations;
38
using namespace ::com::sun::star::presentation;
39
40
namespace oox::ppt {
41
42
    SlideTransition::SlideTransition()
43
2.98k
        : mnTransitionType( 0 )
44
2.98k
        , mnTransitionSubType( 0 )
45
2.98k
        , mbTransitionDirectionNormal( true )
46
2.98k
        , mnAnimationSpeed( AnimationSpeed_FAST )
47
2.98k
        , mfTransitionDurationInSeconds( -1.0 )
48
2.98k
        , mbMode( true )
49
2.98k
        , mnAdvanceTime( -1 )
50
2.98k
        , mnTransitionFadeColor( 0 )
51
2.98k
    {
52
53
2.98k
    }
54
55
    SlideTransition::SlideTransition(std::u16string_view sFilterName)
56
53
        : mnTransitionType( 0 )
57
53
        , mnTransitionSubType( 0 )
58
53
        , mbTransitionDirectionNormal( true )
59
53
        , mnAnimationSpeed( AnimationSpeed_FAST )
60
53
        , mfTransitionDurationInSeconds( -1.0 )
61
53
        , mbMode( true )
62
53
        , mnAdvanceTime( -1 )
63
53
        , mnTransitionFadeColor( 0 )
64
53
    {
65
53
        const transition *p = transition::find( sFilterName );
66
53
        if( p )
67
53
        {
68
53
            mnTransitionType = p->mnType;
69
53
            mnTransitionSubType = p->mnSubType;
70
53
            mbTransitionDirectionNormal = p->mbDirection;
71
53
        }
72
53
    }
73
74
    void SlideTransition::setSlideProperties( PropertyMap & aProps )
75
864
    {
76
864
        try
77
864
        {
78
864
            aProps.setProperty( PROP_TransitionType, mnTransitionType);
79
864
            aProps.setProperty( PROP_TransitionSubtype, mnTransitionSubType);
80
864
            aProps.setProperty( PROP_TransitionDirection, mbTransitionDirectionNormal);
81
864
            aProps.setProperty( PROP_Speed, mnAnimationSpeed);
82
864
            if( mfTransitionDurationInSeconds >= 0.0 )
83
864
                aProps.setProperty( PROP_TransitionDuration, mfTransitionDurationInSeconds);
84
864
            aProps.setProperty( PROP_TransitionFadeColor, mnTransitionFadeColor);
85
864
            if( mnAdvanceTime != -1 ) {
86
0
                aProps.setProperty( PROP_Duration, mnAdvanceTime/1000);
87
0
                aProps.setProperty( PROP_Change, static_cast<sal_Int32>(1));
88
0
            }
89
864
        }
90
864
        catch( Exception& )
91
864
        {
92
            // should not happen
93
0
            TOOLS_WARN_EXCEPTION( "oox", "" );
94
0
        }
95
864
    }
96
97
    void SlideTransition::setTransitionFilterProperties( const Reference< XTransitionFilter > & xFilter )
98
53
    {
99
53
        try
100
53
        {
101
53
            xFilter->setTransition( mnTransitionType );
102
53
            xFilter->setSubtype( mnTransitionSubType );
103
53
            xFilter->setDirection( mbTransitionDirectionNormal );
104
53
            xFilter->setFadeColor( 0 );
105
53
            xFilter->setMode( mbMode );
106
53
        }
107
53
        catch( Exception& )
108
53
        {
109
            // should not happen
110
0
            TOOLS_WARN_EXCEPTION( "oox", "" );
111
0
        }
112
53
    }
113
114
    void SlideTransition::setOoxTransitionSpeed( sal_Int32 nToken)
115
887
    {
116
887
        switch( nToken  )
117
887
        {
118
            /* the speed values are located in the PPT97 importer
119
             * sd/source/filter/ppt/pptin.cxx:1783
120
             * (void ImplSdPPTImport::ImportPageEffect)
121
             */
122
778
        case XML_fast:
123
778
            mnAnimationSpeed = AnimationSpeed_FAST;
124
778
            mfTransitionDurationInSeconds = 0.5;
125
778
            break;
126
91
        case XML_med:
127
91
            mnAnimationSpeed = AnimationSpeed_MEDIUM;
128
91
            mfTransitionDurationInSeconds = 0.75;
129
91
            break;
130
18
        case XML_slow:
131
18
            mnAnimationSpeed = AnimationSpeed_SLOW;
132
18
            mfTransitionDurationInSeconds = 1.0;
133
18
            break;
134
0
        default:
135
            // should not happen. just ignore
136
0
            break;
137
887
        }
138
887
    }
139
140
    void SlideTransition::setOoxTransitionSpeed( double fDurationInSeconds )
141
41
    {
142
        // for compatibility
143
41
        mnAnimationSpeed = ( fDurationInSeconds <= 0.5 ) ? AnimationSpeed_FAST
144
41
                                : ( fDurationInSeconds >= 1.0 ) ? AnimationSpeed_SLOW : AnimationSpeed_MEDIUM;
145
41
        mfTransitionDurationInSeconds = fDurationInSeconds;
146
41
    }
147
148
    sal_Int16 SlideTransition::ooxToOdpEightDirections( ::sal_Int32 nOoxType )
149
0
    {
150
0
        sal_Int16 nOdpDirection;
151
0
        nOdpDirection = ooxToOdpBorderDirections( nOoxType );
152
0
        if( nOdpDirection == 0 )
153
0
        {
154
0
            nOdpDirection = ooxToOdpCornerDirections( nOoxType );
155
0
        }
156
0
        return nOdpDirection;
157
0
    }
158
159
    sal_Int16 SlideTransition::ooxToOdpBorderDirections( ::sal_Int32 nOoxType )
160
0
    {
161
0
        sal_Int16 nOdpDirection;
162
0
        switch( nOoxType )
163
0
        {
164
0
        case XML_d:
165
0
            nOdpDirection = TransitionSubType::FROMTOP;
166
0
            break;
167
0
        case XML_l:
168
0
            nOdpDirection = TransitionSubType::FROMLEFT;
169
0
            break;
170
0
        case XML_r:
171
0
            nOdpDirection = TransitionSubType::FROMRIGHT;
172
0
            break;
173
0
        case XML_u:
174
0
            nOdpDirection = TransitionSubType::FROMBOTTOM;
175
0
            break;
176
0
        default:
177
0
            nOdpDirection= 0;
178
0
            break;
179
0
        }
180
0
        return nOdpDirection;
181
0
    }
182
183
    sal_Int16 SlideTransition::ooxToOdpSideDirections( ::sal_Int32 nOoxType )
184
0
    {
185
0
        sal_Int16 nOdpDirection;
186
0
        switch( nOoxType )
187
0
        {
188
0
        case XML_d:
189
0
        case XML_u:
190
0
            nOdpDirection = TransitionSubType::TOPTOBOTTOM;
191
0
            break;
192
0
        case XML_l:
193
0
        case XML_r:
194
0
            nOdpDirection = TransitionSubType::LEFTTORIGHT;
195
0
            break;
196
0
        default:
197
0
            nOdpDirection= 0;
198
0
            break;
199
0
        }
200
0
        return nOdpDirection;
201
0
    }
202
203
    bool SlideTransition::ooxToOdpSideDirectionsDirectionNormal( ::sal_Int32 nOoxType )
204
0
    {
205
0
        bool bOdpDirection = true;
206
0
        switch( nOoxType )
207
0
        {
208
0
        case XML_u:
209
0
        case XML_l:
210
0
            bOdpDirection = false;
211
0
            break;
212
0
        }
213
0
        return bOdpDirection;
214
0
    }
215
216
    sal_Int16 SlideTransition::ooxToOdpCornerDirections( ::sal_Int32 nOoxType )
217
40
    {
218
40
        sal_Int16 nOdpDirection;
219
40
        switch( nOoxType )
220
40
        {
221
0
        case XML_lu:
222
0
            nOdpDirection = TransitionSubType::FROMBOTTOMRIGHT;
223
0
            break;
224
40
        case XML_ru:
225
40
            nOdpDirection = TransitionSubType::FROMBOTTOMLEFT;
226
40
            break;
227
0
        case XML_ld:
228
0
            nOdpDirection = TransitionSubType::FROMTOPRIGHT;
229
0
            break;
230
0
        case XML_rd:
231
0
            nOdpDirection = TransitionSubType::FROMTOPLEFT;
232
0
            break;
233
0
        default:
234
0
            nOdpDirection = 0;
235
0
            break;
236
40
        }
237
40
        return nOdpDirection;
238
40
    }
239
240
    sal_Int16 SlideTransition::ooxToOdpDirection( ::sal_Int32 nOoxType )
241
0
    {
242
0
        sal_Int16 nOdpDir;
243
0
        switch( nOoxType )
244
0
        {
245
0
        case XML_vert:
246
0
            nOdpDir = TransitionSubType::VERTICAL;
247
0
            break;
248
0
        case XML_horz:
249
0
            nOdpDir = TransitionSubType::HORIZONTAL;
250
0
            break;
251
0
        default:
252
0
            nOdpDir = 0;
253
0
            break;
254
0
        }
255
0
        return nOdpDir;
256
0
    }
257
258
    void SlideTransition::setOoxTransitionType( ::sal_Int32 OoxType, ::sal_Int32 param1, ::sal_Int32 param2 )
259
846
    {
260
846
        switch( OoxType )
261
846
        {
262
0
        case PPT_TOKEN( blinds ):
263
0
            mnTransitionType = TransitionType::BLINDSWIPE;
264
0
            mnTransitionSubType = ooxToOdpDirection( param1 );
265
0
            break;
266
5
        case PPT_TOKEN( checker ):
267
5
            mnTransitionType = TransitionType::CHECKERBOARDWIPE;
268
5
            switch ( param1 )
269
5
            {
270
5
            case XML_vert:
271
5
                mnTransitionSubType = TransitionSubType::DOWN;
272
5
                break;
273
0
            case XML_horz:
274
0
                mnTransitionSubType = TransitionSubType::ACROSS;
275
0
                break;
276
0
            default:
277
0
                break;
278
5
            }
279
5
            break;
280
5
        case PPT_TOKEN( comb ):
281
0
            mnTransitionType = TransitionType::PUSHWIPE;
282
0
            switch( param1 )
283
0
            {
284
0
            case XML_vert:
285
0
                mnTransitionSubType = TransitionSubType::COMBVERTICAL;
286
0
                break;
287
0
            case XML_horz:
288
0
                mnTransitionSubType = TransitionSubType::COMBHORIZONTAL;
289
0
                break;
290
0
            default:
291
0
                break;
292
0
            }
293
0
            break;
294
0
        case PPT_TOKEN( cover ):
295
0
            mnTransitionType = TransitionType::SLIDEWIPE;
296
0
            mnTransitionSubType = ooxToOdpEightDirections( param1 );
297
0
            break;
298
0
        case PPT_TOKEN( pull ): // uncover
299
0
            mnTransitionType = TransitionType::SLIDEWIPE;
300
0
            mnTransitionSubType = ooxToOdpEightDirections( param1 );
301
0
            mbTransitionDirectionNormal = false;
302
0
            break;
303
0
        case PPT_TOKEN( cut ):
304
0
            if( param1 )
305
0
            {
306
0
                mnTransitionType = TransitionType::BARWIPE;
307
0
                mnTransitionSubType = TransitionSubType::FADEOVERCOLOR;
308
0
            }
309
0
            SAL_WARN("oox.ppt", "OOX: cut transition fallback." );
310
0
            break;
311
36
        case PPT_TOKEN( fade ):
312
36
            mnTransitionType = TransitionType::FADE;
313
36
            if( param1 )
314
0
            {
315
0
                mnTransitionSubType = TransitionSubType::FADEOVERCOLOR;
316
0
            }
317
36
            else
318
36
            {
319
36
                mnTransitionSubType = TransitionSubType::CROSSFADE;
320
36
            }
321
36
            break;
322
0
        case PPT_TOKEN( push ):
323
0
            mnTransitionType = TransitionType::PUSHWIPE;
324
0
            mnTransitionSubType = ooxToOdpBorderDirections( param1 );
325
0
            break;
326
0
        case PPT_TOKEN( wipe ):
327
0
            mnTransitionType = TransitionType::BARWIPE;
328
0
            mnTransitionSubType = ooxToOdpSideDirections( param1 );
329
0
            mbTransitionDirectionNormal = ooxToOdpSideDirectionsDirectionNormal( param1 );
330
0
            break;
331
0
        case PPT_TOKEN( split ):
332
0
            mnTransitionType = TransitionType::BARNDOORWIPE;
333
0
            mnTransitionSubType = ooxToOdpDirection( param1 );
334
0
            if( param2 == XML_in )
335
0
            {
336
                // reverse
337
0
                mbTransitionDirectionNormal = false;
338
0
            }
339
0
            break;
340
0
        case PPT_TOKEN( wheel ):
341
0
            mnTransitionType = TransitionType::PINWHEELWIPE;
342
0
            switch( param1 )
343
0
            {
344
0
            case 1:
345
0
                mnTransitionSubType = TransitionSubType::ONEBLADE;
346
0
                break;
347
0
            case 2:
348
0
                mnTransitionSubType = TransitionSubType::TWOBLADEVERTICAL;
349
0
                break;
350
0
            case 3:
351
0
                mnTransitionSubType = TransitionSubType::THREEBLADE;
352
0
                break;
353
0
            case 4:
354
0
                mnTransitionSubType = TransitionSubType::FOURBLADE;
355
0
                break;
356
0
            case 8:
357
0
                mnTransitionSubType = TransitionSubType::EIGHTBLADE;
358
0
                break;
359
0
            default:
360
0
                SAL_INFO(
361
0
                    "oox.ppt",
362
0
                    "strange number of blades for the wheel-wipe " << param1);
363
0
                if( param1 > 8 )
364
0
                {
365
0
                    mnTransitionSubType = TransitionSubType::EIGHTBLADE;
366
0
                }
367
0
                else if( param1 > 4 )
368
0
                {
369
0
                    mnTransitionSubType = TransitionSubType::FOURBLADE;
370
0
                }
371
0
                else if( param1 == 0)
372
0
                {
373
0
                    mnTransitionSubType = TransitionSubType::ONEBLADE;
374
0
                }
375
0
                break;
376
0
            }
377
0
            break;
378
0
        case PPT_TOKEN( randomBar ):
379
0
            mnTransitionType = TransitionType::RANDOMBARWIPE;
380
0
            mnTransitionSubType = ooxToOdpDirection( param1 );
381
0
            break;
382
0
        case PPT_TOKEN( circle ):
383
0
            mnTransitionType = TransitionType::ELLIPSEWIPE;
384
0
            mnTransitionSubType = TransitionSubType::CIRCLE;
385
0
            break;
386
0
        case PPT_TOKEN( diamond ):
387
0
            mnTransitionType = TransitionType::IRISWIPE;
388
0
            mnTransitionSubType = TransitionSubType::DIAMOND;
389
0
            break;
390
765
        case PPT_TOKEN( dissolve ):
391
765
            mnTransitionType = TransitionType::DISSOLVE;
392
765
            mnTransitionSubType = TransitionSubType::DEFAULT;
393
765
            break;
394
0
        case PPT_TOKEN( newsflash ):
395
0
            mnTransitionType = TransitionType::ZOOM;
396
0
            mnTransitionSubType = TransitionSubType::ROTATEIN;
397
0
            break;
398
0
        case PPT_TOKEN( plus ):
399
0
            mnTransitionType = TransitionType::FOURBOXWIPE;
400
0
            mnTransitionSubType = TransitionSubType::CORNERSOUT;
401
0
            break;
402
0
        case PPT_TOKEN( random ):
403
0
            mnTransitionType = TransitionType::RANDOM;
404
0
            mnTransitionSubType = TransitionSubType::DEFAULT;
405
0
            break;
406
0
        case PPT_TOKEN( wedge ):
407
0
            mnTransitionType = TransitionType::FANWIPE;
408
0
            mnTransitionSubType = TransitionSubType::CENTERTOP;
409
0
            break;
410
0
        case PPT_TOKEN( zoom ):
411
0
            mnTransitionType = TransitionType::ZOOM;
412
0
            mnTransitionSubType = TransitionSubType::DEFAULT;
413
0
            break;
414
0
        case P14_TOKEN(prism):
415
0
            mnTransitionType = TransitionType::MISCSHAPEWIPE;
416
0
            if (param1)
417
0
                mnTransitionSubType = TransitionSubType::CORNERSIN;
418
0
            else
419
0
                mnTransitionSubType = TransitionSubType::CORNERSOUT;
420
0
            break;
421
0
        case P14_TOKEN(vortex):
422
0
            mnTransitionType = TransitionType::MISCSHAPEWIPE;
423
0
            mnTransitionSubType = TransitionSubType::VERTICAL;
424
0
            break;
425
0
        case P14_TOKEN(ripple):
426
0
            mnTransitionType = TransitionType::MISCSHAPEWIPE;
427
0
            mnTransitionSubType = TransitionSubType::HORIZONTAL;
428
0
            break;
429
0
        case P14_TOKEN(glitter):
430
0
            mnTransitionType = TransitionType::MISCSHAPEWIPE;
431
0
            mnTransitionSubType = TransitionSubType::DIAMOND;
432
0
            break;
433
0
        case P14_TOKEN(honeycomb):
434
0
            mnTransitionType = TransitionType::MISCSHAPEWIPE;
435
0
            mnTransitionSubType = TransitionSubType::HEART;
436
0
            break;
437
0
        case P14_TOKEN(flash):
438
0
            mnTransitionType = TransitionType::FADE;
439
0
            mnTransitionSubType = TransitionSubType::FADEOVERCOLOR;
440
0
            mnTransitionFadeColor = static_cast<sal_Int32>(COL_WHITE);
441
0
            break;
442
40
        case PPT_TOKEN(strips):
443
40
            mnTransitionType = TransitionType::SLIDEWIPE;
444
40
            mnTransitionSubType = ooxToOdpCornerDirections( param1 );
445
40
            break;
446
0
        default:
447
0
            mnTransitionType = 0;
448
0
            break;
449
846
        }
450
846
    }
451
452
    void SlideTransition::setPresetTransition(std::u16string_view sPresetTransition)
453
0
    {
454
0
        if (sPresetTransition == u"fallOver")
455
0
        {
456
0
            mnTransitionType = TransitionType::MISCSHAPEWIPE;
457
0
            mnTransitionSubType = TransitionSubType::LEFTTORIGHT;
458
0
        }
459
0
        else
460
0
        {
461
0
            mnTransitionType = 0;
462
0
        }
463
0
    }
464
465
}
466
467
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */