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

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

Issue 23018003: Rename GrGLUniformManager to GrGLUniform and ref GrGLUniforms directly Base URL: https://skia.googlecode.com/svn/trunk
Patch Set: Created 7 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 | Annotate | Revision Log
« no previous file with comments | « src/effects/SkMorphologyImageFilter.cpp ('k') | src/effects/SkTableColorFilter.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 2013 Google Inc. 2 * Copyright 2013 Google Inc.
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 "SkDither.h" 8 #include "SkDither.h"
9 #include "SkPerlinNoiseShader.h" 9 #include "SkPerlinNoiseShader.h"
10 #include "SkFlattenableBuffers.h" 10 #include "SkFlattenableBuffers.h"
(...skipping 488 matching lines...) Expand 10 before | Expand all | Expand 10 after
499 #include "GrTBackendEffectFactory.h" 499 #include "GrTBackendEffectFactory.h"
500 500
501 class GrGLNoise : public GrGLEffect { 501 class GrGLNoise : public GrGLEffect {
502 public: 502 public:
503 GrGLNoise(const GrBackendEffectFactory& factory, 503 GrGLNoise(const GrBackendEffectFactory& factory,
504 const GrDrawEffect& drawEffect); 504 const GrDrawEffect& drawEffect);
505 virtual ~GrGLNoise() {} 505 virtual ~GrGLNoise() {}
506 506
507 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&); 507 static inline EffectKey GenKey(const GrDrawEffect&, const GrGLCaps&);
508 508
509 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE; 509 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE;
510 510
511 protected: 511 protected:
512 SkPerlinNoiseShader::Type fType; 512 SkPerlinNoiseShader::Type fType;
513 bool fStitchTiles; 513 bool fStitchTiles;
514 int fNumOctaves; 514 int fNumOctaves;
515 GrGLUniformManager::UniformHandle fBaseFrequencyUni; 515 GrGLUniform* fBaseFrequencyUni;
516 GrGLUniformManager::UniformHandle fAlphaUni; 516 GrGLUniform* fAlphaUni;
517 GrGLUniformManager::UniformHandle fInvMatrixUni; 517 GrGLUniform* fInvMatrixUni;
518 GrGLEffectMatrix fEffectMatrix; 518 GrGLEffectMatrix fEffectMatrix;
519 519
520 private: 520 private:
521 typedef GrGLEffect INHERITED; 521 typedef GrGLEffect INHERITED;
522 }; 522 };
523 523
524 class GrGLPerlinNoise : public GrGLNoise { 524 class GrGLPerlinNoise : public GrGLNoise {
525 public: 525 public:
526 GrGLPerlinNoise(const GrBackendEffectFactory& factory, 526 GrGLPerlinNoise(const GrBackendEffectFactory& factory,
527 const GrDrawEffect& drawEffect) 527 const GrDrawEffect& drawEffect)
528 : GrGLNoise(factory, drawEffect) {} 528 : GrGLNoise(factory, drawEffect) {}
529 virtual ~GrGLPerlinNoise() {} 529 virtual ~GrGLPerlinNoise() {}
530 530
531 virtual void emitCode(GrGLShaderBuilder*, 531 virtual void emitCode(GrGLShaderBuilder*,
532 const GrDrawEffect&, 532 const GrDrawEffect&,
533 EffectKey, 533 EffectKey,
534 const char* outputColor, 534 const char* outputColor,
535 const char* inputColor, 535 const char* inputColor,
536 const TextureSamplerArray&) SK_OVERRIDE; 536 const TextureSamplerArray&) SK_OVERRIDE;
537 537
538 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE; 538 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE;
539 539
540 private: 540 private:
541 GrGLUniformManager::UniformHandle fStitchDataUni; 541 GrGLUniform* fStitchDataUni;
542 542
543 typedef GrGLNoise INHERITED; 543 typedef GrGLNoise INHERITED;
544 }; 544 };
545 545
546 class GrGLSimplexNoise : public GrGLNoise { 546 class GrGLSimplexNoise : public GrGLNoise {
547 // Note : This is for reference only. GrGLPerlinNoise is used for processing . 547 // Note : This is for reference only. GrGLPerlinNoise is used for processing .
548 public: 548 public:
549 GrGLSimplexNoise(const GrBackendEffectFactory& factory, 549 GrGLSimplexNoise(const GrBackendEffectFactory& factory,
550 const GrDrawEffect& drawEffect) 550 const GrDrawEffect& drawEffect)
551 : GrGLNoise(factory, drawEffect) {} 551 : GrGLNoise(factory, drawEffect) {}
552 552
553 virtual ~GrGLSimplexNoise() {} 553 virtual ~GrGLSimplexNoise() {}
554 554
555 virtual void emitCode(GrGLShaderBuilder*, 555 virtual void emitCode(GrGLShaderBuilder*,
556 const GrDrawEffect&, 556 const GrDrawEffect&,
557 EffectKey, 557 EffectKey,
558 const char* outputColor, 558 const char* outputColor,
559 const char* inputColor, 559 const char* inputColor,
560 const TextureSamplerArray&) SK_OVERRIDE; 560 const TextureSamplerArray&) SK_OVERRIDE;
561 561
562 virtual void setData(const GrGLUniformManager&, const GrDrawEffect&) SK_OVER RIDE; 562 virtual void setData(const GrGLContext&, const GrDrawEffect&) SK_OVERRIDE;
563 563
564 private: 564 private:
565 GrGLUniformManager::UniformHandle fSeedUni; 565 GrGLUniform* fSeedUni;
566 566
567 typedef GrGLNoise INHERITED; 567 typedef GrGLNoise INHERITED;
568 }; 568 };
569 569
570 ///////////////////////////////////////////////////////////////////// 570 /////////////////////////////////////////////////////////////////////
571 571
572 class GrNoiseEffect : public GrEffect { 572 class GrNoiseEffect : public GrEffect {
573 public: 573 public:
574 virtual ~GrNoiseEffect() { } 574 virtual ~GrNoiseEffect() { }
575 575
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
745 const GrDrawEffect&, 745 const GrDrawEffect&,
746 EffectKey key, 746 EffectKey key,
747 const char* outputColor, 747 const char* outputColor,
748 const char* inputColor, 748 const char* inputColor,
749 const TextureSamplerArray&) { 749 const TextureSamplerArray&) {
750 sk_ignore_unused_variable(inputColor); 750 sk_ignore_unused_variable(inputColor);
751 751
752 const char* vCoords; 752 const char* vCoords;
753 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &vCoords); 753 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &vCoords);
754 754
755 fSeedUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 755 GrGLShaderBuilder::Uniform* seedUni =
756 kFloat_GrSLType, "seed"); 756 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSL Type, "seed");
757 const char* seedUni = builder->getUniformCStr(fSeedUni); 757 fSeedUni = seedUni->glUniform();
758 fInvMatrixUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 758
759 kMat33f_GrSLType, "invMatrix"); 759 GrGLShaderBuilder::Uniform* invMatrixUni =
760 const char* invMatrixUni = builder->getUniformCStr(fInvMatrixUni); 760 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kMat33f_GrS LType, "invMatrix");
761 fBaseFrequencyUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderT ype, 761 fInvMatrixUni = invMatrixUni->glUniform();
762 kVec2f_GrSLType, "baseFrequency"); 762
763 const char* baseFrequencyUni = builder->getUniformCStr(fBaseFrequencyUni); 763 GrGLShaderBuilder::Uniform* baseFrequencyUni =
764 fAlphaUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 764 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSL Type, "baseFrequency");
765 kFloat_GrSLType, "alpha"); 765 fBaseFrequencyUni = baseFrequencyUni->glUniform();
766 const char* alphaUni = builder->getUniformCStr(fAlphaUni); 766
767 GrGLShaderBuilder::Uniform* alphaUni =
768 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSL Type, "alpha");
769 fAlphaUni = alphaUni->glUniform();
767 770
768 // Add vec3 modulo 289 function 771 // Add vec3 modulo 289 function
769 static const GrGLShaderVar gVec3Args[] = { 772 static const GrGLShaderVar gVec3Args[] = {
770 GrGLShaderVar("x", kVec3f_GrSLType) 773 GrGLShaderVar("x", kVec3f_GrSLType)
771 }; 774 };
772 775
773 SkString mod289_3_funcName; 776 SkString mod289_3_funcName;
774 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kVec3f_GrSLTy pe, 777 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kVec3f_GrSLTy pe,
775 "mod289", SK_ARRAY_COUNT(gVec3Args), gVec3Args, 778 "mod289", SK_ARRAY_COUNT(gVec3Args), gVec3Args,
776 "const vec2 C = vec2(1.0 / 289.0, 289.0);\n" 779 "const vec2 C = vec2(1.0 / 289.0, 289.0);\n"
(...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after
897 const char* yOffsets = "yOffsets"; 900 const char* yOffsets = "yOffsets";
898 const char* channel = "channel"; 901 const char* channel = "channel";
899 902
900 // Fill with some prime numbers 903 // Fill with some prime numbers
901 builder->fsCodeAppendf("\t\tconst vec4 %s = vec4(13.0, 53.0, 101.0, 151.0);\ n", xOffsets); 904 builder->fsCodeAppendf("\t\tconst vec4 %s = vec4(13.0, 53.0, 101.0, 151.0);\ n", xOffsets);
902 builder->fsCodeAppendf("\t\tconst vec4 %s = vec4(109.0, 167.0, 23.0, 67.0);\ n", yOffsets); 905 builder->fsCodeAppendf("\t\tconst vec4 %s = vec4(109.0, 167.0, 23.0, 67.0);\ n", yOffsets);
903 906
904 // There are rounding errors if the floor operation is not performed here 907 // There are rounding errors if the floor operation is not performed here
905 builder->fsCodeAppendf( 908 builder->fsCodeAppendf(
906 "\t\tvec3 %s = vec3(floor((%s*vec3(%s, 1.0)).xy) * vec2(0.66) * %s, 0.0) ;\n", 909 "\t\tvec3 %s = vec3(floor((%s*vec3(%s, 1.0)).xy) * vec2(0.66) * %s, 0.0) ;\n",
907 noiseVecIni, invMatrixUni, vCoords, baseFrequencyUni); 910 noiseVecIni, invMatrixUni->c_str(), vCoords, baseFrequencyUni->c_str());
908 911
909 // Perturb the texcoords with three components of noise 912 // Perturb the texcoords with three components of noise
910 builder->fsCodeAppendf("\t\t%s += 0.1 * vec3(%s(%s + vec3( 0.0, 0.0, %s)) ," 913 builder->fsCodeAppendf("\t\t%s += 0.1 * vec3(%s(%s + vec3( 0.0, 0.0, %s)) ,"
911 "%s(%s + vec3( 43.0, 17.0, %s)) ," 914 "%s(%s + vec3( 43.0, 17.0, %s)) ,"
912 "%s(%s + vec3(-17.0, -43.0, %s)) );\n", 915 "%s(%s + vec3(-17.0, -43.0, %s)) );\n",
913 noiseVecIni, noiseFuncName.c_str(), noiseVecIni, seed Uni, 916 noiseVecIni, noiseFuncName.c_str(), noiseVecIni, seed Uni->c_str(),
914 noiseFuncName.c_str(), noiseVecIni, seed Uni, 917 noiseFuncName.c_str(), noiseVecIni, seed Uni->c_str(),
915 noiseFuncName.c_str(), noiseVecIni, seed Uni); 918 noiseFuncName.c_str(), noiseVecIni, seed Uni->c_str());
916 919
917 builder->fsCodeAppendf("\t\t%s = vec4(0.0);\n", outputColor); 920 builder->fsCodeAppendf("\t\t%s = vec4(0.0);\n", outputColor);
918 921
919 builder->fsCodeAppendf("\t\tvec3 %s = vec3(1.0);\n", factors); 922 builder->fsCodeAppendf("\t\tvec3 %s = vec3(1.0);\n", factors);
920 builder->fsCodeAppendf("\t\tfloat %s = 0.0;\n", sum); 923 builder->fsCodeAppendf("\t\tfloat %s = 0.0;\n", sum);
921 924
922 // Loop over all octaves 925 // Loop over all octaves
923 builder->fsCodeAppendf("\t\tfor (int octave = 0; octave < %d; ++octave) {\n" , fNumOctaves); 926 builder->fsCodeAppendf("\t\tfor (int octave = 0; octave < %d; ++octave) {\n" , fNumOctaves);
924 927
925 // Loop over the 4 channels 928 // Loop over the 4 channels
926 builder->fsCodeAppendf("\t\t\tfor (int %s = 3; %s >= 0; --%s) {\n", channel, channel, channel); 929 builder->fsCodeAppendf("\t\t\tfor (int %s = 3; %s >= 0; --%s) {\n", channel, channel, channel);
927 930
928 builder->fsCodeAppendf( 931 builder->fsCodeAppendf(
929 "\t\t\t\t%s[channel] += %s.x * %s(%s * %s.yyy - vec3(%s[%s], %s[%s], %s * %s.z));\n", 932 "\t\t\t\t%s[channel] += %s.x * %s(%s * %s.yyy - vec3(%s[%s], %s[%s], %s * %s.z));\n",
930 outputColor, factors, noiseFuncName.c_str(), noiseVecIni, factors, xOffs ets, channel, 933 outputColor, factors, noiseFuncName.c_str(), noiseVecIni, factors, xOffs ets, channel,
931 yOffsets, channel, seedUni, factors); 934 yOffsets, channel, seedUni->c_str(), factors);
932 935
933 builder->fsCodeAppend("\t\t\t}\n"); // end of the for loop on channels 936 builder->fsCodeAppend("\t\t\t}\n"); // end of the for loop on channels
934 937
935 builder->fsCodeAppendf("\t\t\t%s += %s.x;\n", sum, factors); 938 builder->fsCodeAppendf("\t\t\t%s += %s.x;\n", sum, factors);
936 builder->fsCodeAppendf("\t\t\t%s *= vec3(0.5, 2.0, 0.75);\n", factors); 939 builder->fsCodeAppendf("\t\t\t%s *= vec3(0.5, 2.0, 0.75);\n", factors);
937 940
938 builder->fsCodeAppend("\t\t}\n"); // end of the for loop on octaves 941 builder->fsCodeAppend("\t\t}\n"); // end of the for loop on octaves
939 942
940 if (fType == SkPerlinNoiseShader::kFractalNoise_Type) { 943 if (fType == SkPerlinNoiseShader::kFractalNoise_Type) {
941 // The value of turbulenceFunctionResult comes from ((turbulenceFunction Result) + 1) / 2 944 // The value of turbulenceFunctionResult comes from ((turbulenceFunction Result) + 1) / 2
942 // by fractalNoise and (turbulenceFunctionResult) by turbulence. 945 // by fractalNoise and (turbulenceFunctionResult) by turbulence.
943 builder->fsCodeAppendf("\t\t%s = %s * vec4(0.5 / %s) + vec4(0.5);\n", 946 builder->fsCodeAppendf("\t\t%s = %s * vec4(0.5 / %s) + vec4(0.5);\n",
944 outputColor, outputColor, sum); 947 outputColor, outputColor, sum);
945 } else { 948 } else {
946 builder->fsCodeAppendf("\t\t%s = abs(%s / vec4(%s));\n", 949 builder->fsCodeAppendf("\t\t%s = abs(%s / vec4(%s));\n",
947 outputColor, outputColor, sum); 950 outputColor, outputColor, sum);
948 } 951 }
949 952
950 builder->fsCodeAppendf("\t\t%s.a *= %s;\n", outputColor, alphaUni); 953 builder->fsCodeAppendf("\t\t%s.a *= %s;\n", outputColor, alphaUni->c_str());
951 954
952 // Clamp values 955 // Clamp values
953 builder->fsCodeAppendf("\t\t%s = clamp(%s, 0.0, 1.0);\n", outputColor, outpu tColor); 956 builder->fsCodeAppendf("\t\t%s = clamp(%s, 0.0, 1.0);\n", outputColor, outpu tColor);
954 957
955 // Pre-multiply the result 958 // Pre-multiply the result
956 builder->fsCodeAppendf("\t\t%s = vec4(%s.rgb * %s.aaa, %s.a);\n", 959 builder->fsCodeAppendf("\t\t%s = vec4(%s.rgb * %s.aaa, %s.a);\n",
957 outputColor, outputColor, outputColor, outputColor); 960 outputColor, outputColor, outputColor, outputColor);
958 } 961 }
959 962
960 void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder, 963 void GrGLPerlinNoise::emitCode(GrGLShaderBuilder* builder,
961 const GrDrawEffect&, 964 const GrDrawEffect&,
962 EffectKey key, 965 EffectKey key,
963 const char* outputColor, 966 const char* outputColor,
964 const char* inputColor, 967 const char* inputColor,
965 const TextureSamplerArray& samplers) { 968 const TextureSamplerArray& samplers) {
966 sk_ignore_unused_variable(inputColor); 969 sk_ignore_unused_variable(inputColor);
967 970
968 const char* vCoords; 971 const char* vCoords;
969 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &vCoords); 972 fEffectMatrix.emitCodeMakeFSCoords2D(builder, key, &vCoords);
970 973
971 fInvMatrixUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, 974 GrGLShaderBuilder::Uniform* invMatrixUni =
972 kMat33f_GrSLType, "invMatrix"); 975 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kMat33f_GrS LType, "invMatrix");
973 const char* invMatrixUni = builder->getUniformCStr(fInvMatrixUni); 976 fInvMatrixUni = invMatrixUni->glUniform();
974 fBaseFrequencyUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderT ype,
975 kVec2f_GrSLType, "baseFrequency");
976 const char* baseFrequencyUni = builder->getUniformCStr(fBaseFrequencyUni);
977 fAlphaUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType,
978 kFloat_GrSLType, "alpha");
979 const char* alphaUni = builder->getUniformCStr(fAlphaUni);
980 977
981 const char* stitchDataUni = NULL; 978 GrGLShaderBuilder::Uniform* baseFrequencyUni =
979 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kVec2f_GrSL Type,
980 "baseFrequency");
981 fBaseFrequencyUni = baseFrequencyUni->glUniform();
982
983 GrGLShaderBuilder::Uniform* alphaUni =
984 builder->addUniform(GrGLShaderBuilder::kFragment_ShaderType, kFloat_GrSL Type, "alpha");
985 fAlphaUni = alphaUni->glUniform();
986
987 GrGLShaderBuilder::Uniform* stitchDataUni = NULL;
982 if (fStitchTiles) { 988 if (fStitchTiles) {
983 fStitchDataUni = builder->addUniform(GrGLShaderBuilder::kFragment_Shader Type, 989 stitchDataUni = builder->addUniform(GrGLShaderBuilder::kFragment_ShaderT ype,
984 kVec2f_GrSLType, "stitchData"); 990 kVec2f_GrSLType, "stitchData");
985 stitchDataUni = builder->getUniformCStr(fStitchDataUni); 991 fStitchDataUni = stitchDataUni->glUniform();
986 } 992 }
987 993
988 // There are 4 lines, so the center of each line is 1/8, 3/8, 5/8 and 7/8 994 // There are 4 lines, so the center of each line is 1/8, 3/8, 5/8 and 7/8
989 const char* chanCoordR = "0.125"; 995 const char* chanCoordR = "0.125";
990 const char* chanCoordG = "0.375"; 996 const char* chanCoordG = "0.375";
991 const char* chanCoordB = "0.625"; 997 const char* chanCoordB = "0.625";
992 const char* chanCoordA = "0.875"; 998 const char* chanCoordA = "0.875";
993 const char* chanCoord = "chanCoord"; 999 const char* chanCoord = "chanCoord";
994 const char* stitchData = "stitchData"; 1000 const char* stitchData = "stitchData";
995 const char* ratio = "ratio"; 1001 const char* ratio = "ratio";
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1141 "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseStitchAr gs), 1147 "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseStitchAr gs),
1142 gPerlinNoiseStitchArgs, noiseCode.c_str(), &noiseF uncName); 1148 gPerlinNoiseStitchArgs, noiseCode.c_str(), &noiseF uncName);
1143 } else { 1149 } else {
1144 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kFloat_Gr SLType, 1150 builder->emitFunction(GrGLShaderBuilder::kFragment_ShaderType, kFloat_Gr SLType,
1145 "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseArgs), 1151 "perlinnoise", SK_ARRAY_COUNT(gPerlinNoiseArgs),
1146 gPerlinNoiseArgs, noiseCode.c_str(), &noiseFuncNam e); 1152 gPerlinNoiseArgs, noiseCode.c_str(), &noiseFuncNam e);
1147 } 1153 }
1148 1154
1149 // There are rounding errors if the floor operation is not performed here 1155 // There are rounding errors if the floor operation is not performed here
1150 builder->fsCodeAppendf("\n\t\tvec2 %s = floor((%s * vec3(%s, 1.0)).xy) * %s; ", 1156 builder->fsCodeAppendf("\n\t\tvec2 %s = floor((%s * vec3(%s, 1.0)).xy) * %s; ",
1151 noiseVec, invMatrixUni, vCoords, baseFrequencyUni); 1157 noiseVec, invMatrixUni->c_str(), vCoords, baseFrequen cyUni->c_str());
1152 1158
1153 // Clear the color accumulator 1159 // Clear the color accumulator
1154 builder->fsCodeAppendf("\n\t\t%s = vec4(0.0);", outputColor); 1160 builder->fsCodeAppendf("\n\t\t%s = vec4(0.0);", outputColor);
1155 1161
1156 if (fStitchTiles) { 1162 if (fStitchTiles) {
1157 // Set up TurbulenceInitial stitch values. 1163 // Set up TurbulenceInitial stitch values.
1158 builder->fsCodeAppendf("\n\t\tvec2 %s = %s;", stitchData, stitchDataUni) ; 1164 builder->fsCodeAppendf("\n\t\tvec2 %s = %s;", stitchData, stitchDataUni- >c_str());
1159 } 1165 }
1160 1166
1161 builder->fsCodeAppendf("\n\t\tfloat %s = 1.0;", ratio); 1167 builder->fsCodeAppendf("\n\t\tfloat %s = 1.0;", ratio);
1162 1168
1163 // Loop over all octaves 1169 // Loop over all octaves
1164 builder->fsCodeAppendf("\n\t\tfor (int octave = 0; octave < %d; ++octave) {" , fNumOctaves); 1170 builder->fsCodeAppendf("\n\t\tfor (int octave = 0; octave < %d; ++octave) {" , fNumOctaves);
1165 1171
1166 builder->fsCodeAppendf("\n\t\t\t%s += ", outputColor); 1172 builder->fsCodeAppendf("\n\t\t\t%s += ", outputColor);
1167 if (fType != SkPerlinNoiseShader::kFractalNoise_Type) { 1173 if (fType != SkPerlinNoiseShader::kFractalNoise_Type) {
1168 builder->fsCodeAppend("abs("); 1174 builder->fsCodeAppend("abs(");
(...skipping 27 matching lines...) Expand all
1196 builder->fsCodeAppendf("\n\t\t\t%s *= vec2(2.0);", stitchData); 1202 builder->fsCodeAppendf("\n\t\t\t%s *= vec2(2.0);", stitchData);
1197 } 1203 }
1198 builder->fsCodeAppend("\n\t\t}"); // end of the for loop on octaves 1204 builder->fsCodeAppend("\n\t\t}"); // end of the for loop on octaves
1199 1205
1200 if (fType == SkPerlinNoiseShader::kFractalNoise_Type) { 1206 if (fType == SkPerlinNoiseShader::kFractalNoise_Type) {
1201 // The value of turbulenceFunctionResult comes from ((turbulenceFunction Result) + 1) / 2 1207 // The value of turbulenceFunctionResult comes from ((turbulenceFunction Result) + 1) / 2
1202 // by fractalNoise and (turbulenceFunctionResult) by turbulence. 1208 // by fractalNoise and (turbulenceFunctionResult) by turbulence.
1203 builder->fsCodeAppendf("\n\t\t%s = %s * vec4(0.5) + vec4(0.5);", outputC olor, outputColor); 1209 builder->fsCodeAppendf("\n\t\t%s = %s * vec4(0.5) + vec4(0.5);", outputC olor, outputColor);
1204 } 1210 }
1205 1211
1206 builder->fsCodeAppendf("\n\t\t%s.a *= %s;", outputColor, alphaUni); 1212 builder->fsCodeAppendf("\n\t\t%s.a *= %s;", outputColor, alphaUni->c_str());
1207 1213
1208 // Clamp values 1214 // Clamp values
1209 builder->fsCodeAppendf("\n\t\t%s = clamp(%s, 0.0, 1.0);", outputColor, outpu tColor); 1215 builder->fsCodeAppendf("\n\t\t%s = clamp(%s, 0.0, 1.0);", outputColor, outpu tColor);
1210 1216
1211 // Pre-multiply the result 1217 // Pre-multiply the result
1212 builder->fsCodeAppendf("\n\t\t%s = vec4(%s.rgb * %s.aaa, %s.a);\n", 1218 builder->fsCodeAppendf("\n\t\t%s = vec4(%s.rgb * %s.aaa, %s.a);\n",
1213 outputColor, outputColor, outputColor, outputColor); 1219 outputColor, outputColor, outputColor, outputColor);
1214 } 1220 }
1215 1221
1216 GrGLNoise::GrGLNoise(const GrBackendEffectFactory& factory, const GrDrawEffect& drawEffect) 1222 GrGLNoise::GrGLNoise(const GrBackendEffectFactory& factory, const GrDrawEffect& drawEffect)
(...skipping 28 matching lines...) Expand all
1245 } 1251 }
1246 1252
1247 key = key << GrGLEffectMatrix::kKeyBits; 1253 key = key << GrGLEffectMatrix::kKeyBits;
1248 1254
1249 SkMatrix m = turbulence.matrix(); 1255 SkMatrix m = turbulence.matrix();
1250 m.postTranslate(SK_Scalar1, SK_Scalar1); 1256 m.postTranslate(SK_Scalar1, SK_Scalar1);
1251 return key | GrGLEffectMatrix::GenKey(m, drawEffect, 1257 return key | GrGLEffectMatrix::GenKey(m, drawEffect,
1252 drawEffect.castEffect<GrPerlinNoiseEffect>().coordsType(), NULL ); 1258 drawEffect.castEffect<GrPerlinNoiseEffect>().coordsType(), NULL );
1253 } 1259 }
1254 1260
1255 void GrGLNoise::setData(const GrGLUniformManager& uman, const GrDrawEffect& draw Effect) { 1261 void GrGLNoise::setData(const GrGLContext& context, const GrDrawEffect& drawEffe ct) {
1256 const GrPerlinNoiseEffect& turbulence = drawEffect.castEffect<GrPerlinNoiseE ffect>(); 1262 const GrPerlinNoiseEffect& turbulence = drawEffect.castEffect<GrPerlinNoiseE ffect>();
1257 1263
1258 const SkVector& baseFrequency = turbulence.baseFrequency(); 1264 const SkVector& baseFrequency = turbulence.baseFrequency();
1259 uman.set2f(fBaseFrequencyUni, baseFrequency.fX, baseFrequency.fY); 1265 fBaseFrequencyUni->set2f(context, baseFrequency.fX, baseFrequency.fY);
1260 uman.set1f(fAlphaUni, SkScalarDiv(SkIntToScalar(turbulence.alpha()), SkIntTo Scalar(255))); 1266 fAlphaUni->set1f(context, SkScalarDiv(SkIntToScalar(turbulence.alpha()), SkI ntToScalar(255)));
1261 1267
1262 SkMatrix m = turbulence.matrix(); 1268 SkMatrix m = turbulence.matrix();
1263 SkMatrix invM; 1269 SkMatrix invM;
1264 if (!m.invert(&invM)) { 1270 if (!m.invert(&invM)) {
1265 invM.reset(); 1271 invM.reset();
1266 } else { 1272 } else {
1267 invM.postConcat(invM); // Square the matrix 1273 invM.postConcat(invM); // Square the matrix
1268 } 1274 }
1269 uman.setSkMatrix(fInvMatrixUni, invM); 1275 fInvMatrixUni->setSkMatrix(context, invM);
1270 1276
1271 // This (1,1) translation is due to WebKit's 1 based coordinates for the noi se 1277 // This (1,1) translation is due to WebKit's 1 based coordinates for the noi se
1272 // (as opposed to 0 based, usually). The same adjustment is in the shadeSpan () functions. 1278 // (as opposed to 0 based, usually). The same adjustment is in the shadeSpan () functions.
1273 m.postTranslate(SK_Scalar1, SK_Scalar1); 1279 m.postTranslate(SK_Scalar1, SK_Scalar1);
1274 fEffectMatrix.setData(uman, m, drawEffect, NULL); 1280 fEffectMatrix.setData(context, m, drawEffect, NULL);
1275 } 1281 }
1276 1282
1277 void GrGLPerlinNoise::setData(const GrGLUniformManager& uman, const GrDrawEffect & drawEffect) { 1283 void GrGLPerlinNoise::setData(const GrGLContext& context, const GrDrawEffect& dr awEffect) {
1278 INHERITED::setData(uman, drawEffect); 1284 INHERITED::setData(context, drawEffect);
1279 1285
1280 const GrPerlinNoiseEffect& turbulence = drawEffect.castEffect<GrPerlinNoiseE ffect>(); 1286 const GrPerlinNoiseEffect& turbulence = drawEffect.castEffect<GrPerlinNoiseE ffect>();
1281 if (turbulence.stitchTiles()) { 1287 if (turbulence.stitchTiles()) {
1282 const SkPerlinNoiseShader::StitchData& stitchData = turbulence.stitchDat a(); 1288 const SkPerlinNoiseShader::StitchData& stitchData = turbulence.stitchDat a();
1283 uman.set2f(fStitchDataUni, SkIntToScalar(stitchData.fWidth), 1289 fStitchDataUni->set2f(context, SkIntToScalar(stitchData.fWidth),
1284 SkIntToScalar(stitchData.fHeight)); 1290 SkIntToScalar(stitchData.fHeight));
1285 } 1291 }
1286 } 1292 }
1287 1293
1288 void GrGLSimplexNoise::setData(const GrGLUniformManager& uman, const GrDrawEffec t& drawEffect) { 1294 void GrGLSimplexNoise::setData(const GrGLContext& context, const GrDrawEffect& d rawEffect) {
1289 INHERITED::setData(uman, drawEffect); 1295 INHERITED::setData(context, drawEffect);
1290 1296
1291 const GrSimplexNoiseEffect& turbulence = drawEffect.castEffect<GrSimplexNois eEffect>(); 1297 const GrSimplexNoiseEffect& turbulence = drawEffect.castEffect<GrSimplexNois eEffect>();
1292 uman.set1f(fSeedUni, turbulence.seed()); 1298 fSeedUni->set1f(context, turbulence.seed());
1293 } 1299 }
1294 1300
1295 ///////////////////////////////////////////////////////////////////// 1301 /////////////////////////////////////////////////////////////////////
1296 1302
1297 GrEffectRef* SkPerlinNoiseShader::asNewEffect(GrContext* context, const SkPaint& paint) const { 1303 GrEffectRef* SkPerlinNoiseShader::asNewEffect(GrContext* context, const SkPaint& paint) const {
1298 SkASSERT(NULL != context); 1304 SkASSERT(NULL != context);
1299 1305
1300 // Either we don't stitch tiles, either we have a valid tile size 1306 // Either we don't stitch tiles, either we have a valid tile size
1301 SkASSERT(!fStitchTiles || !fTileSize.isEmpty()); 1307 SkASSERT(!fStitchTiles || !fTileSize.isEmpty());
1302 1308
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after
1369 str->append(" seed: "); 1375 str->append(" seed: ");
1370 str->appendScalar(fSeed); 1376 str->appendScalar(fSeed);
1371 str->append(" stitch tiles: "); 1377 str->append(" stitch tiles: ");
1372 str->append(fStitchTiles ? "true " : "false "); 1378 str->append(fStitchTiles ? "true " : "false ");
1373 1379
1374 this->INHERITED::toString(str); 1380 this->INHERITED::toString(str);
1375 1381
1376 str->append(")"); 1382 str->append(")");
1377 } 1383 }
1378 #endif 1384 #endif
OLDNEW
« no previous file with comments | « src/effects/SkMorphologyImageFilter.cpp ('k') | src/effects/SkTableColorFilter.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698