Home | History | Annotate | Download | only in gm
      1 /*
      2  * Copyright 2011 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 #include "gm.h"
      9 #include "SkCanvas.h"
     10 #include "SkColorPriv.h"
     11 #include "SkPath.h"
     12 #include "SkShader.h"
     13 
     14 static void test4(SkCanvas* canvas) {
     15     SkPaint paint;
     16     paint.setAntiAlias(true);
     17     SkPoint pts[] = {
     18         {10, 160}, {610, 160},
     19         {610, 160}, {10, 160},
     20 
     21         {610, 160}, {610, 160},
     22         {610, 199}, {610, 199},
     23 
     24         {10, 198}, {610, 198},
     25         {610, 199}, {10, 199},
     26 
     27         {10, 160}, {10, 160},
     28         {10, 199}, {10, 199}
     29     };
     30     char verbs[] = {
     31         0, 1, 1, 1, 4,
     32         0, 1, 1, 1, 4,
     33         0, 1, 1, 1, 4,
     34         0, 1, 1, 1, 4
     35     };
     36     SkPath path;
     37     SkPoint* ptPtr = pts;
     38     for (size_t i = 0; i < sizeof(verbs); ++i) {
     39         switch ((SkPath::Verb) verbs[i]) {
     40             case SkPath::kMove_Verb:
     41                 path.moveTo(ptPtr->fX, ptPtr->fY);
     42                 ++ptPtr;
     43                 break;
     44             case SkPath::kLine_Verb:
     45                 path.lineTo(ptPtr->fX, ptPtr->fY);
     46                 ++ptPtr;
     47                 break;
     48             case SkPath::kClose_Verb:
     49                 path.close();
     50                 break;
     51             default:
     52                 SkASSERT(false);
     53                 break;
     54         }
     55     }
     56     SkRect clip = {0, 130, 772, 531};
     57     canvas->clipRect(clip);
     58     canvas->drawPath(path, paint);
     59 }
     60 
     61 static const struct {
     62     SkXfermode::Mode  fMode;
     63     const char*         fLabel;
     64 } gModes[] = {
     65     { SkXfermode::kClear_Mode,    "Clear"     },
     66     { SkXfermode::kSrc_Mode,      "Src"       },
     67     { SkXfermode::kDst_Mode,      "Dst"       },
     68     { SkXfermode::kSrcOver_Mode,  "SrcOver"   },
     69     { SkXfermode::kDstOver_Mode,  "DstOver"   },
     70     { SkXfermode::kSrcIn_Mode,    "SrcIn"     },
     71     { SkXfermode::kDstIn_Mode,    "DstIn"     },
     72     { SkXfermode::kSrcOut_Mode,   "SrcOut"    },
     73     { SkXfermode::kDstOut_Mode,   "DstOut"    },
     74     { SkXfermode::kSrcATop_Mode,  "SrcATop"   },
     75     { SkXfermode::kDstATop_Mode,  "DstATop"   },
     76     { SkXfermode::kXor_Mode,      "Xor"       },
     77 };
     78 
     79 const int gWidth = 64;
     80 const int gHeight = 64;
     81 const SkScalar W = SkIntToScalar(gWidth);
     82 const SkScalar H = SkIntToScalar(gHeight);
     83 
     84 static SkScalar drawCell(SkCanvas* canvas, SkXfermode* mode,
     85                          SkAlpha a0, SkAlpha a1) {
     86 
     87     SkPaint paint;
     88     paint.setAntiAlias(true);
     89 
     90     SkRect r = SkRect::MakeWH(W, H);
     91     r.inset(W/10, H/10);
     92 
     93     paint.setColor(SK_ColorBLUE);
     94     paint.setAlpha(a0);
     95     canvas->drawOval(r, paint);
     96 
     97     paint.setColor(SK_ColorRED);
     98     paint.setAlpha(a1);
     99     paint.setXfermode(mode);
    100 
    101     SkScalar offset = SK_Scalar1 / 3;
    102     SkRect rect = SkRect::MakeXYWH(W / 4 + offset,
    103                                    H / 4 + offset,
    104                                    W / 2, H / 2);
    105     canvas->drawRect(rect, paint);
    106 
    107     return H;
    108 }
    109 
    110 static SkShader* make_bg_shader() {
    111     SkBitmap bm;
    112     bm.allocN32Pixels(2, 2);
    113     *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF;
    114     *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCE,
    115                                                              0xCF, 0xCE);
    116 
    117     const SkMatrix m = SkMatrix::MakeScale(SkIntToScalar(6), SkIntToScalar(6));
    118     SkShader* s = SkShader::CreateBitmapShader(bm,
    119                                                SkShader::kRepeat_TileMode,
    120                                                SkShader::kRepeat_TileMode,
    121                                                &m);
    122 
    123     return s;
    124 }
    125 
    126 namespace skiagm {
    127 
    128     class AARectModesGM : public GM {
    129         SkPaint fBGPaint;
    130     public:
    131         AARectModesGM () {
    132             fBGPaint.setShader(make_bg_shader())->unref();
    133         }
    134 
    135     protected:
    136 
    137         SkString onShortName() override {
    138             return SkString("aarectmodes");
    139         }
    140 
    141         SkISize onISize() override { return SkISize::Make(640, 480); }
    142 
    143         void onDraw(SkCanvas* canvas) override {
    144             if (false) { // avoid bit rot, suppress warning
    145                 test4(canvas);
    146             }
    147             const SkRect bounds = SkRect::MakeWH(W, H);
    148             static const SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 };
    149 
    150             canvas->translate(SkIntToScalar(4), SkIntToScalar(4));
    151 
    152             for (int alpha = 0; alpha < 4; ++alpha) {
    153                 canvas->save();
    154                 canvas->save();
    155                 for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) {
    156                     if (6 == i) {
    157                         canvas->restore();
    158                         canvas->translate(W * 5, 0);
    159                         canvas->save();
    160                     }
    161                     SkXfermode* mode = SkXfermode::Create(gModes[i].fMode);
    162 
    163                     canvas->drawRect(bounds, fBGPaint);
    164                     canvas->saveLayer(&bounds, nullptr);
    165                     SkScalar dy = drawCell(canvas, mode,
    166                                            gAlphaValue[alpha & 1],
    167                                            gAlphaValue[alpha & 2]);
    168                     canvas->restore();
    169 
    170                     canvas->translate(0, dy * 5 / 4);
    171                     SkSafeUnref(mode);
    172                 }
    173                 canvas->restore();
    174                 canvas->restore();
    175                 canvas->translate(W * 5 / 4, 0);
    176             }
    177         }
    178 
    179     private:
    180         typedef GM INHERITED;
    181     };
    182 
    183 //////////////////////////////////////////////////////////////////////////////
    184 
    185     static GM* MyFactory(void*) { return new AARectModesGM; }
    186     static GMRegistry reg(MyFactory);
    187 
    188 }
    189