1fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot/* 2fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot * Copyright 2013 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#include "SkBitmap.h" 11fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPath.h" 12fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkPathOps.h" 13fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot#include "SkRect.h" 14fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 15fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotnamespace skiagm { 16fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 17fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotclass PathOpsInverseGM : public GM { 18fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotpublic: 19fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot PathOpsInverseGM() { 20fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 21fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 22fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprotected: 23fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onOnceBeforeDraw() override { 24fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const unsigned oneColor = sk_tool_utils::color_to_565(0xFF8080FF); 25fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot const unsigned twoColor = 0x807F1f1f; 26fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor blendColor = blend(oneColor, twoColor); 27fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot makePaint(&fOnePaint, oneColor); 28fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot makePaint(&fTwoPaint, twoColor); 29fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot makePaint(&fOpPaint[kDifference_SkPathOp], oneColor); 30fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot makePaint(&fOpPaint[kIntersect_SkPathOp], blendColor); 31fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot makePaint(&fOpPaint[kUnion_SkPathOp], sk_tool_utils::color_to_565(0xFFc0FFc0)); 32fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot makePaint(&fOpPaint[kReverseDifference_SkPathOp], twoColor); 33fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot makePaint(&fOpPaint[kXOR_SkPathOp], sk_tool_utils::color_to_565(0xFFa0FFe0)); 34fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot makePaint(&fOutlinePaint, 0xFF000000); 35fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot fOutlinePaint.setStyle(SkPaint::kStroke_Style); 36fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 37fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 38fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkColor blend(SkColor one, SkColor two) { 39fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkBitmap temp; 40fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot temp.allocN32Pixels(1, 1); 41fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkCanvas canvas(temp); 42fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.drawColor(one); 43fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas.drawColor(two); 44fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void* pixels = temp.getPixels(); 45fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return *(SkColor*) pixels; 46fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 47fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 48fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void makePaint(SkPaint* paint, SkColor color) { 49fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint->setAntiAlias(true); 50fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint->setStyle(SkPaint::kFill_Style); 51fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot paint->setColor(color); 52fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 53fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 54fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkString onShortName() override { 55fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkString("pathopsinverse"); 56fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 57fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 58fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkISize onISize() override { 59fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot return SkISize::Make(1200, 900); 60fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 61fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 62fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot void onDraw(SkCanvas* canvas) override { 63fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath one, two; 64fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int yPos = 0; 65fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int oneFill = 0; oneFill <= 1; ++oneFill) { 66fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath::FillType oneF = oneFill ? SkPath::kInverseEvenOdd_FillType 67fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : SkPath::kEvenOdd_FillType; 68fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int twoFill = 0; twoFill <= 1; ++twoFill) { 69fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath::FillType twoF = twoFill ? SkPath::kInverseEvenOdd_FillType 70fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot : SkPath::kEvenOdd_FillType; 71fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot one.reset(); 72fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot one.setFillType(oneF); 73fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot one.addRect(10, 10, 70, 70); 74fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot two.reset(); 75fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot two.setFillType(twoF); 76fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot two.addRect(40, 40, 100, 100); 77fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 78fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(0, SkIntToScalar(yPos)); 79fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clipRect(SkRect::MakeWH(110, 110), true); 80fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(one, fOnePaint); 81fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(one, fOutlinePaint); 82fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(two, fTwoPaint); 83fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(two, fOutlinePaint); 84fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 85fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot int xPos = 150; 86fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot for (int op = kDifference_SkPathOp; op <= kReverseDifference_SkPathOp; ++op) { 87fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPath result; 88fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot Op(one, two, (SkPathOp) op, &result); 89fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->save(); 90fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->translate(SkIntToScalar(xPos), SkIntToScalar(yPos)); 91fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->clipRect(SkRect::MakeWH(110, 110), true); 92fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(result, fOpPaint[op]); 93fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->drawPath(result, fOutlinePaint); 94fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot canvas->restore(); 95fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot xPos += 150; 96fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 97fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot yPos += 150; 98fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 99fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 100fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot } 101fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 102fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotprivate: 103fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint fOnePaint; 104fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint fTwoPaint; 105fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint fOutlinePaint; 106fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot SkPaint fOpPaint[kReverseDifference_SkPathOp - kDifference_SkPathOp + 1]; 107fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot typedef GM INHERITED; 108fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot}; 109fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 110fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot////////////////////////////////////////////////////////////////////////////// 111fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 112fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GM* MyFactory(void*) { return new PathOpsInverseGM; } 113fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robotstatic GMRegistry reg(MyFactory); 114fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot 115fe17456d5e528078ce69b5f15cf7adf1fab963fandroid-build-team Robot} 116