1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2011 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "gm/gm.h" 9*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkColor.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPaint.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPoint.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkScalar.h" 15*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkSurface.h" 16*c8dee2aaSAndroid Build Coastguard Worker #include "include/effects/SkGradientShader.h" 17*c8dee2aaSAndroid Build Coastguard Worker #include "tools/Resources.h" 18*c8dee2aaSAndroid Build Coastguard Worker 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker // This tests using clip shader and then changing the canvas matrix before drawing. It also verifies 21*c8dee2aaSAndroid Build Coastguard Worker // that we don't incorrectly disable linear filtering of a clip image shader. 22*c8dee2aaSAndroid Build Coastguard Worker DEF_SIMPLE_GM(clipshadermatrix, canvas, 145, 128) { 23*c8dee2aaSAndroid Build Coastguard Worker auto clipSurface = SkSurfaces::Raster(SkImageInfo::MakeA8({70, 60})); 24*c8dee2aaSAndroid Build Coastguard Worker // Hard edged oval clip 25*c8dee2aaSAndroid Build Coastguard Worker clipSurface->getCanvas()->drawOval(SkRect::MakeXYWH(0, 10, 64, 44), SkPaint{}); 26*c8dee2aaSAndroid Build Coastguard Worker auto clipShader = clipSurface->makeImageSnapshot()->makeShader( 27*c8dee2aaSAndroid Build Coastguard Worker SkTileMode::kDecal, SkTileMode::kDecal, SkFilterMode::kLinear); 28*c8dee2aaSAndroid Build Coastguard Worker 29*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(5, 0); 30*c8dee2aaSAndroid Build Coastguard Worker for (auto tx : {0.f, 68.5f}) { 31*c8dee2aaSAndroid Build Coastguard Worker for (auto ty : {0.f, 66.5f}) { 32*c8dee2aaSAndroid Build Coastguard Worker canvas->save(); 33*c8dee2aaSAndroid Build Coastguard Worker 34*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(tx, ty); 35*c8dee2aaSAndroid Build Coastguard Worker canvas->clipShader(clipShader); 36*c8dee2aaSAndroid Build Coastguard Worker canvas->translate(-tx, -ty); 37*c8dee2aaSAndroid Build Coastguard Worker 38*c8dee2aaSAndroid Build Coastguard Worker SkMatrix m; 39*c8dee2aaSAndroid Build Coastguard Worker m.setSkew(0.03f, 0.f); 40*c8dee2aaSAndroid Build Coastguard Worker m.setPerspY( 0.0007f); 41*c8dee2aaSAndroid Build Coastguard Worker m.setPerspX(-0.002f); 42*c8dee2aaSAndroid Build Coastguard Worker m.setScaleX(1.2f); m.setScaleY(0.8f); 43*c8dee2aaSAndroid Build Coastguard Worker m.preRotate(30.f); 44*c8dee2aaSAndroid Build Coastguard Worker canvas->concat(m); 45*c8dee2aaSAndroid Build Coastguard Worker 46*c8dee2aaSAndroid Build Coastguard Worker SkPoint center = {64, 64}; 47*c8dee2aaSAndroid Build Coastguard Worker SkAssertResult(m.invert(&m)); 48*c8dee2aaSAndroid Build Coastguard Worker center = m.mapPoint(center); 49*c8dee2aaSAndroid Build Coastguard Worker SkColor colors[] {SK_ColorYELLOW, SK_ColorGREEN, SK_ColorBLUE, 50*c8dee2aaSAndroid Build Coastguard Worker SK_ColorMAGENTA, SK_ColorCYAN , SK_ColorYELLOW}; 51*c8dee2aaSAndroid Build Coastguard Worker auto gradient = SkGradientShader::MakeRadial( 52*c8dee2aaSAndroid Build Coastguard Worker center, 53*c8dee2aaSAndroid Build Coastguard Worker /*radius=*/32.f, 54*c8dee2aaSAndroid Build Coastguard Worker colors, 55*c8dee2aaSAndroid Build Coastguard Worker /*pos=*/nullptr, 56*c8dee2aaSAndroid Build Coastguard Worker std::size(colors), 57*c8dee2aaSAndroid Build Coastguard Worker SkTileMode::kMirror, 58*c8dee2aaSAndroid Build Coastguard Worker /*flags=*/0, 59*c8dee2aaSAndroid Build Coastguard Worker /*localMatrix=*/nullptr); 60*c8dee2aaSAndroid Build Coastguard Worker 61*c8dee2aaSAndroid Build Coastguard Worker SkPaint paint; 62*c8dee2aaSAndroid Build Coastguard Worker paint.setShader(std::move(gradient)); 63*c8dee2aaSAndroid Build Coastguard Worker canvas->drawPaint(paint); 64*c8dee2aaSAndroid Build Coastguard Worker 65*c8dee2aaSAndroid Build Coastguard Worker canvas->restore(); 66*c8dee2aaSAndroid Build Coastguard Worker } 67*c8dee2aaSAndroid Build Coastguard Worker } 68*c8dee2aaSAndroid Build Coastguard Worker } 69