167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com/* 267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com * Copyright 2012 Google Inc. 367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com * 467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com * Use of this source code is governed by a BSD-style license that can be 567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com * found in the LICENSE file. 667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com */ 767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com#include "gm.h" 933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 10fb8c1fcab19c99b56d2fdcf6234751d6f0465142reed#include "SkAAClip.h" 11d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkCanvas.h" 12d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkPath.h" 1367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 1467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comnamespace skiagm { 1567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 1667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comstatic void paint_rgn(SkCanvas* canvas, const SkAAClip& clip, 1767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com const SkPaint& paint) { 1867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkMask mask; 1967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkBitmap bm; 2067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 2167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com clip.copyToMask(&mask); 2267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 2367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkAutoMaskFreeImage amfi(mask.fImage); 2467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 25dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org bm.installMaskPixels(mask); 2667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 2767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // need to copy for deferred drawing test to work 2867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkBitmap bm2; 2967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 306285f4f7662853336b788d6ee3e177c396f7fb01commit-bot@chromium.org bm.deepCopyTo(&bm2); 3167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 3267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->drawBitmap(bm2, 3367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SK_Scalar1 * mask.fBounds.fLeft, 3467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SK_Scalar1 * mask.fBounds.fTop, 3567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com &paint); 3667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com} 3767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 3867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com////////////////////////////////////////////////////////////////////////////// 3967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com/* 40d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com * This GM tests anti aliased single operation booleans with SkAAClips, 4167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com * SkRect and SkPaths. 4267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com */ 4367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comclass SimpleClipGM : public GM { 4467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.compublic: 4567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com enum SkGeomTypes { 4667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com kRect_GeomType, 4767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com kPath_GeomType, 4867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com kAAClip_GeomType 4967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com }; 5067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 5167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SimpleClipGM(SkGeomTypes geomType) 5267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com : fGeomType(geomType) { 5363c684a8a609d39da11b4a656223cebf52ca85dccaryclark } 5467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 5563c684a8a609d39da11b4a656223cebf52ca85dccaryclarkprotected: 5636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein void onOnceBeforeDraw() override { 5767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // offset the rects a bit so we get anti-aliasing in the rect case 584b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fBase.set(100.65f, 594b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 100.65f, 604b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 150.65f, 614b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 150.65f); 6267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com fRect = fBase; 6367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com fRect.inset(5, 5); 6467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com fRect.offset(25, 25); 6567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 6667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com fBasePath.addRoundRect(fBase, SkIntToScalar(5), SkIntToScalar(5)); 6767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com fRectPath.addRoundRect(fRect, SkIntToScalar(5), SkIntToScalar(5)); 6865cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark INHERITED::setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD)); 6967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 7067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 71c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed void buildRgn(SkAAClip* clip, SkClipOp op) { 7296fcdcc219d2a0d3579719b84b28bede76efba64halcanary clip->setPath(fBasePath, nullptr, true); 7367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 7467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkAAClip clip2; 7596fcdcc219d2a0d3579719b84b28bede76efba64halcanary clip2.setPath(fRectPath, nullptr, true); 7673603f3c52ffd89fe9d035be827b566a0e7d3b79reed clip->op(clip2, (SkRegion::Op)op); 7767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 7867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 7967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com void drawOrig(SkCanvas* canvas) { 8067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPaint paint; 81d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com paint.setStyle(SkPaint::kStroke_Style); 8367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com paint.setColor(SK_ColorBLACK); 84d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->drawRect(fBase, paint); 8667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->drawRect(fRect, paint); 8767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 88d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 89c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed void drawRgnOped(SkCanvas* canvas, SkClipOp op, SkColor color) { 9067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 9167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkAAClip clip; 9267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 9367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com this->buildRgn(&clip, op); 9467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com this->drawOrig(canvas); 9567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 9667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPaint paint; 9767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com paint.setColor(color); 9867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com paint_rgn(canvas, clip, paint); 9967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 10067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 101c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed void drawPathsOped(SkCanvas* canvas, SkClipOp op, SkColor color) { 10267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 10367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com this->drawOrig(canvas); 10467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 10567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->save(); 10667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 10767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // create the clip mask with the supplied boolean op 10867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com if (kPath_GeomType == fGeomType) { 10967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // path-based case 110669983856d99b9312be3166b7dd1f8483a90c315reed canvas->clipPath(fBasePath, true); 11167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->clipPath(fRectPath, op, true); 11267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } else { 11367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // rect-based case 114669983856d99b9312be3166b7dd1f8483a90c315reed canvas->clipRect(fBase, true); 11567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->clipRect(fRect, op, true); 11667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 11767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 11867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // draw a rect that will entirely cover the clip mask area 11967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPaint paint; 12067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com paint.setColor(color); 12167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 12267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkRect r = SkRect::MakeLTRB(SkIntToScalar(90), SkIntToScalar(90), 12367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkIntToScalar(180), SkIntToScalar(180)); 12467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 12567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->drawRect(r, paint); 12667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 12767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->restore(); 12867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 12967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 130f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein SkString onShortName() override { 13167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkString str; 132d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com str.printf("simpleaaclip_%s", 13367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com kRect_GeomType == fGeomType ? "rect" : 134d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com (kPath_GeomType == fGeomType ? "path" : 13567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com "aaclip")); 13667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com return str; 13767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 13867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 139f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein SkISize onISize() override { 140f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(640, 480); 14167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 14267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 143f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein void onDraw(SkCanvas* canvas) override { 14467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 145dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein const struct { 14667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkColor fColor; 14767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com const char* fName; 148c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed SkClipOp fOp; 14967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } gOps[] = { 150c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed { SK_ColorBLACK, "Difference", kDifference_SkClipOp }, 151c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed { SK_ColorRED, "Intersect", kIntersect_SkClipOp }, 152c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed { sk_tool_utils::color_to_565(0xFF008800), "Union", kUnion_SkClipOp }, 153c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed { SK_ColorGREEN, "Rev Diff", kReverseDifference_SkClipOp }, 154c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed { SK_ColorYELLOW, "Replace", kReplace_SkClipOp }, 155c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed { SK_ColorBLUE, "XOR", kXOR_SkClipOp }, 15667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com }; 15767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 15867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPaint textPaint; 15967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com textPaint.setAntiAlias(true); 1601818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark sk_tool_utils::set_portable_typeface(&textPaint); 16167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com textPaint.setTextSize(SK_Scalar1*24); 1622a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com int xOff = 0; 16367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 16467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) { 16567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->drawText(gOps[op].fName, strlen(gOps[op].fName), 166d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkIntToScalar(75), SkIntToScalar(50), 16767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com textPaint); 16867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 16967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com if (kAAClip_GeomType == fGeomType) { 17067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com this->drawRgnOped(canvas, gOps[op].fOp, gOps[op].fColor); 17167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } else { 17267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com this->drawPathsOped(canvas, gOps[op].fOp, gOps[op].fColor); 17367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 17467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 1752a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com if (xOff >= 400) { 1762a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com canvas->translate(SkIntToScalar(-400), SkIntToScalar(250)); 1772a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com xOff = 0; 17867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } else { 17967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->translate(SkIntToScalar(200), 0); 1802a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com xOff += 200; 18167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 18267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 18367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 18467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comprivate: 18567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 18667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkGeomTypes fGeomType; 18767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 18867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkRect fBase; 18967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkRect fRect; 19067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 19167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPath fBasePath; // fBase as a round rect 19267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPath fRectPath; // fRect as a round rect 19367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 19467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com typedef GM INHERITED; 19567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com}; 19667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 19767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com////////////////////////////////////////////////////////////////////////////// 19867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 19967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com// rects 200de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kRect_GeomType); ) 201de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kPath_GeomType); ) 202de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kAAClip_GeomType); ) 203a7aedfec9e28db36c97e49f11f2bc2e0eb624c30skia.committer@gmail.com 20467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com} 205