| Index: gm/blurroundrect.cpp
 | 
| diff --git a/gm/blurroundrect.cpp b/gm/blurroundrect.cpp
 | 
| index 5a2fa01db785d73e17175d7616063282627c8de2..575606c4cbcac7af890d83b1753ce13f8f5be22b 100644
 | 
| --- a/gm/blurroundrect.cpp
 | 
| +++ b/gm/blurroundrect.cpp
 | 
| @@ -19,36 +19,27 @@
 | 
|  #include "SkString.h"
 | 
|  #include "SkXfermode.h"
 | 
|  
 | 
| +// This GM mimics a blurred RR seen in the wild.
 | 
|  class BlurRoundRectGM : public skiagm::GM {
 | 
|  public:
 | 
| -    BlurRoundRectGM(int width, int height,
 | 
| -                    // X and Y radii for the upper left corner
 | 
| -                    int ulX, int ulY,
 | 
| -                    // X and Y radii for the upper right corner
 | 
| -                    int urX, int urY,
 | 
| -                    // X and Y radii for the lower right corner
 | 
| -                    int lrX, int lrY,
 | 
| -                    // X and Y radii for the lower left corner
 | 
| -                    int llX, int llY,
 | 
| -                    int scaleX, int scaleY)
 | 
| +    BlurRoundRectGM(int width, int height, int radius)
 | 
|          : fName("blurroundrect")
 | 
| -        , fWidth(width)
 | 
| -        , fHeight(height)
 | 
| -        , fScaleX(SkIntToScalar(scaleX))
 | 
| -        , fScaleY(SkIntToScalar(scaleY)) {
 | 
| -        fName.appendf("-WH[%ix%i]-UL[%ix%i]-UR[%ix%i]-LR[%ix%i]-LL[%ix%i]-scale[%ix%i]",
 | 
| -                      width,  height,
 | 
| -                      ulX,    ulY,
 | 
| -                      urX,    urY,
 | 
| -                      lrX,    lrY,
 | 
| -                      llX,    llY,
 | 
| -                      scaleX, scaleY);
 | 
| +    {
 | 
| +        SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
 | 
| +        fRRect.setRectXY(r, SkIntToScalar(radius), SkIntToScalar(radius));
 | 
| +        fName.appendf("-WH[%ix%i]-corner[%i]", width, height, radius);
 | 
| +    }
 | 
| +
 | 
| +    BlurRoundRectGM(int width, int height)
 | 
| +        : fName("blurroundrect") {
 | 
| +        fName.appendf("-WH[%ix%i]-unevenCorners",
 | 
| +                      width,  height);
 | 
|          SkVector radii[4];
 | 
| -        radii[0].set(SkIntToScalar(ulX), SkIntToScalar(ulY));
 | 
| -        radii[1].set(SkIntToScalar(urX), SkIntToScalar(urY));
 | 
| -        radii[2].set(SkIntToScalar(lrX), SkIntToScalar(lrY));
 | 
| -        radii[3].set(SkIntToScalar(llX), SkIntToScalar(llY));
 | 
| -        SkRect r = SkRect::MakeWH(SkIntToScalar(fWidth), SkIntToScalar(fHeight));
 | 
| +        radii[0].set(SkIntToScalar(30), SkIntToScalar(30));
 | 
| +        radii[1].set(SkIntToScalar(10), SkIntToScalar(10));
 | 
| +        radii[2].set(SkIntToScalar(30), SkIntToScalar(30));
 | 
| +        radii[3].set(SkIntToScalar(10), SkIntToScalar(10));
 | 
| +        SkRect r = SkRect::MakeWH(SkIntToScalar(width), SkIntToScalar(height));
 | 
|          fRRect.setRectRadii(r, radii);
 | 
|      }
 | 
|  
 | 
| @@ -57,63 +48,17 @@ public:
 | 
|      }
 | 
|  
 | 
|      virtual SkISize onISize() SK_OVERRIDE {
 | 
| -        SkISize size = this->getUnscaledSize();
 | 
| -        return SkISize::Make(SkScalarCeilToInt(SkScalarMul(size.fWidth, fScaleX)),
 | 
| -                             SkScalarCeilToInt(SkScalarMul(size.fHeight, fScaleY)));
 | 
| -    }
 | 
| -
 | 
| -    virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
 | 
| -        canvas->scale(fScaleX, fScaleY);
 | 
| -    }
 | 
| -
 | 
| -    const SkRRect& getRRect() const {
 | 
| -        return fRRect;
 | 
| -    }
 | 
| -
 | 
| -    // The subclass will implement this to inform us how big they
 | 
| -    // draw before scaling.
 | 
| -    virtual SkISize getUnscaledSize() const = 0;
 | 
| -
 | 
| -    // So subclasses can modify the name.
 | 
| -    SkString* getName() {
 | 
| -        return &fName;
 | 
| -    }
 | 
| -
 | 
| -private:
 | 
| -    SkString fName;
 | 
| -    const int fWidth;
 | 
| -    const int fHeight;
 | 
| -    const SkScalar fScaleX;
 | 
| -    const SkScalar fScaleY;
 | 
| -    SkRRect fRRect;
 | 
| -    typedef skiagm::GM INHERITED;
 | 
| -};
 | 
| -
 | 
| -class SKPBlurRoundRectGM : public BlurRoundRectGM {
 | 
| -public:
 | 
| -    SKPBlurRoundRectGM(int width, int height,
 | 
| -                       int ulX, int ulY,
 | 
| -                       int urX, int urY,
 | 
| -                       int lrX, int lrY,
 | 
| -                       int llX, int llY,
 | 
| -                       int scaleX, int scaleY)
 | 
| -        : INHERITED(width, height, ulX, ulY, urX, urY, lrX, lrY, llX, llY, scaleX, scaleY) {
 | 
| -        this->getName()->prepend("skp-");
 | 
| -    }
 | 
| -
 | 
| -protected:
 | 
| -    virtual SkISize getUnscaledSize() const SK_OVERRIDE {
 | 
| -        return SkISize::Make(SkScalarCeilToInt(this->getRRect().rect().width()),
 | 
| -                             SkScalarCeilToInt(this->getRRect().rect().height()));
 | 
| +        return SkISize::Make(SkScalarCeilToInt(fRRect.rect().width()),
 | 
| +                             SkScalarCeilToInt(fRRect.rect().height()));
 | 
|      }
 | 
|  
 | 
|      virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
 | 
| -        this->INHERITED::onDraw(canvas);
 | 
|          SkLayerDrawLooper* looper = new SkLayerDrawLooper;
 | 
|          {
 | 
|              SkLayerDrawLooper::LayerInfo info;
 | 
|              info.fFlagsMask = 0;
 | 
| -            info.fPaintBits = 40;
 | 
| +            info.fPaintBits = SkLayerDrawLooper::kMaskFilter_Bit
 | 
| +                              | SkLayerDrawLooper::kColorFilter_Bit;
 | 
|              info.fColorMode = SkXfermode::kSrc_Mode;
 | 
|              info.fOffset = SkPoint::Make(SkIntToScalar(-1), SkIntToScalar(0));
 | 
|              info.fPostTranslate = false;
 | 
| @@ -132,80 +77,72 @@ protected:
 | 
|              looper->addLayerOnTop(info);
 | 
|          }
 | 
|          SkPaint paint;
 | 
| -        canvas->drawRect(this->getRRect().rect(), paint);
 | 
| +        canvas->drawRect(fRRect.rect(), paint);
 | 
|  
 | 
|          paint.setLooper(looper)->unref();
 | 
|          paint.setColor(SK_ColorCYAN);
 | 
|          paint.setAntiAlias(true);
 | 
|  
 | 
| -        canvas->drawRRect(this->getRRect(), paint);
 | 
| +        canvas->drawRRect(fRRect, paint);
 | 
|      }
 | 
|  
 | 
|  private:
 | 
| -    typedef BlurRoundRectGM INHERITED;
 | 
| +    SkString        fName;
 | 
| +    SkRRect         fRRect;
 | 
| +
 | 
| +    typedef skiagm::GM INHERITED;
 | 
|  };
 | 
|  
 | 
| -class SimpleBlurRoundRectGM : public BlurRoundRectGM {
 | 
| +// Simpler blurred RR test cases where all the radii are the same.
 | 
| +class SimpleBlurRoundRectGM : public skiagm::GM {
 | 
|  public:
 | 
| -    SimpleBlurRoundRectGM(int width, int height,
 | 
| -                          int blurRadius, int cornerRadius,
 | 
| -                          int scaleX = 1, int scaleY = 1)
 | 
| -        : INHERITED(width, height, cornerRadius, cornerRadius,
 | 
| -                    cornerRadius, cornerRadius, cornerRadius,
 | 
| -                    cornerRadius, cornerRadius, cornerRadius, scaleX, scaleY)
 | 
| -        , fBlurRadius(blurRadius) {
 | 
| -        // For now at least, change the name to reflect only the
 | 
| -        // variables that are changing.
 | 
| -        this->getName()->printf("blurround-blur[%i]-corner[%i]-scale[%ix%i]", fBlurRadius, cornerRadius, scaleX, scaleY);
 | 
| +    SimpleBlurRoundRectGM()
 | 
| +        : fName("simpleblurroundrect") {
 | 
|      }
 | 
|  
 | 
|  protected:
 | 
| -    virtual SkISize getUnscaledSize() const SK_OVERRIDE {
 | 
| -        return SkISize::Make(SkScalarCeilToInt(this->getRRect().rect().width() + 20),
 | 
| -                             SkScalarCeilToInt(this->getRRect().rect().height() + 20));
 | 
| +    virtual SkString onShortName() SK_OVERRIDE {
 | 
| +        return fName;
 | 
| +    }
 | 
| +
 | 
| +    virtual SkISize onISize() SK_OVERRIDE {
 | 
| +        return SkISize::Make(SkIntToScalar(750), SkIntToScalar(750));
 | 
|      }
 | 
|  
 | 
|      virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
 | 
| -        // Handle the scaling.
 | 
| -        this->INHERITED::onDraw(canvas);
 | 
| -        canvas->translate(SkIntToScalar(10), SkIntToScalar(10));
 | 
| -        SkMaskFilter* filter = SkBlurMaskFilter::Create(SkIntToScalar(fBlurRadius),
 | 
| -                SkBlurMaskFilter::kNormal_BlurStyle);
 | 
| -        SkPaint paint;
 | 
| -        paint.setColor(SK_ColorBLUE);
 | 
| -        paint.setMaskFilter(filter)->unref();
 | 
| -        canvas->drawRRect(this->getRRect(), paint);
 | 
| +        canvas->scale(SkFloatToScalar(1.5f), SkFloatToScalar(1.5f));
 | 
| +
 | 
| +        const int blurRadii[] = { 1, 3, 6, 10 };
 | 
| +        const int cornerRadii[] = { 1, 3, 6, 10 };
 | 
| +        const SkRect r = SkRect::MakeWH(SkIntToScalar(100), SkIntToScalar(100));
 | 
| +        for (size_t i = 0; i < SK_ARRAY_COUNT(blurRadii); ++i) {
 | 
| +            SkAutoCanvasRestore autoRestore(canvas, true);
 | 
| +            canvas->translate(0, (r.height() + SkIntToScalar(20)) * i);
 | 
| +            for (size_t j = 0; j < SK_ARRAY_COUNT(cornerRadii); ++j) {
 | 
| +                SkMaskFilter* filter = SkBlurMaskFilter::Create(SkIntToScalar(blurRadii[i]),
 | 
| +                                            SkBlurMaskFilter::kNormal_BlurStyle);
 | 
| +                SkPaint paint;
 | 
| +                paint.setColor(SK_ColorBLUE);
 | 
| +                paint.setMaskFilter(filter)->unref();
 | 
| +
 | 
| +                SkRRect rrect;
 | 
| +                rrect.setRectXY(r, SkIntToScalar(cornerRadii[j]), SkIntToScalar(cornerRadii[j]));
 | 
| +                canvas->drawRRect(rrect, paint);
 | 
| +                canvas->translate(r.width() + SkIntToScalar(10), 0);
 | 
| +            }
 | 
| +        }
 | 
|      }
 | 
|  private:
 | 
| -    const int fBlurRadius;
 | 
| +    const SkString  fName;
 | 
|  
 | 
| -    typedef BlurRoundRectGM INHERITED;
 | 
| +    typedef         skiagm::GM INHERITED;
 | 
|  };
 | 
|  
 | 
|  // Create one with dimensions/rounded corners based on the skp
 | 
| -DEF_GM(return new SKPBlurRoundRectGM(600, 5514, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1);)
 | 
| -// Same radii, much smaller rectangle
 | 
| -DEF_GM(return new SKPBlurRoundRectGM(100, 100, 6, 6, 6, 6, 6, 6, 6, 6, 2, 2);)
 | 
| +DEF_GM(return new BlurRoundRectGM(600, 5514, 6);)
 | 
|  // Rounded rect with two opposite corners with large radii, the other two
 | 
|  // small.
 | 
| -DEF_GM(return new SKPBlurRoundRectGM(100, 100, 30, 30, 10, 10, 30, 30, 10, 10, 3, 4);)
 | 
| -DEF_GM(return new SKPBlurRoundRectGM(100, 100, 90, 90, 90, 90, 90, 90, 90, 90, 2, 3);)
 | 
| -
 | 
| -// Try a few blur values with a small corner radius
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 1, 1));
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 3, 1, 2, 2));
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 6, 1));
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 10, 1, 3, 3));
 | 
| -
 | 
| -// Now a few blur values with a larger corner radius
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 1, 3, 2, 2));
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 3, 3));
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 6, 3, 3, 3));
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 10, 3));
 | 
| -
 | 
| -// Even larger corner radius
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 1, 6, 2, 4));
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 3, 6));
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 6, 6));
 | 
| -DEF_GM(return new SimpleBlurRoundRectGM(100, 100, 10, 6, 1, 3));
 | 
| +DEF_GM(return new BlurRoundRectGM(100, 100);)
 | 
| +
 | 
| +DEF_GM(return new SimpleBlurRoundRectGM();)
 | 
|  
 | 
| 
 |