Changeset 289862 in webkit
- Timestamp:
- Feb 15, 2022 4:26:24 PM (5 months ago)
- Location:
- trunk
- Files:
-
- 7 edited
-
LayoutTests/imported/w3c/ChangeLog (modified) (1 diff)
-
LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-matrix-composition-expected.txt (modified) (2 diffs)
-
LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/animation-types/interpolation-per-property-002-expected.txt (modified) (1 diff)
-
Source/WebCore/ChangeLog (modified) (1 diff)
-
Source/WebCore/platform/graphics/transforms/TransformOperations.cpp (modified) (3 diffs)
-
Source/WebCore/platform/graphics/transforms/TransformOperations.h (modified) (2 diffs)
-
Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/imported/w3c/ChangeLog
r289838 r289862 1 2022-02-15 Nikolaos Mouchtaris <nmouchtaris@apple.com> 2 3 [css-transforms] properly handle interpolation of non-invertible matrices 4 https://bugs.webkit.org/show_bug.cgi?id=236480 5 6 Reviewed by Martin Robinson. 7 8 * web-platform-tests/css/css-transforms/animation/transform-matrix-composition-expected.txt: 9 * web-platform-tests/web-animations/animation-model/animation-types/interpolation-per-property-002-expected.txt: 10 1 11 2022-02-15 Antti Koivisto <antti@apple.com> 2 12 -
trunk/LayoutTests/imported/w3c/web-platform-tests/css/css-transforms/animation/transform-matrix-composition-expected.txt
r289599 r289862 14 14 PASS Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (1) should be [translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(200px)] 15 15 PASS Compositing: property <transform> underlying [matrix3d(0.8535533905932737,0.1464466094067262,-0.5,0,0.1464466094067262,0.8535533905932737,0.5,0,0.5,-0.5,0.7071067811865476,0,100,0,0,1)] from add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 100, 0, 0, 1)] to add [matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 200, 0, 0, 1)] at (1.5) should be [translateX(100px) rotate3d(1, 1, 0, 45deg) translateX(250px)] 16 FAIL Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(1, 1, 0, 0, 100, 200)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 100 , 200 ) " but got "matrix ( 1 , 1 , 0 , 0 , 100 , 100 ) " 16 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(1, 1, 0, 0, 100, 200)] 17 17 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0) should be [matrix(1, 1, 0, 0, 100, 200)] 18 FAIL Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.25) should be [matrix(1, 1, 0, 0, 100, 200)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 100 , 200 ) " but got "matrix ( 1 , 1 , 0 , 0 , 175 , 175 ) " 19 FAIL Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.5) should be [matrix(1, 1, 0, 0, 200, 300)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 200 , 300 ) " but got "matrix ( 1 , 1 , 0 , 0 , 200 , 200 ) " 20 FAIL Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(1, 1, 0, 0, 200, 300)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 200 , 300 ) " but got "matrix ( 1 , 1 , 0 , 0 , 225 , 225 ) " 18 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.25) should be [matrix(1, 1, 0, 0, 100, 200)] 19 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.5) should be [matrix(1, 1, 0, 0, 200, 300)] 20 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(1, 1, 0, 0, 200, 300)] 21 21 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (1) should be [matrix(1, 1, 0, 0, 200, 300)] 22 FAIL Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(1, 1, 0, 0, 200, 300)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 200 , 300 ) " but got "matrix ( 1 , 1 , 0 , 0 , 300 , 300 ) " 23 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(1, 1, 0, 0, 100, 100)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 100 , 100 ) " but got "matrix ( 1.28 , 0.84 , - 0.03 , 0.3 , 187.5 , - 37.5 ) " 22 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from add [matrix(1, 0, 0, 1, 100, 0)] to add [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(1, 1, 0, 0, 200, 300)] 23 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(1, 1, 0, 0, 100, 100)] 24 24 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0) should be [matrix(1, 1, 0, 0, 100, 100)] 25 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.25) should be [matrix(1, 1, 0, 0, 100, 100)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 100 , 100 ) " but got "matrix ( 0.95 , 0.86 , - 0.01 , 0.08 , 159.38 , 65.63 ) " 26 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.5) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.95 , 0.63 , - 0.03 , 0.3 , 187.5 , 62.5 ) " 27 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.97 , 0.32 , - 0.04 , 0.63 , 234.38 , 40.63 ) " 25 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.25) should be [matrix(1, 1, 0, 0, 100, 100)] 26 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.5) should be [matrix(1, 0, 0, 1, 300, 0)] 27 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(1, 0, 0, 1, 300, 0)] 28 28 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (1) should be [matrix(1, 0, 0, 1, 300, 0)] 29 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.99 , - 0.56 , 0.37 , 1.59 , 487.5 , - 137.5 ) " 29 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from add [matrix(1, 1, 0, 0, 0, 100)] to add [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(1, 0, 0, 1, 300, 0)] 30 30 PASS Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(0, 1, -1, 0, 150, 0)] 31 31 PASS Compositing: property <transform> underlying [matrix(0, 1, -1, 0, 100, 0)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0) should be [matrix(0, 1, -1, 0, 200, 0)] … … 49 49 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1) should be [matrix(1, 0, 0, 1, 200, 0)] 50 50 PASS Compositing: property <transform> underlying [matrix(1, 1, 0, 0, 0, 100)] from accumulate [matrix(1, 0, 0, 1, 100, 0)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(1, 0, 0, 1, 250, 0)] 51 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(1, 1, 0, 0, 0, 100)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 0 , 100 ) " but got "matrix ( 1.28 , 0.84 , - 0.03 , 0.3 , 75 , - 75 ) " 51 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (-0.5) should be [matrix(1, 1, 0, 0, 0, 100)] 52 52 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0) should be [matrix(1, 1, 0, 0, 0, 100)] 53 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.25) should be [matrix(1, 1, 0, 0, 0, 100)] assert_equals: expected "matrix ( 1 , 1 , 0 , 0 , 0 , 100 ) " but got "matrix ( 0.95 , 0.86 , - 0.01 , 0.08 , 75 , 75 ) " 54 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.5) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.95 , 0.63 , - 0.03 , 0.3 , 125 , 75 ) " 55 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.97 , 0.32 , - 0.04 , 0.63 , 200 , 50 ) " 53 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.25) should be [matrix(1, 1, 0, 0, 0, 100)] 54 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.5) should be [matrix(1, 0, 0, 1, 300, 0)] 55 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (0.75) should be [matrix(1, 0, 0, 1, 300, 0)] 56 56 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1) should be [matrix(1, 0, 0, 1, 300, 0)] 57 FAIL Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(1, 0, 0, 1, 300, 0)] assert_equals: expected "matrix ( 1 , 0 , 0 , 1 , 300 , 0 ) " but got "matrix ( 0.99 , - 0.56 , 0.37 , 1.59 , 575 , - 175 ) " 57 PASS Compositing: property <transform> underlying [matrix(1, 0, 0, 1, 100, 0)] from accumulate [matrix(1, 1, 0, 0, 0, 100)] to accumulate [matrix(1, 0, 0, 1, 200, 0)] at (1.5) should be [matrix(1, 0, 0, 1, 300, 0)] 58 58 -
trunk/LayoutTests/imported/w3c/web-platform-tests/web-animations/animation-model/animation-types/interpolation-per-property-002-expected.txt
r289732 r289862 225 225 PASS transform: mismatched 3D transforms 226 226 PASS transform: rotateY 227 FAIL transform: non-invertible matrices assert_approx_equals: expected matrix(-1, 0, 0, -1, 200, 0) but got matrix(-0.070657, 0.719998, -0.395146, -0.260079, 87.65015, 62.44985): The value should be matrix(-1, 0, 0, -1, 200, 0) at 499ms but got matrix(-0.070657, 0.719998, -0.395146, -0.260079, 87.65015, 62.44985) expected -1 +/- 0.0001 but got -0.070657 228 FAIL transform: non-invertible matrices in matched transform lists assert_approx_equals: expected matrix(0, -1, 1, 0, 250, 0) but got matrix(-0.229966, -0.692507, 0.329012, -0.3263, 162.600147, 62.44985): The value should be matrix(0, -1, 1, 0, 250, 0) at 499ms but got matrix(-0.229966, -0.692507, 0.329012, -0.3263, 162.600147, 62.44985) expected 0 +/- 0.0001 but got -0.229966 229 FAIL transform: non-invertible matrices in mismatched transform lists assert_approx_equals: expected matrix(-2, 0, 0, -2, 250, 0) but got matrix(0.457235, 1.576158, -1.117609, -0.657221, 112.65025, 49.9): The value should be matrix(-2, 0, 0, -2, 250, 0) at 499ms but got matrix(0.457235, 1.576158, -1.117609, -0.657221, 112.65025, 49.9) expected -2 +/- 0.0001 but got 0.457235 227 PASS transform: non-invertible matrices 228 PASS transform: non-invertible matrices in matched transform lists 229 PASS transform: non-invertible matrices in mismatched transform lists 230 230 FAIL transform: perspective assert_approx_equals: expected matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -0.55, 0, 0, 0, 1) but got matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -0.05, 0, 0, 0, 1): The value should be matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -0.55, 0, 0, 0, 1) at 500ms but got matrix3d(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, -0.05, 0, 0, 0, 1) expected -0.55 +/- 0.0001 but got -0.05 231 231 PASS transform-box (type: discrete) has testInterpolation function -
trunk/Source/WebCore/ChangeLog
r289860 r289862 1 2022-02-15 Nikolaos Mouchtaris <nmouchtaris@apple.com> 2 3 [css-transforms] properly handle interpolation of non-invertible matrices 4 https://bugs.webkit.org/show_bug.cgi?id=236480 5 6 Reviewed by Martin Robinson. 7 8 All composition types should fall back to discrete animation behavior when 9 interpolating non-invertible matrices. Need to segment progress value 10 depending on either side of 0.5. 11 12 * platform/graphics/transforms/TransformOperations.cpp: 13 (WebCore::TransformOperations::shouldFallbackToDiscreteAnimation const): 14 (WebCore::TransformOperations::blendByMatchingOperations const): 15 (WebCore::TransformOperations::blendByUsingMatrixInterpolation const): 16 * platform/graphics/transforms/TransformOperations.h: 17 (WebCore::TransformOperations::hasMatrixOperation const): 18 * platform/graphics/transforms/TransformationMatrix.cpp: 19 (WebCore::TransformationMatrix::blend): 20 1 21 2022-02-15 Philip Chimento <pchimento@igalia.com> 2 22 -
trunk/Source/WebCore/platform/graphics/transforms/TransformOperations.cpp
r289732 r289862 97 97 } 98 98 99 bool TransformOperations::shouldFallBackToDiscreteAnimation(const TransformOperations& from, const LayoutSize& boxSize) const 100 { 101 return (from.hasMatrixOperation() || hasMatrixOperation()) && (!from.isInvertible(boxSize) || !isInvertible(boxSize)); 102 } 103 99 104 TransformOperations TransformOperations::blendByMatchingOperations(const TransformOperations& from, const BlendingContext& context, const LayoutSize& boxSize) const 100 105 { … … 105 110 unsigned maxOperationCount = std::max(fromOperationCount, toOperationCount); 106 111 107 if ( context.compositeOperation == CompositeOperation::Accumulate && (!from.isInvertible(boxSize) || !isInvertible(boxSize)))112 if (shouldFallBackToDiscreteAnimation(from, boxSize)) 108 113 return blendByUsingMatrixInterpolation(from, context, boxSize); 109 114 … … 140 145 from.apply(boxSize, fromTransform); 141 146 apply(boxSize, toTransform); 142 toTransform.blend(fromTransform, context.progress, context.compositeOperation); 147 148 auto progress = context.progress; 149 auto compositeOperation = context.compositeOperation; 150 if (shouldFallBackToDiscreteAnimation(from, boxSize)) { 151 progress = progress < 0.5 ? 0 : 1; 152 compositeOperation = CompositeOperation::Replace; 153 } 154 toTransform.blend(fromTransform, progress, compositeOperation); 143 155 // Append the result 144 156 result.operations().append(Matrix3DTransformOperation::create(toTransform)); -
trunk/Source/WebCore/platform/graphics/transforms/TransformOperations.h
r289732 r289862 61 61 return false; 62 62 } 63 64 bool hasMatrixOperation() const 65 { 66 return std::any_of(m_operations.begin(), m_operations.end(), [](auto operation) { 67 return operation->type() == WebCore::TransformOperation::MATRIX; 68 }); 69 } 63 70 64 71 bool isRepresentableIn2D() const … … 97 104 } 98 105 106 bool shouldFallBackToDiscreteAnimation(const TransformOperations&, const LayoutSize&) const; 107 99 108 TransformOperations blendByMatchingOperations(const TransformOperations& from, const BlendingContext&, const LayoutSize&) const; 100 109 TransformOperations blendByUsingMatrixInterpolation(const TransformOperations& from, const BlendingContext&, const LayoutSize&) const; -
trunk/Source/WebCore/platform/graphics/transforms/TransformationMatrix.cpp
r289599 r289862 1754 1754 void TransformationMatrix::blend(const TransformationMatrix& from, double progress, CompositeOperation compositeOperation) 1755 1755 { 1756 if (compositeOperation == CompositeOperation::Accumulate && (!from.isInvertible() || !isInvertible()))1757 compositeOperation = CompositeOperation::Replace;1758 1756 1759 1757 if (!progress && compositeOperation == CompositeOperation::Replace) {
Note: See TracChangeset
for help on using the changeset viewer.