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

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

Issue 395603002: Simplify flattening to just write enough to call the factory (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: rebase Created 6 years, 4 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 | « src/effects/SkMagnifierImageFilter.cpp ('k') | src/effects/SkMatrixImageFilter.cpp » ('j') | 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 "SkReadBuffer.h" 11 #include "SkReadBuffer.h"
12 #include "SkWriteBuffer.h" 12 #include "SkWriteBuffer.h"
13 #include "SkRect.h" 13 #include "SkRect.h"
14 #include "SkUnPreMultiply.h" 14 #include "SkUnPreMultiply.h"
15 15
16 #if SK_SUPPORT_GPU 16 #if SK_SUPPORT_GPU
17 #include "effects/GrMatrixConvolutionEffect.h" 17 #include "effects/GrMatrixConvolutionEffect.h"
18 #endif 18 #endif
19 19
20 static bool tile_mode_is_valid(SkMatrixConvolutionImageFilter::TileMode tileMode ) {
21 switch (tileMode) {
22 case SkMatrixConvolutionImageFilter::kClamp_TileMode:
23 case SkMatrixConvolutionImageFilter::kRepeat_TileMode:
24 case SkMatrixConvolutionImageFilter::kClampToBlack_TileMode:
25 return true;
26 default:
27 break;
28 }
29 return false;
30 }
31
32 SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter( 20 SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter(
33 const SkISize& kernelSize, 21 const SkISize& kernelSize,
34 const SkScalar* kernel, 22 const SkScalar* kernel,
35 SkScalar gain, 23 SkScalar gain,
36 SkScalar bias, 24 SkScalar bias,
37 const SkIPoint& kernelOffset, 25 const SkIPoint& kernelOffset,
38 TileMode tileMode, 26 TileMode tileMode,
39 bool convolveAlpha, 27 bool convolveAlpha,
40 SkImageFilter* input, 28 SkImageFilter* input,
41 const CropRect* cropRect) 29 const CropRect* cropRect)
42 : INHERITED(1, &input, cropRect), 30 : INHERITED(1, &input, cropRect),
43 fKernelSize(kernelSize), 31 fKernelSize(kernelSize),
44 fGain(gain), 32 fGain(gain),
45 fBias(bias), 33 fBias(bias),
46 fKernelOffset(kernelOffset), 34 fKernelOffset(kernelOffset),
47 fTileMode(tileMode), 35 fTileMode(tileMode),
48 fConvolveAlpha(convolveAlpha) { 36 fConvolveAlpha(convolveAlpha) {
49 uint32_t size = fKernelSize.fWidth * fKernelSize.fHeight; 37 uint32_t size = fKernelSize.fWidth * fKernelSize.fHeight;
50 fKernel = SkNEW_ARRAY(SkScalar, size); 38 fKernel = SkNEW_ARRAY(SkScalar, size);
51 memcpy(fKernel, kernel, size * sizeof(SkScalar)); 39 memcpy(fKernel, kernel, size * sizeof(SkScalar));
52 SkASSERT(kernelSize.fWidth >= 1 && kernelSize.fHeight >= 1); 40 SkASSERT(kernelSize.fWidth >= 1 && kernelSize.fHeight >= 1);
53 SkASSERT(kernelOffset.fX >= 0 && kernelOffset.fX < kernelSize.fWidth); 41 SkASSERT(kernelOffset.fX >= 0 && kernelOffset.fX < kernelSize.fWidth);
54 SkASSERT(kernelOffset.fY >= 0 && kernelOffset.fY < kernelSize.fHeight); 42 SkASSERT(kernelOffset.fY >= 0 && kernelOffset.fY < kernelSize.fHeight);
55 } 43 }
56 44
45 #ifdef SK_SUPPORT_LEGACY_DEEPFLATTENING
46 static bool tile_mode_is_valid(SkMatrixConvolutionImageFilter::TileMode tileMode ) {
47 switch (tileMode) {
48 case SkMatrixConvolutionImageFilter::kClamp_TileMode:
49 case SkMatrixConvolutionImageFilter::kRepeat_TileMode:
50 case SkMatrixConvolutionImageFilter::kClampToBlack_TileMode:
51 return true;
52 default:
53 break;
54 }
55 return false;
56 }
57
57 SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter(SkReadBuffer& buf fer) 58 SkMatrixConvolutionImageFilter::SkMatrixConvolutionImageFilter(SkReadBuffer& buf fer)
58 : INHERITED(1, buffer) { 59 : INHERITED(1, buffer) {
59 // We need to be able to read at most SK_MaxS32 bytes, so divide that 60 // We need to be able to read at most SK_MaxS32 bytes, so divide that
60 // by the size of a scalar to know how many scalars we can read. 61 // by the size of a scalar to know how many scalars we can read.
61 static const int32_t kMaxSize = SK_MaxS32 / sizeof(SkScalar); 62 static const int32_t kMaxSize = SK_MaxS32 / sizeof(SkScalar);
62 fKernelSize.fWidth = buffer.readInt(); 63 fKernelSize.fWidth = buffer.readInt();
63 fKernelSize.fHeight = buffer.readInt(); 64 fKernelSize.fHeight = buffer.readInt();
64 if ((fKernelSize.fWidth >= 1) && (fKernelSize.fHeight >= 1) && 65 if ((fKernelSize.fWidth >= 1) && (fKernelSize.fHeight >= 1) &&
65 // Make sure size won't be larger than a signed int, 66 // Make sure size won't be larger than a signed int,
66 // which would still be extremely large for a kernel, 67 // which would still be extremely large for a kernel,
(...skipping 12 matching lines...) Expand all
79 fKernelOffset.fY = buffer.readInt(); 80 fKernelOffset.fY = buffer.readInt();
80 fTileMode = (TileMode) buffer.readInt(); 81 fTileMode = (TileMode) buffer.readInt();
81 fConvolveAlpha = buffer.readBool(); 82 fConvolveAlpha = buffer.readBool();
82 buffer.validate((fKernel != 0) && 83 buffer.validate((fKernel != 0) &&
83 SkScalarIsFinite(fGain) && 84 SkScalarIsFinite(fGain) &&
84 SkScalarIsFinite(fBias) && 85 SkScalarIsFinite(fBias) &&
85 tile_mode_is_valid(fTileMode) && 86 tile_mode_is_valid(fTileMode) &&
86 (fKernelOffset.fX >= 0) && (fKernelOffset.fX < fKernelSize.f Width) && 87 (fKernelOffset.fX >= 0) && (fKernelOffset.fX < fKernelSize.f Width) &&
87 (fKernelOffset.fY >= 0) && (fKernelOffset.fY < fKernelSize.f Height)); 88 (fKernelOffset.fY >= 0) && (fKernelOffset.fY < fKernelSize.f Height));
88 } 89 }
90 #endif
91
92 SkFlattenable* SkMatrixConvolutionImageFilter::CreateProc(SkReadBuffer& buffer) {
93 SK_IMAGEFILTER_UNFLATTEN_COMMON(common, 1);
94 SkISize kernelSize;
95 kernelSize.fWidth = buffer.readInt();
96 kernelSize.fHeight = buffer.readInt();
97 const int count = buffer.getArrayCount();
98
99 const int64_t kernelArea = sk_64_mul(kernelSize.width(), kernelSize.height() );
100 if (!buffer.validate(kernelArea == count)) {
101 return NULL;
102 }
103 SkAutoSTArray<16, SkScalar> kernel(count);
104 if (!buffer.readScalarArray(kernel.get(), count)) {
105 return NULL;
106 }
107 SkScalar gain = buffer.readScalar();
108 SkScalar bias = buffer.readScalar();
109 SkIPoint kernelOffset;
110 kernelOffset.fX = buffer.readInt();
111 kernelOffset.fY = buffer.readInt();
112 TileMode tileMode = (TileMode)buffer.readInt();
113 bool convolveAlpha = buffer.readBool();
114 return Create(kernelSize, kernel.get(), gain, bias, kernelOffset, tileMode, convolveAlpha,
115 common.getInput(0), &common.cropRect());
116 }
89 117
90 void SkMatrixConvolutionImageFilter::flatten(SkWriteBuffer& buffer) const { 118 void SkMatrixConvolutionImageFilter::flatten(SkWriteBuffer& buffer) const {
91 this->INHERITED::flatten(buffer); 119 this->INHERITED::flatten(buffer);
92 buffer.writeInt(fKernelSize.fWidth); 120 buffer.writeInt(fKernelSize.fWidth);
93 buffer.writeInt(fKernelSize.fHeight); 121 buffer.writeInt(fKernelSize.fHeight);
94 buffer.writeScalarArray(fKernel, fKernelSize.fWidth * fKernelSize.fHeight); 122 buffer.writeScalarArray(fKernel, fKernelSize.fWidth * fKernelSize.fHeight);
95 buffer.writeScalar(fGain); 123 buffer.writeScalar(fGain);
96 buffer.writeScalar(fBias); 124 buffer.writeScalar(fBias);
97 buffer.writeInt(fKernelOffset.fX); 125 buffer.writeInt(fKernelOffset.fX);
98 buffer.writeInt(fKernelOffset.fY); 126 buffer.writeInt(fKernelOffset.fY);
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 fKernelSize, 375 fKernelSize,
348 fKernel, 376 fKernel,
349 fGain, 377 fGain,
350 fBias, 378 fBias,
351 fKernelOffset, 379 fKernelOffset,
352 convert_tilemodes(fTileMode), 380 convert_tilemodes(fTileMode),
353 fConvolveAlpha); 381 fConvolveAlpha);
354 return true; 382 return true;
355 } 383 }
356 #endif 384 #endif
OLDNEW
« no previous file with comments | « src/effects/SkMagnifierImageFilter.cpp ('k') | src/effects/SkMatrixImageFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698