1 /* 2 * Copyright 2013 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/gm.h" 9 #include "include/core/SkCanvas.h" 10 #include "include/core/SkColor.h" 11 #include "include/core/SkPaint.h" 12 #include "include/core/SkPoint.h" 13 #include "include/core/SkRect.h" 14 #include "include/core/SkShader.h" 15 #include "include/core/SkSize.h" 16 #include "include/core/SkString.h" 17 #include "include/core/SkTileMode.h" 18 #include "include/core/SkTypes.h" 19 #include "include/effects/SkGradientShader.h" 20 21 class AlphaGradientsGM : public skiagm::GM { 22 public: AlphaGradientsGM()23 AlphaGradientsGM() {} 24 25 protected: getName() const26 SkString getName() const override { return SkString("alphagradients"); } 27 getISize()28 SkISize getISize() override { return SkISize::Make(640, 480); } 29 draw_grad(SkCanvas * canvas,const SkRect & r,SkColor c0,SkColor c1,bool doPreMul)30 static void draw_grad(SkCanvas* canvas, const SkRect& r, 31 SkColor c0, SkColor c1, bool doPreMul) { 32 SkColor colors[] = { c0, c1 }; 33 SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fBottom } }; 34 SkPaint paint; 35 uint32_t flags = doPreMul ? SkGradientShader::kInterpolateColorsInPremul_Flag : 0; 36 paint.setShader(SkGradientShader::MakeLinear(pts, colors, nullptr, 2, 37 SkTileMode::kClamp, flags, nullptr)); 38 canvas->drawRect(r, paint); 39 40 paint.setShader(nullptr); 41 paint.setStyle(SkPaint::kStroke_Style); 42 canvas->drawRect(r, paint); 43 } 44 onDraw(SkCanvas * canvas)45 void onDraw(SkCanvas* canvas) override { 46 constexpr struct { 47 SkColor fColor0; 48 SkColor fColor1; 49 } gRec[] = { 50 { 0xFFFFFFFF, 0x00000000 }, 51 { 0xFFFFFFFF, 0x00FF0000 }, 52 { 0xFFFFFFFF, 0x00FFFF00 }, 53 { 0xFFFFFFFF, 0x00FFFFFF }, 54 { 0xFFFF0000, 0x00000000 }, 55 { 0xFFFF0000, 0x00FF0000 }, 56 { 0xFFFF0000, 0x00FFFF00 }, 57 { 0xFFFF0000, 0x00FFFFFF }, 58 { 0xFF0000FF, 0x00000000 }, 59 { 0xFF0000FF, 0x00FF0000 }, 60 { 0xFF0000FF, 0x00FFFF00 }, 61 { 0xFF0000FF, 0x00FFFFFF }, 62 }; 63 64 SkRect r = SkRect::MakeWH(300, 30); 65 66 canvas->translate(10, 10); 67 68 for (int doPreMul = 0; doPreMul <= 1; ++doPreMul) { 69 canvas->save(); 70 for (size_t i = 0; i < std::size(gRec); ++i) { 71 draw_grad(canvas, r, gRec[i].fColor0, gRec[i].fColor1, SkToBool(doPreMul)); 72 canvas->translate(0, r.height() + 8); 73 } 74 canvas->restore(); 75 canvas->translate(r.width() + 10, 0); 76 } 77 } 78 79 private: 80 using INHERITED = skiagm::GM; 81 }; 82 83 DEF_GM(return new AlphaGradientsGM;) 84