1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 7ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed 8807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com#include "gm.h" 933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h" 10807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com#include "SkCanvas.h" 11807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com#include "SkPath.h" 12807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 13807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comnamespace skiagm { 14807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 15dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gPathColor = SK_ColorBLACK; 16dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gClipAColor = SK_ColorBLUE; 17dbfd7ab10883f173f5c1b653a233e18dc6142002mtkleinconstexpr SkColor gClipBColor = SK_ColorRED; 18a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com 19807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comclass ComplexClipGM : public GM { 20807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.compublic: 216ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon ComplexClipGM(bool aaclip, bool saveLayer, bool invertDraw) 2250a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com : fDoAAClip(aaclip) 236ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon , fDoSaveLayer(saveLayer) 246ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon , fInvertDraw(invertDraw) { 25ceb9f3b3898c1cc45156ae28854338734f4ad4d1caryclark this->setBGColor(0xFFDEDFDE); 26807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com } 27807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 28807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comprotected: 29a90c6803865766d28e92091f56f718f5e41fe80fcommit-bot@chromium.org 30807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 31807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com SkString onShortName() { 32a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com SkString str; 336ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon str.printf("complexclip_%s%s%s", 3450a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com fDoAAClip ? "aa" : "bw", 356ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon fDoSaveLayer ? "_layer" : "", 366ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon fInvertDraw ? "_invert" : ""); 37a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com return str; 38807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com } 39807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 40f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina SkISize onISize() { return SkISize::Make(970, 780); } 41807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 42807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com virtual void onDraw(SkCanvas* canvas) { 43807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com SkPath path; 44807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.moveTo(SkIntToScalar(0), SkIntToScalar(50)); 45807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.quadTo(SkIntToScalar(0), SkIntToScalar(0), SkIntToScalar(50), SkIntToScalar(0)); 46807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.lineTo(SkIntToScalar(175), SkIntToScalar(0)); 47807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.quadTo(SkIntToScalar(200), SkIntToScalar(0), SkIntToScalar(200), SkIntToScalar(25)); 48807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.lineTo(SkIntToScalar(200), SkIntToScalar(150)); 49807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.quadTo(SkIntToScalar(200), SkIntToScalar(200), SkIntToScalar(150), SkIntToScalar(200)); 50807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.lineTo(SkIntToScalar(0), SkIntToScalar(200)); 51807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.close(); 52807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.moveTo(SkIntToScalar(50), SkIntToScalar(50)); 53807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.lineTo(SkIntToScalar(150), SkIntToScalar(50)); 54807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.lineTo(SkIntToScalar(150), SkIntToScalar(125)); 55807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.quadTo(SkIntToScalar(150), SkIntToScalar(150), SkIntToScalar(125), SkIntToScalar(150)); 56807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.lineTo(SkIntToScalar(50), SkIntToScalar(150)); 57807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com path.close(); 586ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon if (fInvertDraw) { 596ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon path.setFillType(SkPath::kInverseEvenOdd_FillType); 606ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon } else { 616ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon path.setFillType(SkPath::kEvenOdd_FillType); 626ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon } 63807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com SkPaint pathPaint; 64807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com pathPaint.setAntiAlias(true); 65a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com pathPaint.setColor(gPathColor); 66807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 67807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com SkPath clipA; 68807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipA.moveTo(SkIntToScalar(10), SkIntToScalar(20)); 69807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipA.lineTo(SkIntToScalar(165), SkIntToScalar(22)); 70807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipA.lineTo(SkIntToScalar(70), SkIntToScalar(105)); 71807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipA.lineTo(SkIntToScalar(165), SkIntToScalar(177)); 72807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipA.lineTo(SkIntToScalar(-5), SkIntToScalar(180)); 73807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipA.close(); 74807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 75807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com SkPath clipB; 76807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipB.moveTo(SkIntToScalar(40), SkIntToScalar(10)); 77807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipB.lineTo(SkIntToScalar(190), SkIntToScalar(15)); 78807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipB.lineTo(SkIntToScalar(195), SkIntToScalar(190)); 79807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipB.lineTo(SkIntToScalar(40), SkIntToScalar(185)); 80807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipB.lineTo(SkIntToScalar(155), SkIntToScalar(100)); 81807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com clipB.close(); 82807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 83807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com SkPaint paint; 84807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com paint.setAntiAlias(true); 851818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark sk_tool_utils::set_portable_typeface(&paint); 86a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com paint.setTextSize(SkIntToScalar(20)); 87807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 88dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein constexpr struct { 89c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed SkClipOp fOp; 9073603f3c52ffd89fe9d035be827b566a0e7d3b79reed const char* fName; 91807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com } gOps[] = { //extra spaces in names for measureText 92c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed {kIntersect_SkClipOp, "Isect "}, 93c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed {kDifference_SkClipOp, "Diff " }, 94c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed {kUnion_SkClipOp, "Union "}, 95c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed {kXOR_SkClipOp, "Xor " }, 96c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed {kReverseDifference_SkClipOp, "RDiff "} 97807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com }; 98807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 99a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com canvas->translate(SkIntToScalar(20), SkIntToScalar(20)); 100807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com canvas->scale(3 * SK_Scalar1 / 4, 3 * SK_Scalar1 / 4); 101807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 10254bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com if (fDoSaveLayer) { 10354bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com // We want the layer to appear symmetric relative to actual 10454bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com // device boundaries so we need to "undo" the effect of the 10554bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com // scale and translate 10654bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com SkRect bounds = SkRect::MakeLTRB( 1074b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 4.0f/3.0f * -20, 1084b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 4.0f/3.0f * -20, 1094b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 4.0f/3.0f * (this->getISize().fWidth - 20), 1104b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org 4.0f/3.0f * (this->getISize().fHeight - 20)); 11154bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com 11254bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com bounds.inset(SkIntToScalar(100), SkIntToScalar(100)); 11350a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com SkPaint boundPaint; 11450a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com boundPaint.setColor(SK_ColorRED); 11550a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com boundPaint.setStyle(SkPaint::kStroke_Style); 11650a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com canvas->drawRect(bounds, boundPaint); 11796fcdcc219d2a0d3579719b84b28bede76efba64halcanary canvas->saveLayer(&bounds, nullptr); 11850a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com } 11950a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com 120a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com for (int invBits = 0; invBits < 4; ++invBits) { 121a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com canvas->save(); 122807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); ++op) { 123a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com this->drawHairlines(canvas, path, clipA, clipB); 124a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com 125a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com bool doInvA = SkToBool(invBits & 1); 126a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com bool doInvB = SkToBool(invBits & 2); 127807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com canvas->save(); 128807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com // set clip 129a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com clipA.setFillType(doInvA ? SkPath::kInverseEvenOdd_FillType : 130a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com SkPath::kEvenOdd_FillType); 131a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com clipB.setFillType(doInvB ? SkPath::kInverseEvenOdd_FillType : 132a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com SkPath::kEvenOdd_FillType); 133669983856d99b9312be3166b7dd1f8483a90c315reed canvas->clipPath(clipA, fDoAAClip); 134a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com canvas->clipPath(clipB, gOps[op].fOp, fDoAAClip); 135807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 1366ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon // In the inverse case we need to prevent the draw from covering the whole 1376ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon // canvas. 1386ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon if (fInvertDraw) { 1396ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon SkRect rectClip = clipA.getBounds(); 1406ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon rectClip.join(path.getBounds()); 1416ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon rectClip.join(path.getBounds()); 1426ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon rectClip.outset(5, 5); 1436ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon canvas->clipRect(rectClip); 1446ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon } 1456ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon 146807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com // draw path clipped 147807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com canvas->drawPath(path, pathPaint); 148807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com canvas->restore(); 149807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 150807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 151a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com SkScalar txtX = SkIntToScalar(45); 152a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com paint.setColor(gClipAColor); 153a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com const char* aTxt = doInvA ? "InvA " : "A "; 1542a475eae622adc1e8fa29206be1eaf862c23548eCary Clark canvas->drawString(aTxt, txtX, SkIntToScalar(220), paint); 155807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com txtX += paint.measureText(aTxt, strlen(aTxt)); 156807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com paint.setColor(SK_ColorBLACK); 1572a475eae622adc1e8fa29206be1eaf862c23548eCary Clark canvas->drawString(gOps[op].fName, txtX, SkIntToScalar(220), paint); 158807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com txtX += paint.measureText(gOps[op].fName, strlen(gOps[op].fName)); 159a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com paint.setColor(gClipBColor); 160a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com const char* bTxt = doInvB ? "InvB " : "B "; 1612a475eae622adc1e8fa29206be1eaf862c23548eCary Clark canvas->drawString(bTxt, txtX, SkIntToScalar(220), paint); 162807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 163807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com canvas->translate(SkIntToScalar(250),0); 164807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com } 165a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com canvas->restore(); 166a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com canvas->translate(0, SkIntToScalar(250)); 167807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com } 16850a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com 16954bb7abc09e06b41aaf3dca633d27ccc7b291badrobertphillips@google.com if (fDoSaveLayer) { 17050a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com canvas->restore(); 17150a69a0727076d6590a23dd0f6501371573c7d28robertphillips@google.com } 172807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com } 173807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.comprivate: 174a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com void drawHairlines(SkCanvas* canvas, const SkPath& path, 175a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com const SkPath& clipA, const SkPath& clipB) { 176a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com SkPaint paint; 177a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com paint.setAntiAlias(true); 178a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com paint.setStyle(SkPaint::kStroke_Style); 179a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com const SkAlpha fade = 0x33; 180a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com 181a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com // draw path in hairline 182a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com paint.setColor(gPathColor); paint.setAlpha(fade); 183a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com canvas->drawPath(path, paint); 184d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com 185a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com // draw clips in hair line 186a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com paint.setColor(gClipAColor); paint.setAlpha(fade); 187a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com canvas->drawPath(clipA, paint); 188a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com paint.setColor(gClipBColor); paint.setAlpha(fade); 189a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com canvas->drawPath(clipB, paint); 190a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com } 191a8f60f25022d64ba29cfd7c4465151f431d0a264reed@google.com 1926ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon bool fDoAAClip; 1936ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon bool fDoSaveLayer; 1946ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon bool fInvertDraw; 1956ae83cf7f633c3aa101b66509ab29a61592e1980bsalomon 196807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com typedef GM INHERITED; 197807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com}; 198807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 199807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com////////////////////////////////////////////////////////////////////////////// 200807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com 201385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(false, false, false);) 202385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(false, false, true);) 203385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(false, true, false);) 204385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(false, true, true);) 205385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(true, false, false);) 206385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(true, false, true);) 207385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(true, true, false);) 208385fe4d4b62d7d1dd76116dd570df3290a2f487bhalcanaryDEF_GM(return new ComplexClipGM(true, true, true);) 209807cec4397cb50a64de7355ae129cc7c8f2c772bbsalomon@google.com} 210