skia2/gm/anisotropic.cpp
Brian Osman 4428f2c39f Remove SkScalarSinCos
This differed from the separate versions in that it snapped to zero.
It was also strictly worse than calling the two separate versions.
Most clients don't need the snapping, so just call the two existing
functions. For clients that need the snapping, call new variants of
each that do snap.

Change-Id: Ia4e09fd9651932fe15caeab1399df7f6281bdc17
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/205303
Commit-Queue: Brian Osman <brianosman@google.com>
Reviewed-by: Mike Reed <reed@google.com>
2019-04-02 15:46:57 +00:00

115 lines
3.7 KiB
C++

/*
* Copyright 2015 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include "gm.h"
namespace skiagm {
// This GM exercises HighQuality anisotropic filtering.
class AnisotropicGM : public GM {
public:
AnisotropicGM() : fFilterQuality(kHigh_SkFilterQuality) {
this->setBGColor(0xFFCCCCCC);
}
protected:
SkString onShortName() override { return SkString("anisotropic_hq"); }
SkISize onISize() override {
return SkISize::Make(2*kImageSize + 3*kSpacer,
kNumVertImages*kImageSize + (kNumVertImages+1)*kSpacer);
}
// Create an image consisting of lines radiating from its center
void onOnceBeforeDraw() override {
constexpr int kNumLines = 100;
constexpr SkScalar kAngleStep = 360.0f / kNumLines;
constexpr int kInnerOffset = 10;
fBM.allocN32Pixels(kImageSize, kImageSize, true);
SkCanvas canvas(fBM);
canvas.clear(SK_ColorWHITE);
SkPaint p;
p.setAntiAlias(true);
SkScalar angle = 0.0f, sin, cos;
canvas.translate(kImageSize/2.0f, kImageSize/2.0f);
for (int i = 0; i < kNumLines; ++i, angle += kAngleStep) {
sin = SkScalarSin(angle);
cos = SkScalarCos(angle);
canvas.drawLine(cos * kInnerOffset, sin * kInnerOffset,
cos * kImageSize/2, sin * kImageSize/2, p);
}
}
void draw(SkCanvas* canvas, int x, int y, int xSize, int ySize) {
SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(y),
SkIntToScalar(xSize), SkIntToScalar(ySize));
SkPaint p;
p.setFilterQuality(fFilterQuality);
canvas->drawBitmapRect(fBM, r, &p);
}
void onDraw(SkCanvas* canvas) override {
SkScalar gScales[] = { 0.9f, 0.8f, 0.75f, 0.6f, 0.5f, 0.4f, 0.25f, 0.2f, 0.1f };
SkASSERT(kNumVertImages-1 == (int)SK_ARRAY_COUNT(gScales)/2);
// Minimize vertically
for (int i = 0; i < (int)SK_ARRAY_COUNT(gScales); ++i) {
int height = SkScalarFloorToInt(fBM.height() * gScales[i]);
int yOff;
if (i <= (int)SK_ARRAY_COUNT(gScales)/2) {
yOff = kSpacer + i * (fBM.height() + kSpacer);
} else {
// Position the more highly squashed images with their less squashed counterparts
yOff = (SK_ARRAY_COUNT(gScales) - i) * (fBM.height() + kSpacer) - height;
}
this->draw(canvas, kSpacer, yOff, fBM.width(), height);
}
// Minimize horizontally
for (int i = 0; i < (int)SK_ARRAY_COUNT(gScales); ++i) {
int width = SkScalarFloorToInt(fBM.width() * gScales[i]);
int xOff, yOff;
if (i <= (int)SK_ARRAY_COUNT(gScales)/2) {
xOff = fBM.width() + 2*kSpacer;
yOff = kSpacer + i * (fBM.height() + kSpacer);
} else {
// Position the more highly squashed images with their less squashed counterparts
xOff = fBM.width() + 2*kSpacer + fBM.width() - width;
yOff = kSpacer + (SK_ARRAY_COUNT(gScales) - i - 1) * (fBM.height() + kSpacer);
}
this->draw(canvas, xOff, yOff, width, fBM.height());
}
}
private:
static constexpr int kImageSize = 256;
static constexpr int kSpacer = 10;
static constexpr int kNumVertImages = 5;
SkBitmap fBM;
SkFilterQuality fFilterQuality;
typedef GM INHERITED;
};
//////////////////////////////////////////////////////////////////////////////
DEF_GM(return new AnisotropicGM;)
}