blob: 9aa72774690c08c5684f45af206bb30322611526 [file] [log] [blame]
/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "gm/gm.h"
#include "include/core/SkCanvas.h"
#include "include/core/SkColor.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPoint.h"
#include "include/core/SkRect.h"
#include "include/core/SkScalar.h"
#include "include/core/SkSurface.h"
#include "include/effects/SkGradientShader.h"
#include "tools/Resources.h"
// This tests using clip shader and then changing the canvas matrix before drawing. It also verifies
// that we don't incorrectly disable linear filtering of a clip image shader.
DEF_SIMPLE_GM(clipshadermatrix, canvas, 145, 128) {
auto clipSurface = SkSurface::MakeRaster(SkImageInfo::MakeA8({70, 60}));
// Hard edged oval clip
clipSurface->getCanvas()->drawOval(SkRect::MakeXYWH(0, 10, 64, 44), SkPaint{});
auto clipShader = clipSurface->makeImageSnapshot()->makeShader(
SkTileMode::kDecal, SkTileMode::kDecal,
SkSamplingOptions{SkFilterMode::kLinear});
canvas->translate(5, 0);
for (auto tx : {0.f, 68.5f}) {
for (auto ty : {0.f, 66.5f}) {
canvas->save();
canvas->translate(tx, ty);
canvas->clipShader(clipShader);
canvas->translate(-tx, -ty);
SkMatrix m;
m.setSkew(0.03f, 0.f);
m.setPerspY( 0.0007f);
m.setPerspX(-0.002f);
m.setScaleX(1.2f); m.setScaleY(0.8f);
m.preRotate(30.f);
canvas->concat(m);
SkPoint center = {64, 64};
SkAssertResult(m.invert(&m));
center = m.mapPoint(center);
SkColor colors[] {SK_ColorYELLOW, SK_ColorGREEN, SK_ColorBLUE,
SK_ColorMAGENTA, SK_ColorCYAN , SK_ColorYELLOW};
auto gradient = SkGradientShader::MakeRadial(
center,
/*radius=*/32.f,
colors,
/*pos=*/nullptr,
std::size(colors),
SkTileMode::kMirror,
/*flags=*/0,
/*localMatrix=*/nullptr);
SkPaint paint;
paint.setShader(std::move(gradient));
canvas->drawPaint(paint);
canvas->restore();
}
}
}