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 967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com#include "gm.h" 1067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com#include "SkCanvas.h" 1167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com#include "SkAAClip.h" 1267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 1367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comnamespace skiagm { 1467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 1567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comstatic void paint_rgn(SkCanvas* canvas, const SkAAClip& clip, 1667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com const SkPaint& paint) { 1767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkMask mask; 1867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkBitmap bm; 1967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 2067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com clip.copyToMask(&mask); 2167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 2267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkAutoMaskFreeImage amfi(mask.fImage); 2367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 24dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org bm.installMaskPixels(mask); 2567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 2667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // need to copy for deferred drawing test to work 2767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkBitmap bm2; 2867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 296285f4f7662853336b788d6ee3e177c396f7fb01commit-bot@chromium.org bm.deepCopyTo(&bm2); 3067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 3167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->drawBitmap(bm2, 3267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SK_Scalar1 * mask.fBounds.fLeft, 3367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SK_Scalar1 * mask.fBounds.fTop, 3467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com &paint); 3567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com} 3667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 3767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com////////////////////////////////////////////////////////////////////////////// 3867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com/* 39d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com * This GM tests anti aliased single operation booleans with SkAAClips, 4067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com * SkRect and SkPaths. 4167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com */ 4267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comclass SimpleClipGM : public GM { 4367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.compublic: 4467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com enum SkGeomTypes { 4567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com kRect_GeomType, 4667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com kPath_GeomType, 4767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com kAAClip_GeomType 4867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com }; 4967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 5067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SimpleClipGM(SkGeomTypes geomType) 5167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com : fGeomType(geomType) { 5267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 5367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // offset the rects a bit so we get anti-aliasing in the rect case 544b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org fBase.set(100.65f, 554b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 100.65f, 564b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 150.65f, 574b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 150.65f); 5867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com fRect = fBase; 5967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com fRect.inset(5, 5); 6067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com fRect.offset(25, 25); 6167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 6267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com fBasePath.addRoundRect(fBase, SkIntToScalar(5), SkIntToScalar(5)); 6367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com fRectPath.addRoundRect(fRect, SkIntToScalar(5), SkIntToScalar(5)); 6467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com INHERITED::setBGColor(0xFFDDDDDD); 6567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 6667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 6767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comprotected: 6867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com void buildRgn(SkAAClip* clip, SkRegion::Op op) { 6967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com clip->setPath(fBasePath, NULL, true); 7067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 7167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkAAClip clip2; 7267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com clip2.setPath(fRectPath, NULL, true); 7367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com clip->op(clip2, op); 7467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 7567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 7667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com void drawOrig(SkCanvas* canvas) { 7767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPaint paint; 78d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 7967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com paint.setStyle(SkPaint::kStroke_Style); 8067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com paint.setColor(SK_ColorBLACK); 81d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->drawRect(fBase, paint); 8367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->drawRect(fRect, paint); 8467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 85d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 8667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com void drawRgnOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) { 8767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 8867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkAAClip clip; 8967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 9067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com this->buildRgn(&clip, op); 9167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com this->drawOrig(canvas); 9267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 9367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPaint paint; 9467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com paint.setColor(color); 9567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com paint_rgn(canvas, clip, paint); 9667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 9767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 9867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com void drawPathsOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) { 9967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 10067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com this->drawOrig(canvas); 10167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 10267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->save(); 10367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 10467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // create the clip mask with the supplied boolean op 10567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com if (kPath_GeomType == fGeomType) { 10667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // path-based case 10767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->clipPath(fBasePath, SkRegion::kReplace_Op, true); 10867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->clipPath(fRectPath, op, true); 10967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } else { 11067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // rect-based case 11167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->clipRect(fBase, SkRegion::kReplace_Op, true); 11267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->clipRect(fRect, op, true); 11367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 11467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 11567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com // draw a rect that will entirely cover the clip mask area 11667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPaint paint; 11767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com paint.setColor(color); 11867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 11967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkRect r = SkRect::MakeLTRB(SkIntToScalar(90), SkIntToScalar(90), 12067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkIntToScalar(180), SkIntToScalar(180)); 12167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 12267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->drawRect(r, paint); 12367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 12467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->restore(); 12567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 12667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 12767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com virtual SkString onShortName() { 12867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkString str; 129d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com str.printf("simpleaaclip_%s", 13067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com kRect_GeomType == fGeomType ? "rect" : 131d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com (kPath_GeomType == fGeomType ? "path" : 13267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com "aaclip")); 13367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com return str; 13467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 13567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 13667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com virtual SkISize onISize() { 137f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina return SkISize::Make(640, 480); 13867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 13967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 14067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com virtual void onDraw(SkCanvas* canvas) { 14167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 14267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com static const struct { 14367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkColor fColor; 14467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com const char* fName; 14567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkRegion::Op fOp; 14667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } gOps[] = { 14767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com { SK_ColorBLACK, "Difference", SkRegion::kDifference_Op }, 14867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com { SK_ColorRED, "Intersect", SkRegion::kIntersect_Op }, 14967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com { 0xFF008800, "Union", SkRegion::kUnion_Op }, 15067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com { SK_ColorGREEN, "Rev Diff", SkRegion::kReverseDifference_Op }, 1512a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com { SK_ColorYELLOW, "Replace", SkRegion::kReplace_Op }, 1522a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com { SK_ColorBLUE, "XOR", SkRegion::kXOR_Op }, 15367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com }; 15467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 15567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPaint textPaint; 15667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com textPaint.setAntiAlias(true); 157992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark sk_tool_utils::set_portable_typeface(&textPaint); 15867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com textPaint.setTextSize(SK_Scalar1*24); 1592a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com int xOff = 0; 16067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 16167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) { 16267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->drawText(gOps[op].fName, strlen(gOps[op].fName), 163d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com SkIntToScalar(75), SkIntToScalar(50), 16467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com textPaint); 16567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 16667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com if (kAAClip_GeomType == fGeomType) { 16767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com this->drawRgnOped(canvas, gOps[op].fOp, gOps[op].fColor); 16867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } else { 16967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com this->drawPathsOped(canvas, gOps[op].fOp, gOps[op].fColor); 17067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 17167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 1722a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com if (xOff >= 400) { 1732a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com canvas->translate(SkIntToScalar(-400), SkIntToScalar(250)); 1742a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com xOff = 0; 17567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } else { 17667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com canvas->translate(SkIntToScalar(200), 0); 1772a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com xOff += 200; 17867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 17967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 18067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com } 18167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comprivate: 18267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 18367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkGeomTypes fGeomType; 18467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 18567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkRect fBase; 18667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkRect fRect; 18767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 18867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPath fBasePath; // fBase as a round rect 18967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com SkPath fRectPath; // fRect as a round rect 19067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 19167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com typedef GM INHERITED; 19267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com}; 19367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 19467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com////////////////////////////////////////////////////////////////////////////// 19567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com 19667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com// rects 197de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kRect_GeomType); ) 198de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kPath_GeomType); ) 199de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kAAClip_GeomType); ) 200a7aedfec9e28db36c97e49f11f2bc2e0eb624c30skia.committer@gmail.com 20167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com} 202