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