OLD | NEW |
1 | 1 |
2 /* | 2 /* |
3 * Copyright 2006 The Android Open Source Project | 3 * Copyright 2006 The Android Open Source Project |
4 * | 4 * |
5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
7 */ | 7 */ |
8 | 8 |
9 #include "SkBlurMaskFilter.h" | 9 #include "SkBlurMaskFilter.h" |
10 #include "SkBlurMask.h" | 10 #include "SkBlurMask.h" |
(...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
920 return NULL; | 920 return NULL; |
921 } | 921 } |
922 | 922 |
923 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); | 923 static const GrUniqueKey::Domain kDomain = GrUniqueKey::GenerateDomain(); |
924 GrUniqueKey key; | 924 GrUniqueKey key; |
925 GrUniqueKey::Builder builder(&key, kDomain, 2); | 925 GrUniqueKey::Builder builder(&key, kDomain, 2); |
926 builder[0] = blurRadius; | 926 builder[0] = blurRadius; |
927 builder[1] = cornerRadius; | 927 builder[1] = cornerRadius; |
928 builder.finish(); | 928 builder.finish(); |
929 | 929 |
930 GrTexture *blurNinePatchTexture = context->findAndRefCachedTexture(key); | 930 SkAutoTUnref<GrTexture> blurNinePatchTexture(context->findAndRefCachedTextur
e(key)); |
931 | 931 |
932 if (NULL == blurNinePatchTexture) { | 932 if (!blurNinePatchTexture) { |
933 SkMask mask; | 933 SkMask mask; |
934 | 934 |
935 unsigned int smallRectSide = 2*(blurRadius + cornerRadius) + 1; | 935 unsigned int smallRectSide = 2*(blurRadius + cornerRadius) + 1; |
936 | 936 |
937 mask.fBounds = SkIRect::MakeWH(smallRectSide, smallRectSide); | 937 mask.fBounds = SkIRect::MakeWH(smallRectSide, smallRectSide); |
938 mask.fFormat = SkMask::kA8_Format; | 938 mask.fFormat = SkMask::kA8_Format; |
939 mask.fRowBytes = mask.fBounds.width(); | 939 mask.fRowBytes = mask.fBounds.width(); |
940 mask.fImage = SkMask::AllocImage(mask.computeTotalImageSize()); | 940 mask.fImage = SkMask::AllocImage(mask.computeTotalImageSize()); |
941 SkAutoMaskFreeImage amfi(mask.fImage); | 941 SkAutoMaskFreeImage amfi(mask.fImage); |
942 | 942 |
943 memset(mask.fImage, 0, mask.computeTotalImageSize()); | 943 memset(mask.fImage, 0, mask.computeTotalImageSize()); |
944 | 944 |
945 SkRect smallRect; | 945 SkRect smallRect; |
946 smallRect.setWH(SkIntToScalar(smallRectSide), SkIntToScalar(smallRectSid
e)); | 946 smallRect.setWH(SkIntToScalar(smallRectSide), SkIntToScalar(smallRectSid
e)); |
947 | 947 |
948 SkRRect smallRRect; | 948 SkRRect smallRRect; |
949 smallRRect.setRectXY(smallRect, SkIntToScalar(cornerRadius), SkIntToScal
ar(cornerRadius)); | 949 smallRRect.setRectXY(smallRect, SkIntToScalar(cornerRadius), SkIntToScal
ar(cornerRadius)); |
950 | 950 |
951 SkPath path; | 951 SkPath path; |
952 path.addRRect( smallRRect ); | 952 path.addRRect( smallRRect ); |
953 | 953 |
954 SkDraw::DrawToMask(path, &mask.fBounds, NULL, NULL, &mask, | 954 SkDraw::DrawToMask(path, &mask.fBounds, NULL, NULL, &mask, |
955 SkMask::kJustRenderImage_CreateMode, SkPaint::kFill_S
tyle); | 955 SkMask::kJustRenderImage_CreateMode, SkPaint::kFill_S
tyle); |
956 | 956 |
957 SkMask blurred_mask; | 957 SkMask blurredMask; |
958 SkBlurMask::BoxBlur(&blurred_mask, mask, sigma, kNormal_SkBlurStyle, kHi
gh_SkBlurQuality, | 958 SkBlurMask::BoxBlur(&blurredMask, mask, sigma, kNormal_SkBlurStyle, kHig
h_SkBlurQuality, |
959 NULL, true ); | 959 NULL, true ); |
960 | 960 |
961 unsigned int texSide = smallRectSide + 2*blurRadius; | 961 unsigned int texSide = smallRectSide + 2*blurRadius; |
962 GrSurfaceDesc texDesc; | 962 GrSurfaceDesc texDesc; |
963 texDesc.fWidth = texSide; | 963 texDesc.fWidth = texSide; |
964 texDesc.fHeight = texSide; | 964 texDesc.fHeight = texSide; |
965 texDesc.fConfig = kAlpha_8_GrPixelConfig; | 965 texDesc.fConfig = kAlpha_8_GrPixelConfig; |
966 | 966 |
967 blurNinePatchTexture = context->createTexture(texDesc, true, blurred_mas
k.fImage, 0); | 967 blurNinePatchTexture.reset(context->createTexture(texDesc, true, blurred
Mask.fImage, 0)); |
| 968 SkMask::FreeImage(blurredMask.fImage); |
968 if (!blurNinePatchTexture) { | 969 if (!blurNinePatchTexture) { |
969 return NULL; | 970 return NULL; |
970 } | 971 } |
971 context->addResourceToCache(key, blurNinePatchTexture); | 972 context->addResourceToCache(key, blurNinePatchTexture); |
972 | |
973 SkMask::FreeImage(blurred_mask.fImage); | |
974 } | 973 } |
975 | |
976 SkAutoTUnref<GrTexture> blurunref(blurNinePatchTexture); | |
977 if (NULL == blurNinePatchTexture) { | |
978 return NULL; | |
979 } | |
980 | |
981 return SkNEW_ARGS(GrRRectBlurEffect, (sigma, rrect, blurNinePatchTexture)); | 974 return SkNEW_ARGS(GrRRectBlurEffect, (sigma, rrect, blurNinePatchTexture)); |
982 } | 975 } |
983 | 976 |
984 void GrRRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const
{ | 977 void GrRRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const
{ |
985 inout->mulByUnknownSingleComponent(); | 978 inout->mulByUnknownSingleComponent(); |
986 } | 979 } |
987 | 980 |
988 GrRRectBlurEffect::GrRRectBlurEffect(float sigma, const SkRRect& rrect, GrTextur
e *ninePatchTexture) | 981 GrRRectBlurEffect::GrRRectBlurEffect(float sigma, const SkRRect& rrect, GrTextur
e *ninePatchTexture) |
989 : fRRect(rrect), | 982 : fRRect(rrect), |
990 fSigma(sigma), | 983 fSigma(sigma), |
(...skipping 281 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1272 } else { | 1265 } else { |
1273 str->append("None"); | 1266 str->append("None"); |
1274 } | 1267 } |
1275 str->append("))"); | 1268 str->append("))"); |
1276 } | 1269 } |
1277 #endif | 1270 #endif |
1278 | 1271 |
1279 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) | 1272 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) |
1280 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) | 1273 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) |
1281 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END | 1274 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END |
OLD | NEW |