blob: 43a683a97d39a94c47a5b40b404332d37b536edb [file] [log] [blame]
robertphillipsf5ac9722015-04-14 08:19:01 -07001/*
2 * Copyright 2015 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
Mike Kleinc0bd9f92019-04-23 12:05:21 -05008#include "gm/gm.h"
Ben Wagnerd1701ba2019-04-30 13:44:26 -04009#include "include/core/SkCanvas.h"
10#include "include/core/SkColor.h"
11#include "include/core/SkFilterQuality.h"
Mike Reed6dbeac52021-01-13 13:14:23 -050012#include "include/core/SkImage.h"
Ben Wagnerd1701ba2019-04-30 13:44:26 -040013#include "include/core/SkPaint.h"
14#include "include/core/SkRect.h"
15#include "include/core/SkScalar.h"
16#include "include/core/SkSize.h"
17#include "include/core/SkString.h"
Mike Reed18aeb572021-01-19 17:58:25 -050018#include "include/core/SkSurface.h"
robertphillipsf5ac9722015-04-14 08:19:01 -070019
20namespace skiagm {
21
22// This GM exercises HighQuality anisotropic filtering.
23class AnisotropicGM : public GM {
24public:
Mike Reedf3ac2af2021-02-05 12:55:38 -050025 AnisotropicGM() : fSampling(SkCubicResampler::Mitchell()) {
Mike Kleind46dce32018-08-16 10:17:03 -040026 this->setBGColor(0xFFCCCCCC);
robertphillipsf5ac9722015-04-14 08:19:01 -070027 }
28
29protected:
30
31 SkString onShortName() override { return SkString("anisotropic_hq"); }
32
33 SkISize onISize() override {
34 return SkISize::Make(2*kImageSize + 3*kSpacer,
35 kNumVertImages*kImageSize + (kNumVertImages+1)*kSpacer);
36 }
37
38 // Create an image consisting of lines radiating from its center
39 void onOnceBeforeDraw() override {
mtkleindbfd7ab2016-09-01 11:24:54 -070040 constexpr int kNumLines = 100;
41 constexpr SkScalar kAngleStep = 360.0f / kNumLines;
42 constexpr int kInnerOffset = 10;
robertphillipsf5ac9722015-04-14 08:19:01 -070043
Mike Reed18aeb572021-01-19 17:58:25 -050044 auto info = SkImageInfo::MakeN32(kImageSize, kImageSize, kOpaque_SkAlphaType);
45 auto surf = SkSurface::MakeRaster(info);
46 auto canvas = surf->getCanvas();
robertphillipsf5ac9722015-04-14 08:19:01 -070047
Mike Reed18aeb572021-01-19 17:58:25 -050048 canvas->clear(SK_ColorWHITE);
robertphillipsf5ac9722015-04-14 08:19:01 -070049
50 SkPaint p;
51 p.setAntiAlias(true);
52
53 SkScalar angle = 0.0f, sin, cos;
54
Mike Reed18aeb572021-01-19 17:58:25 -050055 canvas->translate(kImageSize/2.0f, kImageSize/2.0f);
robertphillipsf5ac9722015-04-14 08:19:01 -070056 for (int i = 0; i < kNumLines; ++i, angle += kAngleStep) {
Brian Osman4428f2c2019-04-02 10:59:28 -040057 sin = SkScalarSin(angle);
58 cos = SkScalarCos(angle);
Mike Reed18aeb572021-01-19 17:58:25 -050059 canvas->drawLine(cos * kInnerOffset, sin * kInnerOffset,
60 cos * kImageSize/2, sin * kImageSize/2, p);
robertphillipsf5ac9722015-04-14 08:19:01 -070061 }
Mike Reed18aeb572021-01-19 17:58:25 -050062 fImage = surf->makeImageSnapshot();
robertphillipsf5ac9722015-04-14 08:19:01 -070063 }
64
65 void draw(SkCanvas* canvas, int x, int y, int xSize, int ySize) {
66 SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(y),
67 SkIntToScalar(xSize), SkIntToScalar(ySize));
Mike Reed34c56a52021-01-22 15:26:41 -050068 canvas->drawImageRect(fImage, r, fSampling);
robertphillipsf5ac9722015-04-14 08:19:01 -070069 }
70
71 void onDraw(SkCanvas* canvas) override {
72 SkScalar gScales[] = { 0.9f, 0.8f, 0.75f, 0.6f, 0.5f, 0.4f, 0.25f, 0.2f, 0.1f };
halcanary9d524f22016-03-29 09:03:52 -070073
robertphillipsf5ac9722015-04-14 08:19:01 -070074 SkASSERT(kNumVertImages-1 == (int)SK_ARRAY_COUNT(gScales)/2);
75
76 // Minimize vertically
77 for (int i = 0; i < (int)SK_ARRAY_COUNT(gScales); ++i) {
Mike Reed18aeb572021-01-19 17:58:25 -050078 int height = SkScalarFloorToInt(fImage->height() * gScales[i]);
robertphillipsf5ac9722015-04-14 08:19:01 -070079
80 int yOff;
81 if (i <= (int)SK_ARRAY_COUNT(gScales)/2) {
Mike Reed18aeb572021-01-19 17:58:25 -050082 yOff = kSpacer + i * (fImage->height() + kSpacer);
robertphillipsf5ac9722015-04-14 08:19:01 -070083 } else {
84 // Position the more highly squashed images with their less squashed counterparts
Mike Reed18aeb572021-01-19 17:58:25 -050085 yOff = (SK_ARRAY_COUNT(gScales) - i) * (fImage->height() + kSpacer) - height;
robertphillipsf5ac9722015-04-14 08:19:01 -070086 }
87
Mike Reed18aeb572021-01-19 17:58:25 -050088 this->draw(canvas, kSpacer, yOff, fImage->width(), height);
robertphillipsf5ac9722015-04-14 08:19:01 -070089 }
90
91 // Minimize horizontally
92 for (int i = 0; i < (int)SK_ARRAY_COUNT(gScales); ++i) {
Mike Reed18aeb572021-01-19 17:58:25 -050093 int width = SkScalarFloorToInt(fImage->width() * gScales[i]);
robertphillipsf5ac9722015-04-14 08:19:01 -070094
95 int xOff, yOff;
96 if (i <= (int)SK_ARRAY_COUNT(gScales)/2) {
Mike Reed18aeb572021-01-19 17:58:25 -050097 xOff = fImage->width() + 2*kSpacer;
98 yOff = kSpacer + i * (fImage->height() + kSpacer);
robertphillipsf5ac9722015-04-14 08:19:01 -070099 } else {
100 // Position the more highly squashed images with their less squashed counterparts
Mike Reed18aeb572021-01-19 17:58:25 -0500101 xOff = fImage->width() + 2*kSpacer + fImage->width() - width;
102 yOff = kSpacer + (SK_ARRAY_COUNT(gScales) - i - 1) * (fImage->height() + kSpacer);
robertphillipsf5ac9722015-04-14 08:19:01 -0700103 }
104
Mike Reed18aeb572021-01-19 17:58:25 -0500105 this->draw(canvas, xOff, yOff, width, fImage->height());
robertphillipsf5ac9722015-04-14 08:19:01 -0700106 }
107 }
108
109private:
mtkleindbfd7ab2016-09-01 11:24:54 -0700110 static constexpr int kImageSize = 256;
111 static constexpr int kSpacer = 10;
112 static constexpr int kNumVertImages = 5;
robertphillipsf5ac9722015-04-14 08:19:01 -0700113
Mike Reed18aeb572021-01-19 17:58:25 -0500114 sk_sp<SkImage> fImage;
115 SkSamplingOptions fSampling;
robertphillipsf5ac9722015-04-14 08:19:01 -0700116
John Stiles7571f9e2020-09-02 22:42:33 -0400117 using INHERITED = GM;
robertphillipsf5ac9722015-04-14 08:19:01 -0700118};
119
120//////////////////////////////////////////////////////////////////////////////
121
halcanary385fe4d2015-08-26 13:07:48 -0700122DEF_GM(return new AnisotropicGM;)
John Stilesa6841be2020-08-06 14:11:56 -0400123} // namespace skiagm