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

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

Issue 491673002: Initial refactor of shaderbuilder (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
OLDNEW
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"
11 #include "SkGpuBlurUtils.h" 11 #include "SkGpuBlurUtils.h"
12 #include "SkReadBuffer.h" 12 #include "SkReadBuffer.h"
13 #include "SkWriteBuffer.h" 13 #include "SkWriteBuffer.h"
14 #include "SkMaskFilter.h" 14 #include "SkMaskFilter.h"
15 #include "SkRRect.h" 15 #include "SkRRect.h"
16 #include "SkRTConf.h" 16 #include "SkRTConf.h"
17 #include "SkStringUtils.h" 17 #include "SkStringUtils.h"
18 #include "SkStrokeRec.h" 18 #include "SkStrokeRec.h"
19 19
20 #if SK_SUPPORT_GPU 20 #if SK_SUPPORT_GPU
21 #include "GrContext.h" 21 #include "GrContext.h"
22 #include "GrTexture.h" 22 #include "GrTexture.h"
23 #include "GrEffect.h" 23 #include "GrEffect.h"
24 #include "gl/GrGLEffect.h" 24 #include "gl/GrGLEffect.h"
25 #include "gl/GrGLShaderBuilder.h" 25 #include "gl/builders/GrGLProgramBuilder.h"
26 #include "effects/GrSimpleTextureEffect.h" 26 #include "effects/GrSimpleTextureEffect.h"
27 #include "GrTBackendEffectFactory.h" 27 #include "GrTBackendEffectFactory.h"
28 #include "SkGrPixelRef.h" 28 #include "SkGrPixelRef.h"
29 #include "SkDraw.h" 29 #include "SkDraw.h"
30 #endif 30 #endif
31 31
32 SkScalar SkBlurMaskFilter::ConvertRadiusToSigma(SkScalar radius) { 32 SkScalar SkBlurMaskFilter::ConvertRadiusToSigma(SkScalar radius) {
33 return SkBlurMask::ConvertRadiusToSigma(radius); 33 return SkBlurMask::ConvertRadiusToSigma(radius);
34 } 34 }
35 35
(...skipping 555 matching lines...) Expand 10 before | Expand all | Expand 10 after
591 591
592 GR_DECLARE_EFFECT_TEST; 592 GR_DECLARE_EFFECT_TEST;
593 593
594 typedef GrEffect INHERITED; 594 typedef GrEffect INHERITED;
595 }; 595 };
596 596
597 class GrGLRectBlurEffect : public GrGLEffect { 597 class GrGLRectBlurEffect : public GrGLEffect {
598 public: 598 public:
599 GrGLRectBlurEffect(const GrBackendEffectFactory& factory, 599 GrGLRectBlurEffect(const GrBackendEffectFactory& factory,
600 const GrDrawEffect&); 600 const GrDrawEffect&);
601 virtual void emitCode(GrGLShaderBuilder*, 601 virtual void emitCode(GrGLProgramBuilder*,
602 const GrDrawEffect&, 602 const GrDrawEffect&,
603 const GrEffectKey&, 603 const GrEffectKey&,
604 const char* outputColor, 604 const char* outputColor,
605 const char* inputColor, 605 const char* inputColor,
606 const TransformedCoordsArray&, 606 const TransformedCoordsArray&,
607 const TextureSamplerArray&) SK_OVERRIDE; 607 const TextureSamplerArray&) SK_OVERRIDE;
608 608
609 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 609 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE;
610 610
611 private: 611 private:
612 typedef GrGLProgramDataManager::UniformHandle UniformHandle; 612 typedef GrGLProgramDataManager::UniformHandle UniformHandle;
613 613
614 UniformHandle fProxyRectUniform; 614 UniformHandle fProxyRectUniform;
615 UniformHandle fProfileSizeUniform; 615 UniformHandle fProfileSizeUniform;
616 616
617 typedef GrGLEffect INHERITED; 617 typedef GrGLEffect INHERITED;
618 }; 618 };
619 619
620 620
621 621
622 GrGLRectBlurEffect::GrGLRectBlurEffect(const GrBackendEffectFactory& factory, co nst GrDrawEffect&) 622 GrGLRectBlurEffect::GrGLRectBlurEffect(const GrBackendEffectFactory& factory, co nst GrDrawEffect&)
623 : INHERITED(factory) { 623 : INHERITED(factory) {
624 } 624 }
625 625
626 void OutputRectBlurProfileLookup(GrGLShaderBuilder* builder, 626 void OutputRectBlurProfileLookup(GrGLFragmentShaderBuilder* fsBuilder,
627 const GrGLShaderBuilder::TextureSampler& sample r, 627 const GrGLShaderBuilder::TextureSampler& sample r,
628 const char *output, 628 const char *output,
629 const char *profileSize, const char *loc, 629 const char *profileSize, const char *loc,
630 const char *blurred_width, 630 const char *blurred_width,
631 const char *sharp_width) { 631 const char *sharp_width) {
632 builder->fsCodeAppendf("\tfloat %s;\n", output); 632 fsBuilder->codeAppendf("\tfloat %s;\n", output);
633 builder->fsCodeAppendf("\t\t{\n"); 633 fsBuilder->codeAppendf("\t\t{\n");
634 builder->fsCodeAppendf("\t\t\tfloat coord = (0.5 * (abs(2.0*%s - %s) - %s))/ %s;\n", 634 fsBuilder->codeAppendf("\t\t\tfloat coord = (0.5 * (abs(2.0*%s - %s) - %s))/ %s;\n",
635 loc, blurred_width, sharp_width, profileSize); 635 loc, blurred_width, sharp_width, profileSize);
636 builder->fsCodeAppendf("\t\t\t%s = ", output); 636 fsBuilder->codeAppendf("\t\t\t%s = ", output);
637 builder->fsAppendTextureLookup(sampler, "vec2(coord,0.5)"); 637 fsBuilder->appendTextureLookup(sampler, "vec2(coord,0.5)");
638 builder->fsCodeAppend(".a;\n"); 638 fsBuilder->codeAppend(".a;\n");
639 builder->fsCodeAppendf("\t\t}\n"); 639 fsBuilder->codeAppendf("\t\t}\n");
640 } 640 }
641 641
642 void GrGLRectBlurEffect::emitCode(GrGLShaderBuilder* builder, 642 void GrGLRectBlurEffect::emitCode(GrGLProgramBuilder* builder,
643 const GrDrawEffect&, 643 const GrDrawEffect&,
644 const GrEffectKey& key, 644 const GrEffectKey& key,
645 const char* outputColor, 645 const char* outputColor,
646 const char* inputColor, 646 const char* inputColor,
647 const TransformedCoordsArray& coords, 647 const TransformedCoordsArray& coords,
648 const TextureSamplerArray& samplers) { 648 const TextureSamplerArray& samplers) {
649 649
650 const char *rectName; 650 const char *rectName;
651 const char *profileSizeName; 651 const char *profileSizeName;
652 652
653 fProxyRectUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibil ity, 653 fProxyRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi lity,
654 kVec4f_GrSLType, 654 kVec4f_GrSLType,
655 "proxyRect", 655 "proxyRect",
656 &rectName); 656 &rectName);
657 fProfileSizeUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visib ility, 657 fProfileSizeUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visi bility,
658 kFloat_GrSLType, 658 kFloat_GrSLType,
659 "profileSize", 659 "profileSize",
660 &profileSizeName); 660 &profileSizeName);
661 661
662 const char *fragmentPos = builder->fragmentPosition(); 662 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
663 const char *fragmentPos = fsBuilder->fragmentPosition();
663 664
664 if (inputColor) { 665 if (inputColor) {
665 builder->fsCodeAppendf("\tvec4 src=%s;\n", inputColor); 666 fsBuilder->codeAppendf("\tvec4 src=%s;\n", inputColor);
666 } else { 667 } else {
667 builder->fsCodeAppendf("\tvec4 src=vec4(1)\n;"); 668 fsBuilder->codeAppendf("\tvec4 src=vec4(1)\n;");
668 } 669 }
669 670
670 builder->fsCodeAppendf("\tvec2 translatedPos = %s.xy - %s.xy;\n", fragmentPo s, rectName ); 671 fsBuilder->codeAppendf("\tvec2 translatedPos = %s.xy - %s.xy;\n", fragmentPo s, rectName );
671 builder->fsCodeAppendf("\tfloat width = %s.z - %s.x;\n", rectName, rectName) ; 672 fsBuilder->codeAppendf("\tfloat width = %s.z - %s.x;\n", rectName, rectName) ;
672 builder->fsCodeAppendf("\tfloat height = %s.w - %s.y;\n", rectName, rectName ); 673 fsBuilder->codeAppendf("\tfloat height = %s.w - %s.y;\n", rectName, rectName );
673 674
674 builder->fsCodeAppendf("\tvec2 smallDims = vec2(width - %s, height-%s);\n", profileSizeName, profileSizeName); 675 fsBuilder->codeAppendf("\tvec2 smallDims = vec2(width - %s, height-%s);\n", profileSizeName, profileSizeName);
675 builder->fsCodeAppendf("\tfloat center = 2.0 * floor(%s/2.0 + .25) - 1.0;\n" , profileSizeName); 676 fsBuilder->codeAppendf("\tfloat center = 2.0 * floor(%s/2.0 + .25) - 1.0;\n" , profileSizeName);
676 builder->fsCodeAppendf("\tvec2 wh = smallDims - vec2(center,center);\n"); 677 fsBuilder->codeAppendf("\tvec2 wh = smallDims - vec2(center,center);\n");
677 678
678 OutputRectBlurProfileLookup(builder, samplers[0], "horiz_lookup", profileSiz eName, "translatedPos.x", "width", "wh.x"); 679 OutputRectBlurProfileLookup(fsBuilder, samplers[0], "horiz_lookup", profileS izeName, "translatedPos.x", "width", "wh.x");
679 OutputRectBlurProfileLookup(builder, samplers[0], "vert_lookup", profileSize Name, "translatedPos.y", "height", "wh.y"); 680 OutputRectBlurProfileLookup(fsBuilder, samplers[0], "vert_lookup", profileSi zeName, "translatedPos.y", "height", "wh.y");
680 681
681 builder->fsCodeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n"); 682 fsBuilder->codeAppendf("\tfloat final = horiz_lookup * vert_lookup;\n");
682 builder->fsCodeAppendf("\t%s = src * vec4(final);\n", outputColor ); 683 fsBuilder->codeAppendf("\t%s = src * vec4(final);\n", outputColor );
683 } 684 }
684 685
685 void GrGLRectBlurEffect::setData(const GrGLProgramDataManager& pdman, 686 void GrGLRectBlurEffect::setData(const GrGLProgramDataManager& pdman,
686 const GrDrawEffect& drawEffect) { 687 const GrDrawEffect& drawEffect) {
687 const GrRectBlurEffect& rbe = drawEffect.castEffect<GrRectBlurEffect>(); 688 const GrRectBlurEffect& rbe = drawEffect.castEffect<GrRectBlurEffect>();
688 SkRect rect = rbe.getRect(); 689 SkRect rect = rbe.getRect();
689 690
690 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom); 691 pdman.set4f(fProxyRectUniform, rect.fLeft, rect.fTop, rect.fRight, rect.fBot tom);
691 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma())); 692 pdman.set1f(fProfileSizeUniform, SkScalarCeilToScalar(6*rbe.getSigma()));
692 } 693 }
(...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after
952 rrect.setRectXY(SkRect::MakeWH(w, h), r, r); 953 rrect.setRectXY(SkRect::MakeWH(w, h), r, r);
953 return GrRRectBlurEffect::Create(context, sigma, rrect); 954 return GrRRectBlurEffect::Create(context, sigma, rrect);
954 } 955 }
955 956
956 ////////////////////////////////////////////////////////////////////////////// 957 //////////////////////////////////////////////////////////////////////////////
957 958
958 class GrGLRRectBlurEffect : public GrGLEffect { 959 class GrGLRRectBlurEffect : public GrGLEffect {
959 public: 960 public:
960 GrGLRRectBlurEffect(const GrBackendEffectFactory&, const GrDrawEffect&); 961 GrGLRRectBlurEffect(const GrBackendEffectFactory&, const GrDrawEffect&);
961 962
962 virtual void emitCode(GrGLShaderBuilder* builder, 963 virtual void emitCode(GrGLProgramBuilder* builder,
963 const GrDrawEffect& drawEffect, 964 const GrDrawEffect& drawEffect,
964 const GrEffectKey& key, 965 const GrEffectKey& key,
965 const char* outputColor, 966 const char* outputColor,
966 const char* inputColor, 967 const char* inputColor,
967 const TransformedCoordsArray&, 968 const TransformedCoordsArray&,
968 const TextureSamplerArray&) SK_OVERRIDE; 969 const TextureSamplerArray&) SK_OVERRIDE;
969 970
970 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE; 971 virtual void setData(const GrGLProgramDataManager&, const GrDrawEffect&) SK_ OVERRIDE;
971 972
972 private: 973 private:
973 GrGLProgramDataManager::UniformHandle fProxyRectUniform; 974 GrGLProgramDataManager::UniformHandle fProxyRectUniform;
974 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform; 975 GrGLProgramDataManager::UniformHandle fCornerRadiusUniform;
975 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform; 976 GrGLProgramDataManager::UniformHandle fBlurRadiusUniform;
976 typedef GrGLEffect INHERITED; 977 typedef GrGLEffect INHERITED;
977 }; 978 };
978 979
979 GrGLRRectBlurEffect::GrGLRRectBlurEffect(const GrBackendEffectFactory& factory, 980 GrGLRRectBlurEffect::GrGLRRectBlurEffect(const GrBackendEffectFactory& factory,
980 const GrDrawEffect& drawEffect) 981 const GrDrawEffect& drawEffect)
981 : INHERITED (factory) { 982 : INHERITED (factory) {
982 } 983 }
983 984
984 void GrGLRRectBlurEffect::emitCode(GrGLShaderBuilder* builder, 985 void GrGLRRectBlurEffect::emitCode(GrGLProgramBuilder* builder,
985 const GrDrawEffect& drawEffect, 986 const GrDrawEffect& drawEffect,
986 const GrEffectKey& key, 987 const GrEffectKey& key,
987 const char* outputColor, 988 const char* outputColor,
988 const char* inputColor, 989 const char* inputColor,
989 const TransformedCoordsArray&, 990 const TransformedCoordsArray&,
990 const TextureSamplerArray& samplers) { 991 const TextureSamplerArray& samplers) {
991 const char *rectName; 992 const char *rectName;
992 const char *cornerRadiusName; 993 const char *cornerRadiusName;
993 const char *blurRadiusName; 994 const char *blurRadiusName;
994 995
995 // The proxy rect has left, top, right, and bottom edges correspond to 996 // The proxy rect has left, top, right, and bottom edges correspond to
996 // components x, y, z, and w, respectively. 997 // components x, y, z, and w, respectively.
997 998
998 fProxyRectUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibil ity, 999 fProxyRectUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visibi lity,
999 kVec4f_GrSLType, 1000 kVec4f_GrSLType,
1000 "proxyRect", 1001 "proxyRect",
1001 &rectName); 1002 &rectName);
1002 fCornerRadiusUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visi bility, 1003 fCornerRadiusUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Vis ibility,
1003 kFloat_GrSLType, 1004 kFloat_GrSLType,
1004 "cornerRadius", 1005 "cornerRadius",
1005 &cornerRadiusName); 1006 &cornerRadiusName);
1006 fBlurRadiusUniform = builder->addUniform(GrGLShaderBuilder::kFragment_Visibi lity, 1007 fBlurRadiusUniform = builder->addUniform(GrGLProgramBuilder::kFragment_Visib ility,
1007 kFloat_GrSLType, 1008 kFloat_GrSLType,
1008 "blurRadius", 1009 "blurRadius",
1009 &blurRadiusName); 1010 &blurRadiusName);
1010 const char* fragmentPos = builder->fragmentPosition(); 1011
1012 GrGLFragmentShaderBuilder* fsBuilder = builder->getFragmentShaderBuilder();
1013 const char* fragmentPos = fsBuilder->fragmentPosition();
1011 1014
1012 // warp the fragment position to the appropriate part of the 9patch blur tex ture 1015 // warp the fragment position to the appropriate part of the 9patch blur tex ture
1013 1016
1014 builder->fsCodeAppendf("\t\tvec2 rectCenter = (%s.xy + %s.zw)/2.0;\n", rectN ame, rectName); 1017 fsBuilder->codeAppendf("\t\tvec2 rectCenter = (%s.xy + %s.zw)/2.0;\n", rectN ame, rectName);
1015 builder->fsCodeAppendf("\t\tvec2 translatedFragPos = %s.xy - %s.xy;\n", frag mentPos, rectName); 1018 fsBuilder->codeAppendf("\t\tvec2 translatedFragPos = %s.xy - %s.xy;\n", frag mentPos, rectName);
1016 builder->fsCodeAppendf("\t\tfloat threshold = %s + 2.0*%s;\n", cornerRadiusN ame, blurRadiusName ); 1019 fsBuilder->codeAppendf("\t\tfloat threshold = %s + 2.0*%s;\n", cornerRadiusN ame, blurRadiusName );
1017 builder->fsCodeAppendf("\t\tvec2 middle = %s.zw - %s.xy - 2.0*threshold;\n", rectName, rectName ); 1020 fsBuilder->codeAppendf("\t\tvec2 middle = %s.zw - %s.xy - 2.0*threshold;\n", rectName, rectName );
1018 1021
1019 builder->fsCodeAppendf("\t\tif (translatedFragPos.x >= threshold && translat edFragPos.x < (middle.x+threshold)) {\n" ); 1022 fsBuilder->codeAppendf("\t\tif (translatedFragPos.x >= threshold && translat edFragPos.x < (middle.x+threshold)) {\n" );
1020 builder->fsCodeAppendf("\t\t\ttranslatedFragPos.x = threshold;\n"); 1023 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x = threshold;\n");
1021 builder->fsCodeAppendf("\t\t} else if (translatedFragPos.x >= (middle.x + th reshold)) {\n"); 1024 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.x >= (middle.x + th reshold)) {\n");
1022 builder->fsCodeAppendf("\t\t\ttranslatedFragPos.x -= middle.x - 1.0;\n"); 1025 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.x -= middle.x - 1.0;\n");
1023 builder->fsCodeAppendf("\t\t}\n"); 1026 fsBuilder->codeAppendf("\t\t}\n");
1024 1027
1025 builder->fsCodeAppendf("\t\tif (translatedFragPos.y > threshold && translate dFragPos.y < (middle.y+threshold)) {\n" ); 1028 fsBuilder->codeAppendf("\t\tif (translatedFragPos.y > threshold && translate dFragPos.y < (middle.y+threshold)) {\n" );
1026 builder->fsCodeAppendf("\t\t\ttranslatedFragPos.y = threshold;\n"); 1029 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y = threshold;\n");
1027 builder->fsCodeAppendf("\t\t} else if (translatedFragPos.y >= (middle.y + th reshold)) {\n"); 1030 fsBuilder->codeAppendf("\t\t} else if (translatedFragPos.y >= (middle.y + th reshold)) {\n");
1028 builder->fsCodeAppendf("\t\t\ttranslatedFragPos.y -= middle.y - 1.0;\n"); 1031 fsBuilder->codeAppendf("\t\t\ttranslatedFragPos.y -= middle.y - 1.0;\n");
1029 builder->fsCodeAppendf("\t\t}\n"); 1032 fsBuilder->codeAppendf("\t\t}\n");
1030 1033
1031 builder->fsCodeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n"); 1034 fsBuilder->codeAppendf("\t\tvec2 proxyDims = vec2(2.0*threshold+1.0);\n");
1032 builder->fsCodeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n "); 1035 fsBuilder->codeAppendf("\t\tvec2 texCoord = translatedFragPos / proxyDims;\n ");
1033 1036
1034 builder->fsCodeAppendf("\t%s = ", outputColor); 1037 fsBuilder->codeAppendf("\t%s = ", outputColor);
1035 builder->fsAppendTextureLookupAndModulate(inputColor, samplers[0], "texCoord "); 1038 fsBuilder->appendTextureLookupAndModulate(inputColor, samplers[0], "texCoord ");
1036 builder->fsCodeAppend(";\n"); 1039 fsBuilder->codeAppend(";\n");
1037 } 1040 }
1038 1041
1039 void GrGLRRectBlurEffect::setData(const GrGLProgramDataManager& pdman, 1042 void GrGLRRectBlurEffect::setData(const GrGLProgramDataManager& pdman,
1040 const GrDrawEffect& drawEffect) { 1043 const GrDrawEffect& drawEffect) {
1041 const GrRRectBlurEffect& brre = drawEffect.castEffect<GrRRectBlurEffect>(); 1044 const GrRRectBlurEffect& brre = drawEffect.castEffect<GrRRectBlurEffect>();
1042 SkRRect rrect = brre.getRRect(); 1045 SkRRect rrect = brre.getRRect();
1043 1046
1044 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f); 1047 float blurRadius = 3.f*SkScalarCeilToScalar(brre.getSigma()-1/6.0f);
1045 pdman.set1f(fBlurRadiusUniform, blurRadius); 1048 pdman.set1f(fBlurRadiusUniform, blurRadius);
1046 1049
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1204 } else { 1207 } else {
1205 str->append("None"); 1208 str->append("None");
1206 } 1209 }
1207 str->append("))"); 1210 str->append("))");
1208 } 1211 }
1209 #endif 1212 #endif
1210 1213
1211 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter) 1214 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(SkBlurMaskFilter)
1212 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl) 1215 SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(SkBlurMaskFilterImpl)
1213 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END 1216 SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698