static GrEffectRef* Create(bool stroke) {
        // we go through this so we only have one copy of each effect (stroked/filled)
        static SkAutoTUnref<GrEffectRef> gCircleStrokeEdgeEffectRef(
                        CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(CircleEdgeEffect, (true)))));
        static SkAutoTUnref<GrEffectRef> gCircleFillEdgeEffectRef(
                        CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(CircleEdgeEffect, (false)))));

        if (stroke) {
            gCircleStrokeEdgeEffectRef.get()->ref();
            return gCircleStrokeEdgeEffectRef;
        } else {
            gCircleFillEdgeEffectRef.get()->ref();
            return gCircleFillEdgeEffectRef;
        }
    }
    static GrEffectRef* Create() {
        // we go through this so we only have one copy of each effect
        static GrEffectRef* gHairQuadEdgeEffectRef = 
            CreateEffectRef(AutoEffectUnref(SkNEW(HairQuadEdgeEffect)));
        static SkAutoTUnref<GrEffectRef> gUnref(gHairQuadEdgeEffectRef);

        gHairQuadEdgeEffectRef->ref();
        return gHairQuadEdgeEffectRef;
    }
 static GrEffectRef* Create(const SkRect& rect) {
     return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(AARectEffect, (rect))));
 }
 static GrEffectRef* Create() {
     return CreateEffectRef(AutoEffectUnref(SkNEW(DitherEffect)));
 }
 static GrEffectRef* Create(EdgeType edgeType, const SkRect& rect) {
     return CreateEffectRef(AutoEffectUnref(SkNEW_ARGS(AARectEffect, (edgeType, rect))));
 }