179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org/* 279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org * Copyright 2012 Google Inc. 379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org * 479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org * Use of this source code is governed by a BSD-style license that can be 579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org * found in the LICENSE file. 679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org */ 779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org#include "gm.h" 879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org#include "SkGradientShader.h" 979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 1079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgnamespace skiagm { 1179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 129c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.orgstatic SkShader* MakeLinear(SkScalar width, SkScalar height, bool alternate, 139c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org const SkMatrix& localMatrix) { 1479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkPoint pts[2] = { {0, 0}, {width, height}}; 1579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkColor colors[2] = {SK_ColorRED, SK_ColorGREEN}; 1679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org if (alternate) { 1779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org pts[1].fY = 0; 1879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org colors[0] = SK_ColorBLUE; 1979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org colors[1] = SK_ColorYELLOW; 2079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org } 2179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org return SkGradientShader::CreateLinear(pts, colors, NULL, 2, 2283f23d87f1d67e6e73873e1ef7cda621c43703a0commit-bot@chromium.org SkShader::kClamp_TileMode, 0, &localMatrix); 2379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org} 2479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 2579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org/////////////////////////////////////////////////////////////////////////////// 2679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 2779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgclass ShaderBoundsGM : public GM { 2879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgpublic: 2979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org typedef SkShader* (*ShaderGenFunc)(SkScalar width, SkScalar height, 309c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org bool alternate, const SkMatrix& localMatrix); 3179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org ShaderBoundsGM(ShaderGenFunc maker, const SkString& name) 3279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org : fShaderMaker(maker), 3379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org fName(name) { 3479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org } 3579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 3679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgprotected: 37a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 38a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; 39a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 40a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 4179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkString onShortName() { 4279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org return fName; 4379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org } 4479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 45f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina virtual SkISize onISize() { return SkISize::Make(320, 240); } 4679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 4779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org virtual SkMatrix onGetInitialTransform() const SK_OVERRIDE { 4879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkMatrix result; 494b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org SkScalar scale = 0.8f; 5079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org result.setScale(scale, scale); 5179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org result.postTranslate(SkIntToScalar(7), SkIntToScalar(23)); 5279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org return result; 5379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org } 5479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 5579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org virtual void onDraw(SkCanvas* canvas) { 5679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org // The PDF device has already clipped to the content area, but we 5779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org // do it again here so that the raster and pdf results are consistent. 5879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org canvas->clipRect(SkRect::MakeWH(SkIntToScalar(320), 5979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkIntToScalar(240))); 6079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 6179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkMatrix canvasScale; 624b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org SkScalar scale = 0.7f; 6379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org canvasScale.setScale(scale, scale); 6479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org canvas->concat(canvasScale); 6579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 6679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org // Background shader. 6779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkPaint paint; 6879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org paint.setShader(MakeShader(559, 387, false))->unref(); 6979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkRect r = SkRect::MakeXYWH(SkIntToScalar(-12), SkIntToScalar(-41), 7079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkIntToScalar(571), SkIntToScalar(428)); 7179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org canvas->drawRect(r, paint); 7279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 7379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org // Constrained shader. 7479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org paint.setShader(MakeShader(101, 151, true))->unref(); 7579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org r = SkRect::MakeXYWH(SkIntToScalar(43), SkIntToScalar(71), 7679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkIntToScalar(101), SkIntToScalar(151)); 7779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org canvas->clipRect(r); 7879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org canvas->drawRect(r, paint); 7979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org } 8079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 8179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkShader* MakeShader(int width, int height, bool background) { 824b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org SkScalar scale = 0.5f; 8379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org if (background) { 844b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org scale = 0.6f; 8579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org } 86c39c8674c94dba8b1ffe938cd99c825320cc1475vandebo@chromium.org SkScalar shaderWidth = SkScalarDiv(SkIntToScalar(width), scale); 87c39c8674c94dba8b1ffe938cd99c825320cc1475vandebo@chromium.org SkScalar shaderHeight = SkScalarDiv(SkIntToScalar(height), scale); 8879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkMatrix shaderScale; 8979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org shaderScale.setScale(scale, scale); 909c9005a347e9996f357bd79591bd34f74f8bbc66commit-bot@chromium.org SkShader* shader = fShaderMaker(shaderWidth, shaderHeight, background, shaderScale); 9179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org return shader; 9279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org } 9379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 9479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgprivate: 9579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org typedef GM INHERITED; 9679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 9779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org ShaderGenFunc fShaderMaker; 9879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkString fName; 9979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 10079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org SkShader* MakeShader(bool background); 10179d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org}; 10279d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 10379d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org/////////////////////////////////////////////////////////////////////////////// 10479d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 10579d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgstatic GM* MyFactory(void*) { 10679d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org return new ShaderBoundsGM(MakeLinear, SkString("shaderbounds_linear")); 10779d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org} 10879d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.orgstatic GMRegistry reg(MyFactory); 10979d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org 11079d3cb4ba74651ceaa862005a4244460e4662afdvandebo@chromium.org} 111