Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(153)

Side by Side Diff: third_party/WebKit/Source/platform/graphics/filters/FEConvolveMatrix.cpp

Issue 1376473002: Move feConvolveMatrix error handling to FEConvolveMatrix (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698