1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2015 Google Inc. 3fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * 4fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Use of this source code is governed by a BSD-style license that can be 5fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * found in the LICENSE file. 6fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot */ 7fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 8fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "gm.h" 9fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "sk_tool_utils.h" 10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm { 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot// This GM exercises HighQuality anisotropic filtering. 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass AnisotropicGM : public GM { 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot AnisotropicGM() : fFilterQuality(kHigh_SkFilterQuality) { 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->setBGColor(sk_tool_utils::color_to_565(0xFFCCCCCC)); 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString onShortName() override { return SkString("anisotropic_hq"); } 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize onISize() override { 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkISize::Make(2*kImageSize + 3*kSpacer, 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot kNumVertImages*kImageSize + (kNumVertImages+1)*kSpacer); 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Create an image consisting of lines radiating from its center 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onOnceBeforeDraw() override { 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr int kNumLines = 100; 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr SkScalar kAngleStep = 360.0f / kNumLines; 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr int kInnerOffset = 10; 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fBM.allocN32Pixels(kImageSize, kImageSize, true); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas canvas(fBM); 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.clear(SK_ColorWHITE); 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p; 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setAntiAlias(true); 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar angle = 0.0f, sin, cos; 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.translate(kImageSize/2.0f, kImageSize/2.0f); 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < kNumLines; ++i, angle += kAngleStep) { 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot sin = SkScalarSinCos(angle, &cos); 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.drawLine(cos * kInnerOffset, sin * kInnerOffset, 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot cos * kImageSize/2, sin * kImageSize/2, p); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void draw(SkCanvas* canvas, int x, int y, int xSize, int ySize) { 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r = SkRect::MakeXYWH(SkIntToScalar(x), SkIntToScalar(y), 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkIntToScalar(xSize), SkIntToScalar(ySize)); 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint p; 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot p.setFilterQuality(fFilterQuality); 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawBitmapRect(fBM, r, &p); 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar gScales[] = { 0.9f, 0.8f, 0.75f, 0.6f, 0.5f, 0.4f, 0.25f, 0.2f, 0.1f }; 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(kNumVertImages-1 == (int)SK_ARRAY_COUNT(gScales)/2); 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Minimize vertically 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < (int)SK_ARRAY_COUNT(gScales); ++i) { 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int height = SkScalarFloorToInt(fBM.height() * gScales[i]); 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int yOff; 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (i <= (int)SK_ARRAY_COUNT(gScales)/2) { 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot yOff = kSpacer + i * (fBM.height() + kSpacer); 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Position the more highly squashed images with their less squashed counterparts 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot yOff = (SK_ARRAY_COUNT(gScales) - i) * (fBM.height() + kSpacer) - height; 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->draw(canvas, kSpacer, yOff, fBM.width(), height); 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Minimize horizontally 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int i = 0; i < (int)SK_ARRAY_COUNT(gScales); ++i) { 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int width = SkScalarFloorToInt(fBM.width() * gScales[i]); 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int xOff, yOff; 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (i <= (int)SK_ARRAY_COUNT(gScales)/2) { 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot xOff = fBM.width() + 2*kSpacer; 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot yOff = kSpacer + i * (fBM.height() + kSpacer); 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } else { 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot // Position the more highly squashed images with their less squashed counterparts 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot xOff = fBM.width() + 2*kSpacer + fBM.width() - width; 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot yOff = kSpacer + (SK_ARRAY_COUNT(gScales) - i - 1) * (fBM.height() + kSpacer); 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot this->draw(canvas, xOff, yOff, width, fBM.height()); 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static constexpr int kImageSize = 256; 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static constexpr int kSpacer = 10; 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static constexpr int kNumVertImages = 5; 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap fBM; 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkFilterQuality fFilterQuality; 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GM INHERITED; 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////// 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new AnisotropicGM;) 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 115