OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef SK_CONVOLVER_H | 5 #ifndef SK_CONVOLVER_H |
6 #define SK_CONVOLVER_H | 6 #define SK_CONVOLVER_H |
7 | 7 |
8 #include "SkSize.h" | 8 #include "SkSize.h" |
9 #include "SkTDArray.h" | 9 #include "SkTDArray.h" |
10 | 10 |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
133 | 133 |
134 // We store all the filter values in this flat list, indexed by | 134 // We store all the filter values in this flat list, indexed by |
135 // |FilterInstance.data_location| to avoid the mallocs required for storing | 135 // |FilterInstance.data_location| to avoid the mallocs required for storing |
136 // each one separately. | 136 // each one separately. |
137 SkTDArray<ConvolutionFixed> fFilterValues; | 137 SkTDArray<ConvolutionFixed> fFilterValues; |
138 | 138 |
139 // The maximum size of any filter we've added. | 139 // The maximum size of any filter we've added. |
140 int fMaxFilter; | 140 int fMaxFilter; |
141 }; | 141 }; |
142 | 142 |
143 typedef void (*SkConvolveVertically_pointer)( | |
144 const SkConvolutionFilter1D::ConvolutionFixed* filterValues, | |
145 int filterLength, | |
146 unsigned char* const* sourceDataRows, | |
147 int pixelWidth, | |
148 unsigned char* outRow, | |
149 bool hasAlpha); | |
150 typedef void (*SkConvolve4RowsHorizontally_pointer)( | |
151 const unsigned char* srcData[4], | |
152 const SkConvolutionFilter1D& filter, | |
153 unsigned char* outRow[4], | |
154 size_t outRowBytes); | |
155 typedef void (*SkConvolveHorizontally_pointer)( | |
156 const unsigned char* srcData, | |
157 const SkConvolutionFilter1D& filter, | |
158 unsigned char* outRow, | |
159 bool hasAlpha); | |
160 | |
161 struct SkConvolutionProcs { | |
162 SkConvolveVertically_pointer fConvolveVertically; | |
163 SkConvolve4RowsHorizontally_pointer fConvolve4RowsHorizontally; | |
164 SkConvolveHorizontally_pointer fConvolveHorizontally; | |
165 }; | |
166 | |
167 | |
168 | |
169 // Does a two-dimensional convolution on the given source image. | 143 // Does a two-dimensional convolution on the given source image. |
170 // | 144 // |
171 // It is assumed the source pixel offsets referenced in the input filters | 145 // It is assumed the source pixel offsets referenced in the input filters |
172 // reference only valid pixels, so the source image size is not required. Each | 146 // reference only valid pixels, so the source image size is not required. Each |
173 // row of the source image starts |sourceByteRowStride| after the previous | 147 // row of the source image starts |sourceByteRowStride| after the previous |
174 // one (this allows you to have rows with some padding at the end). | 148 // one (this allows you to have rows with some padding at the end). |
175 // | 149 // |
176 // The result will be put into the given output buffer. The destination image | 150 // The result will be put into the given output buffer. The destination image |
177 // size will be xfilter.numValues() * yfilter.numValues() pixels. It will be | 151 // size will be xfilter.numValues() * yfilter.numValues() pixels. It will be |
178 // in rows of exactly xfilter.numValues() * 4 bytes. | 152 // in rows of exactly xfilter.numValues() * 4 bytes. |
179 // | 153 // |
180 // |sourceHasAlpha| is a hint that allows us to avoid doing computations on | 154 // |sourceHasAlpha| is a hint that allows us to avoid doing computations on |
181 // the alpha channel if the image is opaque. If you don't know, set this to | 155 // the alpha channel if the image is opaque. If you don't know, set this to |
182 // true and it will work properly, but setting this to false will be a few | 156 // true and it will work properly, but setting this to false will be a few |
183 // percent faster if you know the image is opaque. | 157 // percent faster if you know the image is opaque. |
184 // | 158 // |
185 // The layout in memory is assumed to be 4-bytes per pixel in B-G-R-A order | 159 // The layout in memory is assumed to be 4-bytes per pixel in B-G-R-A order |
186 // (this is ARGB when loaded into 32-bit words on a little-endian machine). | 160 // (this is ARGB when loaded into 32-bit words on a little-endian machine). |
187 /** | 161 /** |
188 * Returns false if it was unable to perform the convolution/rescale. in which
case the output | 162 * Returns false if it was unable to perform the convolution/rescale. in which
case the output |
189 * buffer is assumed to be undefined. | 163 * buffer is assumed to be undefined. |
190 */ | 164 */ |
191 SK_API bool BGRAConvolve2D(const unsigned char* sourceData, | 165 SK_API bool BGRAConvolve2D(const unsigned char* sourceData, |
192 int sourceByteRowStride, | 166 int sourceByteRowStride, |
193 bool sourceHasAlpha, | 167 bool sourceHasAlpha, |
194 const SkConvolutionFilter1D& xfilter, | 168 const SkConvolutionFilter1D& xfilter, |
195 const SkConvolutionFilter1D& yfilter, | 169 const SkConvolutionFilter1D& yfilter, |
196 int outputByteRowStride, | 170 int outputByteRowStride, |
197 unsigned char* output, | 171 unsigned char* output); |
198 const SkConvolutionProcs&, | |
199 bool useSimdIfPossible); | |
200 | 172 |
201 #endif // SK_CONVOLVER_H | 173 #endif // SK_CONVOLVER_H |
OLD | NEW |