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     virtual uint32_t onGetFlags() const SK_OVERRIDE {
     29         return kSkipTiled_Flag;
     30     }
     31 
     32     virtual SkString onShortName() SK_OVERRIDE {
     33         return SkString("circles");
     34     }
     35 
     36     virtual SkISize onISize() SK_OVERRIDE {
     37         return SkISize::Make(1200, 900);
     38     }
     39 
     40     void makePaints() {
     41         {
     42         // no AA
     43         SkPaint p;
     44         fPaints.push_back(p);
     45         }
     46 
     47         {
     48         // AA
     49         SkPaint p;
     50         p.setAntiAlias(true);
     51         fPaints.push_back(p);
     52         }
     53 
     54         {
     55         // AA with mask filter
     56         SkPaint p;
     57         p.setAntiAlias(true);
     58         SkMaskFilter* mf = SkBlurMaskFilter::Create(
     59                                kNormal_SkBlurStyle,
     60                                SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(5)),
     61                                SkBlurMaskFilter::kHighQuality_BlurFlag);
     62         p.setMaskFilter(mf)->unref();
     63         fPaints.push_back(p);
     64         }
     65 
     66         {
     67         // AA with radial shader
     68         SkPaint p;
     69         p.setAntiAlias(true);
     70         SkPoint center = SkPoint::Make(SkIntToScalar(40), SkIntToScalar(40));
     71         SkColor colors[] = { SK_ColorBLUE, SK_ColorRED, SK_ColorGREEN };
     72         SkScalar pos[] = { 0, SK_ScalarHalf, SK_Scalar1 };
     73         SkShader* s = SkGradientShader::CreateRadial(center,
     74                                                      SkIntToScalar(20),
     75                                                      colors,
     76                                                      pos,
     77                                                      SK_ARRAY_COUNT(colors),
     78                                                      SkShader::kClamp_TileMode);
     79         p.setShader(s)->unref();
     80         fPaints.push_back(p);
     81         }
     82 
     83         {
     84         // AA with blur
     85         SkPaint p;
     86         p.setAntiAlias(true);
     87         SkBlurDrawLooper* shadowLooper =
     88             SkBlurDrawLooper::Create(SK_ColorBLUE,
     89                                      SkBlurMask::ConvertRadiusToSigma(SkIntToScalar(10)),
     90                                      SkIntToScalar(5), SkIntToScalar(10),
     91                                      SkBlurDrawLooper::kIgnoreTransform_BlurFlag |
     92                                      SkBlurDrawLooper::kOverrideColor_BlurFlag |
     93                                      SkBlurDrawLooper::kHighQuality_BlurFlag);
     94         SkAutoUnref aurL0(shadowLooper);
     95         p.setLooper(shadowLooper);
     96         fPaints.push_back(p);
     97         }
     98 
     99         {
    100         // AA with stroke style
    101         SkPaint p;
    102         p.setAntiAlias(true);
    103         p.setStyle(SkPaint::kStroke_Style);
    104         p.setStrokeWidth(SkIntToScalar(3));
    105         fPaints.push_back(p);
    106         }
    107 
    108         {
    109         // AA with stroke style, width = 0
    110         SkPaint p;
    111         p.setAntiAlias(true);
    112         p.setStyle(SkPaint::kStroke_Style);
    113         fPaints.push_back(p);
    114         }
    115 
    116         {
    117         // AA with stroke and fill style
    118         SkPaint p;
    119         p.setAntiAlias(true);
    120         p.setStyle(SkPaint::kStrokeAndFill_Style);
    121         p.setStrokeWidth(SkIntToScalar(2));
    122         fPaints.push_back(p);
    123         }
    124     }
    125 
    126     void makeMatrices() {
    127         {
    128         SkMatrix m;
    129         m.setScale(SkIntToScalar(2), SkIntToScalar(3));
    130         fMatrices.push_back(m);
    131         }
    132 
    133         {
    134         SkMatrix m;
    135         m.setScale(SkIntToScalar(2), SkIntToScalar(2));
    136         fMatrices.push_back(m);
    137         }
    138 
    139         {
    140         SkMatrix m;
    141         m.setSkew(SkIntToScalar(2), SkIntToScalar(3));
    142         fMatrices.push_back(m);
    143         }
    144 
    145         {
    146         SkMatrix m;
    147         m.setSkew(SkIntToScalar(2), SkIntToScalar(2));
    148         fMatrices.push_back(m);
    149         }
    150 
    151         {
    152         SkMatrix m;
    153         m.setRotate(SkIntToScalar(30));
    154         fMatrices.push_back(m);
    155         }
    156     }
    157 
    158     virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE {
    159         SkLCGRandom rand;
    160         canvas->translate(20 * SK_Scalar1, 20 * SK_Scalar1);
    161         int i;
    162         for (i = 0; i < fPaints.count(); ++i) {
    163             canvas->save();
    164             // position the path, and make it at off-integer coords.
    165             canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4,
    166                               SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4);
    167             SkColor color = rand.nextU();
    168             color |= 0xff000000;
    169             fPaints[i].setColor(color);
    170 
    171             canvas->drawCircle(SkIntToScalar(40), SkIntToScalar(40),
    172                                SkIntToScalar(20),
    173                                fPaints[i]);
    174             canvas->restore();
    175         }
    176 
    177         for (int j = 0; j < fMatrices.count(); ++j, ++i) {
    178             canvas->save();
    179 
    180             canvas->translate(SK_Scalar1 * 200 * (i % 5) + SK_Scalar1 / 4,
    181                               SK_Scalar1 * 200 * (i / 5) + 3 * SK_Scalar1 / 4);
    182 
    183             canvas->concat(fMatrices[j]);
    184 
    185             SkPaint paint;
    186             paint.setAntiAlias(true);
    187 
    188             SkColor color = rand.nextU();
    189             color |= 0xff000000;
    190             paint.setColor(color);
    191 
    192             canvas->drawCircle(SkIntToScalar(40), SkIntToScalar(40),
    193                                SkIntToScalar(20),
    194                                paint);
    195 
    196             canvas->restore();
    197         }
    198     }
    199 
    200 private:
    201     typedef GM INHERITED;
    202     SkTArray<SkPaint> fPaints;
    203     SkTArray<SkMatrix> fMatrices;
    204 };
    205 
    206 //////////////////////////////////////////////////////////////////////////////
    207 
    208 static GM* MyFactory(void*) { return new CircleGM; }
    209 static GMRegistry reg(MyFactory);
    210 
    211 }
    212