1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/*
2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2014 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 "SkCanvas.h"
10fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkGradientShader.h"
11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h"
12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRandom.h"
13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotint make_bm(SkBitmap* bm, int height) {
15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    constexpr int kRadius = 22;
16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    constexpr int kMargin = 8;
17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    constexpr SkScalar kStartAngle = 0;
18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    constexpr SkScalar kDAngle = 25;
19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    constexpr SkScalar kSweep = 320;
20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    constexpr SkScalar kThickness = 8;
21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    int count = (height / (2 * kRadius + kMargin));
23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    height = count * (2 * kRadius + kMargin);
24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bm->allocN32Pixels(2 * (kRadius + kMargin), height);
26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkRandom random;
27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkCanvas wholeCanvas(*bm);
29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    wholeCanvas.clear(0x00000000);
30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkScalar angle = kStartAngle;
32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    for (int i = 0; i < count; ++i) {
33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkPaint paint;
34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        // The sw rasterizer disables AA for large canvii. So we make a small canvas for each draw.
35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkBitmap smallBM;
36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkIRect subRect = SkIRect::MakeXYWH(0, i * (kMargin + 2 * kRadius),
37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                            2 * kRadius + kMargin, 2 * kRadius + kMargin);
38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        bm->extractSubset(&smallBM, subRect);
39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkCanvas canvas(smallBM);
40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas.translate(kMargin + kRadius, kMargin + kRadius);
41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setAntiAlias(true);
43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setColor(random.nextU() | 0xFF000000);
44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setStyle(SkPaint::kStroke_Style);
45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setStrokeWidth(kThickness);
46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        paint.setStrokeCap(SkPaint::kRound_Cap);
47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkScalar radius = kRadius - kThickness / 2;
48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkRect bounds = SkRect::MakeLTRB(-radius, -radius, radius, radius);
49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas.drawArc(bounds, angle, kSweep, false, paint);
51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        angle += kDAngle;
52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    bm->setImmutable();
54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    return count;
55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}
56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass TallStretchedBitmapsGM : public skiagm::GM {
58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic:
59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    TallStretchedBitmapsGM() {}
60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected:
62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkString onShortName() override {
63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkString("tall_stretched_bitmaps");
64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    SkISize onISize() override {
67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        return SkISize::Make(730, 690);
68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onOnceBeforeDraw() override {
71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (size_t i = 0; i < SK_ARRAY_COUNT(fTallBmps); ++i) {
72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int h = SkToInt((4 + i) * 1024);
73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            fTallBmps[i].fItemCnt = make_bm(&fTallBmps[i].fBmp, h);
75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    void onDraw(SkCanvas* canvas) override {
79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        canvas->scale(1.3f, 1.3f);
80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        for (size_t i = 0; i < SK_ARRAY_COUNT(fTallBmps); ++i) {
81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkASSERT(fTallBmps[i].fItemCnt > 10);
82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkBitmap bmp = fTallBmps[i].fBmp;
83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            // Draw the last 10 elements of the bitmap.
84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int startItem = fTallBmps[i].fItemCnt - 10;
85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            int itemHeight = bmp.height() / fTallBmps[i].fItemCnt;
86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkIRect subRect = SkIRect::MakeLTRB(0, startItem * itemHeight,
87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot                                               bmp.width(), bmp.height());
88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkRect dstRect = SkRect::MakeWH(SkIntToScalar(bmp.width()), 10.f * itemHeight);
89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            SkPaint paint;
90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            paint.setFilterQuality(kLow_SkFilterQuality);
91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->drawBitmapRect(bmp, subRect, dstRect, &paint);
92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot            canvas->translate(SkIntToScalar(bmp.width() + 10), 0);
93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        }
94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    }
95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate:
97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    struct {
98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        SkBitmap fBmp;
99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot        int      fItemCnt;
100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    } fTallBmps[8];
101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot    typedef skiagm::GM INHERITED;
102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot};
103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot//////////////////////////////////////////////////////////////////////////////
105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot
106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team RobotDEF_GM(return new TallStretchedBitmapsGM;)
107