1779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger/* 2779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger * Copyright 2013 Google Inc. 3779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger * 4779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger * found in the LICENSE file. 6779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger */ 7779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 8779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger#include "gm.h" 9779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger#include "SkCanvas.h" 10779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger#include "SkGradientShader.h" 11779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 12779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenbergerclass AlphaGradientsGM : public skiagm::GM { 13779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenbergerpublic: 14779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger AlphaGradientsGM() {} 15779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 16779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenbergerprotected: 17779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger virtual SkString onShortName() SK_OVERRIDE { 18779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger return SkString("alphagradients"); 19779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger } 20779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 21779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger virtual SkISize onISize() SK_OVERRIDE { 22779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger return SkISize::Make(640, 480); 23779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger } 24779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 25779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger static void draw_grad(SkCanvas* canvas, const SkRect& r, 26779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger SkColor c0, SkColor c1, bool doPreMul) { 27779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger SkColor colors[] = { c0, c1 }; 28779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger SkPoint pts[] = { { r.fLeft, r.fTop }, { r.fRight, r.fBottom } }; 29779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger SkPaint paint; 30779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger uint32_t flags = doPreMul ? SkGradientShader::kInterpolateColorsInPremul_Flag : 0; 31779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger SkShader* s = SkGradientShader::CreateLinear(pts, colors, NULL, 2, 32779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger SkShader::kClamp_TileMode, 33779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger NULL, flags); 34779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger paint.setShader(s)->unref(); 35779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger canvas->drawRect(r, paint); 36779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 37779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger paint.setShader(NULL); 38779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger paint.setStyle(SkPaint::kStroke_Style); 39779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger canvas->drawRect(r, paint); 40779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger } 41779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 42779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 43779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger static const struct { 44779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger SkColor fColor0; 45779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger SkColor fColor1; 46779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger } gRec[] = { 47779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFFFFFFFF, 0x00000000 }, 48779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFFFFFFFF, 0x00FF0000 }, 49779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFFFFFFFF, 0x00FFFF00 }, 50779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFFFFFFFF, 0x00FFFFFF }, 51779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFFFF0000, 0x00000000 }, 52779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFFFF0000, 0x00FF0000 }, 53779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFFFF0000, 0x00FFFF00 }, 54779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFFFF0000, 0x00FFFFFF }, 55779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFF0000FF, 0x00000000 }, 56779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFF0000FF, 0x00FF0000 }, 57779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFF0000FF, 0x00FFFF00 }, 58779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger { 0xFF0000FF, 0x00FFFFFF }, 59779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger }; 60779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 61779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger SkRect r = SkRect::MakeWH(300, 30); 62779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 63779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger canvas->translate(10, 10); 64779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 65779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger for (int doPreMul = 0; doPreMul <= 1; ++doPreMul) { 66779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger canvas->save(); 67779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger for (size_t i = 0; i < SK_ARRAY_COUNT(gRec); ++i) { 68779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger draw_grad(canvas, r, gRec[i].fColor0, gRec[i].fColor1, SkToBool(doPreMul)); 69779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger canvas->translate(0, r.height() + 8); 70779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger } 71779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger canvas->restore(); 72779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger canvas->translate(r.width() + 10, 0); 73779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger } 74779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger } 75779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 76779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger virtual uint32_t onGetFlags() const { return kSkipPipe_Flag; } 77779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 78779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenbergerprivate: 79779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger typedef skiagm::GM INHERITED; 80779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger}; 81779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek Sollenberger 82779bf8a99dc7f03e5c43b26d4b85d7920ce89aeeDerek SollenbergerDEF_GM( return SkNEW(AlphaGradientsGM); ) 83