OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |