OLD | NEW |
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 1063 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1074 | 1074 |
1075 virtual ~GrRRectBlurEffect() {}; | 1075 virtual ~GrRRectBlurEffect() {}; |
1076 const char* name() const override { return "GrRRectBlur"; } | 1076 const char* name() const override { return "GrRRectBlur"; } |
1077 | 1077 |
1078 const SkRRect& getRRect() const { return fRRect; } | 1078 const SkRRect& getRRect() const { return fRRect; } |
1079 float getSigma() const { return fSigma; } | 1079 float getSigma() const { return fSigma; } |
1080 | 1080 |
1081 private: | 1081 private: |
1082 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; | 1082 GrGLSLFragmentProcessor* onCreateGLSLInstance() const override; |
1083 | 1083 |
1084 GrRRectBlurEffect(float xformedSigma, const SkRRect& devRRect, GrTexture* ma
sk); | 1084 GrRRectBlurEffect(float sigma, const SkRRect&, GrTexture* profileTexture); |
1085 | 1085 |
1086 virtual void onGetGLSLProcessorKey(const GrGLSLCaps& caps, | 1086 virtual void onGetGLSLProcessorKey(const GrGLSLCaps& caps, |
1087 GrProcessorKeyBuilder* b) const override; | 1087 GrProcessorKeyBuilder* b) const override; |
1088 | 1088 |
1089 bool onIsEqual(const GrFragmentProcessor& other) const override; | 1089 bool onIsEqual(const GrFragmentProcessor& other) const override; |
1090 | 1090 |
1091 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; | 1091 void onComputeInvariantOutput(GrInvariantOutput* inout) const override; |
1092 | 1092 |
1093 SkRRect fRRect; | 1093 SkRRect fRRect; |
1094 float fSigma; | 1094 float fSigma; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1185 if (!ninePatchable) { | 1185 if (!ninePatchable) { |
1186 return nullptr; | 1186 return nullptr; |
1187 } | 1187 } |
1188 | 1188 |
1189 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, |
1190 xformedSigma, true)); | 1190 xformedSigma, true)); |
1191 if (!mask) { | 1191 if (!mask) { |
1192 return nullptr; | 1192 return nullptr; |
1193 } | 1193 } |
1194 | 1194 |
1195 return sk_sp<GrFragmentProcessor>(new GrRRectBlurEffect(xformedSigma, devRRe
ct, mask.get())); | 1195 return sk_sp<GrFragmentProcessor>(new GrRRectBlurEffect(xformedSigma, |
| 1196 devRRect, |
| 1197 mask.get())); |
1196 } | 1198 } |
1197 | 1199 |
1198 void GrRRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const
{ | 1200 void GrRRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const
{ |
1199 inout->mulByUnknownSingleComponent(); | 1201 inout->mulByUnknownSingleComponent(); |
1200 } | 1202 } |
1201 | 1203 |
1202 GrRRectBlurEffect::GrRRectBlurEffect(float xformedSigma, | 1204 GrRRectBlurEffect::GrRRectBlurEffect(float sigma, const SkRRect& rrect, GrTextur
e *ninePatchTexture) |
1203 const SkRRect& devRRect, | 1205 : fRRect(rrect), |
1204 GrTexture *ninePatchTexture) | 1206 fSigma(sigma), |
1205 : fRRect(devRRect) | 1207 fNinePatchAccess(ninePatchTexture) { |
1206 , fSigma(xformedSigma) | |
1207 , fNinePatchAccess(ninePatchTexture) { | |
1208 this->initClassID<GrRRectBlurEffect>(); | 1208 this->initClassID<GrRRectBlurEffect>(); |
1209 this->addTextureAccess(&fNinePatchAccess); | 1209 this->addTextureAccess(&fNinePatchAccess); |
1210 this->setWillReadFragmentPosition(); | 1210 this->setWillReadFragmentPosition(); |
1211 } | 1211 } |
1212 | 1212 |
1213 bool GrRRectBlurEffect::onIsEqual(const GrFragmentProcessor& other) const { | 1213 bool GrRRectBlurEffect::onIsEqual(const GrFragmentProcessor& other) const { |
1214 const GrRRectBlurEffect& rrbe = other.cast<GrRRectBlurEffect>(); | 1214 const GrRRectBlurEffect& rrbe = other.cast<GrRRectBlurEffect>(); |
1215 return fRRect.getSimpleRadii().fX == rrbe.fRRect.getSimpleRadii().fX && | 1215 return fRRect.getSimpleRadii().fX == rrbe.fRRect.getSimpleRadii().fX && |
1216 fSigma == rrbe.fSigma && | 1216 fSigma == rrbe.fSigma && |
1217 fRRect.rect() == rrbe.fRRect.rect(); | 1217 fRRect.rect() == rrbe.fRRect.rect(); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1344 if (fBlurStyle != kNormal_SkBlurStyle) { | 1344 if (fBlurStyle != kNormal_SkBlurStyle) { |
1345 return false; | 1345 return false; |
1346 } | 1346 } |
1347 | 1347 |
1348 if (!strokeRec.isFillStyle()) { | 1348 if (!strokeRec.isFillStyle()) { |
1349 return false; | 1349 return false; |
1350 } | 1350 } |
1351 | 1351 |
1352 SkScalar xformedSigma = this->computeXformedSigma(viewMatrix); | 1352 SkScalar xformedSigma = this->computeXformedSigma(viewMatrix); |
1353 | 1353 |
1354 GrPaint newPaint(*grp); | |
1355 newPaint.setAntiAlias(false); | |
1356 | |
1357 if (devRRect.isCircle()) { | 1354 if (devRRect.isCircle()) { |
1358 sk_sp<GrFragmentProcessor> fp(GrCircleBlurFragmentProcessor::Make( | 1355 sk_sp<GrFragmentProcessor> fp(GrCircleBlurFragmentProcessor::Make( |
1359 context-
>textureProvider(), | 1356 context-
>textureProvider(), |
1360 devRRect
.rect(), | 1357 devRRect
.rect(), |
1361 xformedS
igma)); | 1358 xformedS
igma)); |
1362 if (!fp) { | 1359 if (!fp) { |
1363 return false; | 1360 return false; |
1364 } | 1361 } |
1365 | 1362 |
| 1363 GrPaint newPaint(*grp); |
1366 newPaint.addCoverageFragmentProcessor(std::move(fp)); | 1364 newPaint.addCoverageFragmentProcessor(std::move(fp)); |
| 1365 newPaint.setAntiAlias(false); |
1367 | 1366 |
1368 SkRect srcProxyRect = srcRRect.rect(); | 1367 SkRect srcProxyRect = srcRRect.rect(); |
1369 srcProxyRect.outset(3.0f*fSigma, 3.0f*fSigma); | 1368 srcProxyRect.outset(3.0f*fSigma, 3.0f*fSigma); |
1370 | 1369 |
1371 drawContext->drawRect(clip, newPaint, viewMatrix, srcProxyRect); | 1370 drawContext->drawRect(clip, newPaint, viewMatrix, srcProxyRect); |
1372 return true; | 1371 return true; |
1373 } | 1372 } |
1374 | 1373 |
1375 SkRRect maskSpaceRRectToDraw; | 1374 sk_sp<GrFragmentProcessor> fp(GrRRectBlurEffect::Make(context, fSigma, xform
edSigma, |
1376 SkISize maskSize; | 1375 srcRRect, devRRect)); |
1377 SkScalar rectXs[SkBlurMaskFilter::kMaxDivisions], rectYs[SkBlurMaskFilter::k
MaxDivisions]; | 1376 if (!fp) { |
1378 SkScalar texXs[SkBlurMaskFilter::kMaxDivisions], texYs[SkBlurMaskFilter::kMa
xDivisions]; | |
1379 int numX, numY; | |
1380 uint32_t skipMask; | |
1381 | |
1382 bool ninePatchable = SkBlurMaskFilter::ComputeBlurredRRectParams(srcRRect, d
evRRect, fOccluder, | |
1383 fSigma, xfo
rmedSigma, | |
1384 &maskSpaceR
RectToDraw, | |
1385 &maskSize, | |
1386 rectXs, rec
tYs, texXs, texYs, | |
1387 &numX, &num
Y, &skipMask); | |
1388 if (!ninePatchable) { | |
1389 return false; | 1377 return false; |
1390 } | 1378 } |
1391 | 1379 |
1392 if (!this->ignoreXform()) { | 1380 GrPaint newPaint(*grp); |
1393 sk_sp<GrTexture> mask(find_or_create_rrect_blur_mask(context, | 1381 newPaint.addCoverageFragmentProcessor(std::move(fp)); |
1394 maskSpaceRRectToDra
w, maskSize, | 1382 newPaint.setAntiAlias(false); |
1395 xformedSigma, true)
); | |
1396 if (!mask) { | |
1397 return false; | |
1398 } | |
1399 | 1383 |
1400 SkMatrix texMatrix; | 1384 if (!this->ignoreXform()) { |
1401 texMatrix.setIDiv(mask->width(), mask->height()); | 1385 SkRect srcProxyRect = srcRRect.rect(); |
| 1386 srcProxyRect.outset(3.0f*fSigma, 3.0f*fSigma); |
1402 | 1387 |
1403 GrTextureParams params; | 1388 SkPoint points[8]; |
1404 params.reset(SkShader::kClamp_TileMode, GrTextureParams::kBilerp_FilterM
ode); | 1389 uint16_t indices[24]; |
| 1390 int numPoints, numIndices; |
1405 | 1391 |
1406 sk_sp<GrFragmentProcessor> fp = GrSimpleTextureEffect::Make(mask.get(),
nullptr, | 1392 SkRect temp = fOccluder; |
1407 texMatrix, p
arams); | |
1408 if (!fp) { | |
1409 return false; | |
1410 } | |
1411 | 1393 |
1412 newPaint.addColorFragmentProcessor(std::move(fp)); | 1394 if (!temp.isEmpty() && (srcProxyRect.contains(temp) || temp.intersect(sr
cProxyRect))) { |
| 1395 srcProxyRect.toQuad(points); |
| 1396 temp.toQuad(&points[4]); |
| 1397 numPoints = 8; |
1413 | 1398 |
1414 uint32_t checkBit = 0x1; | 1399 static const uint16_t ringI[24] = { 0, 1, 5, 5, 4, 0, |
1415 for (int y = 0; y < numY-1; ++y) { | 1400 1, 2, 6, 6, 5, 1, |
1416 for (int x = 0; x < numX-1; ++x) { | 1401 2, 3, 7, 7, 6, 2, |
1417 if (skipMask & checkBit) { | 1402 3, 0, 4, 4, 7, 3 }; |
1418 checkBit <<= 1; | 1403 memcpy(indices, ringI, sizeof(ringI)); |
1419 continue; | 1404 numIndices = 24; |
1420 } | 1405 } else { |
1421 drawContext->fillRectToRect( | 1406 // full rect case |
1422 clip, newPaint, viewMatrix, | 1407 srcProxyRect.toQuad(points); |
1423 SkRect::MakeLTRB(rectXs[x], rectYs[y], rectXs[x+1],
rectYs[y+1]), // dst | 1408 numPoints = 4; |
1424 SkRect::MakeLTRB(texXs[x], texYs[y], texXs[x+1], tex
Ys[y+1])); // src | 1409 |
1425 checkBit <<= 1; | 1410 static const uint16_t fullI[6] = { 0, 1, 2, 0, 2, 3 }; |
1426 } | 1411 memcpy(indices, fullI, sizeof(fullI)); |
1427 } | 1412 numIndices = 6; |
| 1413 } |
| 1414 |
| 1415 drawContext->drawVertices(clip, newPaint, viewMatrix, kTriangles_GrPrimi
tiveType, |
| 1416 numPoints, points, nullptr, nullptr, indices,
numIndices); |
| 1417 |
1428 } else { | 1418 } else { |
1429 sk_sp<GrFragmentProcessor> fp(GrRRectBlurEffect::Make(context, | |
1430 fSigma, xformedSig
ma, | |
1431 srcRRect, devRRect
)); | |
1432 if (!fp) { | |
1433 return false; | |
1434 } | |
1435 | |
1436 newPaint.addCoverageFragmentProcessor(std::move(fp)); | |
1437 | |
1438 SkMatrix inverse; | 1419 SkMatrix inverse; |
1439 if (!viewMatrix.invert(&inverse)) { | 1420 if (!viewMatrix.invert(&inverse)) { |
1440 return false; | 1421 return false; |
1441 } | 1422 } |
1442 | 1423 |
1443 float extra=3.f*SkScalarCeilToScalar(xformedSigma-1/6.0f); | 1424 float extra=3.f*SkScalarCeilToScalar(xformedSigma-1/6.0f); |
1444 SkRect proxyRect = devRRect.rect(); | 1425 SkRect proxyRect = devRRect.rect(); |
1445 proxyRect.outset(extra, extra); | 1426 proxyRect.outset(extra, extra); |
1446 | 1427 |
1447 | 1428 |
(...skipping 121 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1569 } else { | 1550 } else { |
1570 str->append("None"); | 1551 str->append("None"); |
1571 } | 1552 } |
1572 str->append("))"); | 1553 str->append("))"); |
1573 } | 1554 } |
1574 #endif | 1555 #endif |
1575 | 1556 |
1576 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1557 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
1577 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1558 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
1578 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1559 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |