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 |