Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> | 2 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> |
| 3 * | 3 * |
| 4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
| 5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
| 6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
| 7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
| 8 * | 8 * |
| 9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
| 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 111 visitor->trace(m_kernelUnitLength); | 111 visitor->trace(m_kernelUnitLength); |
| 112 visitor->trace(m_order); | 112 visitor->trace(m_order); |
| 113 visitor->trace(m_preserveAlpha); | 113 visitor->trace(m_preserveAlpha); |
| 114 visitor->trace(m_targetX); | 114 visitor->trace(m_targetX); |
| 115 visitor->trace(m_targetY); | 115 visitor->trace(m_targetY); |
| 116 SVGFilterPrimitiveStandardAttributes::trace(visitor); | 116 SVGFilterPrimitiveStandardAttributes::trace(visitor); |
| 117 } | 117 } |
| 118 | 118 |
| 119 DEFINE_NODE_FACTORY(SVGFEConvolveMatrixElement) | 119 DEFINE_NODE_FACTORY(SVGFEConvolveMatrixElement) |
| 120 | 120 |
| 121 IntSize SVGFEConvolveMatrixElement::matrixOrder() const | |
| 122 { | |
| 123 if (!m_order->isSpecified()) | |
| 124 return IntSize(3, 3); | |
| 125 return IntSize(orderX()->currentValue()->value(), orderY()->currentValue()-> value()); | |
| 126 } | |
| 127 | |
| 128 IntPoint SVGFEConvolveMatrixElement::targetPoint() const | |
| 129 { | |
| 130 IntSize order = matrixOrder(); | |
| 131 IntPoint target(m_targetX->currentValue()->value(), m_targetY->currentValue( )->value()); | |
| 132 // The spec says the default value is: targetX = floor ( orderX / 2 )) | |
| 133 if (!m_targetX->isSpecified()) | |
| 134 target.setX(order.width() / 2); | |
|
f(malita)
2016/07/05 15:20:12
I was worried here about negative half-value treat
fs
2016/07/05 15:29:43
We verify all the parameters down in FEConvolveMat
| |
| 135 // The spec says the default value is: targetY = floor ( orderY / 2 )) | |
| 136 if (!m_targetY->isSpecified()) | |
| 137 target.setY(order.height() / 2); | |
| 138 return target; | |
| 139 } | |
| 140 | |
| 121 bool SVGFEConvolveMatrixElement::setFilterEffectAttribute(FilterEffect* effect, const QualifiedName& attrName) | 141 bool SVGFEConvolveMatrixElement::setFilterEffectAttribute(FilterEffect* effect, const QualifiedName& attrName) |
| 122 { | 142 { |
| 123 FEConvolveMatrix* convolveMatrix = static_cast<FEConvolveMatrix*>(effect); | 143 FEConvolveMatrix* convolveMatrix = static_cast<FEConvolveMatrix*>(effect); |
| 124 if (attrName == SVGNames::edgeModeAttr) | 144 if (attrName == SVGNames::edgeModeAttr) |
| 125 return convolveMatrix->setEdgeMode(m_edgeMode->currentValue()->enumValue ()); | 145 return convolveMatrix->setEdgeMode(m_edgeMode->currentValue()->enumValue ()); |
| 126 if (attrName == SVGNames::divisorAttr) | 146 if (attrName == SVGNames::divisorAttr) |
| 127 return convolveMatrix->setDivisor(m_divisor->currentValue()->value()); | 147 return convolveMatrix->setDivisor(m_divisor->currentValue()->value()); |
| 128 if (attrName == SVGNames::biasAttr) | 148 if (attrName == SVGNames::biasAttr) |
| 129 return convolveMatrix->setBias(m_bias->currentValue()->value()); | 149 return convolveMatrix->setBias(m_bias->currentValue()->value()); |
| 130 if (attrName == SVGNames::targetXAttr) | 150 if (attrName == SVGNames::targetXAttr || attrName == SVGNames::targetYAttr) |
| 131 return convolveMatrix->setTargetOffset(IntPoint(m_targetX->currentValue( )->value(), m_targetY->currentValue()->value())); | 151 return convolveMatrix->setTargetOffset(targetPoint()); |
| 132 if (attrName == SVGNames::targetYAttr) | |
| 133 return convolveMatrix->setTargetOffset(IntPoint(m_targetX->currentValue( )->value(), m_targetY->currentValue()->value())); | |
| 134 if (attrName == SVGNames::preserveAlphaAttr) | 152 if (attrName == SVGNames::preserveAlphaAttr) |
| 135 return convolveMatrix->setPreserveAlpha(m_preserveAlpha->currentValue()- >value()); | 153 return convolveMatrix->setPreserveAlpha(m_preserveAlpha->currentValue()- >value()); |
| 136 | 154 |
| 137 ASSERT_NOT_REACHED(); | 155 ASSERT_NOT_REACHED(); |
| 138 return false; | 156 return false; |
| 139 } | 157 } |
| 140 | 158 |
| 141 void SVGFEConvolveMatrixElement::svgAttributeChanged(const QualifiedName& attrNa me) | 159 void SVGFEConvolveMatrixElement::svgAttributeChanged(const QualifiedName& attrNa me) |
| 142 { | 160 { |
| 143 if (attrName == SVGNames::edgeModeAttr | 161 if (attrName == SVGNames::edgeModeAttr |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 160 } | 178 } |
| 161 | 179 |
| 162 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName); | 180 SVGFilterPrimitiveStandardAttributes::svgAttributeChanged(attrName); |
| 163 } | 181 } |
| 164 | 182 |
| 165 FilterEffect* SVGFEConvolveMatrixElement::build(SVGFilterBuilder* filterBuilder, Filter* filter) | 183 FilterEffect* SVGFEConvolveMatrixElement::build(SVGFilterBuilder* filterBuilder, Filter* filter) |
| 166 { | 184 { |
| 167 FilterEffect* input1 = filterBuilder->getEffectById(AtomicString(m_in1->curr entValue()->value())); | 185 FilterEffect* input1 = filterBuilder->getEffectById(AtomicString(m_in1->curr entValue()->value())); |
| 168 ASSERT(input1); | 186 ASSERT(input1); |
| 169 | 187 |
| 170 int orderXValue = orderX()->currentValue()->value(); | |
| 171 int orderYValue = orderY()->currentValue()->value(); | |
| 172 if (!m_order->isSpecified()) { | |
| 173 orderXValue = 3; | |
| 174 orderYValue = 3; | |
| 175 } | |
| 176 | |
| 177 int targetXValue = m_targetX->currentValue()->value(); | |
| 178 // The spec says the default value is: targetX = floor ( orderX / 2 )) | |
| 179 if (!m_targetX->isSpecified()) | |
| 180 targetXValue = static_cast<int>(floorf(orderXValue / 2)); | |
| 181 | |
| 182 int targetYValue = m_targetY->currentValue()->value(); | |
| 183 // The spec says the default value is: targetY = floor ( orderY / 2 )) | |
| 184 if (!m_targetY->isSpecified()) | |
| 185 targetYValue = static_cast<int>(floorf(orderYValue / 2)); | |
| 186 | |
| 187 float divisorValue = m_divisor->currentValue()->value(); | 188 float divisorValue = m_divisor->currentValue()->value(); |
| 188 if (!m_divisor->isSpecified()) { | 189 if (!m_divisor->isSpecified()) { |
| 189 SVGNumberList* kernelMatrix = m_kernelMatrix->currentValue(); | 190 SVGNumberList* kernelMatrix = m_kernelMatrix->currentValue(); |
| 190 size_t kernelMatrixSize = kernelMatrix->length(); | 191 size_t kernelMatrixSize = kernelMatrix->length(); |
| 191 for (size_t i = 0; i < kernelMatrixSize; ++i) | 192 for (size_t i = 0; i < kernelMatrixSize; ++i) |
| 192 divisorValue += kernelMatrix->at(i)->value(); | 193 divisorValue += kernelMatrix->at(i)->value(); |
| 193 if (!divisorValue) | 194 if (!divisorValue) |
| 194 divisorValue = 1; | 195 divisorValue = 1; |
| 195 } | 196 } |
| 196 | 197 |
| 197 FilterEffect* effect = FEConvolveMatrix::create(filter, | 198 FilterEffect* effect = FEConvolveMatrix::create(filter, |
| 198 IntSize(orderXValue, orderYValue), divisorValue, | 199 matrixOrder(), divisorValue, |
| 199 m_bias->currentValue()->value(), IntPoint(targetXValue, targetYValue), m _edgeMode->currentValue()->enumValue(), | 200 m_bias->currentValue()->value(), targetPoint(), m_edgeMode->currentValue ()->enumValue(), |
| 200 m_preserveAlpha->currentValue()->value(), m_kernelMatrix->currentValue() ->toFloatVector()); | 201 m_preserveAlpha->currentValue()->value(), m_kernelMatrix->currentValue() ->toFloatVector()); |
| 201 effect->inputEffects().append(input1); | 202 effect->inputEffects().append(input1); |
| 202 return effect; | 203 return effect; |
| 203 } | 204 } |
| 204 | 205 |
| 205 } // namespace blink | 206 } // namespace blink |
| OLD | NEW |