17dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com/* 27dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com * Copyright 2013 Google Inc. 37dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com * 47dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com * Use of this source code is governed by a BSD-style license that can be 57dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com * found in the LICENSE file. 67dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com */ 77dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 87dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com#include "gm.h" 97dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com#include "SkBitmap.h" 107dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com#include "SkPath.h" 117dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com#include "SkPathOps.h" 127dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com#include "SkRect.h" 137dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 147dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.comnamespace skiagm { 157dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 167dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.comclass PathOpsInverseGM : public GM { 177dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.compublic: 187dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com PathOpsInverseGM() { 197dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com } 207dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 217dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.comprotected: 224eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com virtual void onOnceBeforeDraw() SK_OVERRIDE { 237dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com const unsigned oneColor = 0xFF8080FF; 247dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com const unsigned twoColor = 0x807F1f1f; 257dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com SkColor blendColor = blend(oneColor, twoColor); 264eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com makePaint(&fOnePaint, oneColor); 274eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com makePaint(&fTwoPaint, twoColor); 284eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com makePaint(&fOpPaint[kDifference_PathOp], oneColor); 294eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com makePaint(&fOpPaint[kIntersect_PathOp], blendColor); 304eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com makePaint(&fOpPaint[kUnion_PathOp], 0xFFc0FFc0); 314eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com makePaint(&fOpPaint[kReverseDifference_PathOp], twoColor); 324eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com makePaint(&fOpPaint[kXOR_PathOp], 0xFFa0FFe0); 334eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com makePaint(&fOutlinePaint, 0xFF000000); 344eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com fOutlinePaint.setStyle(SkPaint::kStroke_Style); 357dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com } 367dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 377dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com SkColor blend(SkColor one, SkColor two) { 387dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com SkBitmap temp; 39eb9a46cbbb475e862a084aa2224ec18d4ac5e95breed@google.com temp.allocN32Pixels(1, 1); 407dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com SkCanvas canvas(temp); 417dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com canvas.drawColor(one); 427dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com canvas.drawColor(two); 437dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com void* pixels = temp.getPixels(); 447dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com return *(SkColor*) pixels; 457dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com } 467dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 477dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com void makePaint(SkPaint* paint, SkColor color) { 487dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com paint->setAntiAlias(true); 497dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com paint->setStyle(SkPaint::kFill_Style); 507dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com paint->setColor(color); 517dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com } 527dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 53a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org virtual uint32_t onGetFlags() const SK_OVERRIDE { 54a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org return kSkipTiled_Flag; // Only for 565. 8888 is fine. 55a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org } 56a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 577dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com virtual SkString onShortName() SK_OVERRIDE { 587dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com return SkString("pathopsinverse"); 597dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com } 607dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 617dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com virtual SkISize onISize() SK_OVERRIDE { 62f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(1200, 900); 637dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com } 647dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 657dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com virtual void onDraw(SkCanvas* canvas) SK_OVERRIDE { 667dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com SkPath one, two; 677dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com int yPos = 0; 687dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com for (int oneFill = 0; oneFill <= 1; ++oneFill) { 697dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com SkPath::FillType oneF = oneFill ? SkPath::kInverseEvenOdd_FillType 707dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com : SkPath::kEvenOdd_FillType; 717dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com for (int twoFill = 0; twoFill <= 1; ++twoFill) { 727dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com SkPath::FillType twoF = twoFill ? SkPath::kInverseEvenOdd_FillType 737dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com : SkPath::kEvenOdd_FillType; 747dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com one.reset(); 757dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com one.setFillType(oneF); 767dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com one.addRect(10, 10, 70, 70); 777dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com two.reset(); 787dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com two.setFillType(twoF); 797dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com two.addRect(40, 40, 100, 100); 807dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com canvas->save(); 817dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com canvas->translate(0, SkIntToScalar(yPos)); 827dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com canvas->clipRect(SkRect::MakeWH(110, 110), SkRegion::kIntersect_Op, true); 834eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com canvas->drawPath(one, fOnePaint); 844eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com canvas->drawPath(one, fOutlinePaint); 854eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com canvas->drawPath(two, fTwoPaint); 864eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com canvas->drawPath(two, fOutlinePaint); 877dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com canvas->restore(); 887dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com int xPos = 150; 897dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com for (int op = kDifference_PathOp; op <= kReverseDifference_PathOp; ++op) { 907dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com SkPath result; 917dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com Op(one, two, (SkPathOp) op, &result); 927dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com canvas->save(); 937dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com canvas->translate(SkIntToScalar(xPos), SkIntToScalar(yPos)); 947dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com canvas->clipRect(SkRect::MakeWH(110, 110), SkRegion::kIntersect_Op, true); 954eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com canvas->drawPath(result, fOpPaint[op]); 964eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com canvas->drawPath(result, fOutlinePaint); 977dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com canvas->restore(); 987dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com xPos += 150; 997dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com } 1007dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com yPos += 150; 1017dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com } 1027dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com } 1037dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com } 1047dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 1057dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.comprivate: 1064eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com SkPaint fOnePaint; 1074eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com SkPaint fTwoPaint; 1084eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com SkPaint fOutlinePaint; 1094eedae6f72dc6f410010976d7157f045b150b904caryclark@google.com SkPaint fOpPaint[kReverseDifference_PathOp - kDifference_PathOp + 1]; 1107dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com typedef GM INHERITED; 1117dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com}; 1127dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 1137dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com////////////////////////////////////////////////////////////////////////////// 1147dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 1157dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.comstatic GM* MyFactory(void*) { return new PathOpsInverseGM; } 1167dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.comstatic GMRegistry reg(MyFactory); 1177dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com 1187dfbb0720a133c0f63ac7be504f335bbcc62a291caryclark@google.com} 119