Home | History | Annotate | Download | only in gm
      1 
      2 /*
      3  * Copyright 2012 Intel Inc.
      4  *
      5  * Use of this source code is governed by a BSD-style license that can be
      6  * found in the LICENSE file.
      7  */
      8 #include "gm.h"
      9 #include "SkBlurDrawLooper.h"
     10 #include "SkBlurMask.h"
     11 #include "SkBlurMaskFilter.h"
     12 #include "SkGradientShader.h"
     13 #include "SkMatrix.h"
     14 #include "SkRandom.h"
     15 #include "SkTArray.h"
     16 
     17 namespace skiagm {
     18 
     19 class CircleGM : public GM {
     20 public:
     21     CircleGM() {
     22         this->setBGColor(0xFF000000);
     23         this->makePaints();
     24         this->makeMatrices();
     25     }
     26 
     27 protected:
     28 
     29     SkString onShortName() override {
     30         return SkString("circles");
     31     }
     32 
     33     SkISize onISize() override {
     34         return SkISize::Make(1200, 900);
     35     }
     36 
     37     void makePaints() {
     38         {
     39         // no AA
     40         SkPaint p;
     41         fPaints.push_back(p);
     42         }
     43 
     44         {
     45         // AA
     46         SkPaint p;
     47         p.setAntiAlias(true);
     48         fPaints.push_back(p);
     49         }
     50 
     51         {
     52         // AA with mask filter
     53         SkPaint p;
     54         p.setAntiAlias(true);
     55         SkMaskFilter* mf = SkBlurMaskFilter::Create(
     56                                kNormal_SkBlurStyle,
     57                                SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
     58                                SkBlurMaskFilter::kHighQuality_BlurFlag);
     59         p.setMaskFilter(mf)->unref();
     60         fPaints.push_back(p);
     61         }
     62 
     63         {
     64         // AA with radial shader
     65         SkPaint p;
     66         p.setAntiAlias(true);
     67         SkPoint center = SkPoint::Make(SkIntToScalar(40), SkIntToScalar(40));
     68         SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
     69         SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
     70         SkShader* s = SkGradientShader::CreateRadial(center,
     71                                                      SkIntToScalar(20),
     72                                                      colors,
     73                                                      pos,
     74                                                      SK_ARRAY_COUNT(colors),
     75                                                      SkShader::kClamp_TileMode);
     76         p.setShader(s)->unref();
     77         fPaints.push_back(p);
     78         }
     79 
     80         {
     81         // AA with blur
     82         SkPaint p;
     83         p.setAntiAlias(true);
     84         SkBlurDrawLooper* shadowLooper =
     85             SkBlurDrawLooper::Create(SK_ColorBLUE,
     86                                      SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
     87                                      SkIntToScalar(5), SkIntToScalar(10),
     88                                      SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
     89                                      SkBlurDrawLooper::kOverrideColor_BlurFlag |
     90                                      SkBlurDrawLooper::kHighQuality_BlurFlag);
     91         SkAutoUnref aurL0(shadowLooper);
     92         p.setLooper(shadowLooper);
     93         fPaints.push_back(p);
     94         }
     95 
     96         {
     97         // AA with stroke style
     98         SkPaint p;
     99         p.setAntiAlias(true);
    100         p.setStyle(SkPaint::kStroke_Style);
    101         p.setStrokeWidth(SkIntToScalar(3));
    102         fPaints.push_back(p);
    103         }
    104 
    105         {
    106         // AA with stroke style, width = 0
    107         SkPaint p;
    108         p.setAntiAlias(true);
    109         p.setStyle(SkPaint::kStroke_Style);
    110         fPaints.push_back(p);
    111         }
    112 
    113         {
    114         // AA with stroke and fill style
    115         SkPaint p;
    116         p.setAntiAlias(true);
    117         p.setStyle(SkPaint::kStrokeAndFill_Style);
    118         p.setStrokeWidth(SkIntToScalar(2));
    119         fPaints.push_back(p);
    120         }
    121     }
    122 
    123     void makeMatrices() {
    124         {
    125         SkMatrix m;
    126         m.setScale(SkIntToScalar(2), SkIntToScalar(3));
    127         fMatrices.push_back(m);
    128         }
    129 
    130         {
    131         SkMatrix m;
    132         m.setScale(SkIntToScalar(2), SkIntToScalar(2));
    133         fMatrices.push_back(m);
    134         }
    135 
    136         {
    137         SkMatrix m;
    138         m.setSkew(SkIntToScalar(2), SkIntToScalar(3));
    139         fMatrices.push_back(m);
    140         }
    141 
    142         {
    143         SkMatrix m;
    144         m.setSkew(SkIntToScalar(2), SkIntToScalar(2));
    145         fMatrices.push_back(m);
    146         }
    147 
    148         {
    149         SkMatrix m;
    150         m.setRotate(SkIntToScalar(30));
    151         fMatrices.push_back(m);
    152         }
    153     }
    154 
    155     void onDraw(SkCanvas* canvas) override {
    156         // Draw a giant AA circle as the background.
    157         SkISize size = this->getISize();
    158         SkScalar giantRadius = SkTMin(SkIntToScalar(size.fWidth),
    159                                       SkIntToScalar(size.fHeight)) / 2.f;
    160         SkPoint giantCenter = SkPoint::Make(SkIntToScalar(size.fWidth/2),
    161                                             SkIntToScalar(size.fHeight/2));
    162         SkPaint giantPaint;
    163         giantPaint.setAntiAlias(true);
    164         giantPaint.setColor(0x80808080);
    165         canvas->drawCircle(giantCenter.fX, giantCenter.fY, giantRadius, giantPaint);
    166 
    167         SkRandom rand;
    168         canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
    169         int i;
    170         for (i = 0; i < fPaints.count(); ++i) {
    171             canvas->save();
    172             // position the path, and make it at off-integer coords.
    173             canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4,
    174                               SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4);
    175             SkColor color = rand.nextU();
    176             color |= 0xff000000;
    177             fPaints[i].setColor(color);
    178 
    179             canvas->drawCircle(SkIntToScalar(40), SkIntToScalar(40),
    180                                SkIntToScalar(20),
    181                                fPaints[i]);
    182             canvas->restore();
    183         }
    184 
    185         for (int j = 0; j < fMatrices.count(); ++j, ++i) {
    186             canvas->save();
    187 
    188             canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4,
    189                               SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4);
    190 
    191             canvas->concat(fMatrices[j]);
    192 
    193             SkPaint paint;
    194             paint.setAntiAlias(true);
    195 
    196             SkColor color = rand.nextU();
    197             color |= 0xff000000;
    198             paint.setColor(color);
    199 
    200             canvas->drawCircle(SkIntToScalar(40), SkIntToScalar(40),
    201                                SkIntToScalar(20),
    202                                paint);
    203 
    204             canvas->restore();
    205         }
    206     }
    207 
    208 private:
    209     typedef GM INHERITED;
    210     SkTArray<SkPaint> fPaints;
    211     SkTArray<SkMatrix> fMatrices;
    212 };
    213 
    214 //////////////////////////////////////////////////////////////////////////////
    215 
    216 static GM* MyFactory(void*) { return new CircleGM; }
    217 static GMRegistry reg(MyFactory);
    218 
    219 }
    220