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

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

Issue 374923002: Goodbye GrEffectRef. (Closed) Base URL: https://skia.googlesource.com/skia.git@noref3
Patch Set: Address comments Created 6 years, 5 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
« 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 "SkColorFilter.h" 10 #include "SkColorFilter.h"
(...skipping 507 matching lines...) Expand 10 before | Expand all | Expand 10 after
518 GrGLUniformManager::UniformHandle fAlphaUni; 518 GrGLUniformManager::UniformHandle fAlphaUni;
519 519
520 private: 520 private:
521 typedef GrGLEffect INHERITED; 521 typedef GrGLEffect INHERITED;
522 }; 522 };
523 523
524 ///////////////////////////////////////////////////////////////////// 524 /////////////////////////////////////////////////////////////////////
525 525
526 class GrPerlinNoiseEffect : public GrEffect { 526 class GrPerlinNoiseEffect : public GrEffect {
527 public: 527 public:
528 static GrEffectRef* Create(SkPerlinNoiseShader::Type type, 528 static GrEffect* Create(SkPerlinNoiseShader::Type type,
529 int numOctaves, bool stitchTiles, 529 int numOctaves, bool stitchTiles,
530 SkPerlinNoiseShader::PaintingData* paintingData, 530 SkPerlinNoiseShader::PaintingData* paintingData,
531 GrTexture* permutationsTexture, GrTexture* noiseT exture, 531 GrTexture* permutationsTexture, GrTexture* noiseText ure,
532 const SkMatrix& matrix, uint8_t alpha) { 532 const SkMatrix& matrix, uint8_t alpha) {
533 return SkNEW_ARGS(GrPerlinNoiseEffect, (type, numOctaves, stitchTiles, p aintingData, 533 return SkNEW_ARGS(GrPerlinNoiseEffect, (type, numOctaves, stitchTiles, p aintingData,
534 permutationsTexture, noiseTextur e, matrix, alpha)); 534 permutationsTexture, noiseTextur e, matrix, alpha));
535 } 535 }
536 536
537 virtual ~GrPerlinNoiseEffect() { 537 virtual ~GrPerlinNoiseEffect() {
538 SkDELETE(fPaintingData); 538 SkDELETE(fPaintingData);
539 } 539 }
540 540
541 static const char* Name() { return "PerlinNoise"; } 541 static const char* Name() { return "PerlinNoise"; }
542 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE { 542 virtual const GrBackendEffectFactory& getFactory() const SK_OVERRIDE {
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
601 *validFlags = 0; // This is noise. Nothing is constant. 601 *validFlags = 0; // This is noise. Nothing is constant.
602 } 602 }
603 603
604 private: 604 private:
605 typedef GrEffect INHERITED; 605 typedef GrEffect INHERITED;
606 }; 606 };
607 607
608 ///////////////////////////////////////////////////////////////////// 608 /////////////////////////////////////////////////////////////////////
609 GR_DEFINE_EFFECT_TEST(GrPerlinNoiseEffect); 609 GR_DEFINE_EFFECT_TEST(GrPerlinNoiseEffect);
610 610
611 GrEffectRef* GrPerlinNoiseEffect::TestCreate(SkRandom* random, 611 GrEffect* GrPerlinNoiseEffect::TestCreate(SkRandom* random,
612 GrContext* context, 612 GrContext* context,
613 const GrDrawTargetCaps&, 613 const GrDrawTargetCaps&,
614 GrTexture**) { 614 GrTexture**) {
615 int numOctaves = random->nextRangeU(2, 10); 615 int numOctaves = random->nextRangeU(2, 10);
616 bool stitchTiles = random->nextBool(); 616 bool stitchTiles = random->nextBool();
617 SkScalar seed = SkIntToScalar(random->nextU()); 617 SkScalar seed = SkIntToScalar(random->nextU());
618 SkISize tileSize = SkISize::Make(random->nextRangeU(4, 4096), random->nextR angeU(4, 4096)); 618 SkISize tileSize = SkISize::Make(random->nextRangeU(4, 4096), random->nextR angeU(4, 4096));
619 SkScalar baseFrequencyX = random->nextRangeScalar(0.01f, 619 SkScalar baseFrequencyX = random->nextRangeScalar(0.01f,
620 0.99f); 620 0.99f);
621 SkScalar baseFrequencyY = random->nextRangeScalar(0.01f, 621 SkScalar baseFrequencyY = random->nextRangeScalar(0.01f,
622 0.99f); 622 0.99f);
623 623
624 SkShader* shader = random->nextBool() ? 624 SkShader* shader = random->nextBool() ?
625 SkPerlinNoiseShader::CreateFractalNoise(baseFrequencyX, baseFrequencyY, numOctaves, seed, 625 SkPerlinNoiseShader::CreateFractalNoise(baseFrequencyX, baseFrequencyY, numOctaves, seed,
626 stitchTiles ? &tileSize : NULL) : 626 stitchTiles ? &tileSize : NULL) :
627 SkPerlinNoiseShader::CreateTurbulence(baseFrequencyX, baseFrequencyY, nu mOctaves, seed, 627 SkPerlinNoiseShader::CreateTurbulence(baseFrequencyX, baseFrequencyY, nu mOctaves, seed,
628 stitchTiles ? &tileSize : NULL); 628 stitchTiles ? &tileSize : NULL);
629 629
630 SkPaint paint; 630 SkPaint paint;
631 GrColor grColor; 631 GrColor paintColor;
632 GrEffectRef* effect; 632 GrEffect* effect;
633 shader->asNewEffect(context, paint, NULL, &grColor, &effect); 633 SkAssertResult(shader->asNewEffect(context, paint, NULL, &paintColor, &effec t));
634 634
635 SkDELETE(shader); 635 SkDELETE(shader);
636 636
637 return effect; 637 return effect;
638 } 638 }
639 639
640 GrGLPerlinNoise::GrGLPerlinNoise(const GrBackendEffectFactory& factory, const Gr DrawEffect& drawEffect) 640 GrGLPerlinNoise::GrGLPerlinNoise(const GrBackendEffectFactory& factory, const Gr DrawEffect& drawEffect)
641 : INHERITED (factory) 641 : INHERITED (factory)
642 , fType(drawEffect.castEffect<GrPerlinNoiseEffect>().type()) 642 , fType(drawEffect.castEffect<GrPerlinNoiseEffect>().type())
643 , fStitchTiles(drawEffect.castEffect<GrPerlinNoiseEffect>().stitchTiles()) 643 , fStitchTiles(drawEffect.castEffect<GrPerlinNoiseEffect>().stitchTiles())
(...skipping 293 matching lines...) Expand 10 before | Expand all | Expand 10 after
937 if (turbulence.stitchTiles()) { 937 if (turbulence.stitchTiles()) {
938 const SkPerlinNoiseShader::StitchData& stitchData = turbulence.stitchDat a(); 938 const SkPerlinNoiseShader::StitchData& stitchData = turbulence.stitchDat a();
939 uman.set2f(fStitchDataUni, SkIntToScalar(stitchData.fWidth), 939 uman.set2f(fStitchDataUni, SkIntToScalar(stitchData.fWidth),
940 SkIntToScalar(stitchData.fHeight)); 940 SkIntToScalar(stitchData.fHeight));
941 } 941 }
942 } 942 }
943 943
944 ///////////////////////////////////////////////////////////////////// 944 /////////////////////////////////////////////////////////////////////
945 945
946 bool SkPerlinNoiseShader::asNewEffect(GrContext* context, const SkPaint& paint, 946 bool SkPerlinNoiseShader::asNewEffect(GrContext* context, const SkPaint& paint,
947 const SkMatrix* externalLocalMatrix, GrCol or* grColor, 947 const SkMatrix* externalLocalMatrix, GrCol or* paintColor,
948 GrEffect** grEffect) const { 948 GrEffect** effect) const {
949 SkASSERT(NULL != context); 949 SkASSERT(NULL != context);
950 950
951 *grColor = SkColor2GrColorJustAlpha(paint.getColor()); 951 *paintColor = SkColor2GrColorJustAlpha(paint.getColor());
952 952
953 SkMatrix localMatrix = this->getLocalMatrix(); 953 SkMatrix localMatrix = this->getLocalMatrix();
954 if (externalLocalMatrix) { 954 if (externalLocalMatrix) {
955 localMatrix.preConcat(*externalLocalMatrix); 955 localMatrix.preConcat(*externalLocalMatrix);
956 } 956 }
957 957
958 SkMatrix matrix = context->getMatrix(); 958 SkMatrix matrix = context->getMatrix();
959 matrix.preConcat(localMatrix); 959 matrix.preConcat(localMatrix);
960 960
961 if (0 == fNumOctaves) { 961 if (0 == fNumOctaves) {
962 SkColor clearColor = 0; 962 SkColor clearColor = 0;
963 if (kFractalNoise_Type == fType) { 963 if (kFractalNoise_Type == fType) {
964 clearColor = SkColorSetARGB(paint.getAlpha() / 2, 127, 127, 127); 964 clearColor = SkColorSetARGB(paint.getAlpha() / 2, 127, 127, 127);
965 } 965 }
966 SkAutoTUnref<SkColorFilter> cf(SkColorFilter::CreateModeFilter( 966 SkAutoTUnref<SkColorFilter> cf(SkColorFilter::CreateModeFilter(
967 clearColor, SkXfermode::kSrc_Mod e)); 967 clearColor, SkXfermode::kSrc_Mod e));
968 *grEffect = cf->asNewEffect(context); 968 *effect = cf->asNewEffect(context);
969 return true; 969 return true;
970 } 970 }
971 971
972 // Either we don't stitch tiles, either we have a valid tile size 972 // Either we don't stitch tiles, either we have a valid tile size
973 SkASSERT(!fStitchTiles || !fTileSize.isEmpty()); 973 SkASSERT(!fStitchTiles || !fTileSize.isEmpty());
974 974
975 SkPerlinNoiseShader::PaintingData* paintingData = SkNEW_ARGS(PaintingData, ( fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY, matrix)); 975 SkPerlinNoiseShader::PaintingData* paintingData = SkNEW_ARGS(PaintingData, ( fTileSize, fSeed, fBaseFrequencyX, fBaseFrequencyY, matrix));
976 GrTexture* permutationsTexture = GrLockAndRefCachedBitmapTexture( 976 GrTexture* permutationsTexture = GrLockAndRefCachedBitmapTexture(
977 context, paintingData->getPermutationsBitmap(), NULL); 977 context, paintingData->getPermutationsBitmap(), NULL);
978 GrTexture* noiseTexture = GrLockAndRefCachedBitmapTexture( 978 GrTexture* noiseTexture = GrLockAndRefCachedBitmapTexture(
979 context, paintingData->getNoiseBitmap(), NULL); 979 context, paintingData->getNoiseBitmap(), NULL);
980 980
981 SkMatrix m = context->getMatrix(); 981 SkMatrix m = context->getMatrix();
982 m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1); 982 m.setTranslateX(-localMatrix.getTranslateX() + SK_Scalar1);
983 m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1); 983 m.setTranslateY(-localMatrix.getTranslateY() + SK_Scalar1);
984 if ((NULL != permutationsTexture) && (NULL != noiseTexture)) { 984 if ((NULL != permutationsTexture) && (NULL != noiseTexture)) {
985 *grEffect = GrPerlinNoiseEffect::Create(fType, 985 *effect = GrPerlinNoiseEffect::Create(fType,
986 fNumOctaves, 986 fNumOctaves,
987 fStitchTiles, 987 fStitchTiles,
988 paintingData, 988 paintingData,
989 permutationsTexture, noiseTextur e, 989 permutationsTexture, noiseTextur e,
990 m, paint.getAlpha()); 990 m, paint.getAlpha());
991 } else { 991 } else {
992 SkDELETE(paintingData); 992 SkDELETE(paintingData);
993 *grEffect = NULL; 993 *effect = NULL;
994 } 994 }
995 995
996 // Unlock immediately, this is not great, but we don't have a way of 996 // Unlock immediately, this is not great, but we don't have a way of
997 // knowing when else to unlock it currently. TODO: Remove this when 997 // knowing when else to unlock it currently. TODO: Remove this when
998 // unref becomes the unlock replacement for all types of textures. 998 // unref becomes the unlock replacement for all types of textures.
999 if (NULL != permutationsTexture) { 999 if (NULL != permutationsTexture) {
1000 GrUnlockAndUnrefCachedBitmapTexture(permutationsTexture); 1000 GrUnlockAndUnrefCachedBitmapTexture(permutationsTexture);
1001 } 1001 }
1002 if (NULL != noiseTexture) { 1002 if (NULL != noiseTexture) {
1003 GrUnlockAndUnrefCachedBitmapTexture(noiseTexture); 1003 GrUnlockAndUnrefCachedBitmapTexture(noiseTexture);
1004 } 1004 }
1005 1005
1006 return true; 1006 return true;
1007 } 1007 }
1008 1008
1009 #else 1009 #else
1010 1010
1011 bool SkPerlinNoiseShader::asNewEffect(GrContext* context, const SkPaint& paint, 1011 bool SkPerlinNoiseShader::asNewEffect(GrContext* context, const SkPaint& paint,
1012 const SkMatrix* externalLocalMatrix, GrCol or* grColor, 1012 const SkMatrix* externalLocalMatrix, GrCol or* paintColor,
1013 GrEffect** grEffect) const { 1013 GrEffect** effect) const {
1014 SkDEBUGFAIL("Should not call in GPU-less build"); 1014 SkDEBUGFAIL("Should not call in GPU-less build");
1015 return false; 1015 return false;
1016 } 1016 }
1017 1017
1018 #endif 1018 #endif
1019 1019
1020 #ifndef SK_IGNORE_TO_STRING 1020 #ifndef SK_IGNORE_TO_STRING
1021 void SkPerlinNoiseShader::toString(SkString* str) const { 1021 void SkPerlinNoiseShader::toString(SkString* str) const {
1022 str->append("SkPerlinNoiseShader: ("); 1022 str->append("SkPerlinNoiseShader: (");
1023 1023
(...skipping 18 matching lines...) Expand all
1042 str->append(" seed: "); 1042 str->append(" seed: ");
1043 str->appendScalar(fSeed); 1043 str->appendScalar(fSeed);
1044 str->append(" stitch tiles: "); 1044 str->append(" stitch tiles: ");
1045 str->append(fStitchTiles ? "true " : "false "); 1045 str->append(fStitchTiles ? "true " : "false ");
1046 1046
1047 this->INHERITED::toString(str); 1047 this->INHERITED::toString(str);
1048 1048
1049 str->append(")"); 1049 str->append(")");
1050 } 1050 }
1051 #endif 1051 #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