70 lines
2.3 KiB
C++
70 lines
2.3 KiB
C++
/*
|
|
* 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();
|
|
}
|
|
}
|
|
}
|