| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> | 2 * Copyright (C) 2004, 2005, 2006, 2007 Nikolas Zimmermann <zimmermann@kde.org> |
| 3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> | 3 * Copyright (C) 2004, 2005 Rob Buis <buis@kde.org> |
| 4 * Copyright (C) 2005 Eric Seidel <eric@webkit.org> | 4 * Copyright (C) 2005 Eric Seidel <eric@webkit.org> |
| 5 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> | 5 * Copyright (C) 2009 Dirk Schulze <krit@webkit.org> |
| 6 * Copyright (C) 2010 Zoltan Herczeg <zherczeg@webkit.org> | 6 * Copyright (C) 2010 Zoltan Herczeg <zherczeg@webkit.org> |
| 7 * Copyright (C) 2013 Google Inc. All rights reserved. | 7 * Copyright (C) 2013 Google Inc. All rights reserved. |
| 8 * | 8 * |
| 9 * This library is free software; you can redistribute it and/or | 9 * This library is free software; you can redistribute it and/or |
| 10 * modify it under the terms of the GNU Library General Public | 10 * modify it under the terms of the GNU Library General Public |
| (...skipping 26 matching lines...) Expand all Loading... |
| 37 bool preserveAlpha, const Vector<float>& kernelMatrix) | 37 bool preserveAlpha, const Vector<float>& kernelMatrix) |
| 38 : FilterEffect(filter) | 38 : FilterEffect(filter) |
| 39 , m_kernelSize(kernelSize) | 39 , m_kernelSize(kernelSize) |
| 40 , m_divisor(divisor) | 40 , m_divisor(divisor) |
| 41 , m_bias(bias) | 41 , m_bias(bias) |
| 42 , m_targetOffset(targetOffset) | 42 , m_targetOffset(targetOffset) |
| 43 , m_edgeMode(edgeMode) | 43 , m_edgeMode(edgeMode) |
| 44 , m_preserveAlpha(preserveAlpha) | 44 , m_preserveAlpha(preserveAlpha) |
| 45 , m_kernelMatrix(kernelMatrix) | 45 , m_kernelMatrix(kernelMatrix) |
| 46 { | 46 { |
| 47 ASSERT(m_kernelSize.width() > 0); | |
| 48 ASSERT(m_kernelSize.height() > 0); | |
| 49 } | 47 } |
| 50 | 48 |
| 51 PassRefPtrWillBeRawPtr<FEConvolveMatrix> FEConvolveMatrix::create(Filter* filter
, const IntSize& kernelSize, | 49 PassRefPtrWillBeRawPtr<FEConvolveMatrix> FEConvolveMatrix::create(Filter* filter
, const IntSize& kernelSize, |
| 52 float divisor, float bias, const IntPoint& targetOffset, EdgeModeType edgeMo
de, | 50 float divisor, float bias, const IntPoint& targetOffset, EdgeModeType edgeMo
de, |
| 53 bool preserveAlpha, const Vector<float>& kernelMatrix) | 51 bool preserveAlpha, const Vector<float>& kernelMatrix) |
| 54 { | 52 { |
| 55 return adoptRefWillBeNoop(new FEConvolveMatrix(filter, kernelSize, divisor,
bias, targetOffset, edgeMode, | 53 return adoptRefWillBeNoop(new FEConvolveMatrix(filter, kernelSize, divisor,
bias, targetOffset, edgeMode, |
| 56 preserveAlpha, kernelMatrix)); | 54 preserveAlpha, kernelMatrix)); |
| 57 } | 55 } |
| 58 | 56 |
| 59 FloatRect FEConvolveMatrix::mapPaintRect(const FloatRect& rect, bool forward) | 57 FloatRect FEConvolveMatrix::mapPaintRect(const FloatRect& rect, bool forward) |
| 60 { | 58 { |
| 61 FloatRect result = rect; | 59 FloatRect result = rect; |
| 62 | 60 if (parametersValid()) { |
| 63 result.moveBy(forward ? -m_targetOffset : m_targetOffset - m_kernelSize); | 61 result.moveBy(forward ? -m_targetOffset : m_targetOffset - m_kernelSize)
; |
| 64 result.expand(m_kernelSize); | 62 result.expand(m_kernelSize); |
| 63 } |
| 65 return result; | 64 return result; |
| 66 } | 65 } |
| 67 | 66 |
| 68 IntSize FEConvolveMatrix::kernelSize() const | |
| 69 { | |
| 70 return m_kernelSize; | |
| 71 } | |
| 72 | |
| 73 void FEConvolveMatrix::setKernelSize(const IntSize& kernelSize) | |
| 74 { | |
| 75 ASSERT(kernelSize.width() > 0); | |
| 76 ASSERT(kernelSize.height() > 0); | |
| 77 m_kernelSize = kernelSize; | |
| 78 } | |
| 79 | |
| 80 const Vector<float>& FEConvolveMatrix::kernel() const | |
| 81 { | |
| 82 return m_kernelMatrix; | |
| 83 } | |
| 84 | |
| 85 void FEConvolveMatrix::setKernel(const Vector<float>& kernel) | |
| 86 { | |
| 87 m_kernelMatrix = kernel; | |
| 88 } | |
| 89 | |
| 90 float FEConvolveMatrix::divisor() const | |
| 91 { | |
| 92 return m_divisor; | |
| 93 } | |
| 94 | |
| 95 bool FEConvolveMatrix::setDivisor(float divisor) | 67 bool FEConvolveMatrix::setDivisor(float divisor) |
| 96 { | 68 { |
| 97 ASSERT(divisor); | |
| 98 if (m_divisor == divisor) | 69 if (m_divisor == divisor) |
| 99 return false; | 70 return false; |
| 100 m_divisor = divisor; | 71 m_divisor = divisor; |
| 101 return true; | 72 return true; |
| 102 } | 73 } |
| 103 | 74 |
| 104 float FEConvolveMatrix::bias() const | |
| 105 { | |
| 106 return m_bias; | |
| 107 } | |
| 108 | |
| 109 bool FEConvolveMatrix::setBias(float bias) | 75 bool FEConvolveMatrix::setBias(float bias) |
| 110 { | 76 { |
| 111 if (m_bias == bias) | 77 if (m_bias == bias) |
| 112 return false; | 78 return false; |
| 113 m_bias = bias; | 79 m_bias = bias; |
| 114 return true; | 80 return true; |
| 115 } | 81 } |
| 116 | 82 |
| 117 IntPoint FEConvolveMatrix::targetOffset() const | |
| 118 { | |
| 119 return m_targetOffset; | |
| 120 } | |
| 121 | |
| 122 bool FEConvolveMatrix::setTargetOffset(const IntPoint& targetOffset) | 83 bool FEConvolveMatrix::setTargetOffset(const IntPoint& targetOffset) |
| 123 { | 84 { |
| 124 if (m_targetOffset == targetOffset) | 85 if (m_targetOffset == targetOffset) |
| 125 return false; | 86 return false; |
| 126 m_targetOffset = targetOffset; | 87 m_targetOffset = targetOffset; |
| 127 return true; | 88 return true; |
| 128 } | 89 } |
| 129 | 90 |
| 130 EdgeModeType FEConvolveMatrix::edgeMode() const | |
| 131 { | |
| 132 return m_edgeMode; | |
| 133 } | |
| 134 | |
| 135 bool FEConvolveMatrix::setEdgeMode(EdgeModeType edgeMode) | 91 bool FEConvolveMatrix::setEdgeMode(EdgeModeType edgeMode) |
| 136 { | 92 { |
| 137 if (m_edgeMode == edgeMode) | 93 if (m_edgeMode == edgeMode) |
| 138 return false; | 94 return false; |
| 139 m_edgeMode = edgeMode; | 95 m_edgeMode = edgeMode; |
| 140 return true; | 96 return true; |
| 141 } | 97 } |
| 142 | 98 |
| 143 bool FEConvolveMatrix::preserveAlpha() const | |
| 144 { | |
| 145 return m_preserveAlpha; | |
| 146 } | |
| 147 | |
| 148 bool FEConvolveMatrix::setPreserveAlpha(bool preserveAlpha) | 99 bool FEConvolveMatrix::setPreserveAlpha(bool preserveAlpha) |
| 149 { | 100 { |
| 150 if (m_preserveAlpha == preserveAlpha) | 101 if (m_preserveAlpha == preserveAlpha) |
| 151 return false; | 102 return false; |
| 152 m_preserveAlpha = preserveAlpha; | 103 m_preserveAlpha = preserveAlpha; |
| 153 return true; | 104 return true; |
| 154 } | 105 } |
| 155 | 106 |
| 156 SkMatrixConvolutionImageFilter::TileMode toSkiaTileMode(EdgeModeType edgeMode) | 107 SkMatrixConvolutionImageFilter::TileMode toSkiaTileMode(EdgeModeType edgeMode) |
| 157 { | 108 { |
| 158 switch (edgeMode) { | 109 switch (edgeMode) { |
| 159 case EDGEMODE_DUPLICATE: | 110 case EDGEMODE_DUPLICATE: |
| 160 return SkMatrixConvolutionImageFilter::kClamp_TileMode; | 111 return SkMatrixConvolutionImageFilter::kClamp_TileMode; |
| 161 case EDGEMODE_WRAP: | 112 case EDGEMODE_WRAP: |
| 162 return SkMatrixConvolutionImageFilter::kRepeat_TileMode; | 113 return SkMatrixConvolutionImageFilter::kRepeat_TileMode; |
| 163 case EDGEMODE_NONE: | 114 case EDGEMODE_NONE: |
| 164 return SkMatrixConvolutionImageFilter::kClampToBlack_TileMode; | 115 return SkMatrixConvolutionImageFilter::kClampToBlack_TileMode; |
| 165 default: | 116 default: |
| 166 return SkMatrixConvolutionImageFilter::kClamp_TileMode; | 117 return SkMatrixConvolutionImageFilter::kClamp_TileMode; |
| 167 } | 118 } |
| 168 } | 119 } |
| 169 | 120 |
| 121 bool FEConvolveMatrix::parametersValid() const |
| 122 { |
| 123 if (m_kernelSize.isEmpty()) |
| 124 return false; |
| 125 uint64_t kernelArea = m_kernelSize.area(); |
| 126 if (!WTF::isInBounds<int>(kernelArea)) |
| 127 return false; |
| 128 if (safeCast<size_t>(kernelArea) != m_kernelMatrix.size()) |
| 129 return false; |
| 130 if (m_targetOffset.x() < 0 || m_targetOffset.x() >= m_kernelSize.width()) |
| 131 return false; |
| 132 if (m_targetOffset.y() < 0 || m_targetOffset.y() >= m_kernelSize.height()) |
| 133 return false; |
| 134 if (!m_divisor) |
| 135 return false; |
| 136 return true; |
| 137 } |
| 138 |
| 170 PassRefPtr<SkImageFilter> FEConvolveMatrix::createImageFilter(SkiaImageFilterBui
lder* builder) | 139 PassRefPtr<SkImageFilter> FEConvolveMatrix::createImageFilter(SkiaImageFilterBui
lder* builder) |
| 171 { | 140 { |
| 141 if (!parametersValid()) |
| 142 return createTransparentBlack(); |
| 143 |
| 172 RefPtr<SkImageFilter> input(builder->build(inputEffect(0), operatingColorSpa
ce())); | 144 RefPtr<SkImageFilter> input(builder->build(inputEffect(0), operatingColorSpa
ce())); |
| 173 | 145 |
| 174 SkISize kernelSize(SkISize::Make(m_kernelSize.width(), m_kernelSize.height()
)); | 146 SkISize kernelSize(SkISize::Make(m_kernelSize.width(), m_kernelSize.height()
)); |
| 175 int numElements = kernelSize.width() * kernelSize.height(); | 147 // parametersValid() above checks that the kernel area fits in int. |
| 148 int numElements = safeCast<int>(m_kernelSize.area()); |
| 176 SkScalar gain = SkFloatToScalar(1.0f / m_divisor); | 149 SkScalar gain = SkFloatToScalar(1.0f / m_divisor); |
| 177 SkScalar bias = SkFloatToScalar(m_bias * 255); | 150 SkScalar bias = SkFloatToScalar(m_bias * 255); |
| 178 SkIPoint target = SkIPoint::Make(m_targetOffset.x(), m_targetOffset.y()); | 151 SkIPoint target = SkIPoint::Make(m_targetOffset.x(), m_targetOffset.y()); |
| 179 SkMatrixConvolutionImageFilter::TileMode tileMode = toSkiaTileMode(m_edgeMod
e); | 152 SkMatrixConvolutionImageFilter::TileMode tileMode = toSkiaTileMode(m_edgeMod
e); |
| 180 bool convolveAlpha = !m_preserveAlpha; | 153 bool convolveAlpha = !m_preserveAlpha; |
| 181 OwnPtr<SkScalar[]> kernel = adoptArrayPtr(new SkScalar[numElements]); | 154 OwnPtr<SkScalar[]> kernel = adoptArrayPtr(new SkScalar[numElements]); |
| 182 for (int i = 0; i < numElements; ++i) | 155 for (int i = 0; i < numElements; ++i) |
| 183 kernel[i] = SkFloatToScalar(m_kernelMatrix[numElements - 1 - i]); | 156 kernel[i] = SkFloatToScalar(m_kernelMatrix[numElements - 1 - i]); |
| 184 SkImageFilter::CropRect cropRect = getCropRect(builder->cropOffset()); | 157 SkImageFilter::CropRect cropRect = getCropRect(builder->cropOffset()); |
| 185 return adoptRef(SkMatrixConvolutionImageFilter::Create(kernelSize, kernel.ge
t(), gain, bias, target, tileMode, convolveAlpha, input.get(), &cropRect)); | 158 return adoptRef(SkMatrixConvolutionImageFilter::Create(kernelSize, kernel.ge
t(), gain, bias, target, tileMode, convolveAlpha, input.get(), &cropRect)); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 214 << "divisor=\"" << m_divisor << "\" " | 187 << "divisor=\"" << m_divisor << "\" " |
| 215 << "bias=\"" << m_bias << "\" " | 188 << "bias=\"" << m_bias << "\" " |
| 216 << "target=\"" << m_targetOffset << "\" " | 189 << "target=\"" << m_targetOffset << "\" " |
| 217 << "edgeMode=\"" << m_edgeMode << "\" " | 190 << "edgeMode=\"" << m_edgeMode << "\" " |
| 218 << "preserveAlpha=\"" << m_preserveAlpha << "\"]\n"; | 191 << "preserveAlpha=\"" << m_preserveAlpha << "\"]\n"; |
| 219 inputEffect(0)->externalRepresentation(ts, indent + 1); | 192 inputEffect(0)->externalRepresentation(ts, indent + 1); |
| 220 return ts; | 193 return ts; |
| 221 } | 194 } |
| 222 | 195 |
| 223 } // namespace blink | 196 } // namespace blink |
| OLD | NEW |