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

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

Issue 2248533002: Update ComputeBlurredRRectParams to compute all the parameters needed for occluded blurred rrect ni… (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix indentation Created 4 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 | « include/effects/SkBlurMaskFilter.h ('k') | tests/BlurTest.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 2006 The Android Open Source Project 2 * Copyright 2006 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 "SkBlurMaskFilter.h" 8 #include "SkBlurMaskFilter.h"
9 #include "SkBlurMask.h" 9 #include "SkBlurMask.h"
10 #include "SkGpuBlurUtils.h" 10 #include "SkGpuBlurUtils.h"
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after
132 } 132 }
133 if ((unsigned)style > (unsigned)kLastEnum_SkBlurStyle) { 133 if ((unsigned)style > (unsigned)kLastEnum_SkBlurStyle) {
134 return nullptr; 134 return nullptr;
135 } 135 }
136 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag); 136 SkASSERT(flags <= SkBlurMaskFilter::kAll_BlurFlag);
137 flags &= SkBlurMaskFilter::kAll_BlurFlag; 137 flags &= SkBlurMaskFilter::kAll_BlurFlag;
138 138
139 return sk_sp<SkMaskFilter>(new SkBlurMaskFilterImpl(sigma, style, occluder, flags)); 139 return sk_sp<SkMaskFilter>(new SkBlurMaskFilterImpl(sigma, style, occluder, flags));
140 } 140 }
141 141
142 bool SkBlurMaskFilter::ComputeBlurredRRectParams(const SkRRect& rrect, 142 // linearly interpolate between y1 & y3 to match x2's position between x1 & x3
143 SkScalar sigma, 143 static SkScalar interp(SkScalar x1, SkScalar x2, SkScalar x3, SkScalar y1, SkSca lar y3) {
144 SkASSERT(x1 <= x2 && x2 <= x3);
145 SkASSERT(y1 <= y3);
146
147 SkScalar t = (x2 - x1) / (x3 - x1);
148 return y1 + t * (y3 - y1);
149 }
150
151 // Insert 'lower' and 'higher' into 'array1' and insert a new value at each matc hing insertion
152 // point in 'array2' that linearly interpolates between the existing values.
153 // Return a bit mask which contains a copy of 'inputMask' for all the cells betw een the two
154 // insertion points.
155 static uint32_t insert_into_arrays(SkScalar* array1, SkScalar* array2,
156 SkScalar lower, SkScalar higher,
157 int* num, uint32_t inputMask, int maskSize) {
158 SkASSERT(lower < higher);
159 SkASSERT(lower >= array1[0] && higher <= array1[*num-1]);
160
161 int32_t skipMask = 0x0;
162 int i;
163 for (i = 0; i < *num; ++i) {
164 if (lower >= array1[i] && lower < array1[i+1]) {
165 if (!SkScalarNearlyEqual(lower, array1[i])) {
166 memmove(&array1[i+2], &array1[i+1], (*num-i-1)*sizeof(SkScalar)) ;
167 array1[i+1] = lower;
168 memmove(&array2[i+2], &array2[i+1], (*num-i-1)*sizeof(SkScalar)) ;
169 array2[i+1] = interp(array1[i], lower, array1[i+2], array2[i], a rray2[i+2]);
170 i++;
171 (*num)++;
172 }
173 break;
174 }
175 }
176 for ( ; i < *num; ++i) {
177 skipMask |= inputMask << (i*maskSize);
178 if (higher > array1[i] && higher <= array1[i+1]) {
179 if (!SkScalarNearlyEqual(higher, array1[i+1])) {
180 memmove(&array1[i+2], &array1[i+1], (*num-i-1)*sizeof(SkScalar)) ;
181 array1[i+1] = higher;
182 memmove(&array2[i+2], &array2[i+1], (*num-i-1)*sizeof(SkScalar)) ;
183 array2[i+1] = interp(array1[i], higher, array1[i+2], array2[i], array2[i+2]);
184 (*num)++;
185 }
186 break;
187 }
188 }
189
190 return skipMask;
191 }
192
193 bool SkBlurMaskFilter::ComputeBlurredRRectParams(const SkRRect& srcRRect, const SkRRect& devRRect,
194 const SkRect& occluder,
195 SkScalar sigma, SkScalar xforme dSigma,
144 SkRRect* rrectToDraw, 196 SkRRect* rrectToDraw,
145 SkISize* widthHeight, 197 SkISize* widthHeight,
146 SkScalar xs[4], 198 SkScalar rectXs[kMaxDivisions],
147 int* numXs, 199 SkScalar rectYs[kMaxDivisions],
148 SkScalar ys[4], 200 SkScalar texXs[kMaxDivisions],
149 int* numYs) { 201 SkScalar texYs[kMaxDivisions],
150 unsigned int blurRadius = 3*SkScalarCeilToInt(sigma-1/6.0f); 202 int* numXs, int* numYs, uint32_ t* skipMask) {
203 unsigned int devBlurRadius = 3*SkScalarCeilToInt(xformedSigma-1/6.0f);
204 SkScalar srcBlurRadius = 3.0f * sigma;
151 205
152 const SkRect& orig = rrect.getBounds(); 206 const SkRect& devOrig = devRRect.getBounds();
153 const SkVector& radiiUL = rrect.radii(SkRRect::kUpperLeft_Corner); 207 const SkVector& devRadiiUL = devRRect.radii(SkRRect::kUpperLeft_Corner);
154 const SkVector& radiiUR = rrect.radii(SkRRect::kUpperRight_Corner); 208 const SkVector& devRadiiUR = devRRect.radii(SkRRect::kUpperRight_Corner);
155 const SkVector& radiiLR = rrect.radii(SkRRect::kLowerRight_Corner); 209 const SkVector& devRadiiLR = devRRect.radii(SkRRect::kLowerRight_Corner);
156 const SkVector& radiiLL = rrect.radii(SkRRect::kLowerLeft_Corner); 210 const SkVector& devRadiiLL = devRRect.radii(SkRRect::kLowerLeft_Corner);
157 211
158 const int left = SkScalarCeilToInt(SkTMax<SkScalar>(radiiUL.fX, radiiLL.fX) ); 212 const int devLeft = SkScalarCeilToInt(SkTMax<SkScalar>(devRadiiUL.fX, devRa diiLL.fX));
159 const int top = SkScalarCeilToInt(SkTMax<SkScalar>(radiiUL.fY, radiiUR.fY) ); 213 const int devTop = SkScalarCeilToInt(SkTMax<SkScalar>(devRadiiUL.fY, devRa diiUR.fY));
160 const int right = SkScalarCeilToInt(SkTMax<SkScalar>(radiiUR.fX, radiiLR.fX) ); 214 const int devRight = SkScalarCeilToInt(SkTMax<SkScalar>(devRadiiUR.fX, devRa diiLR.fX));
161 const int bot = SkScalarCeilToInt(SkTMax<SkScalar>(radiiLL.fY, radiiLR.fY) ); 215 const int devBot = SkScalarCeilToInt(SkTMax<SkScalar>(devRadiiLL.fY, devRa diiLR.fY));
162 216
163 // This is a conservative check for nine-patchability 217 // This is a conservative check for nine-patchability
164 if (orig.fLeft + left + blurRadius >= orig.fRight - right - blurRadius || 218 if (devOrig.fLeft + devLeft + devBlurRadius >= devOrig.fRight - devRight - devBlurRadius ||
165 orig.fTop + top + blurRadius >= orig.fBottom - bot - blurRadius) { 219 devOrig.fTop + devTop + devBlurRadius >= devOrig.fBottom - devBot - devBlurRadius) {
166 return false; 220 return false;
167 } 221 }
168 222
169 int newRRWidth, newRRHeight; 223 const SkVector& srcRadiiUL = srcRRect.radii(SkRRect::kUpperLeft_Corner);
224 const SkVector& srcRadiiUR = srcRRect.radii(SkRRect::kUpperRight_Corner);
225 const SkVector& srcRadiiLR = srcRRect.radii(SkRRect::kLowerRight_Corner);
226 const SkVector& srcRadiiLL = srcRRect.radii(SkRRect::kLowerLeft_Corner);
170 227
171 // 3x3 case 228 const SkScalar srcLeft = SkTMax<SkScalar>(srcRadiiUL.fX, srcRadiiLL.fX);
172 newRRWidth = 2*blurRadius + left + right + 1; 229 const SkScalar srcTop = SkTMax<SkScalar>(srcRadiiUL.fY, srcRadiiUR.fY);
173 newRRHeight = 2*blurRadius + top + bot + 1; 230 const SkScalar srcRight = SkTMax<SkScalar>(srcRadiiUR.fX, srcRadiiLR.fX);
174 widthHeight->fWidth = newRRWidth + 2 * blurRadius; 231 const SkScalar srcBot = SkTMax<SkScalar>(srcRadiiLL.fY, srcRadiiLR.fY);
175 widthHeight->fHeight = newRRHeight + 2 * blurRadius; 232
176 // TODO: need to return non-normalized indices 233 int newRRWidth = 2*devBlurRadius + devLeft + devRight + 1;
177 xs[0] = 0.0f; 234 int newRRHeight = 2*devBlurRadius + devTop + devBot + 1;
178 xs[1] = (blurRadius + left) / (float) widthHeight->fWidth; 235 widthHeight->fWidth = newRRWidth + 2 * devBlurRadius;
179 xs[2] = (blurRadius + left + 1.0f) / widthHeight->fWidth; 236 widthHeight->fHeight = newRRHeight + 2 * devBlurRadius;
180 xs[3] = 1.0f; 237
238 const SkRect srcProxyRect = srcRRect.getBounds().makeOutset(srcBlurRadius, s rcBlurRadius);
239
240 rectXs[0] = srcProxyRect.fLeft;
241 rectXs[1] = srcProxyRect.fLeft + 2*srcBlurRadius + srcLeft;
242 rectXs[2] = srcProxyRect.fRight - 2*srcBlurRadius - srcRight;
243 rectXs[3] = srcProxyRect.fRight;
244
245 rectYs[0] = srcProxyRect.fTop;
246 rectYs[1] = srcProxyRect.fTop + 2*srcBlurRadius + srcTop;
247 rectYs[2] = srcProxyRect.fBottom - 2*srcBlurRadius - srcBot;
248 rectYs[3] = srcProxyRect.fBottom;
249
250 texXs[0] = 0.0f;
251 texXs[1] = 2.0f*devBlurRadius + devLeft;
252 texXs[2] = 2.0f*devBlurRadius + devLeft + 1;
253 texXs[3] = SkIntToScalar(widthHeight->fWidth);
254
255 texYs[0] = 0.0f;
256 texYs[1] = 2.0f*devBlurRadius + devTop;
257 texYs[2] = 2.0f*devBlurRadius + devTop + 1;
258 texYs[3] = SkIntToScalar(widthHeight->fHeight);
259
260 SkRect temp = occluder;
261
181 *numXs = 4; 262 *numXs = 4;
182 ys[0] = 0.0f;
183 ys[1] = (blurRadius + top) / (float) widthHeight->fHeight;
184 ys[2] = (blurRadius + top + 1.0f) / widthHeight->fHeight;
185 ys[3] = 1.0f;
186 *numYs = 4; 263 *numYs = 4;
264 *skipMask = 0;
265 if (!temp.isEmpty() && (srcProxyRect.contains(temp) || temp.intersect(srcPro xyRect))) {
266 *skipMask = insert_into_arrays(rectXs, texXs, temp.fLeft, temp.fRight, n umXs, 0x1, 1);
267 *skipMask = insert_into_arrays(rectYs, texYs, temp.fTop, temp.fBottom,
268 numYs, *skipMask, *numXs-1);
269 }
187 270
188 const SkRect newRect = SkRect::MakeXYWH(SkIntToScalar(blurRadius), SkIntToSc alar(blurRadius), 271 const SkRect newRect = SkRect::MakeXYWH(SkIntToScalar(devBlurRadius),
189 SkIntToScalar(newRRWidth), SkIntToSc alar(newRRHeight)); 272 SkIntToScalar(devBlurRadius),
273 SkIntToScalar(newRRWidth),
274 SkIntToScalar(newRRHeight));
190 SkVector newRadii[4]; 275 SkVector newRadii[4];
191 newRadii[0] = { SkScalarCeilToScalar(radiiUL.fX), SkScalarCeilToScalar(radii UL.fY) }; 276 newRadii[0] = { SkScalarCeilToScalar(devRadiiUL.fX), SkScalarCeilToScalar(de vRadiiUL.fY) };
192 newRadii[1] = { SkScalarCeilToScalar(radiiUR.fX), SkScalarCeilToScalar(radii UR.fY) }; 277 newRadii[1] = { SkScalarCeilToScalar(devRadiiUR.fX), SkScalarCeilToScalar(de vRadiiUR.fY) };
193 newRadii[2] = { SkScalarCeilToScalar(radiiLR.fX), SkScalarCeilToScalar(radii LR.fY) }; 278 newRadii[2] = { SkScalarCeilToScalar(devRadiiLR.fX), SkScalarCeilToScalar(de vRadiiLR.fY) };
194 newRadii[3] = { SkScalarCeilToScalar(radiiLL.fX), SkScalarCeilToScalar(radii LL.fY) }; 279 newRadii[3] = { SkScalarCeilToScalar(devRadiiLL.fX), SkScalarCeilToScalar(de vRadiiLL.fY) };
195 280
196 rrectToDraw->setRectRadii(newRect, newRadii); 281 rrectToDraw->setRectRadii(newRect, newRadii);
197 return true; 282 return true;
198 } 283 }
199 284
200 /////////////////////////////////////////////////////////////////////////////// 285 ///////////////////////////////////////////////////////////////////////////////
201 286
202 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle style, 287 SkBlurMaskFilterImpl::SkBlurMaskFilterImpl(SkScalar sigma, SkBlurStyle style,
203 const SkRect& occluder, uint32_t flag s) 288 const SkRect& occluder, uint32_t flag s)
204 : fSigma(sigma) 289 : fSigma(sigma)
(...skipping 771 matching lines...) Expand 10 before | Expand all | Expand 10 after
976 1061
977 drawContext->fillRectWithLocalMatrix(clip, *grp, SkMatrix::I(), rect, invers e); 1062 drawContext->fillRectWithLocalMatrix(clip, *grp, SkMatrix::I(), rect, invers e);
978 return true; 1063 return true;
979 } 1064 }
980 1065
981 ////////////////////////////////////////////////////////////////////////////// 1066 //////////////////////////////////////////////////////////////////////////////
982 1067
983 class GrRRectBlurEffect : public GrFragmentProcessor { 1068 class GrRRectBlurEffect : public GrFragmentProcessor {
984 public: 1069 public:
985 1070
986 static sk_sp<GrFragmentProcessor> Make(GrContext*, float sigma, const SkRRec t&); 1071 static sk_sp<GrFragmentProcessor> Make(GrContext*,
1072 float sigma, float xformedSigma,
1073 const SkRRect& srcRRect, const SkRRec t& devRRect);
987 1074
988 virtual ~GrRRectBlurEffect() {}; 1075 virtual ~GrRRectBlurEffect() {};
989 const char* name() const override { return "GrRRectBlur"; } 1076 const char* name() const override { return "GrRRectBlur"; }
990 1077
991 const SkRRect& getRRect() const { return fRRect; } 1078 const SkRRect& getRRect() const { return fRRect; }
992 float getSigma() const { return fSigma; } 1079 float getSigma() const { return fSigma; }
993 1080
994 private: 1081 private:
995 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; 1082 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
996 1083
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
1062 1149
1063 mask = dc2->asTexture(); 1150 mask = dc2->asTexture();
1064 SkASSERT(mask); 1151 SkASSERT(mask);
1065 context->textureProvider()->assignUniqueKeyToTexture(key, mask.get()); 1152 context->textureProvider()->assignUniqueKeyToTexture(key, mask.get());
1066 } 1153 }
1067 1154
1068 return mask; 1155 return mask;
1069 } 1156 }
1070 1157
1071 sk_sp<GrFragmentProcessor> GrRRectBlurEffect::Make(GrContext* context, 1158 sk_sp<GrFragmentProcessor> GrRRectBlurEffect::Make(GrContext* context,
1072 float xformedSigma, 1159 float sigma, float xformedSig ma,
1073 const SkRRect& devRRect) { 1160 const SkRRect& srcRRect, cons t SkRRect& devRRect) {
1074 SkASSERT(!devRRect.isCircle()); // Should've been caught up-stream 1161 SkASSERT(!devRRect.isCircle()); // Should've been caught up-stream
1075 1162
1076 // TODO: loosen this up 1163 // TODO: loosen this up
1077 if (!devRRect.isSimpleCircular()) { 1164 if (!devRRect.isSimpleCircular()) {
1078 return nullptr; 1165 return nullptr;
1079 } 1166 }
1080 1167
1081 // Make sure we can successfully ninepatch this rrect -- the blur sigma has to be 1168 // Make sure we can successfully ninepatch this rrect -- the blur sigma has to be
1082 // sufficiently small relative to both the size of the corner radius and the 1169 // sufficiently small relative to both the size of the corner radius and the
1083 // width (and height) of the rrect. 1170 // width (and height) of the rrect.
1084 SkRRect rrectToDraw; 1171 SkRRect rrectToDraw;
1085 SkISize size; 1172 SkISize size;
1086 SkScalar ignored[4]; 1173 SkScalar ignored[SkBlurMaskFilter::kMaxDivisions];
1087 int ignoredSize; 1174 int ignoredSize;
1175 uint32_t ignored32;
1088 1176
1089 bool ninePatchable = SkBlurMaskFilter::ComputeBlurredRRectParams(devRRect, x formedSigma, 1177 bool ninePatchable = SkBlurMaskFilter::ComputeBlurredRRectParams(srcRRect, d evRRect,
1178 SkRect::Mak eEmpty(),
1179 sigma, xfor medSigma,
1090 &rrectToDra w, &size, 1180 &rrectToDra w, &size,
1091 ignored, &i gnoredSize, 1181 ignored, ig nored,
1092 ignored, &i gnoredSize); 1182 ignored, ig nored,
1183 &ignoredSiz e, &ignoredSize,
1184 &ignored32) ;
1093 if (!ninePatchable) { 1185 if (!ninePatchable) {
1094 return nullptr; 1186 return nullptr;
1095 } 1187 }
1096 1188
1097 sk_sp<GrTexture> mask(find_or_create_rrect_blur_mask(context, rrectToDraw, s ize, 1189 sk_sp<GrTexture> mask(find_or_create_rrect_blur_mask(context, rrectToDraw, s ize,
1098 xformedSigma, true)); 1190 xformedSigma, true));
1099 if (!mask) { 1191 if (!mask) {
1100 return nullptr; 1192 return nullptr;
1101 } 1193 }
1102 1194
(...skipping 26 matching lines...) Expand all
1129 1221
1130 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrRRectBlurEffect); 1222 GR_DEFINE_FRAGMENT_PROCESSOR_TEST(GrRRectBlurEffect);
1131 1223
1132 sk_sp<GrFragmentProcessor> GrRRectBlurEffect::TestCreate(GrProcessorTestData* d) { 1224 sk_sp<GrFragmentProcessor> GrRRectBlurEffect::TestCreate(GrProcessorTestData* d) {
1133 SkScalar w = d->fRandom->nextRangeScalar(100.f, 1000.f); 1225 SkScalar w = d->fRandom->nextRangeScalar(100.f, 1000.f);
1134 SkScalar h = d->fRandom->nextRangeScalar(100.f, 1000.f); 1226 SkScalar h = d->fRandom->nextRangeScalar(100.f, 1000.f);
1135 SkScalar r = d->fRandom->nextRangeF(1.f, 9.f); 1227 SkScalar r = d->fRandom->nextRangeF(1.f, 9.f);
1136 SkScalar sigma = d->fRandom->nextRangeF(1.f,10.f); 1228 SkScalar sigma = d->fRandom->nextRangeF(1.f,10.f);
1137 SkRRect rrect; 1229 SkRRect rrect;
1138 rrect.setRectXY(SkRect::MakeWH(w, h), r, r); 1230 rrect.setRectXY(SkRect::MakeWH(w, h), r, r);
1139 return GrRRectBlurEffect::Make(d->fContext, sigma, rrect); 1231 return GrRRectBlurEffect::Make(d->fContext, sigma, sigma, rrect, rrect);
1140 } 1232 }
1141 1233
1142 ////////////////////////////////////////////////////////////////////////////// 1234 //////////////////////////////////////////////////////////////////////////////
1143 1235
1144 class GrGLRRectBlurEffect : public GrGLSLFragmentProcessor { 1236 class GrGLRRectBlurEffect : public GrGLSLFragmentProcessor {
1145 public: 1237 public:
1146 void emitCode(EmitArgs&) override; 1238 void emitCode(EmitArgs&) override;
1147 1239
1148 protected: 1240 protected:
1149 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override ; 1241 void onSetData(const GrGLSLProgramDataManager&, const GrProcessor&) override ;
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
1272 newPaint.addCoverageFragmentProcessor(std::move(fp)); 1364 newPaint.addCoverageFragmentProcessor(std::move(fp));
1273 newPaint.setAntiAlias(false); 1365 newPaint.setAntiAlias(false);
1274 1366
1275 SkRect srcProxyRect = srcRRect.rect(); 1367 SkRect srcProxyRect = srcRRect.rect();
1276 srcProxyRect.outset(3.0f*fSigma, 3.0f*fSigma); 1368 srcProxyRect.outset(3.0f*fSigma, 3.0f*fSigma);
1277 1369
1278 drawContext->drawRect(clip, newPaint, viewMatrix, srcProxyRect); 1370 drawContext->drawRect(clip, newPaint, viewMatrix, srcProxyRect);
1279 return true; 1371 return true;
1280 } 1372 }
1281 1373
1282 sk_sp<GrFragmentProcessor> fp(GrRRectBlurEffect::Make(context, xformedSigma, devRRect)); 1374 sk_sp<GrFragmentProcessor> fp(GrRRectBlurEffect::Make(context, fSigma, xform edSigma,
1375 srcRRect, devRRect));
1283 if (!fp) { 1376 if (!fp) {
1284 return false; 1377 return false;
1285 } 1378 }
1286 1379
1287 GrPaint newPaint(*grp); 1380 GrPaint newPaint(*grp);
1288 newPaint.addCoverageFragmentProcessor(std::move(fp)); 1381 newPaint.addCoverageFragmentProcessor(std::move(fp));
1289 newPaint.setAntiAlias(false); 1382 newPaint.setAntiAlias(false);
1290 1383
1291 if (!this->ignoreXform()) { 1384 if (!this->ignoreXform()) {
1292 SkRect srcProxyRect = srcRRect.rect(); 1385 SkRect srcProxyRect = srcRRect.rect();
(...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1457 } else { 1550 } else {
1458 str->append("None"); 1551 str->append("None");
1459 } 1552 }
1460 str->append("))"); 1553 str->append("))");
1461 } 1554 }
1462 #endif 1555 #endif
1463 1556
1464 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) 1557 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter)
1465 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) 1558 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl)
1466 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1559 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW
« no previous file with comments | « include/effects/SkBlurMaskFilter.h ('k') | tests/BlurTest.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698