(* ImageEn Build 7.0.0.06.2637 @ 7-4-17 14:58:42.679 *) (* Copyright (c) 1998-2017 by Carlotta Calandra. All rights reserved. Copyright (c) 2011-2017 by Xequte Software. This software comes without express or implied warranty. In no case shall the author be liable for any damage or unwanted behavior of any computer hardware and/or software. Author grants you the right to include the component in your application, whether COMMERCIAL, SHAREWARE, or FREEWARE. ImageEn, IEvolution and ImageEn ActiveX may not be included in any commercial, shareware or freeware libraries or components. www.ImageEn.com *) {------------------------------------------------------------------------------} { } { Some transitions based on TCustomPicShow v4.10 (PSEffect.pas) by: } { } { Kambiz R. Khojasteh } { kambiz@delphiarea.com } { http://www.delphiarea.com } { } {------------------------------------------------------------------------------} (* File version 1014 *) {$I ie.inc} {$R-} unit iexTransitions; interface uses Windows, Messages, SysUtils, Classes, Graphics, ExtCtrls, hyiedefs, Controls; type {!! TIETransitionType Declaration } TIETransitionType = (iettNone, iettCrossDissolve, // Cross Fade iettFadeOut, // Fade Out iettFadeIn, // Fade In iettFadeOutIn, // Fade Out then In iettLeftRight1, // Wipe Left to Right iettLeftRight2, // Wipe Left to Right 2 iettRightLeft1, // Wipe Right to Left iettRightLeft2, // Wipe Right to Left 2 iettUpDown1, // Wipe Top to Bottom iettUpDown2, // Wipe Top to Bottom 2 iettDownUp1, // Wipe Bottom to Top iettDownUp2, // Wipe Bottom to Top 2 iettFromUpLeft, // Slide from Top Left iettFromUpRight, // Slide from Top Right iettFromBottomLeft, // Slide from Bottom Left iettFromBottomRight, // Slide from Bottom Right iettMoveLeftRight1, // Push Left to Right iettMoveLeftRight2, // Slide Out Left to Right iettMoveRightLeft1, // Push Right to Left iettMoveRightLeft2, // Slide Out Right to Left iettMoveUpDown1, // Push Top to Bottom iettMoveUpDown2, // Slide Out Top to Bottom iettMoveDownUp1, // Push Bottom to Top iettMoveDownUp2, // Slide Out Bottom to Top iettRandomPoints, // Random Points iettRandomBoxes, // Random Boxes iettCenter1, // Wipe Out from Center iettCenter2, // Wipe In to Center iettCenterZoom1, // Expand Out from Center iettCenterZoom2 // Expand In to Center {$ifdef IEINCLUDEEXTRATRANSITIONS} ,iettExpandFromLeft, // Expand from Left iettExpandFromRight, // Expand from Right iettExpandFromTop, // Expand from Top iettExpandFromBottom, // Expand from Bottom iettExpandFromTopLeft, // Expand from Top Left iettExpandFromTopRight, // Expand from Top Right iettExpandFromBottomLeft, // Expand from Bottom Left iettExpandFromBottomRight, // Expand from Bottom Right iettExpandInFromLeft, // Expand in from Left iettExpandInFromRight, // Expand in from Right iettExpandInFromTop, // Expand in from Top iettExpandInFromBottom, // Expand in from Bottom iettExpandInToVerticalCenter, // Expand in to Vertical Center iettExpandInToHorizon, // Expand in to Horizon iettExpandInFromSides, // Expand in from Sides iettExpandInFromTopAndBottom, // Expand in from Top and Bottom iettExpandOutFromHorizon, // Expand out from Horizon iettExpandOutFromVerticalCenter, // Expand out from Vertical Center iettWipeFromTopLeft, // Wipe from Top Left iettWipeFromTopRight, // Wipe from Top Right iettWipeFromBottomLeft, // Wipe from Bottom Left iettWipeFromBottomRight, // Wipe from Bottom Right iettWipeInFromTopAndBottom, // Wipe in from Top and Bottom iettWipeFromHorizon, // Wipe from Horizon iettWipeInFromSides, // Wipe in from Sides iettWipeOutFromVerticalCenter, // Wipe out from Vertical Center iettBuildUpFromLeft, // Build up from Left iettBuildUpFromRight, // Build up from Right iettBuildUpFromTop, // Build up from Top iettBuildUpFromBottom, // Build up from Bottom iettUnrollFromLeft, // Unroll from Left iettUnrollFromRight, // Unroll from Right iettUnrollFromTop, // Unroll from Top iettUnrollFromBottom, // Unroll from Bottom iettSlideInFromLeft, // Slide in from Left iettSlideInFromRight, // Slide in from Right iettSlideInFromTop, // Slide in from Top iettSlideInFromBottom, // Slide in from Bottom iettShrinkToTopLeft, // Shrink to Top Left iettShrinkToTopRight, // Shrink to Top Right iettShrinkToBottomLeft, // Shrink to Bottom Left iettShrinkToBottomRight, // Shrink to Bottom Right iettShrinkToCenter, // Shrink to Center iettQuartersWipeInToCenter, // Quarters Wipe in to Center iettQuartersExpandToCenter, // Quarters Expand to Center iettQuartersSlideInToCenter, // Quarters Slide in to Center iettCurvedWipeFromLeft, // Curved Wipe from Left iettCurvedWipeFromRight, // Curved Wipe from Right iettCurvedWipeFromTop, // Curved Wipe from Top iettCurvedWipeFromBottom, // Curved Wipe from Bottom iettCurvedWipeFromTopLeft, // Curved Wipe from Top Left iettCurvedWipeFromTopRight, // Curved Wipe from Top Right iettCurvedWipeFromBottomLeft, // Curved Wipe from Bottom Left iettCurvedWipeFromBottomRight, // Curved Wipe from Bottom Right iettBarsInFromLeft, // Bars in from Left iettBarsInFromRight, // Bars in from Right iettBarsFromTop, // Bars from Top iettBarsFromBottom, // Bars from Bottom iettBarsLeftThenRight, // Bars Left then Right iettBarsRightThenLeft, // Bars Right then Left iettBarsTopThenBottom, // Bars Top then Bottom iettBarsBottomThenTop, // Bars Bottom then Top iettBarsFromBothSides, // Bars from both Sides iettBarsFromTopAndBottom, // Bars from Top and Bottom iettShreddedFromLeft, // Shredded from Left iettShreddedFromRight, // Shredded from Right iettShreddedFromTop, // Shredded from Top iettShreddedFromBottom, // Shredded from Bottom iettShreddedFromTopAndLeft, // Shredded from Top and Left iettShreddedFromTopAndRight, // Shredded from Top and Right iettShreddedFromBottomAndLeft, // Shredded from Bottom and Left iettShreddedFromBottomAndRight, // Shredded from Bottom and Right iettShreddedFromHorizonAndLeft, // Shredded from Horizon and Left iettShreddedFromHorizonAndRight, // Shredded from Horizon and Right iettShreddedFromTopAndVerticalCenter, // Shredded from Top and Vertical Center iettShreddedFromBottomAndVerticalCenter, // Shredded from Bottom and Vertical Center iettShreddedFromCenter, // Shredded from Center iettShreddedToCenter, // Shredded to Center iettShreddedInToHorizon, // Shredded in to Horizon iettShreddedInToVerticalCenter, // Shredded in to Vertical Center iettShreddedOutFromHorizon, // Shredded out from Horizon iettShreddedOutFromVerticalCenter, // Shredded out from Vertical Center iettExpandingRectangles, // Expanding Rectangles iettExpandingTriangles, // Expanding Triangles iettExpandingCircles, // Expanding Circles iettExpandingDiamonds, // Expanding Diamonds iettCircularWipeFromCenter, // Circular Wipe from Center iettCircularWipeToCenter, // Circular Wipe to Center iettCrisscrossWipeFromTopLeft, // Crisscross Wipe from Top Left iettCrisscrossWipeFromTopRight, // Crisscross Wipe from Top Right iettCrisscrossWipeFromBottomLeft, // Crisscross Wipe from Bottom Left iettCrisscrossWipeFromBottomRight, // Crisscross Wipe from Bottom Right iettCrisscrossWipeBounceFromTopLeft, // Crisscross Wipe Bounce from Top Left iettCrisscrossWipeBounceFromTopRight, // Crisscross Wipe Bounce from Top Right iettCrisscrossWipeBounceFromBottomLeft, // Crisscross Wipe Bounce from Bottom Left iettCrisscrossWipeBounceFromBottomRight, // Crisscross Wipe Bounce from Bottom Right iettCrisscrossWipeFromLeftRightAndTop, // Crisscross Wipe from Left Right and Top iettCrisscrossWipeFromLeftRightAndBottom, // Crisscross Wipe from Left Right and Bottom iettCrisscrossWipeFromLeftTopAndBottom, // Crisscross Wipe from Left Top and Bottom iettCrisscrossWipeFromTopLeftRightAndBottom,// Crisscross Wipe from Top Left Right and Bottom iettCrisscrossWipeFromRightTopAndBottom, // Crisscross Wipe from Right Top and Bottom iettCrisscrossWipeFromBottomLeftTopRight, // Crisscross Wipe from Bottom Left Top Right iettWipeDiagonalFromTopLeft, // Wipe diagonal from Top Left iettWipeDiagonalFromTopRight, // Wipe diagonal from Top Right iettWipeDiagonalFromBottomLeft, // Wipe diagonal from Bottom Left iettWipeDiagonalFromBottomRight, // Wipe diagonal from Bottom Right iettDiagonalSweepClockwise, // Diagonal Sweep Clockwise iettDiagonalSweepCounterClockwise, // Diagonal Sweep Counter-Clockwise iettSweepClockwise, // Half Sweep Clockwise iettSweepCounterClockwise, // Half Sweep Counter-Clockwise iettStarburstClockwiseFromCenter, // Starburst Clockwise from Center iettStarburstCounterClockwiseFromCenter, // Starburst Clockwise from Center iettRotationalRectangle, // Rotational Rectangle - Clockwise iettRotationalRectangleCounterClockwise, // Rotational Rectangle - Counter Clockwise iettRotationalStar, // Rotational Star - Clockwise iettRotationalStarCounterClockwise, // Rotational Star - Counter Clockwise iettSpeckledWipeFromLeft, // Speckled Wipe from Left iettSpeckledWipeFromRight, // Speckled Wipe from Right iettSpeckledWipeFromTop, // Speckled Wipe from Top iettSpeckledWipeFromBottom, // Speckled Wipe from Bottom iettPushLeftAndSlideOut, // Push Left and Slide out iettPushRightAndSlideOut, // Push Right and Slide out iettPushUpAndSlideOut, // Push up and Slide out iettPushDownAndSlideOut, // Push down and Slide out iettPushAndSqueezeLeft, // Push and Squeeze Left iettPushAndSqueezeRight, // Push and Squeeze Right iettPushAndSqueezeUp, // Push and Squeeze up iettPushAndSqueezeDown, // Push and Squeeze down iettHorizontalBlinds, // Horizontal Blinds iettVerticalBlinds, // Vertical Blinds iettUnevenBlindsFromLeft, // Uneven Blinds from Left iettUnevenBlindsFromRight, // Uneven Blinds from Right iettUnevenBlindsFromTop, // Uneven Blinds from Top iettUnevenBlindsFromBottom, // Uneven Blinds from Bottom iettRectanglesFromTheLeft, // Random Bars from the Left iettRectanglesFromTheRight, // Random Bars from the Right iettRectanglesFromTheTop, // Random Bars from the Top iettRectanglesFromTheBottom, // Random Bars from the Bottom iettSpirallingRectangleClockwise, // Spiralling Rectangle Clockwise iettSpirallingRectangleCounterClockwise, // Spiralling Rectangle Counter-Clockwise iettArrowWipeFromLeft, // Arrow Wipe from Left iettArrowWipeFromRight, // Arrow Wipe from Right iettArrowWipeFromTop, // Arrow Wipe from Top iettArrowWipeFromBottom, // Arrow Wipe from Bottom iettHorizontalBowTieWipe, // Horizontal Bow Tie Wipe iettVerticalBowTieWipe, // Vertical Bow Tie Wipe iettDiagonalCrossFromCenter, // Diagonal Cross from Center iettDiagonalCrossToCenter, // Diagonal Cross to Center iettZigzagWipeFromHorizon, // Zigzag Wipe from Horizon iettZigzagWipeFromVerticalCenter, // Zigzag Wipe from Vertical Center iettDiamondWipeFromCenter, // Diamond Wipe from Center iettDiamondWipeToCenter, // Diamond Wipe to Center iettDiagonalBoxWipe, // Diagonal Box Wipe iettTriangularWipe, // Rotational Triangular Wipe iettRandomBigBoxes, // Random Big Boxes iettPageFlip, // Page Flip iettPageFlip2, // Page Flip 2 iettReversePageFlip, // Page Flip iettReversePageFlip2, // Page Flip 2 iettZigzagWipeToHorizon, // Zigzag Wipe To Horizon iettZigzagWipeToVerticalCenter, // Zigzag Wipe To Vertical Center iettRandomHearts, // Random Hearts iettRandomStar5s, // Random 5 Pointed Stars iettRandomStar6s, // Random 6 Pointed Stars iettRandomExplosions, // Random Explosions iettExpandingHearts, // Expanding Hearts iettExpandingStar5, // Expanding 5 Pointed Stars iettExpandingStar6, // Expanding 6 Pointed Stars iettExpandingExplosions, // Expanding Explosions iettExpandingLightningBolts, // Expanding Lightning Bolts iettHeartWipeOut, // Heart Wipe from Center iettHeartWipeIn, // Heart Wipe to Center iettStar5WipeOut, // 5 Pointed Star Wipe from Center iettStar5WipeIn, // 5 Pointed Star Wipe to Center iettStar6WipeOut, // 6 Pointed Star Wipe from Center iettStar6WipeIn, // 6 Pointed Star Wipe to Center iettExplosionWipeOut, // Explosion Wipe from Center iettExplosionWipeIn, // Explosion Wipe to Center iettCrossWipeOut, // Cross Wipe from Center iettCrossWipeIn, // Cross Wipe to Center iettHeartWipeInAndOut, // Heart Wipe In and Out iettStar5WipeInAndOut, // 5 Pointed Star Wipe In and Out iettStar6WipeInAndOut, // 6 Pointed Star Wipe In and Out iettExplosionWipeInAndOut, // Explosion Wipe In and Out iettCubeRotateFromLeft, // Cube Rotate from Left iettCubeRotateFromRight, // Cube Rotate from Right iettCubeRotateFromTop, // Cube Rotate from Top iettCubeRotateFromBottom, // Cube Rotate from Bottom iettSoftWipeFromLeft, // Soft Wipe from Left iettSoftWipeFromRight, // Soft Wipe from Right iettSoftWipeFromTop, // Soft Wipe from Top iettSoftWipeFromBottom, // Soft Wipe from Bottom iettAngledTwistIn, // Twist In iettAngledTwistOut, // Twist Out iettMultipleAngledTwistIn, // Multiple Twist In iettMultipleAngledTwistOut, // Multiple Twist Out iettRandomPuzzlePieces, // Random Puzzle Pieces iettPacmanFromLeft , // Pacman Devours from Left iettPacmanFromRight , // Pacman Devours from Right iettPacman3Row , // Pacman Devours Three Rows iettPacman4Row , // Pacman Devours Four Rows iettPacman2SimRow , // Two Simultaneous Rows of Pacman iettPacman4SimRow , // Four Simultaneous Rows of Pacman iettPacman6SimRow , // Six Simultaneous Rows of Pacman iettFullSweepClockwise, // Full Sweep Clockwise iettExpandingSweepClockwise, // Expanding Sweep Clockwise iettCubeRotateFromLeft2, // 3D Cube Rotate from Left iettCubeRotateFromRight2, // 3D Cube Rotate from Right iettCubeRotateFromTop2, // 3D Cube Rotate from Top iettCubeRotateFromBottom2, // 3D Cube Rotate from Bottom iettRandomBoxesWithWord, // Random Boxes with Word iettRandomWord, // Random Letters of Word iettExpandingWord, // Expanding Letters of Word iettWordWipeOut, // Word Wipe from Center iettWordWipeIn, // Word Wipe to Center iettWordWipeInAndOut, // Word Wipe In and Out iettWordHalfSweep, // Half Sweep with Word iettWordFullSweep, // Full Sweep with Word iettWordFullExpandingSweep // Expanding Sweep with Word {$endif} ,iettPanZoom // Pan Zoom/Effects ); {//} const // All transitions that can display a word, using the global setting, IEGlobalSettings().WordTransitionParams Transitions_Supporting_Word = [ {$ifdef IEINCLUDEEXTRATRANSITIONS} iettRandomBoxesWithWord, iettRandomWord, iettExpandingWord, iettWordWipeOut, iettWordWipeIn, iettWordWipeInAndOut, iettWordHalfSweep, iettWordFullSweep, iettWordFullExpandingSweep {$endif} ]; // All transitions for which the global setting, IEGlobalSettings().TransitionsDrawAlternative, will modify the transition Transitions_Supporting_TransitionsDrawAlternative = [ iettLeftRight2 , iettRightLeft2 , iettUpDown2 , iettDownUp2 , iettRandomPoints , iettRandomBoxes {$ifdef IEINCLUDEEXTRATRANSITIONS} , iettExpandFromLeft , iettExpandFromRight , iettExpandFromTop , iettExpandFromBottom , iettPacmanFromLeft , iettPacmanFromRight , iettPacman3Row , iettPacman4Row , iettPacman2SimRow , iettPacman4SimRow , iettPacman6SimRow , iettCubeRotateFromLeft , iettCubeRotateFromRight , iettCubeRotateFromTop , iettCubeRotateFromBottom , iettCubeRotateFromLeft2 , iettCubeRotateFromRight2 , iettCubeRotateFromTop2 , iettCubeRotateFromBottom2 , iettPageFlip , iettReversePageFlip , iettPageFlip2 , iettReversePageFlip2 , iettSoftWipeFromLeft , iettSoftWipeFromRight , iettSoftWipeFromTop , iettSoftWipeFromBottom , iettSweepClockwise , iettSweepCounterClockwise , iettFullSweepClockwise , iettExpandingSweepClockwise , iettRandomPuzzlePieces , iettRandomBoxesWithWord , iettRandomBigBoxes , iettTriangularWipe , iettShreddedFromLeft , iettShreddedFromRight , iettShreddedFromTop , iettShreddedFromBottom , iettShreddedFromTopAndLeft , iettShreddedFromTopAndRight , iettShreddedFromBottomAndLeft , iettShreddedFromBottomAndRight , iettShreddedFromHorizonAndLeft , iettShreddedFromHorizonAndRight , iettShreddedFromTopAndVerticalCenter , iettShreddedFromBottomAndVerticalCenter , iettShreddedFromCenter , iettShreddedToCenter , iettShreddedInToHorizon , iettShreddedInToVerticalCenter , iettShreddedOutFromHorizon , iettShreddedOutFromVerticalCenter , iettBarsInFromLeft , iettBarsInFromRight , iettBarsFromTop , iettBarsFromBottom , iettBarsLeftThenRight , iettBarsRightThenLeft , iettBarsTopThenBottom , iettBarsBottomThenTop , iettBarsFrombothSides , iettBarsFromTopAndBottom , iettCrisscrossWipeFromTopLeft , iettCrisscrossWipeFromTopRight , iettCrisscrossWipeFromBottomLeft , iettCrisscrossWipeFromBottomRight , iettCrisscrossWipeBounceFromTopLeft , iettCrisscrossWipeBounceFromTopRight , iettCrisscrossWipeBounceFromBottomLeft , iettCrisscrossWipeBounceFromBottomRight , iettCrisscrossWipeFromLeftRightAndTop , iettCrisscrossWipeFromLeftRightAndBottom , iettCrisscrossWipeFromLeftTopAndBottom , iettCrisscrossWipeFromTopLeftRightAndBottom , iettCrisscrossWipeFromRightTopAndBottom , iettCrisscrossWipeFromBottomLeftTopRight , iettSpeckledWipeFromLeft , iettSpeckledWipeFromRight , iettSpeckledWipeFromTop , iettSpeckledWipeFromBottom , iettExpandingExplosions , iettExpandingLightningBolts , iettExplosionWipeOut , iettExplosionWipeIn , iettExplosionWipeInAndOut , iettHeartWipeInAndOut , iettRandomHearts , iettExpandingHearts , iettHeartWipeOut , iettHeartWipeIn , iettExpandingTriangles , iettRectanglesFromTheLeft , iettRectanglesFromTheRight , iettRectanglesFromTheTop , iettRectanglesFromTheBottom , iettRandomWord , iettExpandingWord , iettWordWipeOut , iettWordWipeIn , iettWordWipeInAndOut , iettZigzagWipeFromHorizon , iettZigzagWipeFromVerticalCenter , iettZigzagWipeToHorizon , iettZigzagWipeToVerticalCenter , iettWordHalfSweep , iettWordFullSweep , iettRandomStar6s , iettExpandingStar6 , iettStar6WipeIn , iettStar6WipeOut , iettStar6WipeInAndOut {$endif} ]; {//} { Description The effects that ImageEn offers that allow you to smoothly transition from one image to another. Notes: - The style of many transition effects can be modified using - The shape can be modified for the following effects: iettRandomStar6s, iettExpandingStar6, iettStar6WipeIn, iettStar6WipeOut, iettStar6WipeInAndOut - iettPanZoom is a special effect that does not transition to another image, but rather zooms in/out or pans to a position within the current image iettShreddedFromLeft iettCubeRotateFromTop2 Category Transition Description Notes General iettCrossDissolve Cross Fade iettFadeOutIn Fade Out then In iettPageFlip Page Flip iettPageFlip2 3D Page Flip May be CPU intensive iettReversePageFlip Reverse Page Flip iettReversePageFlip2 3D Reverse Page Flip May be CPU intensive iettCubeRotateFromLeft Cube Rotate from Left iettCubeRotateFromRight Cube Rotate from Right iettCubeRotateFromTop Cube Rotate from Top iettCubeRotateFromBottom Cube Rotate from Bottom iettCubeRotateFromLeft2 3D Cube Rotate from Left May be CPU intensive iettCubeRotateFromRight2 3D Cube Rotate from Right May be CPU intensive iettCubeRotateFromTop2 3D Cube Rotate from Top May be CPU intensive iettCubeRotateFromBottom2 3D Cube Rotate from Bottom May be CPU intensive Wipes iettLeftRight1 Wipe Left to Right iettLeftRight2 Wipe Left to Right 2 iettRightLeft1 Wipe Right to Left iettRightLeft2 Wipe Right to Left 2 iettUpDown1 Wipe Top to Bottom iettUpDown2 Wipe Top to Bottom 2 iettDownUp1 Wipe Bottom to Top iettDownUp2 Wipe Bottom to Top 2 iettCenter1 Wipe Out from Center iettCenter2 Wipe In to Center iettWipeFromTopLeft Wipe from Top Left iettWipeFromTopRight Wipe from Top Right iettWipeFromBottomLeft Wipe from Bottom Left iettWipeFromBottomRight Wipe from Bottom Right iettWipeInFromTopAndBottom Wipe in from Top and Bottom iettWipeFromHorizon Wipe from Horizon iettWipeInFromSides Wipe in from Sides iettWipeOutFromVerticalCenter Wipe out from Vertical Center iettQuartersWipeInToCenter Quarters Wipe in to Center Special Wipes iettUnrollFromLeft Unroll from Left iettUnrollFromRight Unroll from Right iettUnrollFromTop Unroll from Top iettUnrollFromBottom Unroll from Bottom iettSpeckledWipeFromLeft Speckled Wipe from Left iettSpeckledWipeFromRight Speckled Wipe from Right iettSpeckledWipeFromTop Speckled Wipe from Top iettSpeckledWipeFromBottom Speckled Wipe from Bottom iettSoftWipeFromLeft Soft Wipe from Left iettSoftWipeFromRight Soft Wipe from Right iettSoftWipeFromTop Soft Wipe from Top iettSoftWipeFromBottom Soft Wipe from Bottom iettPacmanFromLeft Pacman Devours from Left/C> iettPacmanFromRight Pacman Devours from Right iettPacman3Row Pacman Devours Three Rows iettPacman4Row Pacman Devours Four Rows iettPacman2SimRow Two Simultaneous Rows of Pacman iettPacman4SimRow Four Simultaneous Rows of Pacman iettPacman6SimRow Six Simultaneous Rows of Pacman Curved Wipes iettCurvedWipeFromLeft Curved Wipe from Left iettCurvedWipeFromRight Curved Wipe from Right iettCurvedWipeFromTop Curved Wipe from Top iettCurvedWipeFromBottom Curved Wipe from Bottom iettCurvedWipeFromTopLeft Curved Wipe from Top Left iettCurvedWipeFromTopRight Curved Wipe from Top Right iettCurvedWipeFromBottomLeft Curved Wipe from Bottom Left iettCurvedWipeFromBottomRight Curved Wipe from Bottom Right Angled Wipes iettWipeDiagonalFromTopLeft Wipe diagonal from Top Left iettWipeDiagonalFromTopRight Wipe diagonal from Top Right iettWipeDiagonalFromBottomLeft Wipe diagonal from Bottom Left iettWipeDiagonalFromBottomRight Wipe diagonal from Bottom Right iettArrowWipeFromLeft Arrow Wipe from Left iettArrowWipeFromRight Arrow Wipe from Right iettArrowWipeFromTop Arrow Wipe from Top iettArrowWipeFromBottom Arrow Wipe from Bottom iettHorizontalBowTieWipe Horizontal Bow Tie Wipe iettVerticalBowTieWipe Vertical Bow Tie Wipe iettZigzagWipeFromHorizon Zigzag Wipe from Horizon iettZigzagWipeFromVerticalCenter Zigzag Wipe from Vertical Center iettTriangularWipe Triangular Wipe iettZigzagWipeToHorizon Zigzag Wipe To Horizon iettZigzagWipeToVerticalCenter Zigzag Wipe To Vertical Center iettAngledTwistIn Twist In iettAngledTwistOut Twist Out iettMultipleAngledTwistIn Multiple Twist In iettMultipleAngledTwistOut Multiple Twist Out Center Wipes iettCircularWipeFromCenter Circular Wipe from Center iettCircularWipeToCenter Circular Wipe to Center iettDiagonalCrossFromCenter Diagonal Cross from Center iettDiagonalCrossToCenter Diagonal Cross to Center iettDiamondWipeFromCenter Diamond Wipe from Center iettDiamondWipeToCenter Diamond Wipe to Center iettHeartWipeOut Heart Wipe from Center iettHeartWipeIn Heart Wipe to Center iettStar5WipeOut 5 Pointed Star Wipe from Center iettStar5WipeIn 5 Pointed Star Wipe to Center iettStar6WipeOut 6 Pointed Star Wipe from Center (or alternative shape) iettStar6WipeIn 6 Pointed Star Wipe to Center (or alternative shape) iettExplosionWipeOut Explosion Wipe from Center iettExplosionWipeIn Explosion Wipe to Center iettCrossWipeOut Cross Wipe from Center iettCrossWipeIn Cross Wipe to Center In and Outs iettDiagonalBoxWipe Diamond Wipe In and Out iettHeartWipeInAndOut Heart Wipe In and Out iettStar5WipeInAndOut 5 Pointed Star Wipe In and Out iettStar6WipeInAndOut 6 Pointed Star Wipe In and Out (or alternative shape) iettExplosionWipeInAndOut Explosion Wipe In and Out Shreds iettShreddedFromLeft Shredded from Left iettShreddedFromRight Shredded from Right iettShreddedFromTop Shredded from Top iettShreddedFromBottom Shredded from Bottom iettShreddedFromTopAndLeft Shredded from Top and Left iettShreddedFromTopAndRight Shredded from Top and Right iettShreddedFromBottomAndLeft Shredded from Bottom and Left iettShreddedFromBottomAndRight Shredded from Bottom and Right iettShreddedFromHorizonAndLeft Shredded from Horizon and Left iettShreddedFromHorizonAndRight Shredded from Horizon and Right iettShreddedFromTopAndVerticalCenter Shredded from Top and Vertical Center iettShreddedFromBottomAndVerticalCenter Shredded from Bottom and Vertical Center iettShreddedFromCenter Shredded from Center iettShreddedToCenter Shredded to Center iettShreddedInToHorizon Shredded in to Horizon iettShreddedInToVerticalCenter Shredded in to Vertical Center iettShreddedOutFromHorizon Shredded out from Horizon iettShreddedOutFromVerticalCenter Shredded out from Vertical Center Bars iettBarsInFromLeft Bars in from Left iettBarsInFromRight Bars in from Right iettBarsFromTop Bars from Top iettBarsFromBottom Bars from Bottom iettBarsLeftThenRight Bars Left then Right iettBarsRightThenLeft Bars Right then Left iettBarsTopThenBottom Bars Top then Bottom iettBarsBottomThenTop Bars Bottom then Top iettBarsFromBothSides Bars from both Sides iettBarsFromTopAndBottom Bars from Top and Bottom iettCrisscrossWipeFromTopLeft Crisscross Wipe from Top Left iettCrisscrossWipeFromTopRight Crisscross Wipe from Top Right iettCrisscrossWipeFromBottomLeft Crisscross Wipe from Bottom Left iettCrisscrossWipeFromBottomRight Crisscross Wipe from Bottom Right iettCrisscrossWipeBounceFromTopLeft Crisscross Wipe Bounce from Top Left iettCrisscrossWipeBounceFromTopRight Crisscross Wipe Bounce from Top Right iettCrisscrossWipeBounceFromBottomLeft Crisscross Wipe Bounce from Bottom Left iettCrisscrossWipeBounceFromBottomRight Crisscross Wipe Bounce from Bottom Right iettCrisscrossWipeFromLeftRightAndTop Crisscross Wipe from Left Right and Top iettCrisscrossWipeFromLeftRightAndBottom Crisscross Wipe from Left Right and Bottom iettCrisscrossWipeFromLeftTopAndBottom Crisscross Wipe from Left Top and Bottom iettCrisscrossWipeFromTopLeftRightAndBottom Crisscross Wipe from Top Left Right and Bottom iettCrisscrossWipeFromRightTopAndBottom Crisscross Wipe from Right Top and Bottom iettCrisscrossWipeFromBottomLeftTopRight Crisscross Wipe from Bottom Left Top Right iettRectanglesFromTheLeft Random Bars from the Left iettRectanglesFromTheRight Random Bars from the Right iettRectanglesFromTheTop Random Bars from the Top iettRectanglesFromTheBottom Random Bars from the Bottom Pushes iettMoveLeftRight1 Push Left to Right iettMoveRightLeft1 Push Right to Left iettMoveUpDown1 Push Top to Bottom iettMoveDownUp1 Push Bottom to Top iettPushLeftAndSlideOut Push Left and Slide out iettPushRightAndSlideOut Push Right and Slide out iettPushUpAndSlideOut Push up and Slide out iettPushDownAndSlideOut Push down and Slide out iettPushAndSqueezeLeft Push and Squeeze Left iettPushAndSqueezeRight Push and Squeeze Right iettPushAndSqueezeUp Push and Squeeze up iettPushAndSqueezeDown Push and Squeeze down Slides iettFromUpLeft Slide from Top Left iettFromUpRight Slide from Top Right iettFromBottomLeft Slide from Bottom Left iettFromBottomRight Slide from Bottom Right iettMoveLeftRight2 Slide Out Left to Right iettMoveRightLeft2 Slide Out Right to Left iettMoveUpDown2 Slide Out Top to Bottom iettMoveDownUp2 Slide Out Bottom to Top iettSlideInFromLeft Slide in from Left iettSlideInFromRight Slide in from Right iettSlideInFromTop Slide in from Top iettSlideInFromBottom Slide in from Bottom iettQuartersSlideInToCenter Quarters Slide in to Center Shrinks iettShrinkToTopLeft Shrink to Top Left iettShrinkToTopRight Shrink to Top Right iettShrinkToBottomLeft Shrink to Bottom Left iettShrinkToBottomRight Shrink to Bottom Right iettShrinkToCenter Shrink to Center Expands iettCenterZoom1 Expand Out from Center iettCenterZoom2 Expand In to Center iettExpandFromLeft Expand from Left iettExpandFromRight Expand from Right iettExpandFromTop Expand from Top iettExpandFromBottom Expand from Bottom iettExpandFromTopLeft Expand from Top Left iettExpandFromTopRight Expand from Top Right iettExpandFromBottomLeft Expand from Bottom Left iettExpandFromBottomRight Expand from Bottom Right iettExpandInFromLeft Expand in from Left iettExpandInFromRight Expand in from Right iettExpandInFromTop Expand in from Top iettExpandInFromBottom Expand in from Bottom iettExpandInToVerticalCenter Expand in to Vertical Center iettExpandInToHorizon Expand in to Horizon iettExpandInFromSides Expand in from Sides iettExpandInFromTopAndBottom Expand in from Top and Bottom iettExpandOutFromHorizon Expand out from Horizon iettExpandOutFromVerticalCenter Expand out from Vertical Center iettQuartersExpandToCenter Quarters Expand to Center Multi-Expanders iettExpandingRectangles Expanding Rectangles iettExpandingTriangles Expanding Triangles iettExpandingCircles Expanding Circles iettExpandingDiamonds Expanding Diamonds iettExpandingHearts Expanding Hearts iettExpandingStar5 Expanding 5 Pointed Stars iettExpandingStar6 Expanding 6 Pointed Stars (or alternative shape) iettExpandingExplosions Expanding Explosions iettExpandingLightningBolts Expanding Lightning Bolts Randoms iettRandomPoints Random Points iettRandomBoxes Random Boxes iettRandomBigBoxes Random Big Boxes iettRandomHearts Random Hearts iettRandomStar5s Random 5 Pointed Stars iettRandomStar6s Random 6 Pointed Stars (or alternative shape) iettRandomExplosions Random Explosions iettRandomPuzzlePieces Random Puzzle Pieces Rotates iettDiagonalSweepClockwise Diagonal Sweep Clockwise iettDiagonalSweepCounterClockwise Diagonal Sweep Counter-Clockwise iettSweepClockwise Sweep Clockwise iettSweepCounterClockwise Sweep Counter-Clockwise iettFullSweepClockwise Full Sweep Clockwise iettExpandingSweepClockwise Expanding Sweep Clockwise iettStarburstClockwiseFromCenter Starburst Clockwise iettStarburstCounterClockwiseFromCenter Starburst Counter-Clockwise iettRotationalRectangle Rotational Rectangle Clockwise iettRotationalRectangleCounterClockwise Rotational Rectangle Counter-Clockwise iettRotationalStar Rotational Star Clockwise iettRotationalStarCounterClockwise Rotational Star Counter-Clockwise iettSpirallingRectangleClockwise Spiralling Rectangle Clockwise iettSpirallingRectangleCounterClockwise Spiralling Rectangle Counter-Clockwise Word Effects iettRandomBoxesWithWord Random Boxes with Word Specify word properties using IEGlobalSettings().. Full word is always shown; does not cycle. iettRandomWord Random Letters of Word Specify word properties using IEGlobalSettings(). iettExpandingWord Expanding Letters of Word Specify word properties using IEGlobalSettings(). iettWordWipeOut Word Wipe from Center Specify word properties using IEGlobalSettings(). iettWordWipeIn Word Wipe to Center Specify word properties using IEGlobalSettings(). iettWordWipeInAndOut Word Wipe In and Out Specify word properties using IEGlobalSettings(). iettWordHalfSweep Half Sweep with Word Specify word properties using IEGlobalSettings(). iettWordFullSweep Full Sweep with Word Specify word properties using IEGlobalSettings(). iettWordFullExpandingSweep Expanding Sweep with Word Specify word properties using IEGlobalSettings(). Other iettBuildUpFromLeft Build up from Left iettBuildUpFromRight Build up from Right iettBuildUpFromTop Build up from Top iettBuildUpFromBottom Build up from Bottom iettHorizontalBlinds Horizontal Blinds iettVerticalBlinds Vertical Blinds iettUnevenBlindsFromLeft Uneven Blinds from Left iettUnevenBlindsFromRight Uneven Blinds from Right iettUnevenBlindsFromTop Uneven Blinds from Top iettUnevenBlindsFromBottom Uneven Blinds from Bottom Legacy iettFadeOut Fade Out iettFadeIn Fade In Special iettPanZoom Pan and Zoom Special usage: Must specify Start and End points
!!} type {!! TIETransitionTiming Declaration } TIETransitionTiming=(iettLinear, iettExponential, iettLogarithmic); {!!} {!! TIETransitionStepEvent Declaration } TIETransitionStepEvent=procedure(Sender: TObject; step: Integer) of object; {!!} TIETransitionEffects = class; {!! TIEOnTransitionPaint Declaration } TIEOnTransitionPaint = procedure(Sender: TObject; Bitmap: TBitmap; Transition: TIETransitionEffects; Step: Integer) of object; {!!} // transition effects class TIETransitionEffects = class private fSourceShot, fTargetShot, fCurrentView: TBitmap; fFullImage : TObject; fSourceShotLines, fTargetShotLines, fCurrentViewLines: PPointerArray; fWidth, fHeight: integer; fRunning: boolean; fOwner: TWinControl; fTimer: TTimer; fStep: integer; fFirstStep : Boolean; // some transitions require initializing fAccum1: integer; fTransition: TIETransitionType; fDuration: integer; // time in millisecs fStartTick: dword; fUpdateOnStop: boolean; fStartRect: TRect; fEndRect: TRect; fOnTransitionStop: TNotifyEvent; fOnTransitionStep: TIETransitionStepEvent; fTiming: TIETransitionTiming; fBackground: TColor; fSmoothing: Integer; // Pan Zoom Smoothing fMinLeft, fMaxLeft, fMinTop, fMaxTop, fMinBottom, fMaxBottom, fMinRight, fMaxRight: integer; fOnTransitionPaint: TIEOnTransitionPaint; procedure SetOnTransitionPaint(const Value: TIEOnTransitionPaint); procedure MakeTransition(DestCanvas : TCanvas; bExplicitUpdate : Boolean = False); procedure SetFullImage(const Value: TObject); protected fFrames: integer; // debug counter procedure TimerEvent(Sender: TObject); // procedure CrossDissolve(Step: integer); procedure FadeOut(Step: integer); procedure FadeIn(Step: integer); procedure FadeOutIn(Step: integer); procedure LeftRight1(Step: integer); procedure LeftRight2(Step: integer); procedure RightLeft1(Step: integer); procedure RightLeft2(Step: integer); procedure UpDown1(Step: integer); procedure UpDown2(Step: integer); procedure DownUp1(Step: integer); procedure DownUp2(Step: integer); procedure MoveLeftRight1(Step: integer); procedure MoveLeftRight2(Step: integer); procedure MoveRightLeft1(Step: integer); procedure MoveRightLeft2(Step: integer); procedure MoveUpDown1(Step: integer); procedure MoveUpDown2(Step: integer); procedure MoveDownUp1(Step: integer); procedure MoveDownUp2(Step: integer); procedure RandomPoints(Step: integer); procedure FromUpLeft(Step: integer); procedure FromUpRight(Step: integer); procedure FromBottomLeft(Step: integer); procedure FromBottomRight(Step: integer); procedure RandomBoxes(Step: integer); procedure Center1(Step: integer); procedure Center2(Step: integer); procedure CenterZoom1(Step: integer); procedure CenterZoom2(Step: integer); procedure PanZoom(Step: integer); {$ifdef IEINCLUDEEXTRATRANSITIONS} Procedure CubeRotateDarkenEdges(bVertical, bForward: Boolean; iCurrentPosition, Step : Integer); procedure CubeRotateFromLeft(Step: integer); procedure CubeRotateFromRight(Step: integer); procedure CubeRotateFromTop(Step: integer); procedure CubeRotateFromBottom(Step: integer); procedure CubeRotateFromLeft3D(Step: integer); procedure CubeRotateFromRight3D(Step: integer); procedure CubeRotateFromTop3D(Step: integer); procedure CubeRotateFromBottom3D(Step: integer); procedure PageFlipEffect(Step: Integer; bForward: Boolean); procedure PageFlipEffect3D(Step: Integer; bForward: Boolean); procedure PageFlipDarkenEdges(iCurrentPosition, Step : Integer; bForward: Boolean); procedure SoftWipeVerticalEx(Step: integer; bForward : Boolean); procedure SoftWipeHorizontalEx(Step: integer; bForward : Boolean); procedure SoftWipeFromLeft(Step: integer); procedure SoftWipeFromRight(Step: integer); procedure SoftWipeFromTop(Step: integer); procedure SoftWipeFromBottom(Step: integer); {$endif} public constructor Create(Owner: TWinControl); destructor Destroy; override; property SourceShot: TBitmap read fSourceShot; property TargetShot: TBitmap read fTargetShot; property Running: boolean read fRunning; procedure Run(UpdateOnStop: boolean); procedure Stop; property Transition: TIETransitionType read fTransition write fTransition; procedure SetSizes(Width, Height: integer); property Duration: integer read fDuration write fDuration; procedure PrepareBitmap(OriginalBitmap, TargetBitmap: TBitmap); procedure CreateBitmap(TransitionProgress : Single; DestBitmap : TBitmap); property FullImage : TObject read fFullImage write SetFullImage; // Must be TIEBitmap property StartRect: TRect read fStartRect write fStartRect; property EndRect: TRect read fEndRect write fEndRect; property OnTransitionStop: TNotifyEvent read fOnTransitionStop write fOnTransitionStop; property OnTransitionStep: TIETransitionStepEvent read fOnTransitionStep write fOnTransitionStep; property OnTransitionPaint: TIEOnTransitionPaint read fOnTransitionPaint write SetOnTransitionPaint; property Timing: TIETransitionTiming read fTiming write fTiming; property Background: TColor read fBackground write fBackground; // Smoothing of Pan Zoom effects property Smoothing: Integer read fSmoothing write fSmoothing; end; type TTransitionCategory = (tcGeneral, tcWipes, tcSpecialWipes, tcCurvedWipes, tcAngledWipes, tcCenterWipes, tcInAndOuts, tcShreds, tcBars, tcSlides, tcPushes, tcShrinks, tcExpands, tcMultiExpanders, tcRandoms, tcRotates, tcWordEffects, tcOther, tcUnattractive); TEffect = record Name : String; // Display name for transition Category : TTransitionCategory; // A categorization of the transition Overlay : Boolean; // If true, the transition is suitable when changing from one image to a modified version of the same image (e.g. Image, then the same image with text applied). It is commonly used to "Reveal" text, like in PowerPoint (e.g. Text fading in on a title page) end; const {$ifdef IEINCLUDEEXTRATRANSITIONS} MAX_TRANSITIONS = 249; {$else} MAX_TRANSITIONS = 30; {$endif} IETransitionList: array[1..MAX_TRANSITIONS] of TEffect = ( // ADD IMAGEEN TRANSITIONS TO OUR ARRAY SO ALL TRANSITION NAMES CAN BE ACCESSED (Name: 'Cross Fade'; Category: tcGeneral; Overlay: True), (Name: 'Fade Out'; Category: tcUnattractive; Overlay: False), (Name: 'Fade In'; Category: tcUnattractive; Overlay: False), (Name: 'Fade Out then In'; Category: tcGeneral; Overlay: False), (Name: 'Wipe Left to Right'; Category: tcWipes; Overlay: True), (Name: 'Wipe Left to Right 2'; Category: tcWipes; Overlay: True), (Name: 'Wipe Right to Left'; Category: tcWipes; Overlay: True), (Name: 'Wipe Right to Left 2'; Category: tcWipes; Overlay: True), (Name: 'Wipe Top to Bottom'; Category: tcWipes; Overlay: True), (Name: 'Wipe Top to Bottom 2'; Category: tcWipes; Overlay: True), (Name: 'Wipe Bottom to Top'; Category: tcWipes; Overlay: True), (Name: 'Wipe Bottom to Top 2'; Category: tcWipes; Overlay: True), (Name: 'Slide from Top Left'; Category: tcSlides; Overlay: False), (Name: 'Slide from Top Right'; Category: tcSlides; Overlay: False), (Name: 'Slide from Bottom Left'; Category: tcSlides; Overlay: False), (Name: 'Slide from Bottom Right'; Category: tcSlides; Overlay: False) , (Name: 'Push Left to Right'; Category: tcPushes; Overlay: False), (Name: 'Slide Out Left to Right'; Category: tcSlides; Overlay: False), (Name: 'Push Right to Left'; Category: tcPushes; Overlay: False), (Name: 'Slide Out Right to Left'; Category: tcSlides; Overlay: False), (Name: 'Push Top to Bottom'; Category: tcPushes; Overlay: False), (Name: 'Slide Out Top to Bottom'; Category: tcSlides; Overlay: False), (Name: 'Push Bottom to Top'; Category: tcPushes; Overlay: False), (Name: 'Slide Out Bottom to Top'; Category: tcSlides; Overlay: False), (Name: 'Random Points'; Category: tcRandoms; Overlay: True), (Name: 'Random Boxes'; Category: tcRandoms; Overlay: True), (Name: 'Wipe Out from Center'; Category: tcWipes; Overlay: True), (Name: 'Wipe In to Center'; Category: tcWipes; Overlay: True), (Name: 'Expand Out from Center'; Category: tcExpands; Overlay: False), (Name: 'Expand In to Center'; Category: tcExpands; Overlay: False) {$ifdef IEINCLUDEEXTRATRANSITIONS} // PS EFFECTS START , (Name: 'Expand from Left'; Category: tcExpands; Overlay: False), (Name: 'Expand from Right'; Category: tcExpands; Overlay: False), (Name: 'Expand from Top'; Category: tcExpands; Overlay: False), (Name: 'Expand from Bottom'; Category: tcExpands; Overlay: False), (Name: 'Expand from Top Left'; Category: tcExpands; Overlay: False), (Name: 'Expand from Top Right'; Category: tcExpands; Overlay: False), (Name: 'Expand from Bottom Left'; Category: tcExpands; Overlay: False), (Name: 'Expand from Bottom Right'; Category: tcExpands; Overlay: False), (Name: 'Expand in from Left'; Category: tcExpands; Overlay: False), (Name: 'Expand in from Right'; Category: tcExpands; Overlay: False), (Name: 'Expand in from Top'; Category: tcExpands; Overlay: False), (Name: 'Expand in from Bottom'; Category: tcExpands; Overlay: False), (Name: 'Expand in to Vertical Center'; Category: tcExpands; Overlay: False), (Name: 'Expand in to Horizon'; Category: tcExpands; Overlay: False), (Name: 'Expand in from Sides'; Category: tcExpands; Overlay: False), (Name: 'Expand in from Top and Bottom'; Category: tcExpands; Overlay: False), (Name: 'Expand out from Horizon'; Category: tcExpands; Overlay: False), (Name: 'Expand out from Vertical Center'; Category: tcExpands; Overlay: False), (Name: 'Wipe from Top Left'; Category: tcWipes; Overlay: True), (Name: 'Wipe from Top Right'; Category: tcWipes; Overlay: True), (Name: 'Wipe from Bottom Left'; Category: tcWipes; Overlay: True), (Name: 'Wipe from Bottom Right'; Category: tcWipes; Overlay: True), (Name: 'Wipe in from Top and Bottom'; Category: tcWipes; Overlay: True), (Name: 'Wipe from Horizon'; Category: tcWipes; Overlay: True), (Name: 'Wipe in from Sides'; Category: tcWipes; Overlay: True), (Name: 'Wipe out from Vertical Center'; Category: tcWipes; Overlay: True), (Name: 'Build up from Left'; Category: tcOther; Overlay: False), (Name: 'Build up from Right'; Category: tcOther; Overlay: False), (Name: 'Build up from Top'; Category: tcOther; Overlay: False), (Name: 'Build up from Bottom'; Category: tcOther; Overlay: False), (Name: 'Unroll from Left'; Category: tcSpecialWipes; Overlay: True), (Name: 'Unroll from Right'; Category: tcSpecialWipes; Overlay: True), (Name: 'Unroll from Top'; Category: tcSpecialWipes; Overlay: True), (Name: 'Unroll from Bottom'; Category: tcSpecialWipes; Overlay: True), (Name: 'Slide in from Left'; Category: tcSlides; Overlay: False), (Name: 'Slide in from Right'; Category: tcSlides; Overlay: False), (Name: 'Slide in from Top'; Category: tcSlides; Overlay: False), (Name: 'Slide in from Bottom'; Category: tcSlides; Overlay: False), (Name: 'Shrink to Top Left'; Category: tcShrinks; Overlay: False), (Name: 'Shrink to Top Right'; Category: tcShrinks; Overlay: False), (Name: 'Shrink to Bottom Left'; Category: tcShrinks; Overlay: False), (Name: 'Shrink to Bottom Right'; Category: tcShrinks; Overlay: False), (Name: 'Shrink to Center'; Category: tcShrinks; Overlay: False), (Name: 'Quarters Wipe in to Center'; Category: tcWipes; Overlay: True), (Name: 'Quarters Expand to Center'; Category: tcExpands; Overlay: False), (Name: 'Quarters Slide in to Center'; Category: tcSlides; Overlay: False), (Name: 'Curved Wipe from Left'; Category: tcCurvedWipes; Overlay: True), (Name: 'Curved Wipe from Right'; Category: tcCurvedWipes; Overlay: True), (Name: 'Curved Wipe from Top'; Category: tcCurvedWipes; Overlay: True), (Name: 'Curved Wipe from Bottom'; Category: tcCurvedWipes; Overlay: True), (Name: 'Curved Wipe from Top Left'; Category: tcCurvedWipes; Overlay: True), (Name: 'Curved Wipe from Top Right'; Category: tcCurvedWipes; Overlay: True), (Name: 'Curved Wipe from Bottom Left'; Category: tcCurvedWipes; Overlay: True), (Name: 'Curved Wipe from Bottom Right'; Category: tcCurvedWipes; Overlay: True), (Name: 'Bars in from Left'; Category: tcBars; Overlay: True), (Name: 'Bars in from Right'; Category: tcBars; Overlay: True), (Name: 'Bars from Top'; Category: tcBars; Overlay: True), (Name: 'Bars from Bottom'; Category: tcBars; Overlay: True), (Name: 'Bars Left then Right'; Category: tcBars; Overlay: True), (Name: 'Bars Right then Left'; Category: tcBars; Overlay: True), (Name: 'Bars Top then Bottom'; Category: tcBars; Overlay: True), (Name: 'Bars Bottom then Top'; Category: tcBars; Overlay: True), (Name: 'Bars from both Sides'; Category: tcBars; Overlay: True), (Name: 'Bars from Top and Bottom'; Category: tcBars; Overlay: True), (Name: 'Shredded from Left'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Right'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Top'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Bottom'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Top and Left'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Top and Right'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Bottom and Left'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Bottom and Right'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Horizon and Left'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Horizon and Right'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Top and Vertical Center'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Bottom and Vertical Center'; Category: tcShreds; Overlay: True), (Name: 'Shredded from Center'; Category: tcShreds; Overlay: True), (Name: 'Shredded to Center'; Category: tcShreds; Overlay: True), (Name: 'Shredded in to Horizon'; Category: tcShreds; Overlay: True), (Name: 'Shredded in to Vertical Center'; Category: tcShreds; Overlay: True), (Name: 'Shredded out from Horizon'; Category: tcShreds; Overlay: True), (Name: 'Shredded out from Vertical Center'; Category: tcShreds; Overlay: True), (Name: 'Expanding Rectangles'; Category: tcMultiExpanders; Overlay: True), (Name: 'Expanding Triangles'; Category: tcMultiExpanders; Overlay: True), (Name: 'Expanding Circles'; Category: tcMultiExpanders; Overlay: True), (Name: 'Expanding Diamonds'; Category: tcMultiExpanders; Overlay: True), (Name: 'Circular Wipe from Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Circular Wipe to Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Crisscross Wipe from Top Left'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe from Top Right'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe from Bottom Left'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe from Bottom Right'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe Bounce from Top Left'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe Bounce from Top Right'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe Bounce from Bottom Left'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe Bounce from Bottom Right'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe from Left Right and Top'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe from Left Right and Bottom'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe from Left Top and Bottom'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe from Top Left Right and Bottom'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe from Right Top and Bottom'; Category: tcBars; Overlay: True), (Name: 'Crisscross Wipe from Bottom Left Top Right'; Category: tcBars; Overlay: True), (Name: 'Wipe diagonal from Top Left'; Category: tcAngledWipes; Overlay: True), (Name: 'Wipe diagonal from Top Right'; Category: tcAngledWipes; Overlay: True), (Name: 'Wipe diagonal from Bottom Left'; Category: tcAngledWipes; Overlay: True), (Name: 'Wipe diagonal from Bottom Right'; Category: tcAngledWipes; Overlay: True), (Name: 'Diagonal Sweep Clockwise'; Category: tcRotates; Overlay: True), (Name: 'Diagonal Sweep Counter-Clockwise'; Category: tcRotates; Overlay: True), (Name: 'Half Sweep Clockwise'; Category: tcRotates; Overlay: True), (Name: 'Half Sweep Counter-Clockwise'; Category: tcRotates; Overlay: True), (Name: 'Starburst Clockwise'; Category: tcRotates; Overlay: True), (Name: 'Starburst Counter-Clockwise'; Category: tcRotates; Overlay: True), (Name: 'Rotational Rectangle Clockwise'; Category: tcRotates; Overlay: False), (Name: 'Rotational Rectangle Counter-Clockwise'; Category: tcRotates; Overlay: False), (Name: 'Rotational Star Clockwise'; Category: tcRotates; Overlay: True), (Name: 'Rotational Star Counter-Clockwise'; Category: tcRotates; Overlay: True), (Name: 'Speckled Wipe from Left'; Category: tcSpecialWipes; Overlay: True), (Name: 'Speckled Wipe from Right'; Category: tcSpecialWipes; Overlay: True), (Name: 'Speckled Wipe from Top'; Category: tcSpecialWipes; Overlay: True), (Name: 'Speckled Wipe from Bottom'; Category: tcSpecialWipes; Overlay: True), (Name: 'Push Left and Slide out'; Category: tcPushes; Overlay: False), (Name: 'Push Right and Slide out'; Category: tcPushes; Overlay: False), (Name: 'Push up and Slide out'; Category: tcPushes; Overlay: False), (Name: 'Push down and Slide out'; Category: tcPushes; Overlay: False), (Name: 'Push and Squeeze Left'; Category: tcPushes; Overlay: False), (Name: 'Push and Squeeze Right'; Category: tcPushes; Overlay: False), (Name: 'Push and Squeeze up'; Category: tcPushes; Overlay: False), (Name: 'Push and Squeeze down'; Category: tcPushes; Overlay: False), (Name: 'Horizontal Blinds'; Category: tcOther; Overlay: True), (Name: 'Vertical Blinds'; Category: tcOther; Overlay: True), (Name: 'Uneven Blinds from Left'; Category: tcOther; Overlay: True), (Name: 'Uneven Blinds from Right'; Category: tcOther; Overlay: True), (Name: 'Uneven Blinds from Top'; Category: tcOther; Overlay: True), (Name: 'Uneven Blinds from Bottom'; Category: tcOther; Overlay: True), (Name: 'Wide Bars from the Left'; Category: tcBars; Overlay: True), (Name: 'Wide Bars from the Right'; Category: tcBars; Overlay: True), (Name: 'Wide Bars from the Top'; Category: tcBars; Overlay: True), (Name: 'Wide Bars from the Bottom'; Category: tcBars; Overlay: True), (Name: 'Spiralling Rectangle Clockwise'; Category: tcRotates; Overlay: False), (Name: 'Spiralling Rectangle Counter-Clockwise'; Category: tcRotates; Overlay: False), (Name: 'Arrow Wipe from Left'; Category: tcAngledWipes; Overlay: True), (Name: 'Arrow Wipe from Right'; Category: tcAngledWipes; Overlay: True), (Name: 'Arrow Wipe from Top'; Category: tcAngledWipes; Overlay: True), (Name: 'Arrow Wipe from Bottom'; Category: tcAngledWipes; Overlay: True), (Name: 'Horizontal Bow Tie Wipe'; Category: tcAngledWipes; Overlay: True), (Name: 'Vertical Bow Tie Wipe'; Category: tcAngledWipes; Overlay: True), (Name: 'Diagonal Cross from Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Diagonal Cross to Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Zigzag Wipe from Horizon'; Category: tcAngledWipes; Overlay: True), (Name: 'Zigzag Wipe from Vertical Center'; Category: tcAngledWipes; Overlay: True), (Name: 'Diamond Wipe from Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Diamond Wipe to Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Diamond Wipe In and Out'; Category: tcInAndOuts; Overlay: True), (Name: 'Rotational Triangular Wipe'; Category: tcRotates; Overlay: True), (Name: 'Random Big Boxes'; Category: tcRandoms; Overlay: True), (Name: 'Page Flip'; Category: tcGeneral; Overlay: False), (Name: '3D Page Flip'; Category: tcGeneral; Overlay: False), (Name: 'Reverse Page Flip'; Category: tcGeneral; Overlay: False), (Name: '3D Reverse Page Flip'; Category: tcGeneral; Overlay: False), (Name: 'Zigzag Wipe To Horizon'; Category: tcAngledWipes; Overlay: True), (Name: 'Zigzag Wipe To Vertical Center'; Category: tcAngledWipes; Overlay: True), (Name: 'Random Hearts'; Category: tcRandoms; Overlay: True), (Name: 'Random 5 Pointed Stars'; Category: tcRandoms; Overlay: True), (Name: 'Random 6 Pointed Stars'; Category: tcRandoms; Overlay: True), (Name: 'Random Explosions'; Category: tcRandoms; Overlay: True), (Name: 'Expanding Hearts'; Category: tcMultiExpanders; Overlay: True), (Name: 'Expanding 5 Pointed Stars'; Category: tcMultiExpanders; Overlay: True), (Name: 'Expanding 6 Pointed Stars'; Category: tcMultiExpanders; Overlay: True), (Name: 'Expanding Explosions'; Category: tcMultiExpanders; Overlay: True), (Name: 'Expanding Lightning Bolts'; Category: tcMultiExpanders; Overlay: True), (Name: 'Heart Wipe from Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Heart Wipe to Center'; Category: tcCenterWipes; Overlay: True), (Name: '5 Pointed Star Wipe from Center'; Category: tcCenterWipes; Overlay: True), (Name: '5 Pointed Star Wipe to Center'; Category: tcCenterWipes; Overlay: True), (Name: '6 Pointed Star Wipe from Center'; Category: tcCenterWipes; Overlay: True), (Name: '6 Pointed Star Wipe to Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Explosion Wipe from Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Explosion Wipe to Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Cross Wipe from Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Cross Wipe to Center'; Category: tcCenterWipes; Overlay: True), (Name: 'Heart Wipe In and Out'; Category: tcInAndOuts; Overlay: True), (Name: '5 Pointed Star Wipe In and Out'; Category: tcInAndOuts; Overlay: True), (Name: '6 Pointed Star Wipe In and Out'; Category: tcInAndOuts; Overlay: True), (Name: 'Explosion Wipe In and Out'; Category: tcInAndOuts; Overlay: True), (Name: 'Cube Rotate from Left'; Category: tcGeneral; Overlay: True), (Name: 'Cube Rotate from Right'; Category: tcGeneral; Overlay: True), (Name: 'Cube Rotate from Top'; Category: tcGeneral; Overlay: True), (Name: 'Cube Rotate from Bottom'; Category: tcGeneral; Overlay: True), (Name: 'Soft Wipe from Left'; Category: tcSpecialWipes; Overlay: True), (Name: 'Soft Wipe from Right'; Category: tcSpecialWipes; Overlay: True), (Name: 'Soft Wipe from Top'; Category: tcSpecialWipes; Overlay: True), (Name: 'Soft Wipe from Bottom'; Category: tcSpecialWipes; Overlay: True), (Name: 'Twist In'; Category: tcAngledWipes; Overlay: True), (Name: 'Twist Out'; Category: tcAngledWipes; Overlay: True), (Name: 'Multiple Twist In'; Category: tcAngledWipes; Overlay: True), (Name: 'Multiple Twist Out'; Category: tcAngledWipes; Overlay: True), (Name: 'Random Puzzle Pieces'; Category: tcRandoms; Overlay: True), (Name: 'Pacman Devours from Left'; Category: tcSpecialWipes; Overlay: True), (Name: 'Pacman Devours from Right'; Category: tcSpecialWipes; Overlay: True), (Name: 'Pacman Devours Three Rows'; Category: tcSpecialWipes; Overlay: True), (Name: 'Pacman Devours Four Rows'; Category: tcSpecialWipes; Overlay: True), (Name: 'Two Simultaneous Rows of Pacman'; Category: tcSpecialWipes; Overlay: True), (Name: 'Four Simultaneous Rows of Pacman'; Category: tcSpecialWipes; Overlay: True), (Name: 'Six Simultaneous Rows of Pacman'; Category: tcSpecialWipes; Overlay: True), (Name: 'Full Sweep Clockwise'; Category: tcRotates; Overlay: True), (Name: 'Expanding Sweep Clockwise'; Category: tcRotates; Overlay: True), (Name: '3D Cube Rotate from Left'; Category: tcGeneral; Overlay: True), (Name: '3D Cube Rotate from Right'; Category: tcGeneral; Overlay: True), (Name: '3D Cube Rotate from Top'; Category: tcGeneral; Overlay: True), (Name: '3D Cube Rotate from Bottom'; Category: tcGeneral; Overlay: True), (Name: 'Random Boxes with Word'; Category: tcWordEffects; Overlay: False), (Name: 'Random Letters of Word'; Category: tcWordEffects; Overlay: False), (Name: 'Expanding Letters of Word'; Category: tcWordEffects; Overlay: False), (Name: 'Word Wipe from Center'; Category: tcWordEffects; Overlay: False), (Name: 'Word Wipe to Center'; Category: tcWordEffects; Overlay: False), (Name: 'Word Wipe In and Out'; Category: tcWordEffects; Overlay: False), (Name: 'Half Sweep with Word'; Category: tcWordEffects; Overlay: False), (Name: 'Full Sweep with Word'; Category: tcWordEffects; Overlay: False), (Name: 'Expanding Sweep with Word'; Category: tcWordEffects; Overlay: False) {$endif} ); { THE FOLLOWING EFFECTS FROM CUSTOMPICSHOW WERE NOT USED: (Name: 'Wipe from Left'; Proc: Effect005) : Just like iettLeftRight1 (Name: 'Wipe from Right'; Proc: Effect006) : Just like iettRightLeft1 (Name: 'Wipe from Top'; Proc: Effect022) : Just like iettDownUp1 (Name: 'Wipe from Bottom'; Proc: Effect023) : Just like iettUpDown1 (Name: 'Slide in from Bottom Right'; Proc: Effect039) : Just like iettFromBottomRight (Name: 'Slide in from Top Right'; Proc: Effect040) : Just like iettFromUpRight (Name: 'Slide in from Top Left'; Proc: Effect041) : Just like iettFromUpLeft (Name: 'Slide in from Bottom Left'; Proc: Effect042) : Just like iettFromBottomLeft (Name: 'Expand out from centre'; Proc: Effect052) : Just like iettCenterZoom1 (Name: 'Wipe out from centre'; Proc: Effect053) (Name: 'Wipe in to centre'; Proc: Effect054) : Just like iettCenter2 (Name: 'Fade'; Proc: Effect119) : Just like iettCrossDissolve (Name: 'Pivot from Top Left'; Proc: Effect120) : Requires a 32 bit palette (Name: 'Pivot from Bottom Left'; Proc: Effect121) (Name: 'Pivot from Top Right'; Proc: Effect122) (Name: 'Pivot from Bottom Right'; Proc: Effect123) (Name: 'Random squares appear'; Proc: Effect128) : Just like iettRandomBoxes (Name: 'Pixelate'; Proc: Effect168) : Requires a 32 bit palette (Name: 'Dissolve'; Proc: Effect169) : Just like IE effect (Name: 'Random Bars Horizontal'; Proc: Effect170) : Uses TBitmap.ScanLine (Name: 'Random Bars Vertical'; Proc: Effect171) : Uses TBitmap.ScanLine (Name: 'Channel Mix'; Proc: Effect172) : Uses TBitmap.ScanLine and 32 bit (Name: 'Rectangles from the Left'; Proc: Effect146) : Unattractive (Name: 'Rectangles from the Right'; Proc: Effect147) : Unattractive (Name: 'Rectangles from the Top'; Proc: Effect148) : Unattractive (Name: 'Rectangles from the Bottom'; Proc: Effect149) : Unattractive } type {!! TIEPanZoomType Declaration } TIEPanZoomType = (iepzPanTopLeftToBottomRight, iepzPanTopRightToBottomLeft, iepzPanBottomLeftToTopRight, iepzPanBottomRightToTopLeft, iepzPanTopLeftToCenter, iepzPanTopRightToCenter, iepzPanBottomLeftToCenter, iepzPanBottomRightToCenter, iepzPanCenterToTopLeft, iepzPanCenterToTopRight, iepzPanCenterToBottomLeft, iepzPanCenterToBottomRight, iepzPanLeftToRightOrTopToBottom, iepzPanLeftToCenterOrTopToCenter, iepzPanRightToCenterOrBottomToCenter, iepzPanRightToLeftOrBottomToTop, iepzPanCenterToLeftToOrCenterToTop, iepzPanCenterToRightOrCenterToBottom, iepzZoomInToTopLeft, iepzZoomInToTopRight, iepzZoomInToCenter, iepzZoomInToBottomLeft, iepzZoomInToBottomRight, iepzZoomOutFromTopLeft, iepzZoomOutFromTopRight, iepzZoomOutFromCenter, iepzZoomOutFromBottomLeft, iepzZoomOutFromBottomRight, iepzFullZoomInToTopLeft, iepzFullZoomInToTop, iepzFullZoomInToTopRight, iepzFullZoomInToLeft, iepzFullZoomInToCenter, iepzFullZoomInToRight, iepzFullZoomInToBottomLeft, iepzFullZoomInToBottom, iepzFullZoomInToBottomRight, iepzFullZoomOutFromTopLeft, iepzFullZoomOutFromTop, iepzFullZoomOutFromTopRight, iepzFullZoomOutFromLeft, iepzFullZoomOutFromCenter, iepzFullZoomOutFromRight, iepzFullZoomOutFromBottomLeft, iepzFullZoomOutFromBottom, iepzFullZoomOutFromBottomRight); {!!} const MAX_PAN_ZOOM_EFFECT_COUNT = 46; IEPanZoomEffectNames : array[0 .. MAX_PAN_ZOOM_EFFECT_COUNT - 1] of string = ( 'Pan from Top Left to Bottom Right', 'Pan from Top Right to Bottom Left', 'Pan from Bottom Left to Top Right', 'Pan from Bottom Right to Top Left', 'Pan from Top Left to Center', 'Pan from Top Right to Center', 'Pan from Bottom Left to Center', 'Pan from Bottom Right to Center', 'Pan from Center to Top Left', 'Pan from Center to Top Right', 'Pan from Center to Bottom Left', 'Pan from Center to Bottom Right', 'Pan from Left to Right/Top to Bottom', 'Pan from Left to Center/Top to Center', 'Pan from Right to Center/Bottom to Center', 'Pan from Right to Left/Bottom to Top', 'Pan from Center to Left/Center to Top', 'Pan from Center to Right/Center to Bottom', 'Zoom in to Top Left', 'Zoom in to Top Right', 'Zoom in to Center', 'Zoom in to Bottom Left', 'Zoom in to Bottom Right', 'Zoom out from Top Left', 'Zoom out from Top Right', 'Zoom out from Center', 'Zoom out from Bottom Left', 'Zoom out from Bottom Right', 'Full Zoom in to Top Left', 'Full Zoom in to Top', 'Full Zoom in to Top Right', 'Full Zoom in to Left', 'Full Zoom in to Center', 'Full Zoom in to Right', 'Full Zoom in to Bottom Left', 'Full Zoom in to Bottom', 'Full Zoom in to Bottom Right', 'Full Zoom out from Top Left', 'Full Zoom out from Top', 'Full Zoom out from Top Right', 'Full Zoom out from Left', 'Full Zoom out from Center', 'Full Zoom out from Right', 'Full Zoom out from Bottom Left', 'Full Zoom out from Bottom', 'Full Zoom out from Bottom Right'); // Convert a TIEPanZoomType effect type to a starting and ending position procedure GetPanZoomEffectStartEndRects(iIEClientWidth, iIEClientHeight : Integer; // ClientWidth and ClientHeight of the display window iBitmapWidth, iBitmapHeight : Integer; // Width and Height of the Bitmap PanZoomEffect : TIEPanZoomType; // Effect to use iMaxZoom : Integer; // For zoom effects, how much should we zoom in/out, e.g. 20 for 20% out StartRect: TRect; // Will be filled with the first display position out EndRect: TRect); // Will be filled with the last display position implementation uses imageenproc, iexCanvasUtils, {$IFDEF IEHASTYPES} Types, {$ENDIF} Math, ieSettings, imageenview, iexBitmaps, ieview, iemview, hyieutils; {$ifdef IEINCLUDEEXTRATRANSITIONS} var fTransitionInitialized : Boolean; const iesTransLetter = TIEShape( 100 ); iesTransCircularShape = TIEShape( 101 ); iesTransDiamondShape = TIEShape( 102 ); { TComplexRegion } type TComplexRegion = class(TObject) private RgnData: PRgnData; Capacity: Integer; Count: Integer; Bounds: TRect; Rect: PRect; public constructor Create; destructor Destroy; override; procedure Clear; procedure AddRect(Left, Top, Right, Bottom: Integer); function CreateRegion: HRGN; end; constructor TComplexRegion.Create; begin inherited Create; Clear; end; destructor TComplexRegion.Destroy; begin ReallocMem(RgnData, 0); inherited Destroy; end; procedure TComplexRegion.Clear; begin ReallocMem(RgnData, 0); Count := 0; Capacity := 0; with Bounds do begin Left := +MaxInt; Top := +MaxInt; Right := -MaxInt; Bottom := -MaxInt; end; end; procedure TComplexRegion.AddRect(Left, Top, Right, Bottom: Integer); begin if Count = Capacity then begin Inc(Capacity, 500); ReallocMem(RgnData, SizeOf(TRgnData) + Capacity * SizeOf(TRect)); Rect := PRect(@(RgnData^.Buffer)); Inc(Rect, Count); end; Rect^.Left := Left; Rect^.Top := Top; Rect^.Right := Right; Rect^.Bottom := Bottom; Inc(Rect); Inc(Count); if Bounds.Left > Left then Bounds.Left := Left; if Bounds.Top > Top then Bounds.Top := Top; if Bounds.Right < Right then Bounds.Right := Right; if Bounds.Bottom < Bottom then Bounds.Bottom := Bottom; end; function TComplexRegion.CreateRegion: HRGN; begin if Assigned(RgnData) then begin with RgnData^.rdh do begin dwSize := SizeOf(TRgnDataHeader); iType := RDH_RECTANGLES; nCount := Count; nRgnSize := SizeOf(TRect); rcBound := Bounds; end; Result := ExtCreateRegion(nil, SizeOf(TRgnData) + Count * SizeOf(TRect), RgnData^); end else Result := 0; end; { Helper Functions } // Blend the specified rect of a canvas with a color {$ifdef IEHASNOTWINDOWSALPHABLEND} procedure ColorBlend(const ACanvas: HDC; const ARect: TRect; const ABlendColor: TColor; const ABlendValue: Integer); begin end; {$else} procedure ColorBlend(const ACanvas: HDC; const ARect: TRect; const ABlendColor: TColor; const ABlendValue: Integer); var DC: HDC; Brush: HBRUSH; Bitmap: HBITMAP; BlendFunction: TBlendFunction; begin DC := CreateCompatibleDC(ACanvas); Bitmap := CreateCompatibleBitmap(ACanvas, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top); Brush := CreateSolidBrush(ColorToRGB(ABlendColor)); try SelectObject(DC, Bitmap); Windows.FillRect(DC, Rect(0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top), Brush); BlendFunction.BlendOp := AC_SRC_OVER; BlendFunction.BlendFlags := 0; BlendFunction.AlphaFormat := 0; BlendFunction.SourceConstantAlpha := ABlendValue; AlphaBlend(ACanvas, ARect.Left, ARect.Top, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, DC, 0, 0, ARect.Right - ARect.Left, ARect.Bottom - ARect.Top, BlendFunction); finally DeleteObject(Brush); DeleteObject(Bitmap); DeleteDC(DC); end; end; {$endif} // PS to IE Parameter conversion // W and H remain constant regardless of Progress // X and Y increase in proportion to progress procedure CalcParams(const ARect: TRect; Progress: Integer; var W, H, X, Y: Integer); begin W := ARect.Right - ARect.Left; H := ARect.Bottom - ARect.Top; if W >= H then begin X := MulDiv(W, Progress, 100); Y := MulDiv(X, H, W); end else begin Y := MulDiv(H, Progress, 100); X := MulDiv(Y, W, H); end; end; procedure OutputRgnToCanvas(DestCanvas: TCanvas; W, H : Integer; Rgn: HRGN; Image : TBitmap); begin if Rgn <> 0 then try SelectClipRgn(DestCanvas.Handle, Rgn); BitBlt(DestCanvas.Handle, 0, 0, W, H, Image.Canvas.Handle, 0, 0, SRCCOPY); SelectClipRgn(DestCanvas.Handle, 0); except // UNEXPECTED ERROR end; end; procedure RotatePoints(var Points: array of TPoint; xOrg, yOrg: Integer; Angle: Extended); var Sin, Cos: Extended; xPrime, yPrime: Integer; I: Integer; begin SinCos(Angle, Sin, Cos); for I := Low(Points) to High(Points) do with Points[I] do begin xPrime := X - xOrg; yPrime := Y - yOrg; X := Round(xPrime * Cos - yPrime * Sin) + xOrg; Y := Round(xPrime * Sin + yPrime * Cos) + yOrg; end; end; procedure MirrorCopyRect(Canvas: TCanvas; dstRect: TRect; Bitmap: TBitmap; srcRect: TRect; Horz, Vert: Boolean); var T: Integer; begin IntersectRect(srcRect, srcRect, Rect(0, 0, Bitmap.Width, Bitmap.Height)); if Horz then begin T := dstRect.Left; dstRect.Left := dstRect.Right+1; dstRect.Right := T-1; end; if Vert then begin T := dstRect.Top; dstRect.Top := dstRect.Bottom+1; dstRect.Bottom := T-1; end; SetStretchBltMode(Canvas.Handle, HALFTONE); StretchBlt(Canvas.Handle, dstRect.Left, dstRect.Top, dstRect.Right - dstRect.Left, dstRect.Bottom - dstRect.Top, Bitmap.Canvas.Handle, srcRect.Left, srcRect.Top, srcRect.Right - srcRect.Left, srcRect.Bottom - srcRect.Top, SRCCOPY); end; function CreateBarRgn(X, Y, W, H: Integer; XMode, YMode: Integer): HRGN; const Bar_Count = 50; var X1, Y1, D: Integer; ComplexRgn: TComplexRegion; begin D := (Min(W, H) div Bar_Count) + 1; if IEGlobalSettings().TransitionsDrawAlternative then D := (Min(W, H) div Bar_Count * 4) + 1; ComplexRgn := TComplexRegion.Create; try if X <= W then Y1 := 0 else Y1 := D; while Y1 < H + D do begin if X > W then begin if XMode in [1, 4] then ComplexRgn.AddRect(2 * W - X, Y1, W, Y1 + D) else if XMode in [2, 5] then ComplexRgn.AddRect(0, Y1, X - W, Y1 + D); ComplexRgn.AddRect(0, Y1 - D, W, Y1); end else begin if XMode in [1, 5] then ComplexRgn.AddRect(W - X, Y1, W, Y1 + D) else if XMode in [2, 4] then ComplexRgn.AddRect(0, Y1, X, Y1 + D) else if XMode = 3 then begin ComplexRgn.AddRect(0, Y1 + D, X, Y1 + D + D); ComplexRgn.AddRect(W - X, Y1, W, Y1 + D); end; end; Inc(Y1, 2 * D); end; if Y <= H then X1 := 0 else X1 := D; while X1 < W + D do begin if Y > H then begin if YMode in [1, 4] then ComplexRgn.AddRect(X1, 2 * H - Y, X1 + D, H) else if YMode in [2, 5] then ComplexRgn.AddRect(X1, 0, X1 + D, Y - H); ComplexRgn.AddRect(X1 - D, 0, X1, H); end else begin if YMode in [1, 5] then ComplexRgn.AddRect(X1, H - Y, X1 + D, H) else if YMode in [2, 4] then ComplexRgn.AddRect(X1, 0, X1 + D, Y) else if YMode = 3 then begin ComplexRgn.AddRect(X1, H - Y, X1 + D, H); ComplexRgn.AddRect(X1 + D, 0, X1 + D + D, Y); end; end; Inc(X1, 2 * D); end; Result := ComplexRgn.CreateRegion; finally ComplexRgn.Free; end; end; function CreatePolygonRgnEx(const Pts: array of Integer): HRGN; begin Result := CreatePolygonRgn(Pts, (High(Pts) - Low(Pts) + 1) shr 1, WINDING); end; function CreatePourRgn(X, Y, W, H, XMode, YMode: Integer): HRGN; const Shred_Value = 200; var X1, Y1, mW, mH, WD, HD, N, R, mR, D: Integer; ComplexRegion: TComplexRegion; begin ComplexRegion := TComplexRegion.Create; try D := (Min(W, H) div Shred_Value) + 1; if IEGlobalSettings().TransitionsDrawAlternative then D := (Min(W, H) div Shred_Value * 2) + 1; WD := W mod D; HD := H mod D; mW := W div 2; mH := H div 2; if XMode <> 0 then begin if X < W then N := W div 10 else N := 0; Y1 := 0; while Y1 < H do begin R := X + (Random(2 * N) - N); if XMode = 1 then ComplexRegion.AddRect(W - R, Y1, W, Y1 + D + HD) else if XMode = 2 then ComplexRegion.AddRect(0, Y1, R, Y1 + D + HD) else if XMode = 3 then begin mR := R div 2; ComplexRegion.AddRect(mW - mR, Y1, mW, Y1 + D + HD); ComplexRegion.AddRect(mW, Y1, mW + mR, Y1 + D + HD); end else begin mR := R div 2; ComplexRegion.AddRect(W - mR, Y1, W, Y1 + D + HD); ComplexRegion.AddRect(0, Y1, mR, Y1 + D + HD); end; Inc(Y1, D); end; end; if YMode <> 0 then begin if Y < H then N := H div 10 else N := 0; X1 := 0; while X1 < W do begin R := Y + Random(2 * N) - N; if YMode = 1 then ComplexRegion.AddRect(X1, H - R, X1 + D + WD, H) else if YMode = 2 then ComplexRegion.AddRect(X1, 0, X1 + D + WD, R) else if YMode = 3 then begin mR := R div 2; ComplexRegion.AddRect(X1, mH - mR, X1 + D + WD, mH); ComplexRegion.AddRect(X1, mH, X1 + D + WD, mH + mR); end else begin mR := R div 2; ComplexRegion.AddRect(X1, H - mR, X1 + D + WD, H); ComplexRegion.AddRect(X1, 0, X1 + D + WD, mR); end; Inc(X1, D); end; end; Result := ComplexRegion.CreateRegion; finally ComplexRegion.Free; end; end; function CreateSwarmRgn(X, Y, W, H, XMode, YMode: Integer): HRGN; var X1, Y1, N, M, I, C, L, S: Integer; ComplexRegion: TComplexRegion; begin ComplexRegion := TComplexRegion.Create; try if XMode <> 0 then begin if X < W then N := W div 10 else N := 0; M := N div 20; if IEGlobalSettings().TransitionsDrawAlternative then M := N div 40; if M < 2 then M := 2; S := M div 2; L := N div M; C := (3 * N) div (4 * M); Y1 := 0; while Y1 < H do begin if XMode = 1 then begin ComplexRegion.AddRect(W - X, Y1, W, Y1 + M); for I := L downto 1 do if Random(I) <= Ord(I <= C) then begin X1 := (W - X) - (I * M); ComplexRegion.AddRect(X1, Y1, X1 + M, Y1 + M); end; end else begin ComplexRegion.AddRect(0, Y1, X, Y1 + M); for I := L downto 1 do if Random(I) <= Ord(I <= C) then begin X1 := X + (I * M); ComplexRegion.AddRect(X1 - M, Y1, X1, Y1 + M); end; end; Inc(Y1, S); end; end; if YMode <> 0 then begin if Y < H then N := H div 10 else N := 0; M := N div 20; if IEGlobalSettings().TransitionsDrawAlternative then M := N div 40; if M < 2 then M := 2; S := M div 2; L := N div M; C := (3 * N) div (4 * M); X1 := 0; while X1 < W do begin if YMode = 1 then begin ComplexRegion.AddRect(X1, H - Y, X1 + M, H); for I := L downto 1 do if Random(I) <= Ord(I <= C) then begin Y1 := (H - Y) - (I * M); ComplexRegion.AddRect(X1, Y1, X1 + M, Y1 + M); end; end else begin ComplexRegion.AddRect(X1, 0, X1 + M, Y); for I := N div M downto 1 do if Random(I) <= Ord(I <= C) then begin Y1 := Y + (I * M); ComplexRegion.AddRect(X1, Y1 - M, X1 + M, Y1); end; end; Inc(X1, S); end; end; Result := ComplexRegion.CreateRegion; finally ComplexRegion.Free; end; end; function CreateSliceRgn(mX, mY, Radius: Integer; StartAngle, EndAngle: Extended; NumPts: Integer; bFromTop : Boolean): HRGN; var Pts, Pt: PPoint; Sin, Cos, Delta: Extended; I: Integer; begin if NumPts < 1 then NumPts := 1; GetMem(Pts, (NumPts + 1) * SizeOf(TPoint)); try Pt := Pts; Pt.X := mX; Pt.Y := mY; Delta := (EndAngle - StartAngle) / NumPts; for I := 1 to NumPts do begin Inc(Pt); SinCos(StartAngle, Sin, Cos); if bFromTop then begin Pt.X := mX + Round(Radius * Cos); Pt.Y := mY + Round(Radius * Sin); end else begin Pt.X := mX - Round(Radius * Cos); Pt.Y := mY - Round(Radius * Sin); end; StartAngle := StartAngle + Delta; end; Result := CreatePolygonRgn(Pts^, NumPts + 1, WINDING); finally FreeMem(Pts); end; end; { Randomization } const Max_Random_List = 30; var gRandomList : Array [0..Max_Random_List - 1 ] of Integer; // Generates a randomized index of values between 0 and iMax. Call to initialize before using GetRandomListIndex procedure InitializeRandomList(iMax: Integer); var I: Integer; iDone: Integer; iRandom: Integer; begin if iMax > Max_Random_List - 1 then raise EIEException.create('Too large for random array'); Randomize; for I := 0 to iMax do gRandomList[i] := -1; iDone := 0; while iDone <= iMax do begin iRandom := Random(iMax + 1); if gRandomList[iRandom] = -1 then begin gRandomList[iRandom] := iDone; inc(iDone); end; end; end; // Converts a zero-based value to a random one function GetRandomListIndex(Index : Integer) : Integer; begin Result := gRandomList[Index]; end; { Text Handling } function BitmapToRegion(Bitmap: TBitmap; iLeft, iTop, iWidth, iHeight: Integer; cTransparentColor : TColor): HRGN; type TPixels24 = array[0..0] of TRGBTriple; var Pixels: Pointer; NewRectLeft: Integer; X, Y: Integer; ComplexRegion: TComplexRegion; HorzScale, VertScale : Double; bIsTransparent : Boolean; R, G, B : Byte; procedure AddRect(LastCol: Boolean = False); var iBottom: Integer; begin if LastCol then Inc( X ); iBottom := Y + 1; ComplexRegion.AddRect(iLeft + Trunc(NewRectLeft * HorzScale), iTop + Trunc(Y * VertScale), iLeft + Trunc(X * HorzScale), iTop + Trunc(iBottom * VertScale)); NewRectLeft := -1; end; begin HorzScale := iWidth / Bitmap.Width; VertScale := iHeight / Bitmap.Height; ComplexRegion := TComplexRegion.Create; try R := GetRValue(cTransparentColor); G := GetGValue(cTransparentColor); B := GetBValue(cTransparentColor); for Y := 0 to Bitmap.Height - 1 do begin Pixels := Bitmap.ScanLine[ Y ]; NewRectLeft := -1; for X := 0 to Bitmap.Width - 1 do begin bIsTransparent := ( TPixels24( Pixels^ )[ X ].rgbtRed = R ) and ( TPixels24( Pixels^ )[ X ].rgbtGreen = G ) and ( TPixels24( Pixels^ )[ X ].rgbtBlue = B ); if bIsTransparent then begin if NewRectLeft >= 0 then AddRect; end else begin if NewRectLeft = -1 then NewRectLeft := X; if ( X = Bitmap.Width - 1 ) and ( NewRectLeft >= 0 ) then AddRect( True ); end; end; end; Result := ComplexRegion.CreateRegion; finally ComplexRegion.Free; end; end; function TextToBitmap(const Text : string; iBitmapHeight : Integer; const sFontName : string; cFontColor : TColor; Style : TFontStyles; cBackground : TColor = clWhite; Angle : Integer = 0; bAntiAlias : Boolean = True; bIncludeLeading : Boolean = True ): TBitmap; var LogFont : TLogFont; AnExtent : TSize; AFontHandle : HFont; begin Result := TBitmap.create; Result.Canvas.Font.Name := sFontName; Result.Canvas.Font.Color := cFontColor; Result.Canvas.Font.Style := Style; if bIncludeLeading then Result.Canvas.Font.Height := iBitmapHeight else Result.Canvas.Font.Height := -1 * iBitmapHeight; GetObject(Result.Canvas.Font.Handle, SizeOf(TLogFont), @LogFont); LogFont.lfEscapement := Angle * 10; LogFont.lfOrientation := Angle * 10; if bAntiAlias then LogFont.lfQuality := ANTIALIASED_QUALITY else LogFont.lfQuality := NONANTIALIASED_QUALITY; AFontHandle := CreateFontIndirect(LogFont); Result.Canvas.Font.Handle := AFontHandle; AnExtent := Result.Canvas.TextExtent(Text); Result.Width := AnExtent.cx; Result.Height := AnExtent.cy; Result.Canvas.Brush.Color := cBackground; Result.Canvas.FillRect(Rect(0, 0, Result.Width, Result.Height)); Result.Canvas.Brush.Style := bsClear; Result.Canvas.TextOut(0, 0, Text); end; // iDisplayStart should be 0 if we can start rotating the text immediately // iDisplayEnd should be 100 if we can continue rotating the text all the way to the end function CreateRegionFromLetter(ARect: TRect; Progress : Integer; iDisplayStart, iDisplayEnd : Integer; bForceWholeWord : Boolean = False; bIncludeLeading : Boolean = True): Hrgn; const Font_Color = clBlack; Transparent_Color = clWhite; var Bitmap: TBitmap; iLeft, iTop, iWidth, iHeight: Integer; iQuality: Word; sText, sLetter: string; iLength, iLetter: Integer; iDisplayPeriod, iPeriodProgress: Integer; begin if IEGlobalSettings().WordTransitionParams.Word = '' then IEGlobalSettings().WordTransitionParams.Word := 'A'; if IEGlobalSettings().WordTransitionParams.FontName = '' then IEGlobalSettings().WordTransitionParams.FontName := 'Arial'; if IEGlobalSettings().WordTransitionParams.Quality < 10 then IEGlobalSettings().WordTransitionParams.Quality := 200; // GET THE LETTER TO DISPLAY sText := IEGlobalSettings().WordTransitionParams.Word; iLength := Length(sText); // Support small text strings enclosed in quotes if (iLength > 1) and (sText[1] = '"') and (sText[iLength] = '"') then begin Delete(sText, iLength, 1); Delete(sText, 1, 1); iLength := 1; // Process as if one character if sText = '' then sText := 'X'; end; // Single letter? if bForceWholeWord or (iLength = 1) then sLetter := sText else // In initial "hard to read" period if Progress <= iDisplayStart then sLetter := sText[1] else // in ending "hard to read" period if Progress >= iDisplayEnd then sLetter := sText[iLength] else begin // In rotating text period iDisplayPeriod := iDisplayEnd - iDisplayStart; iPeriodProgress := Progress - iDisplayStart; iLetter := Trunc(iPeriodProgress / iDisplayPeriod * iLength) + 1; sLetter := sText[iLetter]; end; // GET A BITMAP OF OUR LETTER iHeight := ARect.Bottom - ARect.Top; iQuality := IEGlobalSettings().WordTransitionParams.Quality; if iQuality > iHeight then iQuality := iHeight; Bitmap := TextToBitmap(sLetter, iQuality, IEGlobalSettings().WordTransitionParams.FontName, Font_Color, IEGlobalSettings().WordTransitionParams.Style, Transparent_Color, 0, False, bIncludeLeading); try Bitmap.PixelFormat := pf24bit; // Maintain aspect ratio of Letter ARect := GetImageRectWithinArea(Bitmap.Width, Bitmap.Height, ARect); iLeft := ARect.Left; iTop := ARect.Top; iHeight := ARect.Bottom - ARect.Top; iWidth := Round(Bitmap.Width / Bitmap.Height * iHeight); // CONVERT THE LETTER BITMAP TO A REGION Result := BitmapToRegion(Bitmap, iLeft, iTop, iWidth, iHeight, clWhite); finally Bitmap.Free; end; end; { Transition Effects } // Slide in from left procedure SlideInFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, X - W, 0, W, H, Image.Canvas.Handle, 0, 0, SRCCOPY); end; // Slide in from right procedure SlideInFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, W - X, 0, W, H, Image.Canvas.Handle, 0, 0, SRCCOPY); end; // Slide in from top procedure SlideInFromTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, 0, Y - H, W, H, Image.Canvas.Handle, 0, 0, SRCCOPY); end; // Slide in from bottom procedure SlideInFromBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, 0, H - Y, W, H, Image.Canvas.Handle, 0, 0, SRCCOPY); end; // Reveal out from middle procedure WipeOutFromVerticalCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mWX: Integer; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mWX := (W - X) div 2; BitBlt(DestCanvas.Handle, mWX, 0, X, H, Image.Canvas.Handle, mWX, 0, SRCCOPY); end; // Reveal in from sides procedure WipeInFromSidesEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mX: Integer; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mX := X div 2; BitBlt(DestCanvas.Handle, 0, 0, mX, H, Image.Canvas.Handle, 0, 0, SRCCOPY); BitBlt(DestCanvas.Handle, W - mX, 0, mX, H, Image.Canvas.Handle, W - mX, 0, SRCCOPY); end; // Unroll from left // 24bit verson procedure UnrollFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; R1, R2: TRect; begin CalcParams(ARect, Progress, W, H, X, Y); R1 := ARect; R2 := ARect; R1.Left := X; if R1.Left < W div 5 then R1.Right := R1.Left + X div 2 else if (R1.Left + W div 5) > W then R1.Right := R1.Left + (W - X) div 2 else R1.Right := R1.Left + W div 10; R2.Left := R1.Right; R2.Right := R2.Left + R1.Right - R1.Left; MirrorCopyRect(DestCanvas, R1, Image, R2, True, False); R1.Left := 0; R1.Right := X; R2.Left := 0; R2.Right := X; DestCanvas.CopyRect(R1, Image.Canvas, R2); end; // Unroll from right // 24bit verson procedure UnrollFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; R1, R2: TRect; begin CalcParams(ARect, Progress, W, H, X, Y); R1 := ARect; R2 := ARect; R1.Right := W - X; if (R1.Right + W div 5) > W then R1.Left := R1.Right - X div 2 else if R1.Right < W div 5 then R1.Left := R1.Right - (W - X) div 2 else R1.Left := R1.Right - W div 10; R2.Right := R1.Left; R2.Left := R2.Right - R1.Right + R1.Left; MirrorCopyRect(DestCanvas, R1, Image, R2, True, False); R1.Left := W - X; R1.Right := W; R2.Left := W - X; R2.Right := W; DestCanvas.CopyRect(R1, Image.Canvas, R2); end; // Unroll from top // 24bit verson procedure UnrollFromTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; R1, R2: TRect; begin CalcParams(ARect, Progress, W, H, X, Y); R1 := ARect; R2 := ARect; R1.Top := Y; if R1.Top < H div 5 then R1.Bottom := R1.Top + Y div 2 else if (R1.Top + H div 5) > H then R1.Bottom := R1.Top + (H - Y) div 2 else R1.Bottom := R1.Top + H div 10; R2.Top := R1.Bottom; R2.Bottom := R2.Top + R1.Bottom - R1.Top; MirrorCopyRect(DestCanvas, R1, Image, R2, False, True); R1.Top := 0; R1.Bottom := Y; R2.Top := 0; R2.Bottom := Y; DestCanvas.CopyRect(R1, Image.Canvas, R2); end; // Unroll from bottom // 24bit verson procedure UnrollFromBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; R1, R2: TRect; begin CalcParams(ARect, Progress, W, H, X, Y); R1 := ARect; R2 := ARect; R1.Bottom := H - Y; if (R1.Bottom + H div 5) > H then R1.Top := R1.Bottom - Y div 2 else if R1.Bottom < H div 5 then R1.Top := R1.Bottom - (H - Y) div 2 else R1.Top := R1.Bottom - H div 10; R2.Bottom := R1.Top; R2.Top := R2.Bottom - R1.Bottom + R1.Top; MirrorCopyRect(DestCanvas, R1, Image, R2, False, True); R1.Top := H - Y; R1.Bottom := H; R2.Top := H - Y; R2.Bottom := H; DestCanvas.CopyRect(R1, Image.Canvas, R2); end; // Build up from left procedure BuildUpFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var N: Integer; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, W - X, 0, X, H, Image.Canvas.Handle, W - X, 0, SRCCOPY); N := Max((W - X) - (W div 10), 0); StretchBlt(DestCanvas.Handle, 0, 0, W - X, H, Image.Canvas.Handle, N, 0, W - X - N, H, SRCCOPY); end; // Build up from right procedure BuildUpFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var N: Integer; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, 0, 0, X, H, Image.Canvas.Handle, 0, 0, SRCCOPY); N := Min(W - X, W div 10); StretchBlt(DestCanvas.Handle, X, 0, W - X, H, Image.Canvas.Handle, X, 0, N, H, SRCCOPY); end; // Expand in from top procedure BuildUpFromTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var N: Integer; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, 0, H - Y, W, Y, Image.Canvas.Handle, 0, H - Y, SRCCOPY); N := Max((H - Y) - H div 10, 0); StretchBlt(DestCanvas.Handle, 0, 0, W, H - Y, Image.Canvas.Handle, 0, N, W, H - Y - N, SRCCOPY); end; // Expand from bottom procedure BuildUpFromBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var N: Integer; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, 0, 0, W, Y, Image.Canvas.Handle, 0, 0, SRCCOPY); N := Min(H - Y, H div 10); StretchBlt(DestCanvas.Handle, 0, Y, W, H - Y, Image.Canvas.Handle, 0, Y, W, N, SRCCOPY); end; // Expand from left procedure ExpandFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); if IEGlobalSettings().TransitionsDrawAlternative then BitBlt(DestCanvas.Handle, 0, 0, W, H, Screen.Canvas.Handle, 0, 0, SRCCOPY); StretchBlt(DestCanvas.Handle, 0, 0, X, H, Image.Canvas.Handle, 0, 0, W, H, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative then ColorBlend(DestCanvas.Handle, Rect(X, 0, W, H), clBlack, 100 - SQR(10 - Progress div 10)); end; // Expand from right procedure ExpandFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); if IEGlobalSettings().TransitionsDrawAlternative then BitBlt(DestCanvas.Handle, 0, 0, W, H, Screen.Canvas.Handle, 0, 0, SRCCOPY); StretchBlt(DestCanvas.Handle, W - X, 0, X, H, Image.Canvas.Handle, 0, 0, W, H, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative then ColorBlend(DestCanvas.Handle, Rect(0, 0, W - X, H), clBlack, 100 - SQR(10 - Progress div 10)); end; // Expand from top procedure ExpandFromTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); if IEGlobalSettings().TransitionsDrawAlternative then BitBlt(DestCanvas.Handle, 0, 0, W, H, Screen.Canvas.Handle, 0, 0, SRCCOPY); StretchBlt(DestCanvas.Handle, 0, 0, W, Y, Image.Canvas.Handle, 0, 0, W, H, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative then ColorBlend(DestCanvas.Handle, Rect(0, Y, W, H), clBlack, 100 - SQR(10 - Progress div 10)); end; // Expand from bottom procedure ExpandFromBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); if IEGlobalSettings().TransitionsDrawAlternative then BitBlt(DestCanvas.Handle, 0, 0, W, H, Screen.Canvas.Handle, 0, 0, SRCCOPY); StretchBlt(DestCanvas.Handle, 0, H - Y, W, Y, Image.Canvas.Handle, 0, 0, W, H, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative then ColorBlend(DestCanvas.Handle, Rect(0, 0, W, H), clBlack, 100 - SQR(10 - Progress div 10)); end; // Expand from top left procedure ExpandFromTopLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, 0, 0, X, Y, Image.Canvas.Handle, 0, 0, W, H, SRCCOPY); end; // Expand from top right procedure ExpandFromTopRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, W - X, 0, X, Y, Image.Canvas.Handle, 0, 0, W, H, SRCCOPY); end; // Expand from bottom left procedure ExpandFromBottomLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, 0, H - Y, X, Y, Image.Canvas.Handle, 0, 0, W, H, SRCCOPY); end; // Expand from bottom right procedure ExpandFromBottomRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, W - X, H - Y, X, Y, Image.Canvas.Handle, 0, 0, W, H, SRCCOPY); end; // Expand in from left procedure ExpandInFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, X - W, 0, (2 * W) - X, H, Image.Canvas.Handle, W - X, 0, X, H, SRCCOPY); end; // Expand in from right procedure ExpandInFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, 0, 0, (2 * W) - X, H, Image.Canvas.Handle, 0, 0, X, H, SRCCOPY); end; // Expand in from top procedure ExpandInFromTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, 0, Y - H, W, (2 * H) - Y, Image.Canvas.Handle, 0, H - Y, W, Y, SRCCOPY); end; // Expand in from bottom procedure ExpandInFromBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, 0, 0, W, (2 * H) - Y, Image.Canvas.Handle, 0, 0, W, Y, SRCCOPY); end; // Expand in to middle (horiz) procedure ExpandInToHorizonEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, 0, Y - H, W, (3 * H) - (2 * Y), Image.Canvas.Handle, 0, (H - Y) div 2, W, Y, SRCCOPY); end; // Expand in from top / bottom procedure ExpandInFromTopAndBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mY, mH: Integer; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mY := Y div 2; mH := H div 2; StretchBlt(DestCanvas.Handle, 0, 0, W, mY, Image.Canvas.Handle, 0, 0, W, mH, SRCCOPY); StretchBlt(DestCanvas.Handle, 0, H - mY, W, mY, Image.Canvas.Handle, 0, mH, W, mH, SRCCOPY); end; // Expand in to middle procedure ExpandInToVerticalCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, X - W, 0, (3 * W) - (2 * X), H, Image.Canvas.Handle, (W - X) div 2, 0, X, H, SRCCOPY); end; // Expand in from sides procedure ExpandInFromSidesEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mX, mW: Integer; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mX := X div 2; mW := W div 2; StretchBlt(DestCanvas.Handle, 0, 0, mX, H, Image.Canvas.Handle, 0, 0, mW, H, SRCCOPY); StretchBlt(DestCanvas.Handle, W - mX, 0, mX, H, Image.Canvas.Handle, mW, 0, mW, H, SRCCOPY); end; // Expand out from middle (horiz) procedure ExpandOutFromHorizonEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, 0, (H - Y) div 2, W, Y, Image.Canvas.Handle, 0, 0, W, H, SRCCOPY); end; // Expand out from middle procedure ExpandOutFromVerticalCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, (W - X) div 2, 0, X, H, Image.Canvas.Handle, 0, 0, W, H, SRCCOPY); end; // Reveal from middle (horiz) procedure WipeFromHorizonEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mHY: Integer; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mHY := (H - Y) div 2; BitBlt(DestCanvas.Handle, 0, mHY, W, Y, Image.Canvas.Handle, 0, mHY, SRCCOPY); end; // Slide in from top / bottom procedure WipeInFromTopAndBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mY: Integer; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mY := Y div 2; BitBlt(DestCanvas.Handle, 0, 0, W, mY, Image.Canvas.Handle, 0, 0, SRCCOPY); BitBlt(DestCanvas.Handle, 0, H - mY, W, mY, Image.Canvas.Handle, 0, H - mY, SRCCOPY); end; // Reveal from top left procedure WipeFromTopLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, 0, 0, X, Y, Image.Canvas.Handle, 0, 0, SRCCOPY); end; // Reveal from bottom left procedure WipeFromBottomLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, 0, H - Y, X, Y, Image.Canvas.Handle, 0, H - Y, SRCCOPY); end; // Reveal from bottom right procedure WipeFromBottomRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, W - X, H - Y, X, Y, Image.Canvas.Handle, W - X, H - Y, SRCCOPY); end; // Reveal from top right procedure WipeFromTopRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); BitBlt(DestCanvas.Handle, W - X, 0, X, Y, Image.Canvas.Handle, W - X, 0, SRCCOPY); end; // Appear and Contract to top left procedure ShrinkToTopLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, 0, 0, (2 * W) - X, (2 * H) - Y, Image.Canvas.Handle, 0, 0, X, Y, SRCCOPY); end; // Appear and Contract to bottom left procedure ShrinkToBottomLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, 0, Y - H, (2 * W) - X, (2 * H) - Y, Image.Canvas.Handle, 0, H - Y, X, Y, SRCCOPY); end; // Appear and Contract to bottom right procedure ShrinkToBottomRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, X - W, Y - H, (2 * W) - X, (2 * H) - Y, Image.Canvas.Handle, W - X, H - Y, X, Y, SRCCOPY); end; // Appear and Contract to top right procedure ShrinkToTopRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, X - W, 0, (2 * W) - X, (2 * H) - Y, Image.Canvas.Handle, W - X, 0, X, Y, SRCCOPY); end; // Appear and Contract to middle procedure ShrinkToCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); StretchBlt(DestCanvas.Handle, X - W, Y - H, (3 * W) - (2 * X), (3 * H) - (2 * Y), Image.Canvas.Handle, (W - X) div 2, (H - Y) div 2, X, Y, SRCCOPY); end; // Quarters Reveal in to middle procedure QuartersWipeInToCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mX, mY: Integer; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mX := X div 2; mY := Y div 2; BitBlt(DestCanvas.Handle, 0, 0, mX, mY, Image.Canvas.Handle, 0, 0, SRCCOPY); BitBlt(DestCanvas.Handle, 0, H - mY, mX, mY, Image.Canvas.Handle, 0, H - mY, SRCCOPY); BitBlt(DestCanvas.Handle, W - mX, H - mY, mX, mY, Image.Canvas.Handle, W - mX, H - mY, SRCCOPY); BitBlt(DestCanvas.Handle, W - mX, 0, mX, mY, Image.Canvas.Handle, W - mX, 0, SRCCOPY); end; // Quarters Expand to middle procedure QuartersExpandToCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mX, mY, mW, mH: Integer; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mX := X div 2; mY := Y div 2; mW := W div 2; mH := H div 2; StretchBlt(DestCanvas.Handle, 0, 0, mX, mY, Image.Canvas.Handle, 0, 0, mW, mH, SRCCOPY); StretchBlt(DestCanvas.Handle, 0, H - mY, mX, mY, Image.Canvas.Handle, 0, mH, mW, mH, SRCCOPY); StretchBlt(DestCanvas.Handle, W - mX, H - mY, mX, mY, Image.Canvas.Handle, mW, mH, mW, mH, SRCCOPY); StretchBlt(DestCanvas.Handle, W - mX, 0, mX, mY, Image.Canvas.Handle, mW, 0, mW, mH, SRCCOPY); end; // Quarters Slide in to middle procedure QuartersSlideInToCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mX, mY, mW, mH: Integer; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mX := X div 2; mY := Y div 2; mW := W div 2; mH := H div 2; BitBlt(DestCanvas.Handle, mX - mW, 0, mW, mH, Image.Canvas.Handle, 0, 0, SRCCOPY); BitBlt(DestCanvas.Handle, mW, mY - mH, mW, mH, Image.Canvas.Handle, mW, 0, SRCCOPY); BitBlt(DestCanvas.Handle, W - mX, mH, mW, mH, Image.Canvas.Handle, mW, mH, SRCCOPY); BitBlt(DestCanvas.Handle, 0, H - mY, mW, mH, Image.Canvas.Handle, 0, mH, SRCCOPY); end; // Curved Reveal from left procedure CurvedWipeFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateRoundRectRgn(-2 * W, 0, 2 * X, H + 1, 2 * W, 2 * W); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Curved Reveal from right procedure CurvedWipeFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateRoundRectRgn(W - 2 * X, 0, 3 * W, H + 1, 2 * W, 2 * W); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Curved Reveal from top procedure CurvedWipeFromTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateRoundRectRgn(0, -2 * H, W + 1, 2 * Y, 2 * H, 2 * H); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Curved Reveal from bottom procedure CurvedWipeFromBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateRoundRectRgn(0, H - 2 * Y, W + 1, 3 * H, 2 * H, 2 * H); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Curved reveal from top left procedure CurvedWipeFromTopLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateRoundRectRgn(-W, -H, 3 * X div 2, 3 * Y div 2, 2 * W, 2 * H); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Curved reveal from top right procedure CurvedWipeFromTopRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateRoundRectRgn(W - 3 * X div 2, -H, 2 * W, 3 * Y div 2, 2 * W, 2 * H); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Curved reveal from bottom left procedure CurvedWipeFromBottomLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateRoundRectRgn(-W, H - 3 * Y div 2, 3 * X div 2, 2 * H, 2 * W, 2 * H); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Curved reveal from bottom right procedure CurvedWipeFromBottomRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateRoundRectRgn(W - 3 * X div 2, H - 3 * Y div 2, 2 * W, 2 * H, 2 * W, 2 * H); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; procedure DoWipeEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; AShape: TIEShape; bReverse: Boolean; rScale: Single = 1; Angle: Integer = 0); var mW, mH: Integer; Rgn, TmpRgn: HRGN; W, H, X, Y: Integer; iScaledX, iScaledY: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; mH := H div 2; if bReverse then begin Rgn := CreateRectRgn(0, 0, W, H); if AShape = iesTransCircularShape then TmpRgn := CreateRoundRectRgn(X - mW, Y - mH, 3 * mW - X, 3 * mH - Y, 9 * (W - X) div 5, 9 * (H - Y) div 5) else if (rScale <> 1) or (AShape = iesTransLetter) then begin iScaledX := Round(rScale * (W - X)) div 2; iScaledY := Round(rScale * (H - Y)) div 2; if AShape = iesTransLetter then TmpRgn := CreateRegionFromLetter(Rect(X - mW - iScaledX, Y - mH - iScaledY, 3 * mW - X + iScaledX, 3 * mH - Y + iScaledY), Progress, 60, 100) else TmpRgn := IECreateShapeRegion(AShape, Rect(X - mW - iScaledX, Y - mH - iScaledY, 3 * mW - X + iScaledX, 3 * mH - Y + iScaledY), iebDefault, Angle) end else TmpRgn := IECreateShapeRegion(AShape, Rect(X - mW, Y - mH, 3 * mW - X, 3 * mH - Y), iebDefault, Angle); CombineRgn(Rgn, Rgn, TmpRgn, RGN_XOR); DeleteObject(TmpRgn) end else begin if AShape = iesTransCircularShape then Rgn := CreateRoundRectRgn(mW - X, mH - Y, mW + X, mH + Y, 9 * X div 5, 9 * Y div 5) else if (rScale <> 1) or (AShape = iesTransLetter) then begin iScaledX := Round(rScale * X); iScaledY := Round(rScale * Y); if AShape = iesTransLetter then Rgn := CreateRegionFromLetter(Rect(mW - iScaledX, mH - iScaledY, mW + iScaledX, mH + iScaledY), Progress, 0, 60) else Rgn := IECreateShapeRegion(AShape, Rect(mW - iScaledX, mH - iScaledY, mW + iScaledX, mH + iScaledY), iebDefault, Angle) end else Rgn := IECreateShapeRegion(AShape, Rect(mW - X, mH - Y, mW + X, mH + Y), iebDefault, Angle); end; try if (AShape = iesCross) or (AShape = iesTransLetter) or (AShape = iesDoubleHeart) then BitBlt(DestCanvas.Handle, 0, 0, W, H, Screen.Canvas.Handle, 0, 0, SRCCOPY); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); finally DeleteObject(Rgn); end; end; // Circular Wipe from Center procedure CircularWipeFromCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesTransCircularShape, False); end; // Circular Wipe to Center procedure CircularWipeToCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesTransCircularShape, True); end; // Heart Wipe from Center procedure HeartWipeOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin if IEGlobalSettings().TransitionsDrawAlternative then DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesDoubleHeart, False, 1.3) else DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesHeart, False, 1.3) end; // Heart Wipe to Center procedure HeartWipeInEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin if IEGlobalSettings().TransitionsDrawAlternative then DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesDoubleHeart, True, 1.3) else DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesHeart, True, 1.3) end; // 5 Point Star Wipe from Center procedure Star5WipeOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesStar5, False, 1.6); end; // 5 Point Star Wipe to Center procedure Star5WipeInEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesStar5, True, 1.6); end; // 6 Point Star Wipe from Center procedure Star6WipeOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Angle: Integer; begin Angle := 0; if IEGlobalSettings().TransitionsDrawAlternative then Angle := 90; DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, IEGlobalSettings().TransitionsDrawShape, False, 1.3, Angle); end; // 6 Point Star Wipe to Center procedure Star6WipeInEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Angle: Integer; begin Angle := 0; if IEGlobalSettings().TransitionsDrawAlternative then Angle := 90; DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, IEGlobalSettings().TransitionsDrawShape, True, 1.3, Angle); end; // Word Wipe from Center procedure WordWipeOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var rSize: Single; begin rSize := 3; if IEGlobalSettings().TransitionsDrawAlternative then rSize := 6; DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesTransLetter, False, rSize); end; // Word Wipe to Center procedure WordWipeInEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var rSize: Single; begin rSize := 3; if IEGlobalSettings().TransitionsDrawAlternative then rSize := 6; DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesTransLetter, True, rSize); end; // Explosion Wipe from Center procedure ExplosionWipeOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Angle: Integer; begin Angle := 0; if IEGlobalSettings().TransitionsDrawAlternative then Angle := 180; DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesExplosion, False, 0, Angle ); end; // Explosion Wipe to Center procedure ExplosionWipeInEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Angle: Integer; begin Angle := 0; if IEGlobalSettings().TransitionsDrawAlternative then Angle := 180; DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesExplosion, True, 0, Angle ); end; // Cross Wipe from Center procedure CrossWipeOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesCross, False, 3.6); end; // Cross Wipe to Center procedure CrossWipeInEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoWipeEffect(DestCanvas, Screen, Image, ARect, Progress, iesCross, True, 3.5); end; // Bars in from left procedure BarsInFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 0, W, H, 2, 0); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Bars in from right procedure BarsInFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 0, W, H, 1, 0); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Bars right then left procedure BarsRightThenLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 0, W, H, 5, 0); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Bars left then right procedure BarsLeftThenRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 0, W, H, 4, 0); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Bars from both sides procedure BarsFromBothSidesEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(X, 0, W, H, 3, 0); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Bars from top procedure BarsFromTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(0, 2 * Y, W, H, 0, 2); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Bars from bottom procedure BarsFromBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(0, 2 * Y, W, H, 0, 1); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Bars top then bottom procedure BarsTopThenBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(0, 2 * Y, W, H, 0, 4); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Bars from top and bottom procedure BarsFromTopAndBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(0, Y, W, H, 0, 3); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Bars bottom then top procedure BarsBottomThenTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(0, 2 * Y, W, H, 0, 5); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal from top left procedure CrisscrossWipeFromTopLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 2 * Y, W, H, 2, 2); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal from top right procedure CrisscrossWipeFromTopRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 2 * Y, W, H, 1, 2); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal from bottom left procedure CrisscrossWipeFromBottomLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 2 * Y, W, H, 2, 1); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal from bottom right procedure CrisscrossWipeFromBottomRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 2 * Y, W, H, 1, 1); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal bounce from top left procedure CrisscrossWipeBounceFromTopLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 2 * Y, W, H, 4, 4); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal bounce from bottom left procedure CrisscrossWipeBounceFromBottomLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 2 * Y, W, H, 4, 5); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal bounce from top right procedure CrisscrossWipeBounceFromTopRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 2 * Y, W, H, 5, 4); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal bounce from bottom right procedure CrisscrossWipeBounceFromBottomRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 2 * Y, W, H, 5, 5); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal from right top and bottom procedure CrisscrossWipeFromRightTopAndBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(X, Y, W, H, 1, 3); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal from left top and bottom procedure CrisscrossWipeFromLeftTopAndBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(X, Y, W, H, 2, 3); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal from left right and bottom procedure CrisscrossWipeFromLeftRightAndBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(X, Y, W, H, 3, 1); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal from left right and top procedure CrisscrossWipeFromLeftRightAndTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(X, Y, W, H, 3, 2); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal from top left right and bottom procedure CrisscrossWipeFromTopLeftRightAndBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(X, Y, W, H, 3, 3); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Criss Cross reveal from bottom left top right procedure CrisscrossWipeFromBottomLeftTopRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn, TmpRgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateBarRgn(2 * X, 2 * Y, W, H, 1, 1); TmpRgn := CreateBarRgn(2 * X, 2 * Y, W, H, 2, 2); CombineRgn(Rgn, Rgn, TmpRgn, RGN_AND); DeleteObject(TmpRgn); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from left procedure ShreddedFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, 0, W, H, 2, 0); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from right procedure ShreddedFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, 0, W, H, 1, 0); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from top procedure ShreddedFromTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(0, Y, W, H, 0, 2); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Unven shred from bottom procedure ShreddedFromBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(0, Y, W, H, 0, 1); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from top and left procedure ShreddedFromTopAndLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, Y, W, H, 2, 2); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from top and right procedure ShreddedFromTopAndRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, Y, W, H, 1, 2); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from bottom and left procedure ShreddedFromBottomAndLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, Y, W, H, 2, 1); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from bottom and right procedure ShreddedFromBottomAndRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, Y, W, H, 1, 1); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from horiz and left procedure ShreddedFromHorizonAndLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, Y, W, H, 2, 3); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from horiz and right procedure ShreddedFromHorizonAndRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, Y, W, H, 1, 3); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from bottom and vert middle procedure ShreddedFromBottomAndVerticalCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, Y, W, H, 3, 1); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from top and vert middle procedure ShreddedFromTopAndVerticalCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, Y, W, H, 3, 2); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from centre procedure ShreddedFromCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, Y, W, H, 3, 3); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred to centre procedure ShreddedToCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, Y, W, H, 4, 4); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred out from middle (horiz) procedure ShreddedOutFromVerticalCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, 0, W, H, 3, 0); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred in to middle (horiz) procedure ShreddedInToVerticalCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(X, 0, W, H, 4, 0); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred from horizon procedure ShreddedOutFromHorizonEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(0, Y, W, H, 0, 3); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven shred in to horizon procedure ShreddedInToHorizonEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePourRgn(0, Y, W, H, 0, 4); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Reveal diagonal from top left procedure WipeDiagonalFromTopLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePolygonRgnEx([0, 0, 2 * X, 0, 0, 2 * Y]); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Reveal diagonal from top right procedure WipeDiagonalFromTopRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePolygonRgnEx([W, 0, W - 2 * X, 0, W, 2 * Y]); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Reveal diagonal from bottom left procedure WipeDiagonalFromBottomLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePolygonRgnEx([0, H, 2 * X, H, 0, H - 2 * Y]); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Reveal diagonal from bottom right procedure WipeDiagonalFromBottomRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePolygonRgnEx([W, H, W - 2 * X, H, W, H - 2 * Y]); SelectClipRgn(DestCanvas.Handle, Rgn); DeleteObject(Rgn); DestCanvas.Draw(0, 0, Image); SelectClipRgn(DestCanvas.Handle, 0); end; // Diagonal sweep from top left bottom right clockwise procedure DiagonalSweepClockwiseEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn, TmpRgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePolygonRgnEx([W, 0, 0, 0, W, Y]); TmpRgn := CreatePolygonRgnEx([W, H, 0, H, 0, H - Y]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Diagonal sweep from top left bottom right anticlockwise procedure DiagonalSweepCounterClockwiseEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn, TmpRgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreatePolygonRgnEx([0, H, 0, 0, X, H]); TmpRgn := CreatePolygonRgnEx([W, H, W, 0, W - X, 0]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Starburst clockwise from center procedure StarburstClockwiseFromCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mW, mH: Integer; Rgn, TmpRgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; mH := H div 2; Rgn := CreatePolygonRgnEx([mW, mH, 0, 0, X, 0]); TmpRgn := CreatePolygonRgnEx([mW, mH, 0, H, 0, H - Y]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); TmpRgn := CreatePolygonRgnEx([mW, mH, W, H, W - X, H]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); TmpRgn := CreatePolygonRgnEx([mW, mH, W, 0, W, Y]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Starburst anticlockwise from center procedure StarburstCounterClockwiseFromCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mW, mH: Integer; Rgn, TmpRgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; mH := H div 2; Rgn := CreatePolygonRgnEx([mW, mH, 0, 0, 0, Y]); TmpRgn := CreatePolygonRgnEx([mW, mH, 0, H, X, H]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); TmpRgn := CreatePolygonRgnEx([mW, mH, W, H, W, H - Y]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); TmpRgn := CreatePolygonRgnEx([mW, mH, W, 0, W - X, 0]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Triangular shred procedure ExpandingTrianglesEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var sW, sH, dW, dH: Integer; Rgn, TmpRgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); sW := (W div 10) + 1; sH := (H div 10) + 1; dW := MulDiv(sW, Progress, 50); dH := MulDiv(sH, Progress, 50); Rgn := 0; X := 0; while X < W do begin Inc(X, sW); Y := 0; while Y < H + sH do begin Inc(Y, sH); if IEGlobalSettings().TransitionsDrawAlternative then TmpRgn := CreatePolygonRgnEx([X - dW, Y + dH, X, Y - dH, X + dW, Y + dH]) else TmpRgn := CreatePolygonRgnEx([X - dW, Y - dH, X, Y + dH, X + dW, Y - dH]); if Rgn <> 0 then begin CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); end else Rgn := TmpRgn; Inc(Y, sH); end; Inc(X, sW); end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Speckle appear from left procedure SpeckledWipeFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateSwarmRgn(X, Y, W, H, 2, 0); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Speckle appear from right procedure SpeckledWipeFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateSwarmRgn(X, Y, W, H, 1, 0); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Speckle appear from top procedure SpeckledWipeFromTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateSwarmRgn(X, Y, W, H, 0, 2); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Speckle appear from bottom procedure SpeckledWipeFromBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Rgn: HRGN; var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); Rgn := CreateSwarmRgn(X, Y, W, H, 0, 1); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Push and squeeze left procedure PushAndSqueezeLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); with DestCanvas do begin StretchBlt(Handle, 0, 0, W - X, H, Handle, 0, 0, W, H, SRCCOPY); BitBlt(Handle, W - X, 0, X, H, Image.Canvas.Handle, 0, 0, SRCCOPY); end; end; // Push and squeeze right procedure PushAndSqueezeRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); with DestCanvas do begin StretchBlt(Handle, X, 0, W - X, H, Handle, 0, 0, W, H, SRCCOPY); BitBlt(Handle, 0, 0, X, H, Image.Canvas.Handle, W - X, 0, SRCCOPY); end; end; // Push and sqeeze up procedure PushAndSqueezeUpEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); with DestCanvas do begin StretchBlt(Handle, 0, 0, W, H - Y, Handle, 0, 0, W, H, SRCCOPY); BitBlt(Handle, 0, H - Y, W, Y, Image.Canvas.Handle, 0, 0, SRCCOPY); end; end; // Push and sqeeze down procedure PushAndSqueezeDownEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); with DestCanvas do begin StretchBlt(Handle, 0, Y, W, H - Y, Handle, 0, 0, W, H, SRCCOPY); BitBlt(Handle, 0, 0, W, Y, Image.Canvas.Handle, 0, H - Y, SRCCOPY); end; end; // Push left procedure PushLeftAndSlideOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); with DestCanvas do begin BitBlt(Handle, 0, 0, W - X, H, Handle, X, 0, SRCCOPY); BitBlt(Handle, W - X, 0, X, H, Image.Canvas.Handle, 0, 0, SRCCOPY); end; end; // Push right procedure PushRightAndSlideOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); with DestCanvas do begin BitBlt(Handle, X, 0, W - X, H, Handle, 0, 0, SRCCOPY); BitBlt(Handle, 0, 0, X, H, Image.Canvas.Handle, W - X, 0, SRCCOPY); end; end; // Push up procedure PushUpAndSlideOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); with DestCanvas do begin BitBlt(Handle, 0, 0, W, H - Y, Handle, 0, Y, SRCCOPY); BitBlt(Handle, 0, H - Y, W, Y, Image.Canvas.Handle, 0, 0, SRCCOPY); end; end; // Push down procedure PushDownAndSlideOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); with DestCanvas do begin BitBlt(Handle, 0, Y, W, H - Y, Handle, 0, 0, SRCCOPY); BitBlt(Handle, 0, 0, W, Y, Image.Canvas.Handle, 0, H - Y, SRCCOPY); end; end; // Blind vertically procedure VerticalBlindsEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var S, D: Integer; ComplexRegion: TComplexRegion; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); S := (W div 40) + 1; D := MulDiv(S, Progress, 100); ComplexRegion := TComplexRegion.Create; try X := 0; while X < W do begin Inc(X, S); ComplexRegion.AddRect(X - D, 0, X + D, H); Inc(X, S); end; Rgn := ComplexRegion.CreateRegion; finally ComplexRegion.Free; end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Blind horizontally procedure HorizontalBlindsEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var S, D: Integer; ComplexRegion: TComplexRegion; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); S := (H div 40) + 1; D := MulDiv(S, Progress, 100); ComplexRegion := TComplexRegion.Create; try Y := 0; while Y < H do begin Inc(Y, S); ComplexRegion.AddRect(0, Y - D, W, Y + D); Inc(Y, S); end; Rgn := ComplexRegion.CreateRegion; finally ComplexRegion.Free; end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven blind from left procedure UnevenBlindsFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var S, D: Integer; ComplexRegion: TComplexRegion; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); if X = 0 then Exit; S := X; D := MulDiv(S, Progress, 100); ComplexRegion := TComplexRegion.Create; try X := 0; while X < W do begin ComplexRegion.AddRect(X, 0, X + D, H); Inc(X, S); end; Rgn := ComplexRegion.CreateRegion; finally ComplexRegion.Free; end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven blind from right procedure UnevenBlindsFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var S, D: Integer; ComplexRegion: TComplexRegion; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); if X = 0 then Exit; S := X; D := MulDiv(S, Progress, 100); ComplexRegion := TComplexRegion.Create; try X := W; while X > 0 do begin ComplexRegion.AddRect(X - D, 0, X, H); Dec(X, S); end; Rgn := ComplexRegion.CreateRegion; finally ComplexRegion.Free; end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven blind from top procedure UnevenBlindsFromTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var S, D: Integer; ComplexRegion: TComplexRegion; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); if Y = 0 then Exit; S := Y; D := MulDiv(S, Progress, 100); ComplexRegion := TComplexRegion.Create; try Y := 0; while Y < H do begin ComplexRegion.AddRect(0, Y, W, Y + D); Inc(Y, S); end; Rgn := ComplexRegion.CreateRegion; finally ComplexRegion.Free; end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Uneven blind from bottom procedure UnevenBlindsFromBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var S, D: Integer; ComplexRegion: TComplexRegion; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); if Y = 0 then Exit; S := Y; D := MulDiv(S, Progress, 100); ComplexRegion := TComplexRegion.Create; try Y := H; while Y > 0 do begin ComplexRegion.AddRect(0, Y - D, W, Y); Dec(Y, S); end; Rgn := ComplexRegion.CreateRegion; finally ComplexRegion.Free; end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Rectangular shred procedure ExpandingRectanglesEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var S, D: Integer; ComplexRegion: TComplexRegion; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); S := (Min(W, H) div 10) + 1; D := MulDiv(S, Progress, 100); ComplexRegion := TComplexRegion.Create; try X := 0; while X < W do begin Inc(X, S); Y := 0; while Y < H do begin Inc(Y, S); ComplexRegion.AddRect(X - D, Y - D, X + D, Y + D); Inc(Y, S); end; Inc(X, S); end; Rgn := ComplexRegion.CreateRegion; finally ComplexRegion.Free; end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // iDirection is -1 or 1 // bHalfScreen: Turns from the circle and does a full loop // bAlternativing: If true, it is a full screen rotate, if false, it opens from a central point (bHalfScreen = True) // bDoubleRotate: If true, rotates twice, cycling first through a black screen // bIncludeText: Outputs a word using IEGlobalSettings().WordTransitionParams procedure DoRotationalSweepEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; iDirection : Integer; bHalfScreen, bAlternating, bDoubleRotate : Boolean; bIncludeText : Boolean = False); const Size_As_Percent_Of_Dim = 70; // Text is 70% of width/height procedure _DoEffect(AScreen, AImage: TBitmap; iProgress: Integer; bReverse : Boolean = False); var mX, mY: Integer; mPI: Extended; Rgn, Rgn2, WrdRgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, iProgress, W, H, X, Y); mX := W div 2; mY := H div 2; mPI := PI / 2; if bHalfScreen then begin Rgn := CreateSliceRgn(mX, mY, Ceil(Hypot(mX, mY)), -mPI, (iDirection * PI * iProgress / 50) - mPI, iProgress, True); end else begin Rgn := CreateSliceRgn(mX, mY, Ceil(Hypot(mX, mY)), -mPI, (iDirection * PI * iProgress / 100) - mPI, iProgress div 2, not bReverse); if bAlternating then Rgn2 := CreateSliceRgn(mX, mY, Ceil(Hypot(mX, mY)), -mPI, (iDirection * PI * iProgress / 100) - mPI, iProgress div 2, False) else Rgn2 := CreateSliceRgn(mX, mY, Ceil(Hypot(mX, mY)), -mPI, (-1 * iDirection * PI * iProgress / 100) - mPI, iProgress div 2, not bReverse); CombineRgn(Rgn, Rgn, Rgn2, RGN_OR); DeleteObject(Rgn2); end; if bIncludeText and (Progress > 50) then begin WrdRgn := CreateRegionFromLetter(Rect(MulDiv(W, 50 - Size_As_Percent_Of_Dim div 2, 100), MulDiv(H, 50 - Size_As_Percent_Of_Dim div 2, 100), MulDiv(W, 50 + Size_As_Percent_Of_Dim div 2, 100), MulDiv(H, 50 + Size_As_Percent_Of_Dim div 2, 100)), Progress, 0, 100, True); CombineRgn(Rgn, Rgn, WrdRgn, RGN_OR); DeleteObject(WrdRgn) ; end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, AImage); DeleteObject(Rgn); end; var ABlack: TBitmap; bReverse : Boolean; WrdRgn : HRGN; begin if bDoubleRotate = False then begin _DoEffect(Screen, Image, Progress); end else begin ABlack := TBitmap.create; try ABlack.Width := Screen.Width; ABlack.Height := Screen.Height; ABlack.Canvas.Brush.Color := clBlack; ABlack.Canvas.FillRect(Rect(0, 0, ABlack.Width, ABlack.Height)); if Progress < 50 then begin if bIncludeText then begin WrdRgn := CreateRegionFromLetter(Rect(MulDiv(ABlack.Width, 50 - Size_As_Percent_Of_Dim div 2, 100), MulDiv(ABlack.Height, 50 - Size_As_Percent_Of_Dim div 2, 100), MulDiv(ABlack.Width, 50 + Size_As_Percent_Of_Dim div 2, 100), MulDiv(ABlack.Height, 50 + Size_As_Percent_Of_Dim div 2, 100)), Progress, 0, 100, True); OutputRgnToCanvas(ABlack.Canvas, ABlack.Width, ABlack.Height, WrdRgn, Image); DeleteObject(WrdRgn) ; end; _DoEffect(Screen, ABlack, Progress * 2) end else begin DestCanvas.Brush.Color := clBlack; DestCanvas.FillRect(Rect(0, 0, Screen.Width, Screen.Height)); bReverse := (bHalfScreen or bAlternating) = False; _DoEffect(ABlack, Image, Progress * 2 - 100, bReverse); end; finally ABlack.Free; end; end; end; // Half Sweep clockwise procedure HalfSweepClockwise(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var bDoubleRotate: Boolean; begin bDoubleRotate := IEGlobalSettings().TransitionsDrawAlternative; DoRotationalSweepEffect(DestCanvas, Screen, Image, ARect, Progress, 1, True, False, bDoubleRotate); end; // Half Sweep anticlockwise procedure HalfSweepAntiClockwise(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var bDoubleRotate: Boolean; begin bDoubleRotate := IEGlobalSettings().TransitionsDrawAlternative; DoRotationalSweepEffect(DestCanvas, Screen, Image, ARect, Progress, -1, True, False, bDoubleRotate); end; // Full Clockwise Sweep procedure FullSweepClockwise(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var bDoubleRotate: Boolean; begin bDoubleRotate := IEGlobalSettings().TransitionsDrawAlternative; DoRotationalSweepEffect(DestCanvas, Screen, Image, ARect, Progress, 1, False, True, bDoubleRotate); end; // Full Expanding Sweep clockwise procedure FullExpandingSweepClockwise(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var bDoubleRotate: Boolean; begin bDoubleRotate := IEGlobalSettings().TransitionsDrawAlternative; DoRotationalSweepEffect(DestCanvas, Screen, Image, ARect, Progress, 1, False, False, bDoubleRotate); end; // Half Sweep clockwise with Word procedure WordHalfSweep(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var iDirection : Integer; begin iDirection := 1; if IEGlobalSettings().TransitionsDrawAlternative then iDirection := -1; DoRotationalSweepEffect(DestCanvas, Screen, Image, ARect, Progress, iDirection, True, False, True, True); end; // Full Clockwise Sweep with Word procedure WordFullSweep(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var iDirection : Integer; begin iDirection := 1; if IEGlobalSettings().TransitionsDrawAlternative then iDirection := -1; DoRotationalSweepEffect(DestCanvas, Screen, Image, ARect, Progress, iDirection, False, True, True, True); end; // Full Expanding Sweep with Word procedure WordFullExpandingSweep(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoRotationalSweepEffect(DestCanvas, Screen, Image, ARect, Progress, 1, False, False, True, True); end; procedure DoWideBarsEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; bHorz, bReverse : Boolean); const Bar_Count = 12; // Maximum of 30 var ComplexRegion: TComplexRegion; Rgn: HRGN; W, H, X, Y: Integer; iBarSize, iMaxBarLength: Integer; iProgressBlock: Integer; I: Integer; iBarIndex: Integer; iBarLength: Integer; iBarCount: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); iBarCount := Bar_Count; if IEGlobalSettings().TransitionsDrawAlternative then iBarCount := Bar_Count div 2; if bHorz then begin iBarSize := H div iBarCount + 1; iMaxBarLength := W; end else begin iBarSize := W div iBarCount + 1; iMaxBarLength := H; end; iProgressBlock := 100 div iBarCount; if iBarSize = 0 then exit; if fTransitionInitialized = False then begin InitializeRandomList(iBarCount - 1); fTransitionInitialized := True; end; ComplexRegion := TComplexRegion.Create; try for I := 0 to iBarCount - 1 do begin iBarIndex := GetRandomListIndex(I); iBarLength := 0; if Progress > (I + 1) * iProgressBlock then iBarLength := iMaxBarLength else if Progress > I * iProgressBlock then iBarLength := MulDiv(iMaxBarLength, Progress - I * iProgressBlock, iProgressBlock); if iBarLength > 0 then begin if bHorz then begin if bReverse then // RIGHT TO LEFT ComplexRegion.AddRect(W - iBarLength, iBarIndex * iBarSize, W, (iBarIndex + 1) * iBarSize) else // LEFT TO RIGHT ComplexRegion.AddRect(0, iBarIndex * iBarSize, iBarLength, (iBarIndex + 1) * iBarSize); end else // VERTICAL begin if bReverse then // BOTTOM TO TOP ComplexRegion.AddRect(iBarIndex * iBarSize, H - iBarLength, (iBarIndex + 1) * iBarSize, H) else // TOP TO BOTTOM ComplexRegion.AddRect(iBarIndex * iBarSize, 0, (iBarIndex + 1) * iBarSize, iBarLength); end; end; end; Rgn := ComplexRegion.CreateRegion; finally ComplexRegion.Free; end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Random Bars from the Left procedure WideBarsFromLeft(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoWideBarsEffect(DestCanvas, Screen, Image, ARect, Progress, True, False); end; // Random Bars from the Right procedure WideBarsFromRight(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoWideBarsEffect(DestCanvas, Screen, Image, ARect, Progress, True, True); end; // Random Bars from the Top procedure WideBarsFromTop(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoWideBarsEffect(DestCanvas, Screen, Image, ARect, Progress, False, False); end; // Random Bars from the Bottom procedure WideBarsFromBottom(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoWideBarsEffect(DestCanvas, Screen, Image, ARect, Progress, False, True); end; procedure DoRotateEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; var Points: array of TPoint; xOrg, yOrg: Integer; PtCount : Integer; bClockwise: Boolean); var Angle: Extended; Rgn: HRGN; W, H : Integer; begin W := ARect.Right - ARect.Left; H := ARect.Bottom - ARect.Top; Angle := PI * Progress / 50; if bClockwise = False then Angle := -Angle; RotatePoints(Points, xOrg, yOrg, Angle); Rgn := CreatePolygonRgn(Points, PtCount, WINDING); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; procedure RotationalRectangleEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; bClockwise: Boolean); var mW, mH, mX, mY: Integer; Pts: array[1..4] of TPoint; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; mH := H div 2; mX := X div 2; mY := Y div 2; Pts[1].X := mW - mX; Pts[1].Y := mH - mY; Pts[2].X := mW + mX; Pts[2].Y := mH - mY; Pts[3].X := mW + mX; Pts[3].Y := mH + mY; Pts[4].X := mW - mX; Pts[4].Y := mH + mY; DoRotateEffect(DestCanvas, Screen, Image, ARect, Progress, Pts, mW, mH, 4, bClockwise); end; // Rotational star in center procedure RotationalStarEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; bClockwise: Boolean); var mW, mH, mX, mY, dX, dY: Integer; Pts: array[1..8] of TPoint; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; mH := H div 2; mX := X div 2; mY := Y div 2; dX := 2 * X; dY := 2 * Y; Pts[1].X := mW - dX; Pts[1].Y := mH; Pts[2].X := mW - mX; Pts[2].Y := mH - mY; Pts[3].X := mW; Pts[3].Y := mH - dY; Pts[4].X := mW + mX; Pts[4].Y := mH - mY; Pts[5].X := mW + dX; Pts[5].Y := mH; Pts[6].X := mW + mX; Pts[6].Y := mH + mY; Pts[7].X := mW; Pts[7].Y := mH + dY; Pts[8].X := mW - mX; Pts[8].Y := mH + mY; DoRotateEffect(DestCanvas, Screen, Image, ARect, Progress, Pts, mW, mH, 8, bClockwise); end; // Spiral rectangle procedure SpirallingRectangleEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; bClockwise: Boolean); var mW, mH, mX, mY: Integer; Pts: array[1..4] of TPoint; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; mH := H div 2; mX := X div 2; mY := Y div 2; Pts[1].X := mW - mX; Pts[1].Y := mH - mY; Pts[2].X := mW + mX; Pts[2].Y := mH - mY; Pts[3].X := mW + mX; Pts[3].Y := mH + mY; Pts[4].X := mW - mX; Pts[4].Y := mH + mY; DoRotateEffect(DestCanvas, Screen, Image, ARect, Progress, Pts, X, Y, 4, bClockwise); end; // Rotational Triangular Wipe procedure RotationalTriangularWipeEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mW, mH: Integer; Pts: array[1..3] of TPoint; W, H, X, Y: Integer; iSize: Integer; bClockwise: Boolean; begin CalcParams(ARect, Progress, W, H, X, Y); iSize := imax(X, Y) div 2; mW := W div 2; mH := H div 2; Pts[1].X := mW; Pts[1].Y := mH - iSize; Pts[2].X := mW + iSize; Pts[2].Y := mH + iSize; Pts[3].X := mW - iSize; Pts[3].Y := mH + iSize; bClockwise := not IEGlobalSettings().TransitionsDrawAlternative; DoRotateEffect(DestCanvas, Screen, Image, ARect, Progress, Pts, mW, mH, 3, bClockwise); end; procedure DoExpandShapeEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; AShape: TIEShape; rSize: Single; Angle: Integer = 0); var S, D: Integer; Rgn, TmpRgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); S := (Min(W, H) div 10) + 1; D := MulDiv(Round(rSize * S), Progress, 200); Rgn := 0; X := 0; while X < W do begin Inc(X, S); Y := 0; while Y < H do begin Inc(Y, S); if AShape = iesTransLetter then TmpRgn := CreateRegionFromLetter(Rect(X - D, Y - D, X + D, Y + D), Progress, 0, 50) else if AShape = iesTransCircularShape then TmpRgn := CreateEllipticRgn(X - D, Y - D, X + D, Y + D) else TmpRgn := IECreateShapeRegion(AShape, Rect(X - D, Y - D, X + D, Y + D), iebDefault, Angle); if Rgn <> 0 then begin CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); end else Rgn := TmpRgn; Inc(Y, S); end; Inc(X, S); end; if Rgn <> 0 then try if (AShape = iesTransLetter) or (AShape = iesDoubleHeart) then BitBlt(DestCanvas.Handle, 0, 0, W, H, Screen.Canvas.Handle, 0, 0, SRCCOPY); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); finally DeleteObject(Rgn); end; end; // Expanding Circles procedure ExpandingCirclesEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoExpandShapeEffect(DestCanvas, Screen, Image, ARect, Progress, iesTransCircularShape, 3); end; // Expanding Hearts procedure ExpandingHeartsEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin if IEGlobalSettings().TransitionsDrawAlternative then DoExpandShapeEffect(DestCanvas, Screen, Image, ARect, Progress, iesDoubleHeart, 3) else DoExpandShapeEffect(DestCanvas, Screen, Image, ARect, Progress, iesHeart, 3) end; // Expanding 5 Point Stars procedure ExpandingStar5sEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoExpandShapeEffect(DestCanvas, Screen, Image, ARect, Progress, iesStar5, 4); end; // Expanding 6 Point Stars procedure ExpandingStar6sEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Angle: Integer; begin Angle := 0; if IEGlobalSettings().TransitionsDrawAlternative then Angle := 90; DoExpandShapeEffect(DestCanvas, Screen, Image, ARect, Progress, IEGlobalSettings().TransitionsDrawShape, 4, Angle); end; // Expanding Letters of Word procedure ExpandingWordEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var rSize: Single; begin rSize := 6; if IEGlobalSettings().TransitionsDrawAlternative then rSize := 12; DoExpandShapeEffect(DestCanvas, Screen, Image, ARect, Progress, iesTransLetter, rSize); end; // Expanding Explosions procedure ExpandingExplosionsEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Angle: Integer; begin Angle := 0; if IEGlobalSettings().TransitionsDrawAlternative then Angle := 180; DoExpandShapeEffect(DestCanvas, Screen, Image, ARect, Progress, iesExplosion, 4, Angle ); end; // Expanding Lightning Bolts procedure ExpandingLightningBoltsEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var AShape: TIEShape; begin if IEGlobalSettings().TransitionsDrawAlternative then AShape := iesLightningRight else AShape := iesLightningLeft; DoExpandShapeEffect(DestCanvas, Screen, Image, ARect, Progress, AShape, 6); end; // Reveal V from left procedure ArrowWipeFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mH: Integer; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mH := H div 2; Rgn := CreatePolygonRgnEx([0, mH - Y, 2 * X, mH, 0, mH + Y]); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Reveal V from right procedure ArrowWipeFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mH: Integer; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mH := H div 2; Rgn := CreatePolygonRgnEx([W, mH - Y, W - 2 * X, mH, W, mH + Y]); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Reveal V from top procedure ArrowWipeFromTopEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mW: Integer; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; Rgn := CreatePolygonRgnEx([mW - X, 0, mW, 2 * Y, mW + X, 0]); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Reveal V from bottom procedure ArrowWipeFromBottomEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mW: Integer; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; Rgn := CreatePolygonRgnEx([mW - X, H, mW, H - 2 * Y, mW + X, H]); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Bow Tie Horizontal procedure HorizontalBowTieWipeEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mH: Integer; Rgn, TmpRgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mH := H div 2; Rgn := CreatePolygonRgnEx([0, mH - Y, X, mH, 0, mH + Y]); TmpRgn := CreatePolygonRgnEx([W, mH - Y, W - X, mH, W, mH + Y]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Bow Tie Vertical procedure VerticalBowTieWipeEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mW: Integer; Rgn, TmpRgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; Rgn := CreatePolygonRgnEx([mW - X, 0, mW, 2 * Y, mW + X, 0]); TmpRgn := CreatePolygonRgnEx([mW - X, H, mW, H - 2 * Y, mW + X, H]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Diagonal Cross In procedure DiagonalCrossToCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mW, mH, mX, mY: Integer; Rgn, TmpRgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; mH := H div 2; mX := X div 2; mY := Y div 2; Rgn := CreatePolygonRgnEx([0, mH - mY, mX, mH, 0, mH + mY]); TmpRgn := CreatePolygonRgnEx([W, mH - mY, W - mX, mH, W, mH + mY]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); TmpRgn := CreatePolygonRgnEx([mW - mX, 0, mW, mY, mW + mX, 0]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); TmpRgn := CreatePolygonRgnEx([mW - mX, H, mW, H - mY, mW + mX, H]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Diagonal Cross Out procedure DiagonalCrossFromCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mW, mH, mX, mY: Integer; Rgn, TmpRgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); X := W - X; Y := H - Y; mW := W div 2; mH := H div 2; mX := X div 2; mY := Y div 2; Rgn := CreateRectRgn(0, 0, W, H); TmpRgn := CreatePolygonRgnEx([0, mH - mY, mX, mH, 0, mH + mY]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_XOR); DeleteObject(TmpRgn); TmpRgn := CreatePolygonRgnEx([W, mH - mY, W - mX, mH, W, mH + mY]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_XOR); DeleteObject(TmpRgn); TmpRgn := CreatePolygonRgnEx([mW - mX, 0, mW, mY, mW + mX, 0]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_XOR); DeleteObject(TmpRgn); TmpRgn := CreatePolygonRgnEx([mW - mX, H, mW, H - mY, mW + mX, H]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_XOR); DeleteObject(TmpRgn); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; procedure DoHorzZigzagEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; bReverse : Boolean); var mH, mY, sH, sW: Integer; YY: array[1..4] of Integer; U, D, I, J: Integer; Pts: array[1..24] of TPoint; Rgn: HRGN; W, H, X, Y: Integer; iProgress: Integer; begin iProgress := Progress; if bReverse then iProgress := 100 - Progress; CalcParams(ARect, iProgress, W, H, X, Y); sH := H div 10; sW := W div 10; if IEGlobalSettings().TransitionsDrawAlternative then begin sH := sH * 2; sW := sW * 2; end; mH := H div 2; mY := Y div 2 + MulDiv(sH, iProgress, 100); YY[1] := mH + sH - mY; YY[2] := mH - sH - mY; YY[3] := mH + sH + mY; YY[4] := mH - sH + mY; X := 0; U := Low(Pts); D := High(Pts); for I := 1 to 6 do begin for J := 1 to 2 do begin Pts[U].X := X; Pts[U].Y := YY[J]; Inc(U); Pts[D].X := X; Pts[D].Y := YY[J + 2]; Dec(D); Inc(X, sW); end; end; Rgn := CreatePolygonRgn(Pts, 24, WINDING); try with DestCanvas do begin if bReverse then BitBlt(Handle, 0, 0, W, H, Image.Canvas.Handle, 0, 0, SRCCOPY); SelectClipRgn(Handle, Rgn); if bReverse then BitBlt(Handle, 0, 0, W, H, Screen.Canvas.Handle, 0, 0, SRCCOPY) else BitBlt(Handle, 0, 0, W, H, Image.Canvas.Handle, 0, 0, SRCCOPY); SelectClipRgn(Handle, 0); end; finally DeleteObject(Rgn); end; end; // Zigzag Wipe from Horizon procedure ZigzagWipeFromHorizonEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoHorzZigzagEffect(DestCanvas, Screen, Image, ARect, Progress, False); end; // Zigzag Wipe To Horizon procedure ZigzagWipeToHorizonEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoHorzZigzagEffect(DestCanvas, Screen, Image, ARect, Progress, True); end; procedure DoVerticalZigzagEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; bReverse : Boolean); var mW, mX, sH, sW: Integer; XX: array[1..4] of Integer; L, R, I, J: Integer; Pts: array[1..24] of TPoint; Rgn: HRGN; W, H, X, Y: Integer; iProgress: Integer; begin iProgress := Progress; if bReverse then iProgress := 100 - Progress; CalcParams(ARect, iProgress, W, H, X, Y); sH := H div 10; sW := W div 10; if IEGlobalSettings().TransitionsDrawAlternative then begin sH := sH * 2; sW := sW * 2; end; mW := W div 2; mX := X div 2 + MulDiv(sW, iProgress, 100); // LHS XX[1] := mW + sW - mX; XX[2] := mW - sW - mX; // RHS XX[3] := mW + sW + mX; XX[4] := mW - sW + mX; Y := 0; L := Low(Pts); R := High(Pts); for I := 1 to 6 do begin for J := 1 to 2 do begin // LHS Pts[L].X := XX[J]; Pts[L].Y := Y; Inc(L); // RHS Pts[R].X := XX[J + 2]; Pts[R].Y := Y; Dec(R); Inc(Y, sH); end; end; Rgn := CreatePolygonRgn(Pts, 24, WINDING); try with DestCanvas do begin if bReverse then BitBlt(Handle, 0, 0, W, H, Image.Canvas.Handle, 0, 0, SRCCOPY); SelectClipRgn(Handle, Rgn); if bReverse then BitBlt(Handle, 0, 0, W, H, Screen.Canvas.Handle, 0, 0, SRCCOPY) else BitBlt(Handle, 0, 0, W, H, Image.Canvas.Handle, 0, 0, SRCCOPY); SelectClipRgn(Handle, 0); end; finally DeleteObject(Rgn); end; end; // Zigzag Wipe from Vertical Center procedure ZigzagWipeFromVerticalCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoVerticalZigzagEffect(DestCanvas, Screen, Image, ARect, Progress, False); end; // Zigzag Wipe To Vertical Center procedure ZigzagWipeToVerticalCenter(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoVerticalZigzagEffect(DestCanvas, Screen, Image, ARect, Progress, True); end; // Diamond shred procedure ExpandingDiamondsEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var S, D: Integer; Rgn, TmpRgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); S := (Min(W, H) div 10) + 1; D := MulDiv(S, Progress, 50); Rgn := 0; X := 0; while X < W do begin Inc(X, S); Y := 0; while Y < H do begin Inc(Y, S); TmpRgn := CreatePolygonRgnEx([X - D, Y, X, Y - D, X + D, Y, X, Y + D]); if Rgn <> 0 then begin CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); end else Rgn := TmpRgn; Inc(Y, S); end; Inc(X, S); end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Reveal diamond out from centre procedure DiamondWipeFromCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mW, mH: Integer; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; mH := H div 2; Rgn := CreatePolygonRgnEx([mW - X, mH, mW, mH - Y, mW + X, mH, mW, mH + Y]); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Reveal diamond in to centre procedure DiamondWipeToCenterEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var mW, mH: Integer; Rgn, TmpRgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; mH := H div 2; Rgn := CreateRectRgn(0, 0, W, H); TmpRgn := CreatePolygonRgnEx([X - mW, mH, mW, Y - mH, 3 * mW - X, mH, mW, 3 * mH - Y]); CombineRgn(Rgn, Rgn, TmpRgn, RGN_XOR); DeleteObject(TmpRgn); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; procedure DoShapeWipeInAndOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; AShape: TIEShape; rScale: single = 1; Angle: Integer = 0); var mW, mH, mX, mY: Integer; Rgn, TmpRgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); mW := W div 2; mH := H div 2; mX := X div 2; mY := Y div 2; if AShape = iesTransLetter then begin Rgn := CreateRegionFromLetter(Rect(-1 * Round(rScale * mX), -1 * Round(rScale * mY), 2 * mW + Round(rScale * mX), 2 * mH + Round(rScale * mY)), Progress, 0, 50); TmpRgn := CreateRegionFromLetter(Rect(mx, mY, 2 * mW - mX, 2 * mH - mY), Progress, 10, 80); end else if AShape = iesTransDiamondShape then begin Rgn := CreatePolygonRgnEx([-mX, mH, mW, -mY, 2 * mW + mX, mH, mW, 2 * mH + mY]); TmpRgn := CreatePolygonRgnEx([mX, mH, mW, mY, 2 * mW - mX, mH, mW, 2 * mH - mY]); end else begin Rgn := IECreateShapeRegion(AShape, Rect(-1 * Round(rScale * mX), -1 * Round(rScale * mY), 2 * mW + Round(rScale * mX), 2 * mH + Round(rScale * mY)), iebDefault, Angle); TmpRgn := IECreateShapeRegion(AShape, Rect(mx, mY, 2 * mW - mX, 2 * mH - mY), iebDefault, Angle); end; CombineRgn(Rgn, Rgn, TmpRgn, RGN_XOR); DeleteObject(TmpRgn); try if (AShape = iesTransLetter) or (AShape = iesDoubleHeart) then BitBlt(DestCanvas.Handle, 0, 0, W, H, Screen.Canvas.Handle, 0, 0, SRCCOPY); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); finally DeleteObject(Rgn); end; end; // Diamond Wipe In and Out procedure DiagonalBoxWipeEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoShapeWipeInAndOutEffect(DestCanvas, Screen, Image, ARect, Progress, iesTransDiamondShape); end; // Heart Wipe In and Out procedure HeartWipeInAndOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin if IEGlobalSettings().TransitionsDrawAlternative then DoShapeWipeInAndOutEffect(DestCanvas, Screen, Image, ARect, Progress, iesDoubleHeart, 1.6) else DoShapeWipeInAndOutEffect(DestCanvas, Screen, Image, ARect, Progress, iesHeart, 1.6) end; // 5 Point Star Wipe In and Out procedure Star5WipeInAndOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoShapeWipeInAndOutEffect(DestCanvas, Screen, Image, ARect, Progress, iesStar5, 2.4); end; // 6 Point Star Wipe In and Out procedure Star6WipeInAndOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Angle: Integer; begin Angle := 0; if IEGlobalSettings().TransitionsDrawAlternative then Angle := 90; DoShapeWipeInAndOutEffect(DestCanvas, Screen, Image, ARect, Progress, IEGlobalSettings().TransitionsDrawShape, 1.6, Angle); end; // Word Wipe In and Out procedure WordWipeInAndOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var rSize: Single; begin rSize := 4.0; if IEGlobalSettings().TransitionsDrawAlternative then rSize := 8.0; DoShapeWipeInAndOutEffect(DestCanvas, Screen, Image, ARect, Progress, iesTransLetter, rSize); end; var gPacmanLastUpdate : DWORD; gPacmanState : Byte; procedure DoPacmanEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; iRowCount : Integer; bSimultaneous : Boolean; bReversed : Boolean = False); const State_Duration = 100 {millisec}; // Pacman states Mouth_Open = 0; Mouth_Closing = 1; Mouth_Closed = 2; Mouth_Opening = 3; var W, H, X, Y: Integer; iSize: Integer; Rgn, TmpRgn: HRGN; I: Integer; iProgressDivs: Integer; bDraw: Boolean; function GetPacmanRegion(iHPos, iVOffSet : Integer; bReverse : Boolean) : HRgn; var iMouthPos: Integer; Pts: array[1..3] of TPoint; iX, iY, iPillSize, iSpacing: Integer; begin if bReversed then bReverse := not bReverse; iMouthPos := iHPos + iSize div 2; if bReverse then begin iHPos := W - iHPos; iMouthPos := iHPos - iSize div 2; end; // Trail if bReverse then Result := CreateRectRgn(iHPos, iVOffSet, W, iVOffSet + iSize) else Result := CreateRectRgn(0, iVOffSet, iHPos, iVOffSet + iSize); // Pac body TmpRgn := CreateEllipticRgn(iHPos - iSize div 2, iVOffSet, iHPos + iSize div 2, iVOffSet + iSize + 1); CombineRgn(Result, Result, TmpRgn, RGN_OR); DeleteObject(TmpRgn); // Pac Mouth Pts[1].X := iHPos; Pts[1].Y := iVOffSet + iSize div 2; if gPacmanState in [Mouth_Opening, Mouth_Closing] then begin // Mouth half open Pts[2].X := iMouthPos; Pts[2].Y := iVOffSet + MulDiv(iSize, 1, 4); Pts[3].X := iMouthPos; Pts[3].Y := iVOffSet + MulDiv(iSize, 3, 4); end else if gPacmanState = Mouth_Closed then begin // Mouth almost closed Pts[2].X := iMouthPos; Pts[2].Y := iVOffSet + MulDiv(iSize, 15, 32); Pts[3].X := iMouthPos; Pts[3].Y := iVOffSet + MulDiv(iSize, 17, 32); end else // Mouth_Open begin // Mouth fully open Pts[2].X := iMouthPos; Pts[2].Y := iVOffSet - MulDiv(iSize, 1, 4); Pts[3].X := iMouthPos; Pts[3].Y := iVOffSet + iSize + MulDiv(iSize, 1, 4); end; TmpRgn := CreatePolygonRgn(Pts, 3, WINDING); CombineRgn(Result, Result, TmpRgn, RGN_DIFF); DeleteObject(TmpRgn); // Previous paths if (bSimultaneous = False) and (iVOffSet > 0) then begin TmpRgn := CreateRectRgn(0, 0, W, iVOffSet); CombineRgn(Result, Result, TmpRgn, RGN_OR); DeleteObject(TmpRgn); end; // Draw pills if IEGlobalSettings().TransitionsDrawAlternative = False then begin iY := iVOffSet + iSize div 2; iPillSize := iSize div 12; iSpacing := imax(W div 10, iPillSize * 3); iX := iSpacing div 2; while iX < W do begin if bReverse then bDraw := iX < iMouthPos else bDraw := iX > iMouthPos; if bDraw then begin TmpRgn := CreateEllipticRgn(iX - iPillSize, iY- iPillSize, iX + iPillSize, iY + iPillsize); CombineRgn(Result, Result, TmpRgn, RGN_OR); DeleteObject(TmpRgn); end; inc(iX, iSpacing); end; end; end; begin CalcParams(ARect, Progress, W, H, X, Y); iSize := H div iRowCount + 1; if fTransitionInitialized = False then begin gPacmanLastUpdate := GetTickCount; gPacmanState := Mouth_Open; fTransitionInitialized := True; end else if GetTickCount > gPacmanLastUpdate + State_Duration then begin inc(gPacmanState); if gPacmanState > Mouth_Opening then gPacmanState := Mouth_Open; gPacmanLastUpdate := GetTickCount; end; Rgn := 0; iProgressDivs := 100 div iRowCount; for I := 0 to iRowCount - 1 do begin if bSimultaneous then begin TmpRgn := GetPacmanRegion(MulDiv(W, Progress, 100), iSize * I, I Mod 2 = 1); if Rgn = 0 then Rgn := TmpRgn else begin CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); end; end else begin if I = iRowCount - 1 then bDraw := Progress >= iProgressDivs * (iRowCount - 1) else bDraw := Progress < (I + 1) * iProgressDivs; if bDraw then begin Rgn := GetPacmanRegion(MulDiv(W, Progress - I * iProgressDivs, iProgressDivs), iSize * I, I Mod 2 = 1); Break; end; end; end; if Rgn <> 0 then try BitBlt(DestCanvas.Handle, 0, 0, W, H, Screen.Canvas.Handle, 0, 0, SRCCOPY); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); finally DeleteObject(Rgn); end; end; // Pacman Devours from Left procedure PacmanFromLeftEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoPacmanEffect(DestCanvas, Screen, Image, ARect, Progress, 1, False); end; // Pacman Devours from Right procedure PacmanFromRightEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoPacmanEffect(DestCanvas, Screen, Image, ARect, Progress, 1, False, True); end; // Pacman Devours Three Rows procedure Pacman3RowEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoPacmanEffect(DestCanvas, Screen, Image, ARect, Progress, 3, False); end; // Pacman Devours Four Rows procedure Pacman4RowEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoPacmanEffect(DestCanvas, Screen, Image, ARect, Progress, 4, False); end; // Two Simultaneous Rows of Pacman procedure Pacman2SimRowEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoPacmanEffect(DestCanvas, Screen, Image, ARect, Progress, 2, True); end; // Four Simultaneous Rows of Pacman procedure Pacman4SimRowEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoPacmanEffect(DestCanvas, Screen, Image, ARect, Progress, 4, True); end; // Six Simultaneous Rows of Pacman procedure Pacman6SimRowEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoPacmanEffect(DestCanvas, Screen, Image, ARect, Progress, 6, True); end; // Random Puzzle Pieces procedure RandomPuzzlePiecesEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); const Box_Value = 8; // = 5 boxes var S, SavedRandSeed: Integer; Rgn, TmpRgn, JRgn: HRGN; W, H, X, Y: Integer; iJSize, iJOffset: Integer; bTopJoiner: Boolean; iCol, iRow: Integer; procedure _AddJoiner(p1, p2, p3, p4, CombineMode : Integer); begin JRgn := CreateEllipticRgn(p1, p2, p3, p4); CombineRgn(TmpRgn, TmpRgn, JRgn, CombineMode); DeleteObject(JRgn); end; begin CalcParams(ARect, Progress, W, H, X, Y); SavedRandSeed := RandSeed; RandSeed := Integer(Image.Handle); S := (Min(W, H) div Box_Value) + 1; if IEGlobalSettings().TransitionsDrawAlternative then S := (Min(W, H) div Box_Value div 2) + 1; iJSize := S div 3; iJOffset := iJSize div 5; Rgn := 0; try iCol := 0; X := 0 - 2 * iJSize; while X < W do begin Inc(X, S); Y := 0 - 2 * iJSize; iRow := 0; while Y < H do begin Inc(Y, S); if Random(100) < Progress then begin TmpRgn := CreateRectRgn(X - S, Y - S, X + S, Y + S); bTopJoiner := iCol mod 2 = 0; if iRow mod 2 = 0 then bTopJoiner := not bTopJoiner; if bTopJoiner then begin // Top Joiner _AddJoiner(X - iJSize, Y - S - iJOffset, X + iJSize, Y - S - iJOffset + 2 * iJSize, RGN_DIFF); // Poke In // Left Joiner _AddJoiner(X - S - 2 * iJSize + iJOffset, Y - iJSize, X - S + iJOffset, Y + iJSize, RGN_OR); // Poke Out // Bottom Joiner _AddJoiner(X - iJSize, Y + S - 2 * iJSize + iJOffset, X + iJSize, Y + S + iJOffset, RGN_DIFF); // Poke In // Right Joiner _AddJoiner(X + S - iJOffset, Y - iJSize, X + S - iJOffset + 2 * iJSize, Y + iJSize, RGN_OR); // Poke Out end else begin // Top Joiner _AddJoiner(X - iJSize, Y - S - 2 * iJSize + iJOffset, X + iJSize, Y - S + iJOffset, RGN_OR); // Poke Out // Left Joiner _AddJoiner(X - S - iJOffset, Y - iJSize, X - S - iJOffset + 2 * iJSize, Y + iJSize, RGN_DIFF); // Poke In // Bottom Joiner _AddJoiner(X - iJSize, Y + S - iJOffset, X + iJSize, Y + S - iJOffset + 2 * iJSize, RGN_OR); // Poke Out // Right Joiner _AddJoiner(X + S - 2 * iJSize + iJOffset, Y - iJSize, X + S + iJOffset, Y + iJSize, RGN_DIFF); // Poke In end; if Rgn = 0 then Rgn := TmpRgn else begin CombineRgn(Rgn, Rgn, TmpRgn, RGN_XOR); DeleteObject(TmpRgn) end; end; Inc(Y, S); Inc(iRow); end; Inc(X, S); inc(iCol); end; finally RandSeed := SavedRandSeed; end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Explosion Wipe In and Out procedure ExplosionWipeInAndOutEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Angle: Integer; begin Angle := 0; if IEGlobalSettings().TransitionsDrawAlternative then Angle := 180; DoShapeWipeInAndOutEffect(DestCanvas, Screen, Image, ARect, Progress, iesExplosion, 1.1, Angle ); end; // Random Boxes with Word procedure RandomBoxesWithWordEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); const Box_Value = 400; // = 201 boxes Size_As_Percent_Of_Dim = 90; // Text is 90% of width/height Intersection_Point_in_Progress = 60; // when change from showing word to dissolving word var S, SavedRandSeed: Integer; ComplexRegion: TComplexRegion; Rgn, TmpRgn: HRGN; var W, H, X, Y: Integer; bAdd: Boolean; begin CalcParams(ARect, Progress, W, H, X, Y); SavedRandSeed := RandSeed; RandSeed := Integer(Image.Handle); S := (Min(W, H) div Box_Value) + 1; if IEGlobalSettings().TransitionsDrawAlternative then S := (Min(W, H) div Box_Value div 2) + 1; ComplexRegion := TComplexRegion.Create; try X := 0; while X < W do begin Inc(X, S); Y := 0; while Y < H do begin Inc(Y, S); if Progress > Intersection_Point_in_Progress then bAdd := Random(100) < MulDiv(Progress - Intersection_Point_in_Progress, 100, 100 - Intersection_Point_in_Progress) else bAdd := Random(100) < MulDiv(Progress, 100, Intersection_Point_in_Progress); if bAdd then ComplexRegion.AddRect(X - S, Y - S, X + S, Y + S); Inc(Y, S); end; Inc(X, S); end; Rgn := ComplexRegion.CreateRegion; finally ComplexRegion.Free; RandSeed := SavedRandSeed; end; TmpRgn := CreateRegionFromLetter(Rect(MulDiv(W, 50 - Size_As_Percent_Of_Dim div 2, 100), MulDiv(H, 50 - Size_As_Percent_Of_Dim div 2, 100), MulDiv(W, 50 + Size_As_Percent_Of_Dim div 2, 100), MulDiv(H, 50 + Size_As_Percent_Of_Dim div 2, 100)), Progress, 0, 100, True); if Rgn = 0 then Rgn := TmpRgn else begin if Progress > Intersection_Point_in_Progress then CombineRgn(Rgn, Rgn, TmpRgn, RGN_AND) else CombineRgn(Rgn, Rgn, TmpRgn, RGN_DIFF); DeleteObject(TmpRgn) end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; // Large boxes at random positions procedure RandomBigBoxesEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); const Box_Value = 20; // = 11 boxes var S, SavedRandSeed: Integer; ComplexRegion: TComplexRegion; Rgn: HRGN; W, H, X, Y: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); SavedRandSeed := RandSeed; RandSeed := Integer(Image.Handle); S := (Min(W, H) div Box_Value) + 1; if IEGlobalSettings().TransitionsDrawAlternative then S := (Min(W, H) div Box_Value div 2) + 1; ComplexRegion := TComplexRegion.Create; try X := 0; while X < W do begin Inc(X, S); Y := 0; while Y < H do begin Inc(Y, S); if Random(100) < Progress then ComplexRegion.AddRect(X - S, Y - S, X + S, Y + S); Inc(Y, S); end; Inc(X, S); end; Rgn := ComplexRegion.CreateRegion; finally ComplexRegion.Free; RandSeed := SavedRandSeed; end; OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); DeleteObject(Rgn); end; procedure DoRandomShapesEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; AShape: TIEShape; iCount: integer; rCoverage: Single; Angle: Integer = 0); var iSize, SavedRandSeed: Integer; Rgn: HRGN; W, H, X, Y: Integer; TmpRgn: HRGN; iMovementIncrement: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); SavedRandSeed := RandSeed; RandSeed := Integer(Image.Handle); iSize := (Min(W, H) div iCount) + 1; iMovementIncrement := Trunc(iSize * rCoverage); Rgn := 0; try X := 0; while X < W do begin Inc(X, iMovementIncrement); Y := 0; while Y < H do begin Inc(Y, iMovementIncrement); if Random(100) < Progress then begin if AShape = iesTransLetter then TmpRgn := CreateRegionFromLetter(Rect(X - iSize, Y - iSize, X + iSize, Y + iSize), Progress, 0, 50, False, False) else TmpRgn := IECreateShapeRegion(AShape, Rect(X - iSize, Y - iSize, X + iSize, Y + iSize), iebDefault, Angle ); if Rgn <> 0 then begin CombineRgn(Rgn, Rgn, TmpRgn, RGN_OR); DeleteObject(TmpRgn); end else Rgn := TmpRgn; end; Inc(Y, iMovementIncrement); end; Inc(X, iMovementIncrement); end; finally RandSeed := SavedRandSeed; end; if Rgn <> 0 then try if (AShape = iesTransLetter) and (Length(IEGlobalSettings().WordTransitionParams.Word) > 1) then BitBlt(DestCanvas.Handle, 0, 0, W, H, Screen.Canvas.Handle, 0, 0, SRCCOPY); OutputRgnToCanvas(DestCanvas, W, H, Rgn, Image); finally DeleteObject(Rgn); end; end; // Hearts at random positions procedure RandomHeartsEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin if IEGlobalSettings().TransitionsDrawAlternative then DoRandomShapesEffect(DestCanvas, Screen, Image, ARect, Progress, iesDoubleHeart, 12, 0.2) else DoRandomShapesEffect(DestCanvas, Screen, Image, ARect, Progress, iesHeart, 12, 0.2); end; // 5 Point Stars at random positions procedure RandomStar5sEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); begin DoRandomShapesEffect(DestCanvas, Screen, Image, ARect, Progress, iesStar5, 14, 0.4); end; // 6 Point Stars at random positions procedure RandomStar6sEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Angle: Integer; begin Angle := 0; if IEGlobalSettings().TransitionsDrawAlternative then Angle := 90; DoRandomShapesEffect(DestCanvas, Screen, Image, ARect, Progress, IEGlobalSettings().TransitionsDrawShape, 14, 0.4, Angle); end; // Words of Letter at random positions procedure RandomWordEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var rSize: Single; begin rSize := 0.4; if IEGlobalSettings().TransitionsDrawAlternative then rSize := 0.2; DoRandomShapesEffect(DestCanvas, Screen, Image, ARect, Progress, iesTransLetter, 14, rSize); end; // Explosions at random positions procedure RandomExplosionsEffect(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var Angle: Integer; begin Angle := 0; if Progress mod 2 = 0 then Angle := 180; DoRandomShapesEffect(DestCanvas, Screen, Image, ARect, Progress, iesExplosion, 18, 0.5, Angle); end; // Twist In procedure AngledTwistIn(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; Pts: array [0..2] of TPoint; begin CalcParams(ARect, Progress, W, H, X, Y); { PlgBlt requires a pointer to an array of three points that identify three corners of the destination parallelogram Pts[0] : upper-left corner of the source rectangle Pts[1] : upper-right corner Pts[2] : lower-left corner Implied : lower-right corner of the source rectangle is mapped to the implicit fourth point in the parallelogram. } Pts[0] := Point((w - X) div 2, (h - Y) div 2); Pts[1] := Point(w, 0); Pts[2] := Point(0, H); PlgBlt(DestCanvas.Handle, Pts, Image.Canvas.Handle, 0, 0, W, H, 0, 0, 0); end; // Twist Out procedure AngledTwistOut(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer); var W, H, X, Y: Integer; Pts: array [0..2] of TPoint; begin CalcParams(ARect, Progress, W, H, X, Y); { PlgBlt requires a pointer to an array of three points that identify three corners of the destination parallelogram Pts[0] : upper-left corner of the source rectangle Pts[1] : upper-right corner Pts[2] : lower-left corner Implied : lower-right corner of the source rectangle is mapped to the implicit fourth point in the parallelogram. } BitBlt(DestCanvas.Handle, 0, 0, W, H, Image.Canvas.Handle, 0, 0, SRCCOPY); Pts[0] := Point(X div 2, Y div 2); Pts[1] := Point(w, 0); Pts[2] := Point(0, H); PlgBlt(DestCanvas.Handle, Pts, Screen.Canvas.Handle, 0, 0, W, H, 0, 0, 0); end; // Multiple Twist In procedure MultipleAngledTwistIn(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; Step : Integer); const Horz_Count = 6; Vert_Count = 4; var W, H, X, Y: Integer; Pts: array [0..2] of TPoint; iBoxWidth, iBoxHeight: Integer; iBoxSkewPosX, iBoxSkewPosY: Integer; iBoxX, iBoxY: Integer; iX, iY: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); iBoxWidth := Round(W / Horz_Count); iBoxHeight := Round(H / Vert_Count); iBoxSkewPosX := (iBoxWidth - MulDiv(iBoxWidth, Step, 1024)) div 2; iBoxSkewPosY := (iBoxHeight - MulDiv(iBoxHeight, Step, 1024)) div 2; for iY := 0 to Vert_Count - 1 do for iX := 0 to Horz_Count - 1 do begin { PlgBlt requires a pointer to an array of three points that identify three corners of the destination parallelogram Pts[0] : upper-left corner of the source rectangle Pts[1] : upper-right corner Pts[2] : lower-left corner Implied : lower-right corner of the source rectangle is mapped to the implicit fourth point in the parallelogram. } iBoxX := iX * iBoxWidth; iBoxY := iY * iBoxHeight; Pts[0] := Point(iBoxX + iBoxSkewPosX, iBoxY + iBoxSkewPosY); Pts[1] := Point(iBoxX + iBoxWidth, iBoxY - 1); Pts[2] := Point(iBoxX - 1, iBoxY + iBoxHeight); PlgBlt(DestCanvas.Handle, Pts, Image.Canvas.Handle, iBoxX, iBoxY, iBoxWidth, iBoxHeight, 0, 0, 0); end; end; // Multiple Twist Out procedure MultipleAngledTwistOut(DestCanvas: TCanvas; Screen, Image: TBitmap; const ARect: TRect; Progress: Integer; Step : Integer); const Horz_Count = 6; Vert_Count = 4; var W, H, X, Y: Integer; Pts: array [0..2] of TPoint; iBoxWidth, iBoxHeight: Integer; iBoxSkewPosX, iBoxSkewPosY: Integer; iBoxX, iBoxY: Integer; iX, iY: Integer; begin CalcParams(ARect, Progress, W, H, X, Y); iBoxWidth := Round(W / Horz_Count); iBoxHeight := Round(H / Vert_Count); iBoxSkewPosX := MulDiv(iBoxWidth, Step, 1024) div 2; iBoxSkewPosY := MulDiv(iBoxHeight, Step, 1024) div 2; BitBlt(DestCanvas.Handle, 0, 0, W, H, Image.Canvas.Handle, 0, 0, SRCCOPY); for iY := 0 to Vert_Count - 1 do for iX := 0 to Horz_Count - 1 do begin { PlgBlt requires a pointer to an array of three points that identify three corners of the destination parallelogram Pts[0] : upper-left corner of the source rectangle Pts[1] : upper-right corner Pts[2] : lower-left corner Implied : lower-right corner of the source rectangle is mapped to the implicit fourth point in the parallelogram. } iBoxX := iX * iBoxWidth; iBoxY := iY * iBoxHeight; Pts[0] := Point(iBoxX + iBoxSkewPosX, iBoxY + iBoxSkewPosY); Pts[1] := Point(iBoxX + iBoxWidth, iBoxY {- 1}); Pts[2] := Point(iBoxX {- 1}, iBoxY + iBoxHeight); PlgBlt(DestCanvas.Handle, Pts, Screen.Canvas.Handle, iBoxX, iBoxY, iBoxWidth, iBoxHeight, 0, 0, 0); end; end; // Perform one of the "Extra" transitionEffects procedure PerformExtraTransitionEffect(Effect : TIETransitionType; ACanvas: TCanvas; ASourceBitmap, ATargetBitmap: TBitmap; const ARect: TRect; iStep: Integer); var iProgress: Integer; begin iProgress := Round(iStep / 1024 * 100); case Effect of iettExpandFromLeft : ExpandFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandFromRight : ExpandFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandFromTop : ExpandFromTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandFromBottom : ExpandFromBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandFromTopLeft : ExpandFromTopLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandFromTopRight : ExpandFromTopRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandFromBottomLeft : ExpandFromBottomLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandFromBottomRight : ExpandFromBottomRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandInFromLeft : ExpandInFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandInFromRight : ExpandInFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandInFromTop : ExpandInFromTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandInFromBottom : ExpandInFromBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandInToVerticalCenter : ExpandInToVerticalCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandInToHorizon : ExpandInToHorizonEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandInFromSides : ExpandInFromSidesEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandInFromTopAndBottom : ExpandInFromTopAndBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandOutFromHorizon : ExpandOutFromHorizonEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandOutFromVerticalCenter : ExpandOutFromVerticalCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeFromTopLeft : WipeFromTopLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeFromTopRight : WipeFromTopRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeFromBottomLeft : WipeFromBottomLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeFromBottomRight : WipeFromBottomRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeInFromTopAndBottom : WipeInFromTopAndBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeFromHorizon : WipeFromHorizonEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeInFromSides : WipeInFromSidesEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeOutFromVerticalCenter : WipeOutFromVerticalCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBuildUpFromLeft : BuildUpFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBuildUpFromRight : BuildUpFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBuildUpFromTop : BuildUpFromTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBuildUpFromBottom : BuildUpFromBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettUnrollFromLeft : UnrollFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettUnrollFromRight : UnrollFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettUnrollFromTop : UnrollFromTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettUnrollFromBottom : UnrollFromBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettSlideInFromLeft : SlideInFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettSlideInFromRight : SlideInFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettSlideInFromTop : SlideInFromTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettSlideInFromBottom : SlideInFromBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShrinkToTopLeft : ShrinkToTopLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShrinkToTopRight : ShrinkToTopRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShrinkToBottomLeft : ShrinkToBottomLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShrinkToBottomRight : ShrinkToBottomRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShrinkToCenter : ShrinkToCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettQuartersWipeInToCenter : QuartersWipeInToCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettQuartersExpandToCenter : QuartersExpandToCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettQuartersSlideInToCenter : QuartersSlideInToCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCurvedWipeFromLeft : CurvedWipeFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCurvedWipeFromRight : CurvedWipeFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCurvedWipeFromTop : CurvedWipeFromTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCurvedWipeFromBottom : CurvedWipeFromBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCurvedWipeFromTopLeft : CurvedWipeFromTopLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCurvedWipeFromTopRight : CurvedWipeFromTopRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCurvedWipeFromBottomLeft : CurvedWipeFromBottomLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCurvedWipeFromBottomRight : CurvedWipeFromBottomRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBarsInFromLeft : BarsInFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBarsInFromRight : BarsInFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBarsFromTop : BarsFromTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBarsFromBottom : BarsFromBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBarsLeftThenRight : BarsLeftThenRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBarsRightThenLeft : BarsRightThenLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBarsTopThenBottom : BarsTopThenBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBarsBottomThenTop : BarsBottomThenTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBarsFromBothSides : BarsFromBothSidesEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettBarsFromTopAndBottom : BarsFromTopAndBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromLeft : ShreddedFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromRight : ShreddedFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromTop : ShreddedFromTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromBottom : ShreddedFromBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromTopAndLeft : ShreddedFromTopAndLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromTopAndRight : ShreddedFromTopAndRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromBottomAndLeft : ShreddedFromBottomAndLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromBottomAndRight : ShreddedFromBottomAndRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromHorizonAndLeft : ShreddedFromHorizonAndLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromHorizonAndRight : ShreddedFromHorizonAndRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromTopAndVerticalCenter : ShreddedFromTopAndVerticalCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromBottomAndVerticalCenter : ShreddedFromBottomAndVerticalCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedFromCenter : ShreddedFromCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedToCenter : ShreddedToCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedInToHorizon : ShreddedInToHorizonEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedInToVerticalCenter : ShreddedInToVerticalCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedOutFromHorizon : ShreddedOutFromHorizonEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettShreddedOutFromVerticalCenter : ShreddedOutFromVerticalCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandingRectangles : ExpandingRectanglesEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandingTriangles : ExpandingTrianglesEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandingCircles : ExpandingCirclesEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandingDiamonds : ExpandingDiamondsEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCircularWipeFromCenter : CircularWipeFromCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCircularWipeToCenter : CircularWipeToCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeFromTopLeft : CrisscrossWipeFromTopLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeFromTopRight : CrisscrossWipeFromTopRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeFromBottomLeft : CrisscrossWipeFromBottomLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeFromBottomRight : CrisscrossWipeFromBottomRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeBounceFromTopLeft : CrisscrossWipeBounceFromTopLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeBounceFromTopRight : CrisscrossWipeBounceFromTopRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeBounceFromBottomLeft : CrisscrossWipeBounceFromBottomLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeBounceFromBottomRight : CrisscrossWipeBounceFromBottomRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeFromLeftRightAndTop : CrisscrossWipeFromLeftRightAndTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeFromLeftRightAndBottom : CrisscrossWipeFromLeftRightAndBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeFromLeftTopAndBottom : CrisscrossWipeFromLeftTopAndBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeFromTopLeftRightAndBottom : CrisscrossWipeFromTopLeftRightAndBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeFromRightTopAndBottom : CrisscrossWipeFromRightTopAndBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrisscrossWipeFromBottomLeftTopRight : CrisscrossWipeFromBottomLeftTopRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeDiagonalFromTopLeft : WipeDiagonalFromTopLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeDiagonalFromTopRight : WipeDiagonalFromTopRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeDiagonalFromBottomLeft : WipeDiagonalFromBottomLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWipeDiagonalFromBottomRight : WipeDiagonalFromBottomRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettDiagonalSweepClockwise : DiagonalSweepClockwiseEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettDiagonalSweepCounterClockwise : DiagonalSweepCounterClockwiseEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettSweepClockwise : HalfSweepClockwise(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettSweepCounterClockwise : HalfSweepAntiClockwise(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettStarburstClockwiseFromCenter : StarburstClockwiseFromCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettStarburstCounterClockwiseFromCenter : StarburstCounterClockwiseFromCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRotationalRectangle : RotationalRectangleEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress, True); iettRotationalRectangleCounterClockwise : RotationalRectangleEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress, False); iettRotationalStar : RotationalStarEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress, True); iettRotationalStarCounterClockwise : RotationalStarEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress, False); iettSpeckledWipeFromLeft : SpeckledWipeFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettSpeckledWipeFromRight : SpeckledWipeFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettSpeckledWipeFromTop : SpeckledWipeFromTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettSpeckledWipeFromBottom : SpeckledWipeFromBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPushLeftAndSlideOut : PushLeftAndSlideOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPushRightAndSlideOut : PushRightAndSlideOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPushUpAndSlideOut : PushUpAndSlideOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPushDownAndSlideOut : PushDownAndSlideOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPushAndSqueezeLeft : PushAndSqueezeLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPushAndSqueezeRight : PushAndSqueezeRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPushAndSqueezeUp : PushAndSqueezeUpEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPushAndSqueezeDown : PushAndSqueezeDownEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettHorizontalBlinds : HorizontalBlindsEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettVerticalBlinds : VerticalBlindsEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettUnevenBlindsFromLeft : UnevenBlindsFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettUnevenBlindsFromRight : UnevenBlindsFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettUnevenBlindsFromTop : UnevenBlindsFromTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettUnevenBlindsFromBottom : UnevenBlindsFromBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRectanglesFromTheLeft : WideBarsFromLeft(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRectanglesFromTheRight : WideBarsFromRight(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRectanglesFromTheTop : WideBarsFromTop(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRectanglesFromTheBottom : WideBarsFromBottom(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettSpirallingRectangleClockwise : SpirallingRectangleEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress, True); iettSpirallingRectangleCounterClockwise : SpirallingRectangleEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress, False); iettArrowWipeFromLeft : ArrowWipeFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettArrowWipeFromRight : ArrowWipeFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettArrowWipeFromTop : ArrowWipeFromTopEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettArrowWipeFromBottom : ArrowWipeFromBottomEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettHorizontalBowTieWipe : HorizontalBowTieWipeEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettVerticalBowTieWipe : VerticalBowTieWipeEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettDiagonalCrossFromCenter : DiagonalCrossFromCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettDiagonalCrossToCenter : DiagonalCrossToCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettZigzagWipeFromHorizon : ZigzagWipeFromHorizonEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettZigzagWipeFromVerticalCenter : ZigzagWipeFromVerticalCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettDiamondWipeFromCenter : DiamondWipeFromCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettDiamondWipeToCenter : DiamondWipeToCenterEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettDiagonalBoxWipe : DiagonalBoxWipeEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettTriangularWipe : RotationalTriangularWipeEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRandomBigBoxes : RandomBigBoxesEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettZigzagWipeToHorizon : ZigzagWipeToHorizonEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettZigzagWipeToVerticalCenter : ZigzagWipeToVerticalCenter (ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRandomHearts : RandomHeartsEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRandomStar5s : RandomStar5sEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRandomStar6s : RandomStar6sEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRandomExplosions : RandomExplosionsEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandingHearts : ExpandingHeartsEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandingStar5 : ExpandingStar5sEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandingStar6 : ExpandingStar6sEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandingExplosions : ExpandingExplosionsEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandingLightningBolts : ExpandingLightningBoltsEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettHeartWipeOut : HeartWipeOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettHeartWipeIn : HeartWipeInEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettStar5WipeOut : Star5WipeOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettStar5WipeIn : Star5WipeInEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettStar6WipeOut : Star6WipeOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettStar6WipeIn : Star6WipeInEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExplosionWipeOut : ExplosionWipeOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExplosionWipeIn : ExplosionWipeInEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrossWipeOut : CrossWipeOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettCrossWipeIn : CrossWipeInEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettHeartWipeInAndOut : HeartWipeInAndOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettStar5WipeInAndOut : Star5WipeInAndOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettStar6WipeInAndOut : Star6WipeInAndOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExplosionWipeInAndOut : ExplosionWipeInAndOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettAngledTwistIn : AngledTwistIn(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettAngledTwistOut : AngledTwistOut(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettMultipleAngledTwistIn : MultipleAngledTwistIn(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress, iStep); iettMultipleAngledTwistOut : MultipleAngledTwistOut(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress, iStep); iettRandomPuzzlePieces : RandomPuzzlePiecesEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPacmanFromLeft : PacmanFromLeftEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPacmanFromRight : PacmanFromRightEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPacman3Row : Pacman3RowEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPacman4Row : Pacman4RowEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPacman2SimRow : Pacman2SimRowEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPacman4SimRow : Pacman4SimRowEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettPacman6SimRow : Pacman6SimRowEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettFullSweepClockwise : FullSweepClockwise(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandingSweepClockwise : FullExpandingSweepClockwise(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRandomBoxesWithWord : RandomBoxesWithWordEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettRandomWord : RandomWordEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettExpandingWord : ExpandingWordEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWordWipeOut : WordWipeOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWordWipeIn : WordWipeInEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWordWipeInAndOut : WordWipeInAndOutEffect(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWordHalfSweep : WordHalfSweep(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWordFullSweep : WordFullSweep(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); iettWordFullExpandingSweep : WordFullExpandingSweep(ACanvas, ASourceBitmap, ATargetBitmap, ARect, iProgress); else raise EIEException.create('Unknown Transition!'); end; end; {$endif} ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// // TIETransitionEffects // constructor TIETransitionEffects.Create(Owner: TWinControl); begin inherited Create; // if assigned( Owner ) and not ( Owner is TIEView ) then raise EIEException.create('Invalid Owner'); fOwner := Owner; fSourceShot := TBitmap.Create; fSourceShot.Width := 1; fSourceShot.Height := 1; fSourceShot.PixelFormat := pf24bit; fTargetShot := TBitmap.Create; fTargetShot.Width := 1; fTargetShot.Height := 1; fTargetShot.PixelFormat := pf24bit; fCurrentView := TBitmap.Create; fCurrentView.Width := 1; fCurrentView.Height := 1; fCurrentView.PixelFormat := pf24bit; fRunning := false; fTransition := iettNone; fDuration := 1000; fSourceShotLines := nil; fTargetShotLines := nil; fCurrentViewLines := nil; fUpdateOnStop := false; fTimer := TTimer.Create(fOwner); fTimer.Enabled := false; fTimer.OnTimer := TimerEvent; fTimer.Interval := 20; fFullImage := nil; fOnTransitionStop := nil; fOnTransitionStep := nil; fTiming := iettLinear; end; destructor TIETransitionEffects.Destroy; begin if fSourceShotLines <> nil then freemem(fSourceShotLines); if fTargetShotLines <> nil then freemem(fTargetShotLines); if fCurrentViewLines <> nil then freemem(fCurrentViewLines); fSourceShotLines := nil; fTargetShotLines := nil; fCurrentViewLines := nil; FreeAndNil(fTimer); FreeAndNil(fSourceShot); FreeAndNil(fTargetShot); FreeAndNil(fCurrentView); // inherited; end; procedure TIETransitionEffects.SetFullImage(const Value: TObject); begin if ( Value is TIEBitmap ) = False then raise EIEException.create('Must be TIEBitmap'); fFullImage := Value; end; procedure TIETransitionEffects.SetOnTransitionPaint(const Value: TIEOnTransitionPaint); begin fOnTransitionPaint := Value; end; procedure TIETransitionEffects.SetSizes(Width, Height: integer); begin Stop; fWidth := Width; fHeight := Height; fCurrentView.Width := fWidth; fCurrentView.Height := fHeight; fSourceShot.Width := fWidth; fSourceShot.Height := fHeight; fTargetShot.Width := fWidth; fTargetShot.Height := fHeight; fMinLeft := 0; fMaxRight := 0; end; procedure TIETransitionEffects.Run(UpdateOnStop: boolean); var q: integer; begin if fTransition = iettNone then exit; if fRunning then TIEView( fOwner ).NPUnLockPaint; fUpdateOnStop := UpdateOnStop; fRunning := true; fStep := 0; fFirstStep := True; fAccum1 := 0; fFrames := 0; if ((fWidth < 2) and (fHeight < 2)) or (fHeight<>fSourceShot.Height) then begin fRunning := false; exit; end; TIEView( fOwner ).LockPaint; if fSourceShotLines <> nil then freemem(fSourceShotLines); if fTargetShotLines <> nil then freemem(fTargetShotLines); if fCurrentViewLines <> nil then freemem(fCurrentViewLines); getmem(fSourceShotLines, sizeof(pointer) * fHeight); getmem(fTargetShotLines, sizeof(pointer) * fHeight); getmem(fCurrentViewLines, sizeof(pointer) * fHeight); for q := 0 to fHeight - 1 do begin fSourceShotLines[q] := fSourceShot.Scanline[q]; fTargetShotLines[q] := fTargetShot.Scanline[q]; fCurrentViewLines[q] := fCurrentView.Scanline[q]; end; fStartTick := GetTickCount; fTimer.Enabled := true; end; procedure TIETransitionEffects.PrepareBitmap(OriginalBitmap, TargetBitmap : TBitmap); var q: Integer; begin if fTransition=iettNone then exit; fRunning := true; fStep := 0; fFirstStep := True; fAccum1 := 0; fFrames := 0; SetSizes(OriginalBitmap.Width, OriginalBitmap.Height); fSourceShot.assign(OriginalBitmap); fCurrentView.assign(OriginalBitmap); fTargetShot.assign(TargetBitmap); if ((fWidth < 2) and (fHeight < 2)) or (fHeight <> fSourceShot.Height) then begin fRunning := false; exit; end; if fSourceShotLines <> nil then freemem(fSourceShotLines); if fTargetShotLines <> nil then freemem(fTargetShotLines); if fCurrentViewLines <> nil then freemem(fCurrentViewLines); getmem(fSourceShotLines, sizeof(pointer) * fHeight); getmem(fTargetShotLines, sizeof(pointer) * fHeight); getmem(fCurrentViewLines, sizeof(pointer) * fHeight); for q := 0 to fHeight - 1 do begin fSourceShotLines[q] := fSourceShot.Scanline[q]; fTargetShotLines[q] := fTargetShot.Scanline[q]; fCurrentViewLines[q] := fCurrentView.Scanline[q]; end; end; procedure TIETransitionEffects.Stop; begin if not fRunning then exit; if fTransition = iettNone then exit; fTimer.Enabled := false; fRunning := false; fCurrentView.Width := 1; fCurrentView.Height := 1; fSourceShot.Width := 1; fSourceShot.Height := 1; fTargetShot.Width := 1; fTargetShot.Height := 1; if assigned( fOwner ) then begin TIEView( fOwner ).NPUnLockPaint; if fUpdateOnStop then TIEView( fOwner ).Update; if assigned(fOnTransitionStop) then fOnTransitionStop(fOwner); end; end; procedure TIETransitionEffects.MakeTransition(DestCanvas : TCanvas; bExplicitUpdate : Boolean = False); const Transitions_That_Use_CurrentViewLines = [iettRandomPoints , iettFadeIn , iettFadeOut , iettCrossDissolve , iettMoveLeftRight1 , iettMoveLeftRight2 , iettMoveRightLeft1 , iettMoveRightLeft2 , iettMoveUpDown1 , iettMoveUpDown2 , iettMoveDownUp1 , iettMoveDownUp2 {$ifdef IEINCLUDEEXTRATRANSITIONS} ,iettPageFlip2 , iettReversePageFlip2 , iettCubeRotateFromLeft , iettCubeRotateFromRight , iettCubeRotateFromTop , iettCubeRotateFromBottom , iettSoftWipeFromLeft , iettSoftWipeFromRight , iettSoftWipeFromTop , iettSoftWipeFromBottom , iettCubeRotateFromLeft2 , iettCubeRotateFromRight2 , iettCubeRotateFromTop2 , iettCubeRotateFromBottom2 {$endif} ]; var q: Integer; begin // Output transition to fCurrentView or fCurrentViewLines case fTransition of iettNone : begin { Nothing to do } end; iettCrossDissolve : CrossDissolve(fStep); iettFadeOut : FadeOut(fStep); iettFadeIn : FadeIn(fStep); iettFadeOutIn : FadeOutIn(fStep); iettLeftRight1 : LeftRight1(fStep); iettLeftRight2 : LeftRight2(fStep); iettRightLeft1 : RightLeft1(fStep); iettRightLeft2 : RightLeft2(fStep); iettUpDown1 : UpDown1(fStep); iettUpDown2 : UpDown2(fStep); iettDownUp1 : DownUp1(fStep); iettDownUp2 : DownUp2(fStep); iettMoveLeftRight1 : MoveLeftRight1(fStep); iettMoveLeftRight2 : MoveLeftRight2(fStep); iettMoveRightLeft1 : MoveRightLeft1(fStep); iettMoveRightLeft2 : MoveRightLeft2(fStep); iettMoveUpDown1 : MoveUpDown1(fStep); iettMoveUpDown2 : MoveUpDown2(fStep); iettMoveDownUp1 : MoveDownUp1(fStep); iettMoveDownUp2 : MoveDownUp2(fStep); iettRandomPoints : RandomPoints(fStep); iettFromUpLeft : FromUpLeft(fStep); iettFromUpRight : FromUpRight(fStep); iettFromBottomLeft : FromBottomLeft(fStep); iettFromBottomRight : FromBottomRight(fStep); iettRandomBoxes : RandomBoxes(fStep); iettCenter1 : Center1(fStep); iettCenter2 : Center2(fStep); iettCenterZoom1 : CenterZoom1(fStep); iettCenterZoom2 : CenterZoom2(fStep); iettPanZoom : PanZoom(fStep); {$ifdef IEINCLUDEEXTRATRANSITIONS} iettPageFlip : PageFlipEffect(fStep, True); iettPageFlip2 : PageFlipEffect3D(fStep, True); iettReversePageFlip : PageFlipEffect(fStep, False); iettReversePageFlip2 : PageFlipEffect3D(fStep, False); iettCubeRotateFromLeft : CubeRotateFromLeft(fStep); iettCubeRotateFromRight : CubeRotateFromRight(fStep); iettCubeRotateFromTop : CubeRotateFromTop(fStep); iettCubeRotateFromBottom : CubeRotateFromBottom(fStep); iettSoftWipeFromLeft : SoftWipeFromLeft(fStep); iettSoftWipeFromRight : SoftWipeFromRight(fStep); iettSoftWipeFromTop : SoftWipeFromTop(fStep); iettSoftWipeFromBottom : SoftWipeFromBottom(fStep); iettCubeRotateFromLeft2 : CubeRotateFromLeft3D(fStep); iettCubeRotateFromRight2 : CubeRotateFromRight3D(fStep); iettCubeRotateFromTop2 : CubeRotateFromTop3D(fStep); iettCubeRotateFromBottom2 : CubeRotateFromBottom3D(fStep); else begin // Support for Extra Transition effects if (fStep = 0) or fFirstStep then begin fCurrentView.assign(fSourceShot); fTransitionInitialized := False; end; if (fStep > 0) then begin SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); PerformExtraTransitionEffect(fTransition, fCurrentView.Canvas, fSourceShot, fTargetShot, Rect(0, 0, fCurrentView.Width, fCurrentView.Height), fStep); end; end; {$endif} end; // Force update of fCurrentView if bExplicitUpdate and (fTransition in Transitions_That_Use_CurrentViewLines) then for q := 0 to fCurrentView.Height - 1 do CopyMemory(fCurrentView.Scanline[q], fCurrentViewLines[q], IEBitmapRowLen(fCurrentView.Width, 24, 32)); // paint result BitBlt(DestCanvas.handle, 0, 0, fWidth, fHeight, fCurrentView.Canvas.Handle, 0, 0, SRCCOPY); end; procedure TIETransitionEffects.TimerEvent(Sender: TObject); var elap: dword; begin if not fRunning then exit; if assigned(fOnTransitionStep) then fOnTransitionStep(fOwner, fStep); inc(fFrames); MakeTransition( TIEView( fOwner ).GetCanvas ); if Assigned(FOnTransitionPaint) then fOnTransitionPaint(fOwner, FCurrentView, Self, fStep); // elap := GetTickCount - fStartTick; if elap >= dword(fDuration) then begin if FUpdateOnStop and (fTransition<>iettPanZoom) then begin BitBlt( TIEView( fOwner ).GetCanvas.handle, 0, 0, fWidth, fHeight, fTargetShot.Canvas.Handle, 0, 0, SRCCOPY); if Assigned(FOnTransitionPaint) then fOnTransitionPaint(fOwner, fTargetShot, Self, 1024); end; Stop; end; case fTiming of iettLinear: fStep := Trunc((elap / fDuration) * 1024); // linear iettExponential: fStep := Trunc( exp((elap/fDuration)*5-2.718)/10 * 1024); // exponential iettLogarithmic: fStep := Trunc( (ln((elap/fDuration)*10)+2.718)/5 * 1024 ); // logarithmic end; if fStep > 1024 then fStep := 1024; fFirstStep := False; end; // TransitionProgress: The percentage that it is has progressed from the start image to the end image (ranging from 0.0 to 100.0) procedure TIETransitionEffects.CreateBitmap(TransitionProgress : Single; DestBitmap : TBitmap); // NPC: 24/10/11 begin // Removed v5.0.7. Already handled by PrepareBitmap. Causes A/V on memory copy // if (TransitionProgress = 0) or fFirstStep then // fCurrentView.assign(fSourceShot); DestBitmap.width := fWidth; DestBitmap.Height := fHeight; DestBitmap.pixelformat := pf24bit; FStep := Round(1024 * TransitionProgress / 100); if fStep > 1024 then fStep := 1024; if fStep < 0 then fStep := 0; inc(fFrames); // make transition MakeTransition(DestBitmap.Canvas, True); fFirstStep := False; end; procedure TIETransitionEffects.RandomPoints(Step: integer); var y, fRowLen: integer; px1, px2: PRGBROW; r, rr: integer; s, q: integer; begin fRowLen := IEBitmapRowLen(fWidth, 24, 32); if (fStep = 0) or fFirstStep then CopyMemory(fCurrentViewLines[fHeight - 1], fSourceShotLines[fHeight - 1], fRowLen * fHeight); if fStep > 0 then begin q := round(Step * fWidth * (Step / 180) / 1024); s := q - fAccum1; fAccum1 := q; for y := 0 to fHeight - 1 do begin px1 := fCurrentViewLines[y]; px2 := fTargetShotLines[y]; for q := 0 to s - 1 do begin r := random(fWidth); px1^[r].r := px2^[r].r; px1^[r].b := px2^[r].b; px1^[r].g := px2^[r].g; if IEGlobalSettings().TransitionsDrawAlternative then begin for rr := 1 to 5 do if r + rr < fWidth then begin px1^[r + rr].r := px2^[r + rr].r; px1^[r + rr].b := px2^[r + rr].b; px1^[r + rr].g := px2^[r + rr].g; end; end; end; end; end; end; // fade from background procedure TIETransitionEffects.FadeIn(Step: integer); var x, y: integer; ppx, ppx3: pRGB; c1: integer; rr, gg, bb: integer; begin c1 := 1024 - Step; with TColor2TRGB(FBackground) do begin rr := r * c1; gg := g * c1; bb := b * c1; end; for y := 0 to fHeight - 1 do begin ppx := fTargetShotLines[y]; ppx3 := fCurrentViewLines[y]; for x := 0 to fWidth - 1 do begin with ppx3^ do begin r := (ppx^.r * Step + rr) shr 10; g := (ppx^.g * Step + gg) shr 10; b := (ppx^.b * Step + bb) shr 10; end; inc(ppx); inc(ppx3); end; end; end; procedure TIETransitionEffects.FadeOutIn(Step: integer); begin if Step < 512 then FadeOut(Step * 2) else FadeIn((Step - 512) * 2); end; // dissolve to background procedure TIETransitionEffects.FadeOut(Step: integer); var x, y: integer; ppx, ppx3: pRGB; c1: integer; rr, gg, bb: integer; begin c1 := 1024 - Step; with TColor2TRGB(FBackground) do begin rr := r * Step; gg := g * Step; bb := b * Step; end; for y := 0 to fHeight - 1 do begin ppx := fSourceShotLines[y]; ppx3 := fCurrentViewLines[y]; for x := 0 to fWidth - 1 do begin with ppx3^ do begin r := (ppx^.r * c1 + rr) shr 10; g := (ppx^.g * c1 + gg) shr 10; b := (ppx^.b * c1 + bb) shr 10; end; inc(ppx); inc(ppx3); end; end; end; procedure TIETransitionEffects.CrossDissolve(Step: integer); var x, y: integer; ppx, ppx2, ppx3: pRGB; c1: integer; begin c1 := 1024 - Step; for y := 0 to fHeight - 1 do begin ppx := fSourceShotLines[y]; ppx2 := fTargetShotLines[y]; ppx3 := fCurrentViewLines[y]; for x := 0 to fWidth - 1 do begin with ppx3^ do begin r := (ppx^.r * c1 + ppx2^.r * Step) shr 10; g := (ppx^.g * c1 + ppx2^.g * Step) shr 10; b := (ppx^.b * c1 + ppx2^.b * Step) shr 10; end; inc(ppx); inc(ppx2); inc(ppx3); end; end; end; procedure TIETransitionEffects.LeftRight1(Step: integer); begin if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); BitBlt(fCurrentView.Canvas.Handle, 0, 0, ((Step * fWidth) shr 10), fHeight, fTargetShot.Canvas.Handle, 0, 0, SRCCOPY); end; procedure TIETransitionEffects.LeftRight2(Step: integer); var sx: integer; begin sx := (Step * fWidth) shr 10; if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); BitBlt(fCurrentView.Canvas.Handle, 0, 0, sx, fHeight, fTargetShot.Canvas.Handle, 0, 0, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative then begin fCurrentView.Canvas.Pen.color := clGray; fCurrentView.Canvas.Pen.Width := 2; end else begin fCurrentView.Canvas.Pen.color := clRed; fCurrentView.Canvas.Pen.Width := 1; end; fCurrentView.Canvas.MoveTo(sx, 0); fCurrentView.canvas.LineTo(sx, fHeight); end; procedure TIETransitionEffects.RightLeft1(Step: integer); var sx, sx2: integer; begin sx := round(((1024 - Step) * fWidth) / 1024); sx2 := round((Step * fWidth) / 1024); if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); BitBlt(fCurrentView.Canvas.Handle, sx, 0, sx2, fHeight, fTargetShot.Canvas.Handle, sx, 0, SRCCOPY); end; procedure TIETransitionEffects.RightLeft2(Step: integer); var sx, sx2: integer; begin sx := round(((1024 - Step) * fWidth) / 1024); sx2 := round((Step * fWidth) / 1024); if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); BitBlt(fCurrentView.Canvas.Handle, sx, 0, sx2, fHeight, fTargetShot.Canvas.Handle, sx, 0, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative then begin fCurrentView.Canvas.Pen.color := clGray; fCurrentView.Canvas.Pen.Width := 2; end else begin fCurrentView.Canvas.Pen.color := clRed; fCurrentView.Canvas.Pen.Width := 1; end; fCurrentView.Canvas.MoveTo(sx, 0); fCurrentView.canvas.LineTo(sx, fHeight); end; procedure TIETransitionEffects.UpDown1(Step: integer); var sy: integer; begin sy := round((Step * fHeight) / 1024); if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); BitBlt(fCurrentView.Canvas.Handle, 0, 0, fWidth, sy, fTargetShot.Canvas.Handle, 0, 0, SRCCOPY); end; procedure TIETransitionEffects.UpDown2(Step: integer); var sy: integer; begin sy := round((Step * fHeight) / 1024); if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); BitBlt(fCurrentView.Canvas.Handle, 0, 0, fWidth, sy, fTargetShot.Canvas.Handle, 0, 0, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative then begin fCurrentView.Canvas.Pen.color := clGray; fCurrentView.Canvas.Pen.Width := 2; end else begin fCurrentView.Canvas.Pen.color := clRed; fCurrentView.Canvas.Pen.Width := 1; end; fCurrentView.Canvas.MoveTo(0, sy); fCurrentView.Canvas.LineTo(fWidth, sy); end; procedure TIETransitionEffects.DownUp1(Step: integer); var sy, sy2: integer; begin sy := round(((1024 - Step) * fHeight) / 1024); sy2 := round((Step * fHeight) / 1024); if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); BitBlt(fCurrentView.Canvas.Handle, 0, sy, fWidth, sy2, fTargetShot.Canvas.Handle, 0, sy, SRCCOPY); end; procedure TIETransitionEffects.DownUp2(Step: integer); var sy, sy2: integer; begin sy := round(((1024 - Step) * fHeight) / 1024); sy2 := round((Step * fHeight) / 1024); if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); BitBlt(fCurrentView.Canvas.Handle, 0, sy, fWidth, sy2, fTargetShot.Canvas.Handle, 0, sy, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative then begin fCurrentView.Canvas.Pen.color := clGray; fCurrentView.Canvas.Pen.Width := 2; end else begin fCurrentView.Canvas.Pen.color := clRed; fCurrentView.Canvas.Pen.Width := 1; end; fCurrentView.Canvas.MoveTo(0, sy); fCurrentView.Canvas.LineTo(fWidth, sy); end; procedure TIETransitionEffects.MoveLeftRight1(Step: integer); var sx, y: integer; ppx, ppx2: PRGB; begin sx := Step * fWidth shr 10; for y := 0 to fHeight - 1 do begin ppx := fCurrentViewLines[y]; ppx2 := fTargetShotLines[y]; inc(ppx2, fWidth - sx); CopyMemory(ppx, ppx2, sx * 3); inc(ppx, sx); CopyMemory(ppx, fSourceShotLines[y], (fWidth - sx) * 3); end; end; procedure TIETransitionEffects.MoveLeftRight2(Step: integer); var sx, y: integer; ppx: PRGB; begin sx := Step * fWidth shr 10; for y := 0 to fHeight - 1 do begin ppx := fCurrentViewLines[y]; CopyMemory(ppx, fTargetShotLines[y], sx * 3); inc(ppx, sx); CopyMemory(ppx, fSourceShotLines[y], (fWidth - sx) * 3); end; end; procedure TIETransitionEffects.MoveRightLeft1(Step: integer); var sx, y: integer; ppx, ppx2: PRGB; begin sx := (1024 - Step) * fWidth shr 10; for y := 0 to fHeight - 1 do begin ppx := fCurrentViewLines[y]; ppx2 := fSourceShotLines[y]; inc(ppx2, fWidth - sx); CopyMemory(ppx, ppx2, sx * 3); inc(ppx, sx); CopyMemory(ppx, fTargetShotLines[y], (fWidth - sx) * 3); end; end; procedure TIETransitionEffects.MoveRightLeft2(Step: integer); var sx, y: integer; ppx: PRGB; begin sx := (1024 - Step) * fWidth shr 10; for y := 0 to fHeight - 1 do begin ppx := fCurrentViewLines[y]; CopyMemory(ppx, fSourceShotLines[y], sx * 3); inc(ppx, sx); CopyMemory(ppx, fTargetShotLines[y], (fWidth - sx) * 3); end; end; procedure TIETransitionEffects.MoveUpDown1(Step: integer); var sy, fRowLen, y: integer; begin sy := Step * fHeight shr 10; fRowLen := IEBitmapRowLen(fWidth, 24, 32); for y := 0 to sy - 1 do CopyMemory(fCurrentViewLines[y], fTargetShotLines[fHeight - sy + y], fRowLen); for y := sy to fHeight - 1 do CopyMemory(fCurrentViewLines[y], fSourceShotLines[y - sy], fRowLen); end; // source image go away procedure TIETransitionEffects.MoveUpDown2(Step: integer); var sy, fRowLen, y: integer; begin sy := Step * fHeight shr 10; fRowLen := IEBitmapRowLen(fWidth, 24, 32); for y := 0 to sy - 1 do CopyMemory(fCurrentViewLines[y], fTargetShotLines[y], fRowLen); for y := sy to fHeight - 1 do CopyMemory(fCurrentViewLines[y], fSourceShotLines[y - sy], fRowLen); end; procedure TIETransitionEffects.MoveDownUp1(Step: integer); var sy, fRowLen, y: integer; begin sy := (1024 - Step) * fHeight shr 10; fRowLen := IEBitmapRowLen(fWidth, 24, 32); for y := 0 to sy - 1 do CopyMemory(fCurrentViewLines[y], fSourceShotLines[fHeight - sy + y], fRowLen); for y := sy to fHeight - 1 do CopyMemory(fCurrentViewLines[y], fTargetShotLines[y - sy], fRowLen); end; // source image go away procedure TIETransitionEffects.MoveDownUp2(Step: integer); var sy, fRowLen, y: integer; begin sy := (1024 - Step) * fHeight shr 10; fRowLen := IEBitmapRowLen(fWidth, 24, 32); for y := 0 to sy - 1 do CopyMemory(fCurrentViewLines[y], fSourceShotLines[fHeight - sy + y], fRowLen); for y := sy to fHeight - 1 do CopyMemory(fCurrentViewLines[y], fTargetShotLines[y], fRowLen); end; procedure TIETransitionEffects.FromUpLeft(Step: integer); var sx, sy: integer; begin sx := (1024 - Step) * fWidth shr 10; sy := (1024 - Step) * fHeight shr 10; if Step = 0 then fCurrentView.Canvas.Draw(0, 0, fSourceShot); fCurrentView.Canvas.Draw(-sx, -sy, fTargetShot) end; procedure TIETransitionEffects.FromUpRight(Step: integer); var sx, sy: integer; begin sx := (1024 - Step) * fWidth shr 10; sy := (1024 - Step) * fHeight shr 10; if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); fCurrentView.Canvas.Draw(sx, -sy, fTargetShot); end; procedure TIETransitionEffects.FromBottomLeft(Step: integer); var sx, sy: integer; begin sx := (1024 - Step) * fWidth shr 10; sy := (1024 - Step) * fHeight shr 10; if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); fCurrentView.Canvas.Draw(-sx, sy, fTargetShot); end; procedure TIETransitionEffects.FromBottomRight(Step: integer); var sx, sy: integer; begin sx := (1024 - Step) * fWidth shr 10; sy := (1024 - Step) * fHeight shr 10; if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); fCurrentView.Canvas.Draw(sx, sy, fTargetShot); end; procedure TIETransitionEffects.RandomBoxes(Step: integer); const Box_Value = 8; var s, q, x, y: integer; iBoxDims: integer; begin iBoxDims := Box_Value; if IEGlobalSettings().TransitionsDrawAlternative then iBoxDims := 2 * Box_Value; if fStep = 0 then fCurrentView.Canvas.Draw(0, 0, fSourceShot) else begin q := round(Step * (fWidth * fHeight div (iBoxDims * iBoxDims)) * (Step / 180) / 1024); s := q - fAccum1; fAccum1 := q; for q := 0 to s - 1 do begin x := random(fWidth) and $FFFFFFF8; y := random(fheight) and $FFFFFFF8; BitBlt(fCurrentView.Canvas.Handle, x, y, iBoxDims, iBoxDims, fTargetShot.Canvas.Handle, x, y, SRCCOPY); end; end; end; // the new image begin from center procedure TIETransitionEffects.Center1(Step: integer); var sx, sy: integer; sx2, sy2: integer; cx, cy: integer; begin cx := fWidth shr 1; cy := fheight shr 1; sx := (Step * cx) shr 10; sx2 := Step * fWidth shr 10; sy := (Step * cy) shr 10; sy2 := step * fHeight shr 10; if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); BitBlt(fCurrentView.Canvas.Handle, cx - sx, cy - sy, sx2, sy2, fTargetShot.Canvas.Handle, cx - sx, cy - sy, SRCCOPY); end; // the old image collapse in the center procedure TIETransitionEffects.Center2(Step: integer); var sx, sy: integer; sx2, sy2: integer; cx, cy: integer; begin cx := fWidth shr 1; cy := fheight shr 1; sx := ((1024 - Step) * cx) shr 10; sx2 := (1024 - Step) * fWidth shr 10; sy := ((1024 - Step) * cy) shr 10; sy2 := (1024 - step) * fHeight shr 10; fCurrentView.Canvas.Draw(0, 0, fTargetShot); BitBlt(fCurrentView.Canvas.Handle, cx - sx, cy - sy, sx2, sy2, fSourceShot.Canvas.Handle, cx - sx, cy - sy, SRCCOPY); end; procedure TIETransitionEffects.CenterZoom1(Step: integer); var sx, sy: integer; sx2, sy2: integer; cx, cy: integer; begin cx := fWidth shr 1; cy := fheight shr 1; sx := (Step * cx) shr 10; sx2 := Step * fWidth shr 10; sy := (Step * cy) shr 10; sy2 := step * fHeight shr 10; if (Step = 0) or fFirstStep then fCurrentView.Canvas.Draw(0, 0, fSourceShot); SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); StretchBlt(fCurrentView.Canvas.Handle, cx - sx, cy - sy, sx2, sy2, fTargetShot.Canvas.Handle, 0, 0, fWidth, fHeight, SRCCOPY); end; procedure TIETransitionEffects.CenterZoom2(Step: integer); var sx, sy: integer; sx2, sy2: integer; cx, cy: integer; begin cx := fWidth shr 1; cy := fheight shr 1; sx := ((1024 - Step) * cx) shr 10; sx2 := (1024 - Step) * fWidth shr 10; sy := ((1024 - Step) * cy) shr 10; sy2 := (1024 - step) * fHeight shr 10; fCurrentView.Canvas.Draw(0, 0, fTargetShot); SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); StretchBlt(fCurrentView.Canvas.Handle, cx - sx, cy - sy, sx2, sy2, fSourceShot.Canvas.Handle, 0, 0, fWidth, fHeight, SRCCOPY); end; procedure TIETransitionEffects.PanZoom(Step: integer); var bHasBorders: boolean; xdst, ydst, dxdst, dydst: Integer; xSrc, ySrc, dxSrc, dySrc: Integer; q: double; iSetLeft, iSetTop, iSetRight, iSetBottom : Integer; aRect: TRect; aBitmap: TBitmap; blendFunc: _BLENDFUNCTION; FullImage : TIEBitmap; procedure ResetMinMaxVals; begin fMinLeft := round(xSrc); fMaxLeft := round(xSrc); fMinTop := round(ySrc); fMaxTop := round(ySrc); fMinRight := Trunc(xSrc + dxSrc); fMaxRight := Trunc(xSrc + dxSrc); fMinBottom := Trunc(ySrc + dySrc); fMaxBottom := Trunc(ySrc + dySrc); end; procedure UpdateMinMaxVals; begin if iSetLeft < fMinLeft then fMinLeft := iSetLeft; if iSetLeft > fMaxLeft then fMaxLeft := iSetLeft; if iSetTop < fMinTop then fMinTop := iSetTop; if iSetTop > fMaxTop then fMaxTop := iSetTop; if iSetRight < fMinRight then fMinRight := iSetRight; if iSetRight > fMaxRight then fMaxRight := iSetRight; if iSetBottom < fMinBottom then fMinBottom := iSetBottom; if iSetBottom > fMaxBottom then fMaxBottom := iSetBottom; end; begin bHasBorders := false; aBitmap := TBitmap.create; aBitmap.Width := fCurrentView.Width; aBitmap.Height := fCurrentView.Height; aBitmap.PixelFormat := fCurrentView.PixelFormat; FullImage := TIEBitmap( fFullImage ); xdst := 0; ydst := 0; dxdst := fWidth; dydst := fHeight; q := ( StartRect.Left - EndRect.Left ) / 1024; xSrc := Trunc( StartRect.Left - q * Step ); q := ( StartRect.Top - EndRect.Top ) / 1024; ySrc := Trunc( StartRect.Top- q * Step ); q := ( StartRect.Right - EndRect.Right ) / 1024; dxSrc := Trunc( StartRect.Right - q * Step) - xSrc; q := ( StartRect.Bottom- EndRect.Bottom ) / 1024; dySrc := Trunc( StartRect.Bottom - q * Step ) - ySrc; // Are we showing some border area? if xSrc < 0 then begin xSrc := 0; bHasBorders := true; end; if dxSrc > FullImage.width then begin dxSrc := FullImage.width; bHasBorders := true; end; if xSrc + dxSrc > FullImage.width then begin xSrc := FullImage.width - dxSrc; bHasBorders := true; end; if ySrc < 0 then begin ySrc := 0; bHasBorders := true; end; if ySrc + dySrc > FullImage.Height then begin ySrc := FullImage.Height - dySrc; bHasBorders := true; end; if dySrc > FullImage.height then begin dySrc := FullImage.height; bHasBorders := true; end; if bHasBorders then begin // Center the visible image portion within the window (and maintain the aspect ratio) aRect := GetImageRectWithinArea( dxSrc, dySrc, fwidth, fheight ); xdst := aRect.Left; ydst := aRect.Top; dxdst := aRect.Right - aRect.Left; dydst := aRect.Bottom - aRect.Top; // Draw the background if assigned(fOwner) and (fOwner is TImageEnView) then TImageEnView(fOwner).DrawBackgroundToCanvas(aBitmap.Canvas) else begin aBitmap.Canvas.Brush.color := fBackground; aBitmap.Canvas.FillRect(rect(0, 0, aBitmap.width, aBitmap.height)); end; end; if (Step = 0) or (fFirstStep) or (fMinLeft = 0) or (fMaxRight = 0) or (bHasBorders) then ResetMinMaxVals; // Smooth pan zoom motion if StartRect.Left > EndRect.Left then // Getting Smaller iSetLeft := min(fMinLeft, round(xSrc)) else // Getting Larger iSetLeft := max(fMaxLeft, round(xSrc)); if StartRect.Top > EndRect.Top then // Getting Smaller iSetTop := min(fMinTop, round(ySrc)) else // Getting Larger iSetTop := max(fMaxTop, round(ySrc)); if StartRect.Right > EndRect.Right then // Getting Smaller iSetRight := min(fMinRight, iSetLeft + Trunc(dxSrc)) else // Getting Larger iSetRight := max(fMaxRight, iSetLeft + Trunc(dxSrc)); if StartRect.Bottom > EndRect.Bottom then // Getting Smaller iSetBottom := min(fMinBottom, iSetTop + Trunc(dySrc)) else // Getting Larger iSetBottom := max(fMaxBottom, iSetTop + Trunc(dySrc)); FullImage.RenderToTBitmapEx(aBitmap, round(xdst), round(ydst), Trunc(dxdst), Trunc(dydst), iSetLeft, iSetTop, iSetRight - iSetLeft, iSetBottom - iSetTop, True, 255, IEGlobalSettings().PanZoomQualityFilter, ielNormal); {$ifdef IEHASNOTWINDOWSALPHABLEND} fCurrentView.assign( aBitmap ); {$else} if fFirstStep or ( Step = 0 ) or ( fSmoothing < 1 ) or ( fSmoothing > 254 )then fCurrentView.assign( aBitmap ) else begin // Blend the result for smoothness blendFunc.BlendOp := AC_SRC_OVER; blendFunc.BlendFlags := 0; blendFunc.SourceConstantAlpha := fSmoothing; blendFunc.AlphaFormat := 0; AlphaBlend( fCurrentView.Canvas.handle, 0, 0, fWidth, fHeight, aBitmap.Canvas.Handle, 0, 0, fWidth, fHeight, blendFunc ); end; {$endif} UpdateMinMaxVals; aBitmap.free; end; {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.SoftWipeHorizontalEx(Step: integer; bForward : Boolean); var x, y: integer; ppx, ppx2, ppx3: pRGB; iTransLevel: integer; iBlendEndPos: Integer; iDistance: Integer; iBlendWidth: Integer; begin if bForward = False then Step := 1024 - Step; iBlendWidth := FWidth div 8; if IEGlobalSettings().TransitionsDrawAlternative then iBlendWidth := FWidth div 4; iBlendEndPos := MulDiv(FWidth + iBlendWidth, Step, 1024); for y := 0 to fHeight - 1 do begin if bForward then begin ppx := fSourceShotLines[y]; ppx2 := fTargetShotLines[y]; end else begin ppx := fTargetShotLines[y]; ppx2 := fSourceShotLines[y]; end; ppx3 := fCurrentViewLines[y]; for x := 0 to fWidth - 1 do begin if X > iBlendEndPos then iTransLevel := 0 else begin iDistance := iBlendEndPos - X; iTransLevel := MulDiv(1024, iDistance, iBlendWidth); if iTransLevel > 1024 then iTransLevel := 1024; end; with ppx3^ do begin r := (ppx^.r * (1024 - iTransLevel) + ppx2^.r * iTransLevel) shr 10; g := (ppx^.g * (1024 - iTransLevel) + ppx2^.g * iTransLevel) shr 10; b := (ppx^.b * (1024 - iTransLevel) + ppx2^.b * iTransLevel) shr 10; end; inc(ppx); inc(ppx2); inc(ppx3); end; end; end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.SoftWipeFromRight(Step: integer); begin SoftWipeHorizontalEx(Step, False); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.SoftWipeFromLeft(Step: integer); begin SoftWipeHorizontalEx(Step, True); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.SoftWipeVerticalEx(Step: integer; bForward : Boolean); var x, y: integer; ppx, ppx2, ppx3: pRGB; iTransLevel: integer; iBlendEndPos: Integer; iDistance: Integer; iBlendHeight: Integer; begin if bForward = False then Step := 1024 - Step; iBlendHeight := FHeight div 8; if IEGlobalSettings().TransitionsDrawAlternative then iBlendHeight := FHeight div 4; iBlendEndPos := MulDiv(fHeight + iBlendHeight, Step, 1024); for y := 0 to fHeight - 1 do begin if bForward then begin ppx := fSourceShotLines[y]; ppx2 := fTargetShotLines[y]; end else begin ppx := fTargetShotLines[y]; ppx2 := fSourceShotLines[y]; end; ppx3 := fCurrentViewLines[y]; if Y > iBlendEndPos then iTransLevel := 0 else begin iDistance := iBlendEndPos - Y; iTransLevel := MulDiv(1024, iDistance, iBlendHeight); if iTransLevel > 1024 then iTransLevel := 1024; end; for x := 0 to fWidth - 1 do begin with ppx3^ do begin r := (ppx^.r * (1024 - iTransLevel) + ppx2^.r * iTransLevel) shr 10; g := (ppx^.g * (1024 - iTransLevel) + ppx2^.g * iTransLevel) shr 10; b := (ppx^.b * (1024 - iTransLevel) + ppx2^.b * iTransLevel) shr 10; end; inc(ppx); inc(ppx2); inc(ppx3); end; end; end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.SoftWipeFromTop(Step: integer); begin SoftWipeVerticalEx(Step, True); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.SoftWipeFromBottom(Step: integer); begin SoftWipeVerticalEx(Step, False); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.PageFlipDarkenEdges(iCurrentPosition, Step : Integer; bForward: Boolean); const Initial_Darken_Level = 0.25; Darkness_Reduction = 0.5; var iX, iY: integer; ppx: pRGB; rr, gg, bb: integer; iFadeStep: integer; bDoDarken: Boolean; begin if Step < 512 then iFadeStep := Round(Step + Round(1024 * Initial_Darken_Level) / Darkness_Reduction) else iFadeStep := Round(1024 - Step + Round(1024 * Initial_Darken_Level) / Darkness_Reduction); if iFadeStep > 1024 then iFadeStep := 1024; with TColor2TRGB(fBackground) do begin rr := r * (1024 - iFadeStep); gg := g * (1024 - iFadeStep); bb := b * (1024 - iFadeStep); end; for iY := 0 to fHeight - 1 do begin ppx := fCurrentViewLines[iY]; for iX := 0 to fWidth - 1 do begin if Step < 512 then bDoDarken := iX > iCurrentPosition else bDoDarken := iX < iCurrentPosition; if bForward = False then bDoDarken := not bDoDarken; if bDoDarken then with ppx^ do begin r := (ppx^.r * iFadeStep + rr) shr 10; g := (ppx^.g * iFadeStep + gg) shr 10; b := (ppx^.b * iFadeStep + bb) shr 10; end; inc(ppx); end; end; fCurrentView.Canvas.MoveTo(iCurrentPosition, 0); fCurrentView.Canvas.LineTo(iCurrentPosition, fHeight); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} // Page Flip Transition procedure TIETransitionEffects.PageFlipEffect(Step: Integer; bForward: Boolean); var W, H, X: Integer; begin W := fCurrentView.Width; H := fCurrentView.Height; if (Step = 0) or fFirstStep then StretchBlt(fCurrentView.Canvas.Handle, 0, 0, W, H, FSourceShot.Canvas.Handle, 0, 0, W, H, SRCCOPY); if Step = 0 then exit; SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); fCurrentView.Canvas.Pen.Color := clBlack; fCurrentView.Canvas.Pen.Width := 1; fCurrentView.Canvas.Pen.Style := psSolid; if bForward then begin // draw the new image on the RHS StretchBlt(fCurrentView.Canvas.Handle, w div 2, 0, w div 2, H, FTargetShot.Canvas.Handle, w div 2, 0, W div 2, H, SRCCOPY); if Step <= 512 then begin X := MulDiv(W, 512 - Step, 1024); // Right Hand fCurrentView.Canvas StretchBlt(fCurrentView.Canvas.Handle, w div 2, 0, X, H, FSourceShot.Canvas.Handle, w div 2, 0, W div 2, H, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative = False then PageFlipDarkenEdges(w div 2 + X, Step, True); end else begin X := MulDiv(W, Step - 512, 512) div 2; if IEGlobalSettings().TransitionsDrawAlternative = False then StretchBlt(fCurrentView.Canvas.Handle, 0, 0, W div 2, H, FSourceShot.Canvas.Handle, 0, 0, W div 2, H, SRCCOPY); // Left Hand side StretchBlt(fCurrentView.Canvas.Handle, W div 2 - X, 0, X, H, FTargetShot.Canvas.Handle, 0, 0, W div 2, H, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative = False then PageFlipDarkenEdges(w div 2 - X, Step, True); end; end else begin // draw the New image on the LHS StretchBlt(fCurrentView.Canvas.Handle, 0, 0, w div 2, H, FTargetShot.Canvas.Handle, 0, 0, W div 2, H, SRCCOPY); if Step <= 512 then begin X := MulDiv(W, Step, 1024); // Left Hand side StretchBlt(fCurrentView.Canvas.Handle, X, 0, w div 2 - X, H, FSourceShot.Canvas.Handle, 0, 0, W div 2, H, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative = False then PageFlipDarkenEdges(X, Step, False); end else begin X := MulDiv(W, Step - 512, 512) div 2; // draw the old image on the RHS StretchBlt(fCurrentView.Canvas.Handle, w div 2, 0, w div 2, H, FSourceShot.Canvas.Handle, w div 2, 0, W div 2, H, SRCCOPY); // Right Hand Side StretchBlt(fCurrentView.Canvas.Handle, W div 2, 0, X, H, FTargetShot.Canvas.Handle, w div 2, 0, W div 2, H, SRCCOPY); if IEGlobalSettings().TransitionsDrawAlternative = False then PageFlipDarkenEdges(w div 2 + X, Step, False); end; end; end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} // 3D Page Flip Transition procedure TIETransitionEffects.PageFlipEffect3D(Step: Integer; bForward: Boolean); const Inset_Factor = 10; // 1/10 the height var W, H, X, iInset: Integer; IECurrentView : TIEBitmap; IESourceShotLHS, IESourceShotRHS : TIEBitmap; IETargetShotLHS, IETargetShotRHS : TIEBitmap; iEdgeInset: Integer; iAlpha: Integer; begin W := fCurrentView.Width; H := fCurrentView.Height; if (Step = 0) or fFirstStep then StretchBlt(fCurrentView.Canvas.Handle, 0, 0, W, H, FSourceShot.Canvas.Handle, 0, 0, W, H, SRCCOPY); if Step = 0 then exit; if Step <= 512 then iInset := MulDiv(H, Step, 512 * Inset_Factor) else iInset := MulDiv(H, 1024 - Step, 512 * Inset_Factor); iEdgeInset := iInset div 2; fCurrentView.Canvas.Brush.Color := fBackground; fCurrentView.Canvas.fillRect(Rect(0, 0, fCurrentView.Width, fCurrentView.height)); SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); fCurrentView.Canvas.Pen.Color := clBlack; fCurrentView.Canvas.Pen.Width := 1; fCurrentView.Canvas.Pen.Style := psSolid; IECurrentView := TIEBitmap.create; IESourceShotLHS := TIEBitmap.create(fSourceShot, Rect(0, 0, W div 2, H)); IESourceShotRHS := TIEBitmap.create(fSourceShot, Rect(W div 2, 0, W, H)); IETargetShotLHS := TIEBitmap.create(fTargetShot, Rect(0, 0, W div 2, H)); IETargetShotRHS := TIEBitmap.create(fTargetShot, Rect(w div 2, 0, W, H)); try IECurrentView.EncapsulateTBitmap(fCurrentView, False); if bForward then begin // FORWARD PAGE FLIP // Draw old image on LHS IEPerspectiveTransform(IESourceShotLHS, IECurrentView, iEdgeInset, iEdgeInset, // Top-Left W div 2, iInset, // Top-Right W div 2, H - iInset, // Bottom-Right iEdgeInset, H - iEdgeInset, // Bottom-Left -1, -1, True); // Draw new image on the RHS IEPerspectiveTransform(IETargetShotRHS, IECurrentView, w div 2, iInset, // Top-Left W - iEdgeInset, iEdgeInset, // Top-Right W - iEdgeInset, H - iEdgeInset, // Bottom-Right w div 2, H - iInset, // Bottom-Left -1, -1, True); if Step <= 512 then begin X := MulDiv(W, 512 - Step, 1024); // Draw old image flipping on RHS IEPerspectiveTransform(IESourceShotRHS, IECurrentView, w div 2, iInset, // Top-Left W div 2 + X, 0, // Top-Right W div 2 + X, H , // Bottom-Right w div 2, H - iInset, // Bottom-Left -1, -1, True); end else begin X := MulDiv(W, Step - 512, 512) div 2; // Draw New image flipping on LHS IEPerspectiveTransform(IETargetShotLHS, IECurrentView, W div 2 - X, 0, // Top-Left W div 2, iInset, // Top-Right W div 2, H - iInset, // Bottom-Right w div 2 - X, H , // Bottom-Left -1, -1, True); end; end else begin // REVERSE PAGE FLIP // Draw new image on the LHS IEPerspectiveTransform(IETargetShotLHS, IECurrentView, iEdgeInset, 0, // Top-Left W div 2, iInset, // Top-Right W div 2, H - iInset, // Bottom-Right iEdgeInset, H, // Bottom-Left -1, -1, True); // Draw old image on RHS IEPerspectiveTransform(IESourceShotRHS, IECurrentView, w div 2, iInset, // Top-Left W - iEdgeInset, 0, // Top-Right W - iEdgeInset, H, // Bottom-Right w div 2, H - iInset, // Bottom-Left -1, -1, True); if Step <= 512 then begin X := MulDiv(W, Step, 1024); // Draw old image flipping on LHS IEPerspectiveTransform(IESourceShotLHS, IECurrentView, X, 0, // Top-Left W div 2, iInset, // Top-Right W div 2, H - iInset, // Bottom-Right X, H, // Bottom-Left -1, -1, True); end else begin X := MulDiv(W, Step - 512, 512) div 2; // Draw new image flipping on RHS IEPerspectiveTransform(IETargetShotRHS, IECurrentView, w div 2, iInset, // Top-Left W div 2 + X, 0, // Top-Right W div 2 + X, H, // Bottom-Right w div 2, H - iInset, // Bottom-Left -1, -1, True); end; end; finally FreeAndNil(IESourceShotLHS); FreeAndNil(IESourceShotRHS); FreeAndNil(IETargetShotLHS); FreeAndNil(IETargetShotRHS); FreeAndNil(IECurrentView); end; // Darken half shown pages if bForward then begin if Step <= 512 then PageFlipDarkenEdges(w div 2 + X, Step, True) else PageFlipDarkenEdges(w div 2 - X, Step, True); end else begin if Step <= 512 then PageFlipDarkenEdges(X, Step, False) else PageFlipDarkenEdges(w div 2 + X, Step, False); end; // DRAW PAGE CENTER LINE if IEGlobalSettings().TransitionsDrawAlternative = False then begin if Step <= 512 then iAlpha := MulDiv(Step, 255, 1024) else iAlpha := MulDiv(1024 - Step, 255, 1024); ColorBlend(fCurrentView.Canvas.Handle, Rect(w div 2, 0, w div 2 + 1, fHeight), fBackground, iAlpha); end; end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.CubeRotateDarkenEdges(bVertical, bForward: Boolean; iCurrentPosition, Step : Integer); const Initial_Darken_Level = 0.15; Darkness_Reduction = 0.6; var iX, iY: integer; ppx: pRGB; rr1, gg1, bb1: integer; rr2, gg2, bb2: integer; bFirstHalf: Boolean; iFadeStep1, iFadeStep2 : integer; begin if bForward then begin iFadeStep1 := Round(Step + Round(1024 * Initial_Darken_Level) / Darkness_Reduction); iFadeStep2 := Round(1024 - Step + Round(1024 * Initial_Darken_Level) / Darkness_Reduction); end else begin iFadeStep1 := Round(1024 - Step + Round(1024 * Initial_Darken_Level) / Darkness_Reduction); iFadeStep2 := Round(Step + Round(1024 * Initial_Darken_Level) / Darkness_Reduction); end; if iFadeStep1 > 1024 then iFadeStep1 := 1024; if iFadeStep2 > 1024 then iFadeStep2 := 1024; with TColor2TRGB(fBackground) do begin rr1 := r * iFadeStep1; gg1 := g * iFadeStep1; bb1 := b * iFadeStep1; end; with TColor2TRGB(fBackground) do begin rr2 := r * iFadeStep2; gg2 := g * iFadeStep2; bb2 := b * iFadeStep2; end; for iY := 0 to fCurrentView.Height - 1 do begin ppx := fCurrentViewLines[iY]; for iX := 0 to fCurrentView.Width - 1 do begin if bVertical then bFirstHalf := (iY < iCurrentPosition) else bFirstHalf := (iX < iCurrentPosition); if bFirstHalf then begin // Darken LHS/Top with ppx^ do begin r := (ppx^.r * iFadeStep1 + rr1) shr 10; g := (ppx^.g * iFadeStep1 + gg1) shr 10; b := (ppx^.b * iFadeStep1 + bb1) shr 10; end end else begin // Darken RHS/Bottom with ppx^ do begin r := (ppx^.r * iFadeStep2 + rr2) shr 10; g := (ppx^.g * iFadeStep2 + gg2) shr 10; b := (ppx^.b * iFadeStep2 + bb2) shr 10; end; end; inc(ppx); end; end; end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.CubeRotateFromRight(Step: integer); var W, H, X, Y: Integer; begin W := fCurrentView.Width; H := fCurrentView.Height; if W >= H then X := W - MulDiv(W, Step, 1024) else begin Y := MulDiv(H, Step, 1024); X := W - MulDiv(Y, W, H); end; SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); // LHS StretchBlt(fCurrentView.Canvas.Handle, 0, 0, X, H, fSourceShot.Canvas.Handle, 0, 0, W, H, SRCCOPY); // RHS StretchBlt(fCurrentView.Canvas.Handle, X, 0, W - X, H, fTargetShot.Canvas.Handle, 0, 0, W, H, SRCCOPY); // Now fade the half shown sides if IEGlobalSettings().TransitionsDrawAlternative = False then CubeRotateDarkenEdges(False, False, X, Step); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.CubeRotateFromRight3D(Step: integer); const Inset_Factor = 4; // 1/4 of height is inset var W, H, X, Y: Integer; iLeftInset, iRightInset: Integer; IECurrentView, IESourceShot, IETargetShot: TIEBitmap; begin W := fCurrentView.Width; H := fCurrentView.Height; if W >= H then X := W - MulDiv(W, Step, 1024) else begin Y := MulDiv(H, Step, 1024); X := W - MulDiv(Y, W, H); end; iLeftInset := MulDiv(H, Step, 1024 * Inset_Factor); iRightInset := MulDiv(H, 1024 - Step, 1024 * Inset_Factor); fCurrentView.Canvas.Brush.Color := fBackground; fCurrentView.Canvas.fillRect(Rect(0, 0, fCurrentView.Width, fCurrentView.height)); SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); IESourceShot := TIEBitmap.create; IECurrentView := TIEBitmap.create; IETargetShot := TIEBitmap.create; try IESourceShot.EncapsulateTBitmap(fSourceShot, False); IECurrentView.EncapsulateTBitmap(fCurrentView, False); IETargetShot.EncapsulateTBitmap(fTargetShot, False); // LHS IEPerspectiveTransform(IESourceShot, IECurrentView, 0, iLeftInset, // Top-Left X, 0, // Top-Right X, H, // Bottom-Right 0, H - iLeftInset, // Bottom-Left -1, -1, True); // RHS IEPerspectiveTransform(IETargetShot, IECurrentView, X, 0, // Top-Left W, iRightInset, // Top-Right W, H - iRightInset, // Bottom-Right X, H, // Bottom-Left -1, -1, True); finally FreeAndNil(IESourceShot); FreeAndNil(IECurrentView); FreeAndNil(IETargetShot); end; // Now fade the half shown sides if IEGlobalSettings().TransitionsDrawAlternative = False then CubeRotateDarkenEdges(False, False, X, Step); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.CubeRotateFromLeft(Step: integer); var W, H, X, Y: Integer; begin W := fCurrentView.Width; H := fCurrentView.Height; if W >= H then X := MulDiv(W, Step, 1024) else begin Y := MulDiv(H, Step, 1024); X := MulDiv(Y, W, H); end; SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); // Draw LHS StretchBlt(fCurrentView.Canvas.Handle, 0, 0, X, H, fTargetShot.Canvas.Handle, 0, 0, W, H, SRCCOPY); // Draw RHS StretchBlt(fCurrentView.Canvas.Handle, X, 0, W - X, H, fSourceShot.Canvas.Handle, 0, 0, W, H, SRCCOPY); // Now fade the half shown sides if IEGlobalSettings().TransitionsDrawAlternative = False then CubeRotateDarkenEdges(False, True, X, Step); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.CubeRotateFromLeft3D(Step: integer); const Inset_Factor = 4; // 1/4 of height is inset var W, H, X, Y: Integer; iLeftInset, iRightInset: Integer; IECurrentView, IESourceShot, IETargetShot: TIEBitmap; begin W := fCurrentView.Width; H := fCurrentView.Height; if W >= H then X := MulDiv(W, Step, 1024) else begin Y := MulDiv(H, Step, 1024); X := MulDiv(Y, W, H); end; iLeftInset := MulDiv(H, 1024 - Step, 1024 * Inset_Factor); iRightInset := MulDiv(H, Step, 1024 * Inset_Factor); fCurrentView.Canvas.Brush.Color := fBackground; fCurrentView.Canvas.fillRect(Rect(0, 0, fCurrentView.Width, fCurrentView.height)); SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); IESourceShot := TIEBitmap.create; IECurrentView := TIEBitmap.create; IETargetShot := TIEBitmap.create; try IESourceShot.EncapsulateTBitmap(fSourceShot, False); IECurrentView.EncapsulateTBitmap(fCurrentView, False); IETargetShot.EncapsulateTBitmap(fTargetShot, False); // LHS IEPerspectiveTransform(IETargetShot, IECurrentView, 0, iLeftInset, // Top-Left X, 0, // Top-Right X, H, // Bottom-Right 0, H - iLeftInset, // Bottom-Left -1, -1, True); // RHS IEPerspectiveTransform(IESourceShot, IECurrentView, X, 0, // Top-Left W, iRightInset, // Top-Right W, H - iRightInset, // Bottom-Right X, H, // Bottom-Left -1, -1, True); finally FreeAndNil(IESourceShot); FreeAndNil(IECurrentView); FreeAndNil(IETargetShot); end; // Now fade the half shown sides if IEGlobalSettings().TransitionsDrawAlternative = False then CubeRotateDarkenEdges(False, True, X, Step); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.CubeRotateFromBottom(Step: integer); var W, H, X, Y: Integer; begin W := fCurrentView.Width; H := fCurrentView.Height; if W >= H then begin X := MulDiv(W, Step, 1024); Y := H - MulDiv(X, H, W); end else begin Y := H - MulDiv(H, Step, 1024); end; SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); // Draw Top StretchBlt(fCurrentView.Canvas.Handle, 0, 0, W, Y, fSourceShot.Canvas.Handle, 0, 0, W, H, SRCCOPY); // Draw Bottom StretchBlt(fCurrentView.Canvas.Handle, 0, Y, W, H - Y, fTargetShot.Canvas.Handle, 0, 0, W, H, SRCCOPY); // Now fade the half shown sides if IEGlobalSettings().TransitionsDrawAlternative = False then CubeRotateDarkenEdges(True, False, Y, Step); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.CubeRotateFromBottom3D(Step: integer); const Inset_Factor = 4; // 1/4 of height is inset var W, H, X, Y: Integer; iTopInset, iBottomInset: Integer; IECurrentView, IESourceShot, IETargetShot: TIEBitmap; begin W := fCurrentView.Width; H := fCurrentView.Height; if W >= H then begin X := MulDiv(W, Step, 1024); Y := H - MulDiv(X, H, W); end else begin Y := H - MulDiv(H, Step, 1024); end; iTopInset := MulDiv(W, Step, 1024 * Inset_Factor); iBottomInset := MulDiv(W, 1024 - Step, 1024 * Inset_Factor); fCurrentView.Canvas.Brush.Color := fBackground; fCurrentView.Canvas.fillRect(Rect(0, 0, fCurrentView.Width, fCurrentView.height)); SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); IESourceShot := TIEBitmap.create; IECurrentView := TIEBitmap.create; IETargetShot := TIEBitmap.create; try IESourceShot.EncapsulateTBitmap(fSourceShot, False); IECurrentView.EncapsulateTBitmap(fCurrentView, False); IETargetShot.EncapsulateTBitmap(fTargetShot, False); // Top IEPerspectiveTransform(IESourceShot, IECurrentView, iTopInset, 0, // Top-Left W - iTopInset, 0, // Top-Right W, Y, // Bottom-Right 0, Y, // Bottom-Left -1, -1, True); // Bottom IEPerspectiveTransform(IETargetShot, IECurrentView, 0, Y, // Top-Left W, Y, // Top-Right W - iBottomInset, H, // Bottom-Right iBottomInset, H, // Bottom-Left -1, -1, True); finally FreeAndNil(IESourceShot); FreeAndNil(IECurrentView); FreeAndNil(IETargetShot); end; // Now fade the half shown sides if IEGlobalSettings().TransitionsDrawAlternative = False then CubeRotateDarkenEdges(True, False, Y, Step); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.CubeRotateFromTop(Step: integer); var W, H, X, Y: Integer; begin W := fCurrentView.Width; H := fCurrentView.Height; if W >= H then begin X := MulDiv(W, Step, 1024); Y := MulDiv(X, H, W); end else begin Y := MulDiv(H, Step, 1024); end; SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); // Draw Top StretchBlt(fCurrentView.Canvas.Handle, 0, 0, W, Y, fTargetShot.Canvas.Handle, 0, 0, W, H, SRCCOPY); // Draw Bottom StretchBlt(fCurrentView.Canvas.Handle, 0, Y, W, H - Y, fSourceShot.Canvas.Handle, 0, 0, W, H, SRCCOPY); // Now fade the half shown sides if IEGlobalSettings().TransitionsDrawAlternative = False then CubeRotateDarkenEdges(True, True, Y, Step); end; {$endif} {$ifdef IEINCLUDEEXTRATRANSITIONS} procedure TIETransitionEffects.CubeRotateFromTop3D(Step: integer); const Inset_Factor = 4; // 1/4 of height is inset var W, H, X, Y: Integer; iTopInset, iBottomInset: Integer; IECurrentView, IESourceShot, IETargetShot: TIEBitmap; begin W := fCurrentView.Width; H := fCurrentView.Height; if W >= H then begin X := MulDiv(W, Step, 1024); Y := MulDiv(X, H, W); end else begin Y := MulDiv(H, Step, 1024); end; iTopInset := MulDiv(W, 1024 - Step, 1024 * Inset_Factor); iBottomInset := MulDiv(W, Step, 1024 * Inset_Factor); fCurrentView.Canvas.Brush.Color := fBackground; fCurrentView.Canvas.fillRect(Rect(0, 0, fCurrentView.Width, fCurrentView.height)); SetStretchBltMode(fCurrentView.Canvas.Handle, HALFTONE); IESourceShot := TIEBitmap.create; IECurrentView := TIEBitmap.create; IETargetShot := TIEBitmap.create; try IESourceShot.EncapsulateTBitmap(fSourceShot, False); IECurrentView.EncapsulateTBitmap(fCurrentView, False); IETargetShot.EncapsulateTBitmap(fTargetShot, False); // Top IEPerspectiveTransform(IETargetShot, IECurrentView, iTopInset, 0, // Top-Left W - iTopInset, 0, // Top-Right W, Y, // Bottom-Right 0, Y, // Bottom-Left -1, -1, True); // Bottom IEPerspectiveTransform(IESourceShot, IECurrentView, 0, Y, // Top-Left W, Y, // Top-Right W - iBottomInset, H, // Bottom-Right iBottomInset, H, // Bottom-Left -1, -1, True); finally FreeAndNil(IESourceShot); FreeAndNil(IECurrentView); FreeAndNil(IETargetShot); end; // Now fade the half shown sides if IEGlobalSettings().TransitionsDrawAlternative = False then CubeRotateDarkenEdges(True, True, Y, Step); end; {$endif} // Convert a TIEPanZoomType effect type to a starting and ending position procedure GetPanZoomEffectStartEndRects(iIEClientWidth, iIEClientHeight : Integer; // ClientWidth and ClientHeight of the display window iBitmapWidth, iBitmapHeight : Integer; // Width and Height of the Bitmap PanZoomEffect : TIEPanZoomType; // Effect to use iMaxZoom : Integer; // For zoom effects, how much should we zoom in/out, e.g. 20 for 20% out StartRect: TRect; // Will be filled with the first display position out EndRect: TRect); // Will be filled with the last display position function RectWidth(ARect: Trect): Integer; begin result := ARect.right - ARect.left; end; function RectHeight(ARect: Trect): Integer; begin result := ARect.bottom - ARect.top; end; function AreSimilar(val1, val2 : Double): boolean; begin result := abs(val1 - val2) <= 0.01; end; const _ipsTopLeft = 0; _ipsTop = 1; _ipsTopRight = 2; _ipsLeft = 3; _ipsCenter = 4; _ipsRight = 5; _ipsBottomLeft = 6; _ipsBottom = 7; _ipsBottomRight = 8; Buffer_Zone = 2; // avoid display of a 1 pixel border Default_Zoom_Level = 20; var VisibleImageRect : TRect; BigPic : TPoint; // A portion of the image at full width or height of the image bCroppedToAspectRatio : Boolean; // Image has same aspect ratio as display window bIsPortraitImage : boolean; // Original image portrait or landscape? Use to determine the best way to display some effects function _GetRect(iPos : Integer; iWidth, iHeight : Integer): TRect; var iTop: Integer; iLeft: Integer; begin // HORIZONTAL POS case iPos of _ipsTopLeft, _ipsLeft, _ipsBottomLeft : iLeft := VisibleImageRect.Left; _ipsTopRight, _ipsRight, _ipsBottomRight : iLeft := VisibleImageRect.Left + RectWidth(VisibleImageRect) - iWidth; {_ipsTop, _ipsCenter, _ipsBottom } else iLeft := VisibleImageRect.Left + (RectWidth(VisibleImageRect) - iWidth) div 2; end; // VERTICAL POS case iPos of _ipsTopLeft, _ipsTop, _ipsTopRight : iTop := VisibleImageRect.Top; _ipsBottomLeft, _ipsBottom, _ipsBottomRight : iTop := VisibleImageRect.Top + RectHeight(VisibleImageRect) - iHeight; {_ipsLeft, _ipsCenter, _ipsRight } else iTop := VisibleImageRect.Top + (RectHeight(VisibleImageRect) - iHeight) div 2; end; result := Rect(iLeft, iTop, iLeft + iWidth, iTop + iHeight); end; function _GetSmallRect(iPos: Integer): Trect; begin result := _GetRect(iPos, MulDiv(BigPic.X, 100 - iMaxZoom, 100), MulDiv(BigPic.Y, 100 - iMaxZoom, 100)); end; function _GetBigRect(iPos: Integer): Trect; begin result := _GetRect(iPos, BigPic.X, BigPic.Y); end; // The rect to display a full image function _GetFullImageRect: Trect; begin result := _GetRect(_ipsCenter, RectWidth(VisibleImageRect), RectHeight(VisibleImageRect)); end; function _GetFullImageSmallRect(iPos: Integer): Trect; begin result := _GetRect(iPos, MulDiv(RectWidth(VisibleImageRect), 100 - iMaxZoom, 100), MulDiv(RectHeight(VisibleImageRect), 100 - iMaxZoom, 100)); end; begin VisibleImageRect := Rect(Buffer_Zone, Buffer_Zone, iBitmapWidth - 2 * Buffer_Zone, iBitmapHeight - 2 * Buffer_Zone); bCroppedToAspectRatio := AreSimilar(RectWidth(VisibleImageRect) / RectHeight(VisibleImageRect), iIEClientwidth / iIEClientheight); // Image is cropped or matches the output aspect ratio bIsPortraitImage := iBitmapHeight > iBitmapWidth; if iMaxZoom < 2 then iMaxZoom := Default_Zoom_Level; if (RectHeight(VisibleImageRect) / iIEClientheight) > (RectWidth(VisibleImageRect) / iIEClientwidth) then begin // Vertical Slide - PIC IS AS WIDE AS THE IMAGE BigPic.X := RectWidth(VisibleImageRect); BigPic.Y := round(BigPic.X * iIEClientHeight/iIEClientWidth); end ELSE begin // Horizontal Slide - PIC IS AS HIGH AS THE IMAGE BigPic.Y := RectHeight(VisibleImageRect); BigPic.X := round(BigPic.Y * iIEClientWidth/iIEClientHeight); end; case PanZoomEffect of iepzPanTopLeftToBottomRight, iepzPanBottomRightToTopLeft: begin StartRect := _GetSmallRect(_ipsTopLeft); EndRect := _GetSmallRect(_ipsBottomRight); end; iepzPanTopRightToBottomLeft, iepzPanBottomLeftToTopRight: begin StartRect := _GetSmallRect(_ipsTopRight); EndRect := _GetSmallRect(_ipsBottomLeft); end; iepzPanTopLeftToCenter, iepzPanCenterToTopLeft: begin StartRect := _GetSmallRect(_ipsTopLeft); EndRect := _GetSmallRect(_ipsCenter); end; iepzPanTopRightToCenter, iepzPanCenterToTopRight: begin StartRect := _GetSmallRect(_ipsTopRight); EndRect := _GetSmallRect(_ipsCenter); end; iepzPanBottomLeftToCenter, iepzPanCenterToBottomLeft: begin StartRect := _GetSmallRect(_ipsBottomLeft); EndRect := _GetSmallRect(_ipsCenter); end; iepzPanBottomRightToCenter, iepzPanCenterToBottomRight: begin StartRect := _GetSmallRect(_ipsBottomRight); EndRect := _GetSmallRect(_ipsCenter); end; iepzPanLeftToRightOrTopToBottom, iepzPanRightToLeftOrBottomToTop: begin // Output image has same dimensions as the display area? if bCroppedToAspectRatio and bIsPortraitImage then // Zoomed vertical Slide begin StartRect := _GetSmallRect(_ipsTop); EndRect := _GetSmallRect(_ipsBottom); end ELSE if bCroppedToAspectRatio and (bIsPortraitImage = false) then // Zoomed horizontal Slide begin StartRect := _GetSmallRect(_ipsLeft); EndRect := _GetSmallRect(_ipsRight); end ELSE if (RectHeight(VisibleImageRect) / iIEClientheight) > (RectWidth(VisibleImageRect) / iIEClientwidth) then // Vertical Slide begin StartRect := _GetBigRect(_ipsTop); EndRect := _GetBigRect(_ipsBottom); end ELSE // Horizontal Slide begin StartRect := _GetBigRect(_ipsLeft); EndRect := _GetBigRect(_ipsRight); end; end; iepzPanLeftToCenterOrTopToCenter, iepzPanCenterToLeftToOrCenterToTop: begin // Output image has same dimensions as the display area? if bCroppedToAspectRatio and bIsPortraitImage then // Zoomed vertical Slide begin StartRect := _GetSmallRect(_ipsTop); EndRect := _GetSmallRect(_ipsCenter); end ELSE if bCroppedToAspectRatio and (bIsPortraitImage = false) then // Zoomed horizontal Slide begin StartRect := _GetSmallRect(_ipsLeft); EndRect := _GetSmallRect(_ipsCenter); end ELSE if (RectHeight(VisibleImageRect) / iIEClientheight) > (RectWidth(VisibleImageRect) / iIEClientwidth) then // Vertical Slide begin StartRect := _GetBigRect(_ipsTop); EndRect := _GetBigRect(_ipsCenter); end ELSE // Horizontal Slide begin StartRect := _GetBigRect(_ipsLeft); EndRect := _GetBigRect(_ipsCenter); end; end; iepzPanRightToCenterOrBottomToCenter, iepzPanCenterToRightOrCenterToBottom: begin // Output image has same dimensions as the display area? if bCroppedToAspectRatio and bIsPortraitImage then // Zoomed vertical Slide begin StartRect := _GetSmallRect(_ipsBottom); EndRect := _GetSmallRect(_ipsCenter); end ELSE if bCroppedToAspectRatio and (bIsPortraitImage = false) then // Zoomed horizontal Slide begin StartRect := _GetSmallRect(_ipsRight); EndRect := _GetSmallRect(_ipsCenter); end ELSE if (RectHeight(VisibleImageRect) / iIEClientheight) > (RectWidth(VisibleImageRect) / iIEClientwidth) then // Vertical Slide begin StartRect := _GetBigRect(_ipsBottom); EndRect := _GetBigRect(_ipsCenter); end ELSE // Horizontal Slide begin StartRect := _GetBigRect(_ipsRight); EndRect := _GetBigRect(_ipsCenter); end; end; iepzZoomInToTopLeft, iepzZoomOutFromTopLeft: begin StartRect := _GetBigRect(_ipsTopLeft); EndRect := _GetSmallRect(_ipsTopLeft); end; iepzZoomInToTopRight, iepzZoomOutFromTopRight: begin StartRect := _GetBigRect(_ipsTopRight); EndRect := _GetSmallRect(_ipsTopRight); end; iepzZoomInToBottomLeft, iepzZoomOutFromBottomLeft: begin StartRect := _GetBigRect(_ipsBottomLeft); EndRect := _GetSmallRect(_ipsBottomLeft); end; iepzZoomInToBottomRight, iepzZoomOutFromBottomRight: begin StartRect := _GetBigRect(_ipsBottomRight); EndRect := _GetSmallRect(_ipsBottomRight); end; iepzZoomInToCenter, iepzZoomOutFromCenter: begin StartRect := _GetBigRect(_ipsCenter); EndRect := _GetSmallRect(_ipsCenter); end; iepzFullZoomInToTopLeft, iepzFullZoomOutFromTopLeft: begin StartRect := _GetFullImageRect; EndRect := _GetFullImageSmallRect(_ipsTopLeft); end; iepzFullZoomInToTop, iepzFullZoomOutFromTop: begin StartRect := _GetFullImageRect; EndRect := _GetFullImageSmallRect(_ipsTop); end; iepzFullZoomInToTopRight, iepzFullZoomOutFromTopRight: begin StartRect := _GetFullImageRect; EndRect := _GetFullImageSmallRect(_ipsTopRight); end; iepzFullZoomInToLeft, iepzFullZoomOutFromLeft: begin StartRect := _GetFullImageRect; EndRect := _GetFullImageSmallRect(_ipsLeft); end; iepzFullZoomInToCenter, iepzFullZoomOutFromCenter: begin StartRect := _GetFullImageRect; EndRect := _GetFullImageSmallRect(_ipsCenter); end; iepzFullZoomInToRight, iepzFullZoomOutFromRight: begin StartRect := _GetFullImageRect; EndRect := _GetFullImageSmallRect(_ipsRight); end; iepzFullZoomInToBottomLeft, iepzFullZoomOutFromBottomLeft: begin StartRect := _GetFullImageRect; EndRect := _GetFullImageSmallRect(_ipsBottomLeft); end; iepzFullZoomInToBottom, iepzFullZoomOutFromBottom: begin StartRect := _GetFullImageRect; EndRect := _GetFullImageSmallRect(_ipsBottom); end; iepzFullZoomInToBottomRight, iepzFullZoomOutFromBottomRight: begin StartRect := _GetFullImageRect; EndRect := _GetFullImageSmallRect(_ipsBottomRight); end; end; // REVERSE THE RECTS? if PanZoomEffect in [iepzPanBottomRightToTopLeft, iepzPanBottomLeftToTopRight, iepzPanCenterToTopLeft, iepzPanCenterToTopRight, iepzPanCenterToBottomLeft, iepzPanCenterToBottomRight, iepzPanRightToLeftOrBottomToTop, iepzPanCenterToLeftToOrCenterToTop, iepzPanCenterToRightOrCenterToBottom, iepzZoomOutFromTopLeft, iepzZoomOutFromTopRight, iepzZoomOutFromBottomLeft, iepzZoomOutFromBottomRight, iepzZoomOutFromCenter, iepzFullZoomOutFromTopLeft, iepzFullZoomOutFromTop, iepzFullZoomOutFromTopRight, iepzFullZoomOutFromLeft, iepzFullZoomOutFromCenter, iepzFullZoomOutFromRight, iepzFullZoomOutFromBottomLeft, iepzFullZoomOutFromBottom, iepzFullZoomOutFromBottomRight] then IESwap( StartRect, EndRect ); end; // end of TIETransitionEffects ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////////// end.