1 /* 2 * Copyright 2012 Google Inc. 3 * 4 * Use of this source code is governed by a BSD-style license that can be 5 * found in the LICENSE file. 6 */ 7 8 #ifndef GrEffectUnitTest_DEFINED 9 #define GrEffectUnitTest_DEFINED 10 11 #include "SkRandom.h" 12 #include "SkTArray.h" 13 #include "SkTypes.h" 14 15 class SkMatrix; 16 class GrDrawTargetCaps; 17 18 namespace GrEffectUnitTest { 19 // Used to access the dummy textures in TestCreate procs. 20 enum { 21 kSkiaPMTextureIdx = 0, 22 kAlphaTextureIdx = 1, 23 }; 24 25 /** 26 * A helper for use in GrEffect::TestCreate functions. 27 */ 28 const SkMatrix& TestMatrix(SkRandom*); 29 30 } 31 32 #if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 33 34 class GrContext; 35 class GrEffectRef; 36 class GrTexture; 37 38 class GrEffectTestFactory : SkNoncopyable { 39 public: 40 41 typedef GrEffectRef* (*CreateProc)(SkRandom*, 42 GrContext*, 43 const GrDrawTargetCaps& caps, 44 GrTexture* dummyTextures[]); 45 GrEffectTestFactory(CreateProc createProc)46 GrEffectTestFactory(CreateProc createProc) { 47 fCreateProc = createProc; 48 GetFactories()->push_back(this); 49 } 50 CreateStage(SkRandom * random,GrContext * context,const GrDrawTargetCaps & caps,GrTexture * dummyTextures[])51 static GrEffectRef* CreateStage(SkRandom* random, 52 GrContext* context, 53 const GrDrawTargetCaps& caps, 54 GrTexture* dummyTextures[]) { 55 uint32_t idx = random->nextRangeU(0, GetFactories()->count() - 1); 56 GrEffectTestFactory* factory = (*GetFactories())[idx]; 57 return factory->fCreateProc(random, context, caps, dummyTextures); 58 } 59 60 private: 61 CreateProc fCreateProc; 62 static SkTArray<GrEffectTestFactory*, true>* GetFactories(); 63 }; 64 65 /** GrEffect subclasses should insert this macro in their declaration to be included in the 66 * program generation unit test. 67 */ 68 #define GR_DECLARE_EFFECT_TEST \ 69 static GrEffectTestFactory gTestFactory; \ 70 static GrEffectRef* TestCreate(SkRandom*, \ 71 GrContext*, \ 72 const GrDrawTargetCaps&, \ 73 GrTexture* dummyTextures[2]) 74 75 /** GrEffect subclasses should insert this macro in their implementation file. They must then 76 * also implement this static function: 77 * GrEffect* TestCreate(SkRandom*, 78 * GrContext*, 79 * const GrDrawTargetCaps&, 80 * GrTexture* dummyTextures[2]); 81 * dummyTextures[] are valid textures that can optionally be used to construct GrTextureAccesses. 82 * The first texture has config kSkia8888_GrPixelConfig and the second has 83 * kAlpha_8_GrPixelConfig. TestCreate functions are also free to create additional textures using 84 * the GrContext. 85 */ 86 #define GR_DEFINE_EFFECT_TEST(Effect) \ 87 GrEffectTestFactory Effect :: gTestFactory(Effect :: TestCreate) 88 89 #else // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 90 91 // The unit test relies on static initializers. Just declare the TestCreate function so that 92 // its definitions will compile. 93 #define GR_DECLARE_EFFECT_TEST \ 94 static GrEffectRef* TestCreate(SkRandom*, \ 95 GrContext*, \ 96 const GrDrawTargetCaps&, \ 97 GrTexture* dummyTextures[2]) 98 #define GR_DEFINE_EFFECT_TEST(X) 99 100 #endif // !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS 101 #endif 102