Changeset 286589 in webkit
- Timestamp:
- Dec 6, 2021, 11:19:06 PM (4 years ago)
- Location:
- trunk
- Files:
-
- 56 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/LayoutTests/ChangeLog
r286586 r286589 1 2021-12-06 Said Abou-Hallawa <said@apple.com> 2 3 [GPU Process] [Filters] Make FilterEffect::externalRepresentation() and its overridable functions work iteratively 4 https://bugs.webkit.org/show_bug.cgi?id=233893 5 6 Reviewed by Cameron McCormack. 7 8 Add missing closing quotations in the expected results of some of the 9 filter layout tests. 10 11 * svg/filters/feDropShadow-expected.txt: 12 * svg/filters/feDropShadow-subregion-expected.txt: 13 * svg/filters/feDropShadow-zero-deviation-expected.txt: 14 * svg/repaint/filter-child-repaint-expected.txt: 15 1 16 2021-12-06 Lauro Moura <lmoura@igalia.com> 2 17 -
trunk/LayoutTests/svg/filters/feDropShadow-expected.txt
r119860 r286589 5 5 RenderSVGHiddenContainer {defs} at (0,0) size 0x0 6 6 RenderSVGResourceFilter {filter} [id="drop-shadow-1"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 7 [feDropShadow stdDeviation="2.00, 2.00" dx="2.00" dy="2.00" flood-color="#008000" flood-opacity="1.00 ]7 [feDropShadow stdDeviation="2.00, 2.00" dx="2.00" dy="2.00" flood-color="#008000" flood-opacity="1.00"] 8 8 [SourceGraphic] 9 9 RenderSVGResourceFilter {filter} [id="drop-shadow-2"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 10 [feDropShadow stdDeviation="0.00, 0.00" dx="0.00" dy="0.00" flood-color="#008000" flood-opacity="1.00 ]10 [feDropShadow stdDeviation="0.00, 0.00" dx="0.00" dy="0.00" flood-color="#008000" flood-opacity="1.00"] 11 11 [SourceGraphic] 12 12 RenderSVGResourceFilter {filter} [id="drop-shadow-3"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 13 [feDropShadow stdDeviation="0.00, 10.00" dx="5.00" dy="5.00" flood-color="#008000" flood-opacity="1.00 ]13 [feDropShadow stdDeviation="0.00, 10.00" dx="5.00" dy="5.00" flood-color="#008000" flood-opacity="1.00"] 14 14 [SourceGraphic] 15 15 RenderSVGResourceFilter {filter} [id="drop-shadow-4"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 16 [feDropShadow stdDeviation="10.00, 0.00" dx="5.00" dy="5.00" flood-color="#008000" flood-opacity="1.00 ]16 [feDropShadow stdDeviation="10.00, 0.00" dx="5.00" dy="5.00" flood-color="#008000" flood-opacity="1.00"] 17 17 [SourceGraphic] 18 18 RenderSVGResourceFilter {filter} [id="drop-shadow-5"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 19 [feDropShadow stdDeviation="10.00, 10.00" dx="5.00" dy="5.00" flood-color="#008000" flood-opacity="1.00 ]19 [feDropShadow stdDeviation="10.00, 10.00" dx="5.00" dy="5.00" flood-color="#008000" flood-opacity="1.00"] 20 20 [SourceGraphic] 21 21 RenderSVGResourceFilter {filter} [id="drop-shadow-6"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 22 [feDropShadow stdDeviation="10.00, 10.00" dx="-5.00" dy="-5.00" flood-color="#008000" flood-opacity="1.00 ]22 [feDropShadow stdDeviation="10.00, 10.00" dx="-5.00" dy="-5.00" flood-color="#008000" flood-opacity="1.00"] 23 23 [SourceGraphic] 24 24 RenderSVGResourceFilter {filter} [id="drop-shadow-7"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 25 [feDropShadow stdDeviation="128.00, 128.00" dx="0.00" dy="0.00" flood-color="#008000" flood-opacity="1.00 ]25 [feDropShadow stdDeviation="128.00, 128.00" dx="0.00" dy="0.00" flood-color="#008000" flood-opacity="1.00"] 26 26 [SourceGraphic] 27 27 RenderSVGResourceFilter {filter} [id="drop-shadow-8"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 28 [feDropShadow stdDeviation="10.00, 10.00" dx="5.00" dy="5.00" flood-color="#008000" flood-opacity="0.50 ]28 [feDropShadow stdDeviation="10.00, 10.00" dx="5.00" dy="5.00" flood-color="#008000" flood-opacity="0.50"] 29 29 [SourceGraphic] 30 30 RenderSVGEllipse {circle} at (0,0) size 159x159 [stroke={[type=SOLID] [color=#0000FF] [stroke width=5.00]}] [fill={[type=SOLID] [color=#FFFF00]}] [cx=75.00] [cy=75.00] [r=70.00] -
trunk/LayoutTests/svg/filters/feDropShadow-subregion-expected.txt
r123210 r286589 6 6 RenderSVGResourceFilter {filter} [id="DropShadow"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 7 7 [feComposite operation="OVER"] 8 [feDropShadow stdDeviation="10.00, 10.00" dx="10.00" dy="10.00" flood-color="#FF0000" flood-opacity="1.00 ]8 [feDropShadow stdDeviation="10.00, 10.00" dx="10.00" dy="10.00" flood-color="#FF0000" flood-opacity="1.00"] 9 9 [SourceGraphic] 10 10 [feOffset dx="10.00" dy="10.00"] -
trunk/LayoutTests/svg/filters/feDropShadow-zero-deviation-expected.txt
r158896 r286589 5 5 RenderSVGHiddenContainer {defs} at (0,0) size 0x0 6 6 RenderSVGResourceFilter {filter} [id="f1"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 7 [feDropShadow stdDeviation="0.00, 1.00" dx="2.00" dy="2.00" flood-color="#000000" flood-opacity="1.00 ]7 [feDropShadow stdDeviation="0.00, 1.00" dx="2.00" dy="2.00" flood-color="#000000" flood-opacity="1.00"] 8 8 [SourceGraphic] 9 9 RenderSVGResourceFilter {filter} [id="f2"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 10 [feDropShadow stdDeviation="1.00, 0.00" dx="2.00" dy="2.00" flood-color="#000000" flood-opacity="1.00 ]10 [feDropShadow stdDeviation="1.00, 0.00" dx="2.00" dy="2.00" flood-color="#000000" flood-opacity="1.00"] 11 11 [SourceGraphic] 12 12 RenderSVGRect {rect} at (49,19) size 12x12 [fill={[type=SOLID] [color=#008000]}] [x=50.00] [y=20.00] [width=10.00] [height=10.00] -
trunk/LayoutTests/svg/repaint/filter-child-repaint-expected.txt
r107417 r286589 5 5 RenderSVGHiddenContainer {defs} at (0,0) size 0x0 6 6 RenderSVGResourceFilter {filter} [id="dropShadow"] [filterUnits=objectBoundingBox] [primitiveUnits=userSpaceOnUse] 7 [feDropShadow stdDeviation="2.00, 2.00" dx="3.00" dy="3.00" flood-color="#000000" flood-opacity="1.00 ]7 [feDropShadow stdDeviation="2.00, 2.00" dx="3.00" dy="3.00" flood-color="#000000" flood-opacity="1.00"] 8 8 [SourceGraphic] 9 9 RenderSVGContainer {g} at (0,0) size 106x106 -
trunk/Source/WebCore/ChangeLog
r286588 r286589 1 2021-12-06 Said Abou-Hallawa <said@apple.com> 2 3 [GPU Process] [Filters] Make FilterEffect::externalRepresentation() and its overridable functions work iteratively 4 https://bugs.webkit.org/show_bug.cgi?id=233893 5 6 Reviewed by Cameron McCormack. 7 8 This is a step towards removing the inputEffect() from FilterEffect. 9 10 -- The enum FliterEffect::RepresentationType is replaced by 11 FilterRepresentation. 12 13 -- CSSFilter calls its functions from left to right to dump their 14 externalRepresentation. 15 16 -- SVGFilter uses its expression to dump its graph of FilterEffects. 17 18 -- Since SourceAlpha is a built-in effect it does not need to dump 19 SourceGraphic as its input. 20 21 * platform/graphics/filters/FEBlend.cpp: 22 (WebCore::FEBlend::externalRepresentation const): 23 * platform/graphics/filters/FEBlend.h: 24 * platform/graphics/filters/FEColorMatrix.cpp: 25 (WebCore::FEColorMatrix::externalRepresentation const): 26 * platform/graphics/filters/FEColorMatrix.h: 27 * platform/graphics/filters/FEComponentTransfer.cpp: 28 (WebCore::FEComponentTransfer::externalRepresentation const): 29 * platform/graphics/filters/FEComponentTransfer.h: 30 * platform/graphics/filters/FEComposite.cpp: 31 (WebCore::FEComposite::externalRepresentation const): 32 * platform/graphics/filters/FEComposite.h: 33 * platform/graphics/filters/FEConvolveMatrix.cpp: 34 (WebCore::FEConvolveMatrix::externalRepresentation const): 35 * platform/graphics/filters/FEConvolveMatrix.h: 36 * platform/graphics/filters/FEDiffuseLighting.cpp: 37 (WebCore::FEDiffuseLighting::externalRepresentation const): 38 * platform/graphics/filters/FEDiffuseLighting.h: 39 * platform/graphics/filters/FEDisplacementMap.cpp: 40 (WebCore::FEDisplacementMap::externalRepresentation const): 41 * platform/graphics/filters/FEDisplacementMap.h: 42 * platform/graphics/filters/FEDropShadow.cpp: 43 (WebCore::FEDropShadow::externalRepresentation const): 44 * platform/graphics/filters/FEDropShadow.h: 45 * platform/graphics/filters/FEFlood.cpp: 46 (WebCore::FEFlood::externalRepresentation const): 47 * platform/graphics/filters/FEFlood.h: 48 * platform/graphics/filters/FEGaussianBlur.cpp: 49 (WebCore::FEGaussianBlur::externalRepresentation const): 50 * platform/graphics/filters/FEGaussianBlur.h: 51 * platform/graphics/filters/FEMerge.cpp: 52 (WebCore::FEMerge::externalRepresentation const): 53 * platform/graphics/filters/FEMerge.h: 54 * platform/graphics/filters/FEMorphology.cpp: 55 (WebCore::FEMorphology::externalRepresentation const): 56 * platform/graphics/filters/FEMorphology.h: 57 * platform/graphics/filters/FEOffset.cpp: 58 (WebCore::FEOffset::externalRepresentation const): 59 * platform/graphics/filters/FEOffset.h: 60 * platform/graphics/filters/FESpecularLighting.cpp: 61 (WebCore::FESpecularLighting::externalRepresentation const): 62 * platform/graphics/filters/FESpecularLighting.h: 63 * platform/graphics/filters/FETile.cpp: 64 (WebCore::FETile::externalRepresentation const): 65 * platform/graphics/filters/FETile.h: 66 * platform/graphics/filters/FETurbulence.cpp: 67 (WebCore::FETurbulence::externalRepresentation const): 68 * platform/graphics/filters/FETurbulence.h: 69 * platform/graphics/filters/Filter.h: 70 * platform/graphics/filters/FilterEffect.cpp: 71 (WebCore::FilterEffect::externalRepresentation const): 72 (WebCore::operator<<): 73 * platform/graphics/filters/FilterEffect.h: 74 * platform/graphics/filters/FilterFunction.h: 75 * platform/graphics/filters/SourceAlpha.cpp: 76 (WebCore::SourceAlpha::externalRepresentation const): 77 * platform/graphics/filters/SourceAlpha.h: 78 * platform/graphics/filters/SourceGraphic.cpp: 79 (WebCore::SourceGraphic::externalRepresentation const): 80 * platform/graphics/filters/SourceGraphic.h: 81 * rendering/CSSFilter.cpp: 82 (WebCore::CSSFilter::externalRepresentation const): 83 * rendering/CSSFilter.h: 84 * rendering/svg/SVGRenderTreeAsText.cpp: 85 (WebCore::writeSVGResourceContainer): 86 * svg/graphics/filters/SVGFEImage.cpp: 87 (WebCore::FEImage::externalRepresentation const): 88 * svg/graphics/filters/SVGFEImage.h: 89 * svg/graphics/filters/SVGFilter.cpp: 90 (WebCore::SVGFilter::externalRepresentation const): 91 * svg/graphics/filters/SVGFilter.h: 92 * svg/graphics/filters/SVGFilterBuilder.cpp: 93 (WebCore::effectGeometryFlagsForElement): 94 (WebCore::SVGFilterBuilder::buildFilterEffects): 95 (WebCore::SVGFilterBuilder::buildEffectExpression const): 96 (WebCore::SVGFilterBuilder::buildExpression const): 97 (WebCore::boundarySetFlagsForElement): Deleted. 98 * svg/graphics/filters/SVGFilterBuilder.h: 99 * svg/graphics/filters/SVGFilterExpression.h: 100 1 101 2021-12-06 Patrick Angle <pangle@apple.com> 2 102 -
trunk/Source/WebCore/platform/graphics/filters/FEBlend.cpp
r286391 r286589 58 58 } 59 59 60 TextStream& FEBlend::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const60 TextStream& FEBlend::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 61 61 { 62 62 ts << indent << "[feBlend"; 63 63 FilterEffect::externalRepresentation(ts, representation); 64 ts << " mode=\"" << (m_mode == BlendMode::Normal ? "normal" : compositeOperatorName(CompositeOperator::SourceOver, m_mode)) << "\"]\n";65 64 66 TextStream::IndentScope indentScope(ts);67 inputEffect(0)->externalRepresentation(ts, representation); 68 inputEffect(1)->externalRepresentation(ts, representation);65 ts << " mode=\"" << (m_mode == BlendMode::Normal ? "normal" : compositeOperatorName(CompositeOperator::SourceOver, m_mode)); 66 67 ts << "\"]\n"; 69 68 return ts; 70 69 } -
trunk/Source/WebCore/platform/graphics/filters/FEBlend.h
r286538 r286589 47 47 unsigned colorArrayLength); 48 48 49 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;49 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 50 50 51 51 BlendMode m_mode; -
trunk/Source/WebCore/platform/graphics/filters/FEColorMatrix.cpp
r286287 r286589 142 142 } 143 143 144 TextStream& FEColorMatrix::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const144 TextStream& FEColorMatrix::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 145 145 { 146 146 ts << indent << "[feColorMatrix"; 147 147 FilterEffect::externalRepresentation(ts, representation); 148 148 149 ts << " type=\"" << m_type << "\""; 149 150 if (!m_values.isEmpty()) { … … 154 155 ts << *ptr; 155 156 ++ptr; 156 if (ptr < end) 157 if (ptr < end) 157 158 ts << " "; 158 159 } 159 160 ts << "\""; 160 161 } 162 161 163 ts << "]\n"; 162 163 TextStream::IndentScope indentScope(ts);164 inputEffect(0)->externalRepresentation(ts, representation);165 164 return ts; 166 165 } -
trunk/Source/WebCore/platform/graphics/filters/FEColorMatrix.h
r286538 r286589 64 64 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 65 65 66 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;66 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 67 67 68 68 ColorMatrixType m_type; -
trunk/Source/WebCore/platform/graphics/filters/FEComponentTransfer.cpp
r286193 r286589 117 117 } 118 118 119 TextStream& FEComponentTransfer::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const119 TextStream& FEComponentTransfer::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 120 120 { 121 121 ts << indent << "[feComponentTransfer"; 122 122 FilterEffect::externalRepresentation(ts, representation); 123 123 ts << "\n"; 124 124 125 { 125 126 TextStream::IndentScope indentScope(ts, 2); … … 127 128 ts << indent << "{green: " << m_greenFunction << "}\n"; 128 129 ts << indent << "{blue: " << m_blueFunction << "}\n"; 129 ts << indent << "{alpha: " << m_alphaFunction << "} ]\n";130 ts << indent << "{alpha: " << m_alphaFunction << "}"; 130 131 } 131 132 132 TextStream::IndentScope indentScope(ts); 133 inputEffect(0)->externalRepresentation(ts, representation); 133 ts << "]\n"; 134 134 return ts; 135 135 } -
trunk/Source/WebCore/platform/graphics/filters/FEComponentTransfer.h
r286538 r286589 75 75 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 76 76 77 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;77 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 78 78 79 79 ComponentTransferFunction m_redFunction; -
trunk/Source/WebCore/platform/graphics/filters/FEComposite.cpp
r286287 r286589 143 143 } 144 144 145 TextStream& FEComposite::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const145 TextStream& FEComposite::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 146 146 { 147 147 ts << indent << "[feComposite"; 148 148 FilterEffect::externalRepresentation(ts, representation); 149 149 150 ts << " operation=\"" << m_type << "\""; 150 151 if (m_type == FECOMPOSITE_OPERATOR_ARITHMETIC) 151 152 ts << " k1=\"" << m_k1 << "\" k2=\"" << m_k2 << "\" k3=\"" << m_k3 << "\" k4=\"" << m_k4 << "\""; 153 152 154 ts << "]\n"; 153 154 TextStream::IndentScope indentScope(ts);155 inputEffect(0)->externalRepresentation(ts, representation);156 inputEffect(1)->externalRepresentation(ts, representation);157 155 return ts; 158 156 } -
trunk/Source/WebCore/platform/graphics/filters/FEComposite.h
r286538 r286589 70 70 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 71 71 72 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;72 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 73 73 74 74 inline void platformArithmeticSoftware(const Uint8ClampedArray& source, Uint8ClampedArray& destination, float k1, float k2, float k3, float k4); -
trunk/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.cpp
r286287 r286589 144 144 } 145 145 146 TextStream& FEConvolveMatrix::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const146 TextStream& FEConvolveMatrix::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 147 147 { 148 148 ts << indent << "[feConvolveMatrix"; 149 149 FilterEffect::externalRepresentation(ts, representation); 150 ts << " order=\"" << m_kernelSize << "\" "151 << "kernelMatrix=\"" << m_kernelMatrix << "\" "152 << "divisor=\"" << m_divisor << "\" "153 << "bias=\"" << m_bias << "\" "154 << "target=\"" << m_targetOffset << "\" "155 << "edgeMode=\"" << m_edgeMode << "\" "156 << "kernelUnitLength=\"" << m_kernelUnitLength << "\" "157 << "preserveAlpha=\"" << m_preserveAlpha << "\"]\n";158 150 159 TextStream::IndentScope indentScope(ts); 160 inputEffect(0)->externalRepresentation(ts, representation); 151 ts << " order=\"" << m_kernelSize << "\""; 152 ts << " kernelMatrix=\"" << m_kernelMatrix << "\""; 153 ts << " divisor=\"" << m_divisor << "\""; 154 ts << " bias=\"" << m_bias << "\""; 155 ts << " target=\"" << m_targetOffset << "\""; 156 ts << " edgeMode=\"" << m_edgeMode << "\""; 157 ts << " kernelUnitLength=\"" << m_kernelUnitLength << "\""; 158 ts << " preserveAlpha=\"" << m_preserveAlpha << "\""; 159 160 ts << "]\n"; 161 161 return ts; 162 162 } -
trunk/Source/WebCore/platform/graphics/filters/FEConvolveMatrix.h
r286538 r286589 75 75 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 76 76 77 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;77 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 78 78 79 79 IntSize m_kernelSize; -
trunk/Source/WebCore/platform/graphics/filters/FEDiffuseLighting.cpp
r286152 r286589 48 48 } 49 49 50 TextStream& FEDiffuseLighting::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const50 TextStream& FEDiffuseLighting::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 51 51 { 52 52 ts << indent << "[feDiffuseLighting"; 53 53 FilterEffect::externalRepresentation(ts, representation); 54 ts << " surfaceScale=\"" << m_surfaceScale << "\" "55 << "diffuseConstant=\"" << m_diffuseConstant << "\" "56 << "kernelUnitLength=\"" << m_kernelUnitLengthX << ", " << m_kernelUnitLengthY << "\"]\n";57 54 58 TextStream::IndentScope indentScope(ts); 59 inputEffect(0)->externalRepresentation(ts, representation); 55 ts << " surfaceScale=\"" << m_surfaceScale << "\""; 56 ts << " diffuseConstant=\"" << m_diffuseConstant << "\""; 57 ts << " kernelUnitLength=\"" << m_kernelUnitLengthX << ", " << m_kernelUnitLengthY << "\""; 58 59 ts << "]\n"; 60 60 return ts; 61 61 } -
trunk/Source/WebCore/platform/graphics/filters/FEDiffuseLighting.h
r286538 r286589 36 36 bool setDiffuseConstant(float); 37 37 38 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;38 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 39 39 40 40 template<class Decoder> static std::optional<Ref<FEDiffuseLighting>> decode(Decoder&); -
trunk/Source/WebCore/platform/graphics/filters/FEDisplacementMap.cpp
r286578 r286589 117 117 } 118 118 119 TextStream& FEDisplacementMap::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const119 TextStream& FEDisplacementMap::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 120 120 { 121 121 ts << indent << "[feDisplacementMap"; 122 122 FilterEffect::externalRepresentation(ts, representation); 123 ts << " scale=\"" << m_scale << "\" "124 << "xChannelSelector=\"" << m_xChannelSelector << "\" "125 << "yChannelSelector=\"" << m_yChannelSelector << "\"]\n";126 123 127 TextStream::IndentScope indentScope(ts); 128 inputEffect(0)->externalRepresentation(ts, representation); 129 inputEffect(1)->externalRepresentation(ts, representation); 124 ts << " scale=\"" << m_scale << "\""; 125 ts << " xChannelSelector=\"" << m_xChannelSelector << "\""; 126 ts << " yChannelSelector=\"" << m_yChannelSelector << "\""; 127 128 ts << "]\n"; 130 129 return ts; 131 130 } -
trunk/Source/WebCore/platform/graphics/filters/FEDisplacementMap.h
r286578 r286589 62 62 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 63 63 64 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;64 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 65 65 66 66 ChannelSelectorType m_xChannelSelector; -
trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.cpp
r286287 r286589 78 78 } 79 79 80 TextStream& FEDropShadow::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const80 TextStream& FEDropShadow::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 81 81 { 82 82 ts << indent <<"[feDropShadow"; 83 83 FilterEffect::externalRepresentation(ts, representation); 84 ts << " stdDeviation=\"" << m_stdX << ", " << m_stdY << "\" dx=\"" << m_dx << "\" dy=\"" << m_dy << "\" flood-color=\"" << serializationForRenderTreeAsText(m_shadowColor) <<"\" flood-opacity=\"" << m_shadowOpacity << "]\n";85 84 86 TextStream::IndentScope indentScope(ts); 87 inputEffect(0)->externalRepresentation(ts, representation); 85 ts << " stdDeviation=\"" << m_stdX << ", " << m_stdY << "\""; 86 ts << " dx=\"" << m_dx << "\" dy=\"" << m_dy << "\""; 87 ts << " flood-color=\"" << serializationForRenderTreeAsText(m_shadowColor) << "\""; 88 ts << " flood-opacity=\"" << m_shadowOpacity << "\""; 89 90 ts << "]\n"; 88 91 return ts; 89 92 } -
trunk/Source/WebCore/platform/graphics/filters/FEDropShadow.h
r286538 r286589 60 60 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 61 61 62 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;62 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 63 63 64 64 float m_stdX; -
trunk/Source/WebCore/platform/graphics/filters/FEFlood.cpp
r286287 r286589 70 70 } 71 71 72 TextStream& FEFlood::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const72 TextStream& FEFlood::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 73 73 { 74 74 ts << indent << "[feFlood"; 75 75 FilterEffect::externalRepresentation(ts, representation); 76 ts << " flood-color=\"" << serializationForRenderTreeAsText(floodColor()) << "\" " 77 << "flood-opacity=\"" << floodOpacity() << "\"]\n"; 76 77 ts << " flood-color=\"" << serializationForRenderTreeAsText(floodColor()) << "\""; 78 ts << " flood-opacity=\"" << floodOpacity() << "\""; 79 80 ts << "]\n"; 78 81 return ts; 79 82 } -
trunk/Source/WebCore/platform/graphics/filters/FEFlood.h
r286538 r286589 54 54 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 55 55 56 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;56 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 57 57 58 58 Color m_floodColor; -
trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.cpp
r286287 r286589 137 137 } 138 138 139 TextStream& FEGaussianBlur::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const139 TextStream& FEGaussianBlur::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 140 140 { 141 141 ts << indent << "[feGaussianBlur"; 142 142 FilterEffect::externalRepresentation(ts, representation); 143 ts << " stdDeviation=\"" << m_stdX << ", " << m_stdY << "\"]\n";144 143 145 TextStream::IndentScope indentScope(ts); 146 inputEffect(0)->externalRepresentation(ts, representation); 144 ts << " stdDeviation=\"" << m_stdX << ", " << m_stdY << "\""; 145 146 ts << "]\n"; 147 147 return ts; 148 148 } -
trunk/Source/WebCore/platform/graphics/filters/FEGaussianBlur.h
r286538 r286589 59 59 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 60 60 61 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;61 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 62 62 63 63 float m_stdX; -
trunk/Source/WebCore/platform/graphics/filters/FEMerge.cpp
r286538 r286589 46 46 } 47 47 48 TextStream& FEMerge::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const48 TextStream& FEMerge::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 49 49 { 50 50 ts << indent << "[feMerge"; 51 51 FilterEffect::externalRepresentation(ts, representation); 52 unsigned size = numberOfEffectInputs();53 ASSERT(size > 0);54 ts << " mergeNodes=\"" << size << "\"]\n";55 52 56 TextStream::IndentScope indentScope(ts);57 for (unsigned i = 0; i < size; ++i) 58 inputEffect(i)->externalRepresentation(ts, representation);53 ts << " mergeNodes=\"" << m_numberOfEffectInputs << "\""; 54 55 ts << "]\n"; 59 56 return ts; 60 57 } -
trunk/Source/WebCore/platform/graphics/filters/FEMerge.h
r286538 r286589 39 39 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 40 40 41 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;41 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 42 42 43 43 unsigned m_numberOfEffectInputs { 0 }; -
trunk/Source/WebCore/platform/graphics/filters/FEMorphology.cpp
r286287 r286589 102 102 } 103 103 104 TextStream& FEMorphology::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const104 TextStream& FEMorphology::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 105 105 { 106 106 ts << indent << "[feMorphology"; 107 107 FilterEffect::externalRepresentation(ts, representation); 108 ts << " operator=\"" << morphologyOperator() << "\" "109 << "radius=\"" << radiusX() << ", " << radiusY() << "\"]\n";110 108 111 TextStream::IndentScope indentScope(ts); 112 inputEffect(0)->externalRepresentation(ts, representation); 109 ts << " operator=\"" << morphologyOperator() << "\""; 110 ts << " radius=\"" << radiusX() << ", " << radiusY() << "\""; 111 112 ts << "]\n"; 113 113 return ts; 114 114 } -
trunk/Source/WebCore/platform/graphics/filters/FEMorphology.h
r286538 r286589 58 58 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 59 59 60 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;60 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 61 61 62 62 MorphologyOperatorType m_type; -
trunk/Source/WebCore/platform/graphics/filters/FEOffset.cpp
r286287 r286589 71 71 } 72 72 73 TextStream& FEOffset::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const73 TextStream& FEOffset::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 74 74 { 75 75 ts << indent << "[feOffset"; 76 76 FilterEffect::externalRepresentation(ts, representation); 77 ts << " dx=\"" << dx() << "\" dy=\"" << dy() << "\"]\n";78 77 79 TextStream::IndentScope indentScope(ts); 80 inputEffect(0)->externalRepresentation(ts, representation); 78 ts << " dx=\"" << dx() << "\" dy=\"" << dy() << "\""; 79 80 ts << "]\n"; 81 81 return ts; 82 82 } -
trunk/Source/WebCore/platform/graphics/filters/FEOffset.h
r286538 r286589 49 49 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 50 50 51 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;51 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 52 52 53 53 float m_dx; -
trunk/Source/WebCore/platform/graphics/filters/FESpecularLighting.cpp
r286152 r286589 56 56 } 57 57 58 TextStream& FESpecularLighting::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const58 TextStream& FESpecularLighting::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 59 59 { 60 60 ts << indent << "[feSpecularLighting"; 61 61 FilterEffect::externalRepresentation(ts, representation); 62 ts << " surfaceScale=\"" << m_surfaceScale << "\" " 63 << "specualConstant=\"" << m_specularConstant << "\" " 64 << "specularExponent=\"" << m_specularExponent << "\"]\n"; 62 63 ts << " surfaceScale=\"" << m_surfaceScale << "\""; 64 ts << " specualConstant=\"" << m_specularConstant << "\""; 65 ts << " specularExponent=\"" << m_specularExponent << "\""; 65 66 66 TextStream::IndentScope indentScope(ts); 67 inputEffect(0)->externalRepresentation(ts, representation); 67 ts << "]\n"; 68 68 return ts; 69 69 } -
trunk/Source/WebCore/platform/graphics/filters/FESpecularLighting.h
r286538 r286589 37 37 bool setSpecularExponent(float); 38 38 39 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;39 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 40 40 41 41 template<class Decoder> static std::optional<Ref<FESpecularLighting>> decode(Decoder&); -
trunk/Source/WebCore/platform/graphics/filters/FETile.cpp
r286287 r286589 54 54 } 55 55 56 TextStream& FETile::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const56 TextStream& FETile::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 57 57 { 58 58 ts << indent << "[feTile"; 59 59 FilterEffect::externalRepresentation(ts, representation); 60 60 ts << "]\n"; 61 62 TextStream::IndentScope indentScope(ts);63 inputEffect(0)->externalRepresentation(ts, representation);64 65 61 return ts; 66 62 } -
trunk/Source/WebCore/platform/graphics/filters/FETile.h
r286538 r286589 40 40 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 41 41 42 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;42 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 43 43 }; 44 44 -
trunk/Source/WebCore/platform/graphics/filters/FETurbulence.cpp
r286287 r286589 123 123 } 124 124 125 TextStream& FETurbulence::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const125 TextStream& FETurbulence::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 126 126 { 127 127 ts << indent << "[feTurbulence"; 128 128 FilterEffect::externalRepresentation(ts, representation); 129 ts << " type=\"" << type() << "\" " 130 << "baseFrequency=\"" << baseFrequencyX() << ", " << baseFrequencyY() << "\" " 131 << "seed=\"" << seed() << "\" " 132 << "numOctaves=\"" << numOctaves() << "\" " 133 << "stitchTiles=\"" << stitchTiles() << "\"]\n"; 129 130 ts << " type=\"" << type() << "\""; 131 ts << " baseFrequency=\"" << baseFrequencyX() << ", " << baseFrequencyY() << "\""; 132 ts << " seed=\"" << seed() << "\""; 133 ts << " numOctaves=\"" << numOctaves() << "\""; 134 ts << " stitchTiles=\"" << stitchTiles() << "\""; 135 136 ts << "]\n"; 134 137 return ts; 135 138 } -
trunk/Source/WebCore/platform/graphics/filters/FETurbulence.h
r286538 r286589 68 68 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 69 69 70 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;70 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 71 71 72 72 TurbulenceType m_type; -
trunk/Source/WebCore/platform/graphics/filters/Filter.h
r286578 r286589 22 22 #pragma once 23 23 24 #include "FilterEffectGeometry.h"25 24 #include "FilterFunction.h" 26 25 #include "FloatRect.h" -
trunk/Source/WebCore/platform/graphics/filters/FilterEffect.cpp
r286578 r286589 162 162 } 163 163 164 TextStream& FilterEffect::externalRepresentation(TextStream& ts, RepresentationType representationType) const164 TextStream& FilterEffect::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 165 165 { 166 166 // FIXME: We should dump the subRegions of the filter primitives here later. This isn't 167 167 // possible at the moment, because we need more detailed informations from the target object. 168 168 169 if (representation Type == RepresentationType::Debugging) {169 if (representation == FilterRepresentation::Debugging) { 170 170 TextStream::IndentScope indentScope(ts); 171 171 ts.dumpProperty("operating colorspace", operatingColorSpace()); … … 175 175 } 176 176 177 TextStream& operator<<(TextStream& ts, const FilterEffect& filter)177 TextStream& operator<<(TextStream& ts, const FilterEffect& effect) 178 178 { 179 179 // Use a new stream because we want multiline mode for logging filters. 180 180 TextStream filterStream; 181 filter.externalRepresentation(filterStream, FilterEffect::RepresentationType::Debugging);181 effect.externalRepresentation(filterStream, FilterRepresentation::Debugging); 182 182 183 183 return ts << filterStream.release(); -
trunk/Source/WebCore/platform/graphics/filters/FilterEffect.h
r286578 r286589 59 59 virtual void setOperatingColorSpace(const DestinationColorSpace& colorSpace) { m_operatingColorSpace = colorSpace; } 60 60 61 enum class RepresentationType { TestOutput, Debugging }; 62 virtual WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType = RepresentationType::TestOutput) const; 61 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 63 62 64 63 protected: -
trunk/Source/WebCore/platform/graphics/filters/FilterFunction.h
r286578 r286589 39 39 40 40 class Filter; 41 42 enum class FilterRepresentation : uint8_t { 43 TestOutput, 44 Debugging 45 }; 41 46 42 47 class FilterFunction : public RefCounted<FilterFunction> { … … 94 99 virtual void clearResult() { } 95 100 101 virtual WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation = FilterRepresentation::TestOutput) const = 0; 102 96 103 private: 97 104 Type m_filterType; -
trunk/Source/WebCore/platform/graphics/filters/SourceAlpha.cpp
r286287 r286589 50 50 } 51 51 52 TextStream& SourceAlpha::externalRepresentation(TextStream& ts, RepresentationType) const52 TextStream& SourceAlpha::externalRepresentation(TextStream& ts, FilterRepresentation) const 53 53 { 54 54 ts << indent << "[SourceAlpha]\n"; -
trunk/Source/WebCore/platform/graphics/filters/SourceAlpha.h
r286287 r286589 38 38 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 39 39 40 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;40 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 41 41 }; 42 42 -
trunk/Source/WebCore/platform/graphics/filters/SourceGraphic.cpp
r286287 r286589 57 57 } 58 58 59 TextStream& SourceGraphic::externalRepresentation(TextStream& ts, RepresentationType) const59 TextStream& SourceGraphic::externalRepresentation(TextStream& ts, FilterRepresentation) const 60 60 { 61 61 ts << indent << "[SourceGraphic]\n"; -
trunk/Source/WebCore/platform/graphics/filters/SourceGraphic.h
r286538 r286589 43 43 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const override; 44 44 45 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const override;45 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const override; 46 46 }; 47 47 -
trunk/Source/WebCore/rendering/CSSFilter.cpp
r286546 r286589 405 405 } 406 406 407 TextStream& CSSFilter::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 408 { 409 unsigned level = 0; 410 411 for (auto it = m_functions.rbegin(), end = m_functions.rend(); it != end; ++it) { 412 auto& function = *it; 413 414 // SourceAlpha is a built-in effect. No need to say SourceGraphic is its input. 415 if (function->filterType() == FilterEffect::Type::SourceAlpha) 416 ++it; 417 418 TextStream::IndentScope indentScope(ts, level++); 419 function->externalRepresentation(ts, representation); 420 } 421 422 return ts; 423 } 424 407 425 } // namespace WebCore -
trunk/Source/WebCore/rendering/CSSFilter.h
r286546 r286589 69 69 #endif 70 70 71 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const final; 72 71 73 bool m_hasFilterThatMovesPixels { false }; 72 74 bool m_hasFilterThatShouldBeRestrictedBySecurityOrigin { false }; -
trunk/Source/WebCore/rendering/svg/SVGRenderTreeAsText.cpp
r286546 r286589 435 435 if (dummyFilter) { 436 436 TextStream::IndentScope indentScope(ts); 437 438 if (auto lastEffect = dummyFilter->lastEffect()) 439 lastEffect->externalRepresentation(ts); 437 dummyFilter->externalRepresentation(ts, FilterRepresentation::TestOutput); 440 438 } 441 439 } else if (resource.resourceType() == ClipperResourceType) { -
trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.cpp
r286287 r286589 113 113 } 114 114 115 TextStream& FEImage::externalRepresentation(TextStream& ts, RepresentationTyperepresentation) const115 TextStream& FEImage::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 116 116 { 117 117 ts << indent << "[feImage"; 118 118 FilterEffect::externalRepresentation(ts, representation); 119 ts << " image-size=\"" << m_sourceImageRect.width() << "x" << m_sourceImageRect.height() << "\"]\n"; 119 120 ts << " image-size=\"" << m_sourceImageRect.width() << "x" << m_sourceImageRect.height() << "\""; 120 121 // FIXME: should this dump also object returned by SVGFEImage::image() ? 122 123 ts << "]\n"; 121 124 return ts; 122 125 } -
trunk/Source/WebCore/svg/graphics/filters/SVGFEImage.h
r286287 r286589 55 55 std::unique_ptr<FilterEffectApplier> createApplier(const Filter&) const final; 56 56 57 WTF::TextStream& externalRepresentation(WTF::TextStream&, RepresentationType) const final;57 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const final; 58 58 59 59 SourceImage m_sourceImage; -
trunk/Source/WebCore/svg/graphics/filters/SVGFilter.cpp
r286578 r286589 134 134 } 135 135 136 TextStream& SVGFilter::externalRepresentation(TextStream& ts, FilterRepresentation representation) const 137 { 138 for (auto it = m_expression.rbegin(), end = m_expression.rend(); it != end; ++it) { 139 auto& term = *it; 140 141 // SourceAlpha is a built-in effect. No need to say SourceGraphic is its input. 142 if (term.effect->filterType() == FilterEffect::Type::SourceAlpha) 143 ++it; 144 145 TextStream::IndentScope indentScope(ts, term.level); 146 term.effect->externalRepresentation(ts, representation); 147 } 148 149 return ts; 150 } 151 136 152 } // namespace WebCore -
trunk/Source/WebCore/svg/graphics/filters/SVGFilter.h
r286578 r286589 47 47 RefPtr<FilterImage> apply() final; 48 48 49 WTF::TextStream& externalRepresentation(WTF::TextStream&, FilterRepresentation) const final; 50 49 51 private: 50 52 SVGFilter(RenderingMode, const FloatSize& filterScale, ClipOperation, const FloatRect& filterRegion, const FloatRect& targetBoundingBox, SVGUnitTypes::SVGUnitType primitiveUnits); -
trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.cpp
r286578 r286589 42 42 } 43 43 44 static OptionSet<FilterEffectGeometry::Flags> boundarySetFlagsForElement(SVGElement& element)44 static OptionSet<FilterEffectGeometry::Flags> effectGeometryFlagsForElement(SVGElement& element) 45 45 { 46 46 OptionSet<FilterEffectGeometry::Flags> flags; … … 109 109 break; 110 110 111 if (auto flags = boundarySetFlagsForElement(effectElement)) {111 if (auto flags = effectGeometryFlagsForElement(effectElement)) { 112 112 auto effectBoundaries = SVGLengthContext::resolveRectangle<SVGFilterPrimitiveStandardAttributes>(&effectElement, m_primitiveUnits, m_targetBoundingBox); 113 113 m_effectGeometryMap.add(*effect, FilterEffectGeometry(effectBoundaries, flags)); … … 210 210 } 211 211 212 bool SVGFilterBuilder::buildEffectExpression(const RefPtr<FilterEffect>& effect, FilterEffectVector& stack, SVGFilterExpression& expression) const212 bool SVGFilterBuilder::buildEffectExpression(const RefPtr<FilterEffect>& effect, FilterEffectVector& stack, unsigned level, SVGFilterExpression& expression) const 213 213 { 214 214 // A cycle is detected. … … 218 218 stack.append(effect); 219 219 220 expression.append({ *effect, effectGeometry(*effect) });220 expression.append({ *effect, effectGeometry(*effect), level }); 221 221 222 222 for (auto& inputEffect : effect->inputEffects()) { 223 if (!buildEffectExpression(inputEffect, stack, expression))223 if (!buildEffectExpression(inputEffect, stack, level + 1, expression)) 224 224 return false; 225 225 } … … 238 238 239 239 FilterEffectVector stack; 240 if (!buildEffectExpression(m_lastEffect, stack, expression))240 if (!buildEffectExpression(m_lastEffect, stack, 0, expression)) 241 241 return false; 242 242 -
trunk/Source/WebCore/svg/graphics/filters/SVGFilterBuilder.h
r286578 r286589 80 80 81 81 std::optional<FilterEffectGeometry> effectGeometry(FilterEffect&) const; 82 bool buildEffectExpression(const RefPtr<FilterEffect>&, FilterEffectVector& stack, SVGFilterExpression&) const;82 bool buildEffectExpression(const RefPtr<FilterEffect>&, FilterEffectVector& stack, unsigned level, SVGFilterExpression&) const; 83 83 84 84 HashMap<AtomString, RefPtr<FilterEffect>> m_builtinEffects; -
trunk/Source/WebCore/svg/graphics/filters/SVGFilterExpression.h
r286578 r286589 36 36 Ref<FilterEffect> effect; 37 37 std::optional<FilterEffectGeometry> geometry; 38 unsigned level; 38 39 }; 39 40
Note:
See TracChangeset
for help on using the changeset viewer.