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

Side by Side Diff: src/effects/SkMatrixConvolutionImageFilter.cpp

Issue 1886553002: quick hackup of SkNx SkMatrixConvolutionImageFilter (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 4 years, 7 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 The Android Open Source Project 2 * Copyright 2012 The Android Open Source Project
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #include "SkMatrixConvolutionImageFilter.h" 8 #include "SkMatrixConvolutionImageFilter.h"
9 #include "SkBitmap.h" 9 #include "SkBitmap.h"
10 #include "SkColorPriv.h" 10 #include "SkColorPriv.h"
11 #include "SkNx.h"
11 #include "SkReadBuffer.h" 12 #include "SkReadBuffer.h"
12 #include "SkSpecialImage.h" 13 #include "SkSpecialImage.h"
13 #include "SkSpecialSurface.h" 14 #include "SkSpecialSurface.h"
14 #include "SkWriteBuffer.h" 15 #include "SkWriteBuffer.h"
15 #include "SkRect.h" 16 #include "SkRect.h"
16 #include "SkUnPreMultiply.h" 17 #include "SkUnPreMultiply.h"
17 18
18 #if SK_SUPPORT_GPU 19 #if SK_SUPPORT_GPU
19 #include "GrContext.h" 20 #include "GrContext.h"
20 #include "GrDrawContext.h" 21 #include "GrDrawContext.h"
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
167 SkBitmap* result, 168 SkBitmap* result,
168 const SkIRect& r, 169 const SkIRect& r,
169 const SkIRect& bounds) const { 170 const SkIRect& bounds) const {
170 SkIRect rect(r); 171 SkIRect rect(r);
171 if (!rect.intersect(bounds)) { 172 if (!rect.intersect(bounds)) {
172 return; 173 return;
173 } 174 }
174 for (int y = rect.fTop; y < rect.fBottom; ++y) { 175 for (int y = rect.fTop; y < rect.fBottom; ++y) {
175 SkPMColor* dptr = result->getAddr32(rect.fLeft - bounds.fLeft, y - bound s.fTop); 176 SkPMColor* dptr = result->getAddr32(rect.fLeft - bounds.fLeft, y - bound s.fTop);
176 for (int x = rect.fLeft; x < rect.fRight; ++x) { 177 for (int x = rect.fLeft; x < rect.fRight; ++x) {
177 SkScalar sumA = 0, sumR = 0, sumG = 0, sumB = 0; 178 Sk4s sum = 0;
178 for (int cy = 0; cy < fKernelSize.fHeight; cy++) { 179 for (int cy = 0; cy < fKernelSize.fHeight; cy++) {
179 for (int cx = 0; cx < fKernelSize.fWidth; cx++) { 180 for (int cx = 0; cx < fKernelSize.fWidth; cx++) {
180 SkPMColor s = PixelFetcher::fetch(src, 181 SkPMColor s = PixelFetcher::fetch(src,
181 x + cx - fKernelOffset.fX, 182 x + cx - fKernelOffset.fX,
182 y + cy - fKernelOffset.fY, 183 y + cy - fKernelOffset.fY,
183 bounds); 184 bounds);
184 SkScalar k = fKernel[cy * fKernelSize.fWidth + cx]; 185 SkScalar k = fKernel[cy * fKernelSize.fWidth + cx];
185 if (convolveAlpha) { 186
186 sumA += SkScalarMul(SkIntToScalar(SkGetPackedA32(s)), k) ; 187 sum += k * SkNx_cast<SkScalar>(Sk4b::Load(&s));
187 }
188 sumR += SkScalarMul(SkIntToScalar(SkGetPackedR32(s)), k);
189 sumG += SkScalarMul(SkIntToScalar(SkGetPackedG32(s)), k);
190 sumB += SkScalarMul(SkIntToScalar(SkGetPackedB32(s)), k);
191 } 188 }
192 } 189 }
193 int a = convolveAlpha 190 Sk4s d = Sk4s::Max(0, Sk4s::Min(sum * fGain + fBias, 255.0f));
194 ? SkClampMax(SkScalarFloorToInt(SkScalarMul(sumA, fGain) + fBi as), 255) 191
195 : 255; 192 if (convolveAlpha) {
196 int r = SkClampMax(SkScalarFloorToInt(SkScalarMul(sumR, fGain) + fBi as), a); 193 d = Sk4s::Min(d, d[3]);
197 int g = SkClampMax(SkScalarFloorToInt(SkScalarMul(sumG, fGain) + fBi as), a);
198 int b = SkClampMax(SkScalarFloorToInt(SkScalarMul(sumB, fGain) + fBi as), a);
199 if (!convolveAlpha) {
200 a = SkGetPackedA32(PixelFetcher::fetch(src, x, y, bounds));
201 *dptr++ = SkPreMultiplyARGB(a, r, g, b);
202 } else { 194 } else {
203 *dptr++ = SkPackARGB32(a, r, g, b); 195 SkScalar a01 = (1/255.0f) * SkGetPackedA32(PixelFetcher::fetch(s rc, x, y, bounds));
196 d = Sk4s{d[0],d[1],d[2], 255} * a01;
204 } 197 }
198 SkNx_cast<uint8_t>(d).store(dptr++);
205 } 199 }
206 } 200 }
207 } 201 }
208 202
209 template<class PixelFetcher> 203 template<class PixelFetcher>
210 void SkMatrixConvolutionImageFilter::filterPixels(const SkBitmap& src, 204 void SkMatrixConvolutionImageFilter::filterPixels(const SkBitmap& src,
211 SkBitmap* result, 205 SkBitmap* result,
212 const SkIRect& rect, 206 const SkIRect& rect,
213 const SkIRect& bounds) const { 207 const SkIRect& bounds) const {
214 if (fConvolveAlpha) { 208 if (fConvolveAlpha) {
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
414 str->appendf("%f ", fKernel[y * fKernelSize.width() + x]); 408 str->appendf("%f ", fKernel[y * fKernelSize.width() + x]);
415 } 409 }
416 } 410 }
417 str->appendf(")"); 411 str->appendf(")");
418 str->appendf("gain: %f bias: %f ", fGain, fBias); 412 str->appendf("gain: %f bias: %f ", fGain, fBias);
419 str->appendf("offset: (%d, %d) ", fKernelOffset.fX, fKernelOffset.fY); 413 str->appendf("offset: (%d, %d) ", fKernelOffset.fX, fKernelOffset.fY);
420 str->appendf("convolveAlpha: %s", fConvolveAlpha ? "true" : "false"); 414 str->appendf("convolveAlpha: %s", fConvolveAlpha ? "true" : "false");
421 str->append(")"); 415 str->append(")");
422 } 416 }
423 #endif 417 #endif
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698