1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2011 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 "SkColorPriv.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkShader.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic void test4(SkCanvas* canvas) { 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(true); 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint pts[] = { 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {10, 160}, {610, 160}, 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {610, 160}, {10, 160}, 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {610, 160}, {610, 160}, 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {610, 199}, {610, 199}, 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {10, 198}, {610, 198}, 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {610, 199}, {10, 199}, 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {10, 160}, {10, 160}, 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot {10, 199}, {10, 199} 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot char verbs[] = { 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0, 1, 1, 1, 4, 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0, 1, 1, 1, 4, 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0, 1, 1, 1, 4, 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0, 1, 1, 1, 4 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath path; 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPoint* ptPtr = pts; 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t i = 0; i < sizeof(verbs); ++i) { 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot switch ((SkPath::Verb) verbs[i]) { 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkPath::kMove_Verb: 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.moveTo(ptPtr->fX, ptPtr->fY); 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ++ptPtr; 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkPath::kLine_Verb: 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.lineTo(ptPtr->fX, ptPtr->fY); 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot ++ptPtr; 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot case SkPath::kClose_Verb: 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot path.close(); 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot default: 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkASSERT(false); 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot break; 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect clip = {0, 130, 772, 531}; 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clipRect(clip); 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(path, paint); 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconstexpr SkBlendMode gModes[] = { 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kClear, 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kSrc, 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kDst, 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kSrcOver, 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kDstOver, 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kSrcIn, 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kDstIn, 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kSrcOut, 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kDstOut, 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kSrcATop, 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kDstATop, 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBlendMode::kXor, 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst int gWidth = 64; 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst int gHeight = 64; 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkScalar W = SkIntToScalar(gWidth); 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotconst SkScalar H = SkIntToScalar(gHeight); 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic SkScalar drawCell(SkCanvas* canvas, SkBlendMode mode, SkAlpha a0, SkAlpha a1) { 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint paint; 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAntiAlias(true); 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect r = SkRect::MakeWH(W, H); 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot r.inset(W/10, H/10); 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(SK_ColorBLUE); 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAlpha(a0); 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawOval(r, paint); 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setColor(SK_ColorRED); 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setAlpha(a1); 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint.setBlendMode(mode); 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar offset = SK_Scalar1 / 3; 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkRect rect = SkRect::MakeXYWH(W / 4 + offset, 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot H / 4 + offset, 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot W / 2, H / 2); 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(rect, paint); 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return H; 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic sk_sp<SkShader> make_bg_shader() { 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap bm; 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot bm.allocN32Pixels(2, 2); 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *bm.getAddr32(0, 0) = *bm.getAddr32(1, 1) = 0xFFFFFFFF; 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot *bm.getAddr32(1, 0) = *bm.getAddr32(0, 1) = SkPackARGB32(0xFF, 0xCE, 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 0xCF, 0xCE); 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkMatrix m = SkMatrix::MakeScale(SkIntToScalar(6), SkIntToScalar(6)); 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkShader::MakeBitmapShader(bm, SkShader::kRepeat_TileMode, SkShader::kRepeat_TileMode, 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot &m); 116fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 117fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 118fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm { 119fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 120fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot class AARectModesGM : public GM { 121fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint fBGPaint; 122fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot public: 123fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot AARectModesGM () { 124fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fBGPaint.setShader(make_bg_shader()); 125fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 126fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 127fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot protected: 128fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 129fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString onShortName() override { 130fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("aarectmodes"); 131fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 132fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 133fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize onISize() override { return SkISize::Make(640, 480); } 134fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 135fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 136fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (false) { // avoid bit rot, suppress warning 137fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot test4(canvas); 138fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 139fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const SkRect bounds = SkRect::MakeWH(W, H); 140fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot constexpr SkAlpha gAlphaValue[] = { 0xFF, 0x88, 0x88 }; 141fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 142fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(SkIntToScalar(4), SkIntToScalar(4)); 143fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 144fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int alpha = 0; alpha < 4; ++alpha) { 145fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 146fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 147fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (size_t i = 0; i < SK_ARRAY_COUNT(gModes); ++i) { 148fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot if (6 == i) { 149fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 150fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(W * 5, 0); 151fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 152fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 153fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawRect(bounds, fBGPaint); 154fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->saveLayer(&bounds, nullptr); 155fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkScalar dy = drawCell(canvas, gModes[i], 156fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot gAlphaValue[alpha & 1], 157fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot gAlphaValue[alpha & 2]); 158fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 159fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 160fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(0, dy * 5 / 4); 161fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 162fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 163fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 164fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(W * 5 / 4, 0); 165fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 166fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 167fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 168fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot private: 169fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GM INHERITED; 170fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot }; 171fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 172fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////// 173fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 174fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static GM* MyFactory(void*) { return new AARectModesGM; } 175fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot static GMRegistry reg(MyFactory); 176fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 177fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 178