1cb93a386Sopenharmony_ci/* 2cb93a386Sopenharmony_ci * Copyright 2013 Google Inc. 3cb93a386Sopenharmony_ci * 4cb93a386Sopenharmony_ci * Use of this source code is governed by a BSD-style license that can be 5cb93a386Sopenharmony_ci * found in the LICENSE file. 6cb93a386Sopenharmony_ci */ 7cb93a386Sopenharmony_ci 8cb93a386Sopenharmony_ci#include "gm/gm.h" 9cb93a386Sopenharmony_ci#include "include/core/SkBitmap.h" 10cb93a386Sopenharmony_ci#include "include/core/SkCanvas.h" 11cb93a386Sopenharmony_ci#include "include/core/SkColor.h" 12cb93a386Sopenharmony_ci#include "include/core/SkPaint.h" 13cb93a386Sopenharmony_ci#include "include/core/SkPath.h" 14cb93a386Sopenharmony_ci#include "include/core/SkRect.h" 15cb93a386Sopenharmony_ci#include "include/core/SkScalar.h" 16cb93a386Sopenharmony_ci#include "include/core/SkSize.h" 17cb93a386Sopenharmony_ci#include "include/core/SkString.h" 18cb93a386Sopenharmony_ci#include "include/pathops/SkPathOps.h" 19cb93a386Sopenharmony_ci#include "tools/ToolUtils.h" 20cb93a386Sopenharmony_ci 21cb93a386Sopenharmony_cinamespace skiagm { 22cb93a386Sopenharmony_ci 23cb93a386Sopenharmony_ciclass PathOpsInverseGM : public GM { 24cb93a386Sopenharmony_cipublic: 25cb93a386Sopenharmony_ci PathOpsInverseGM() { 26cb93a386Sopenharmony_ci } 27cb93a386Sopenharmony_ci 28cb93a386Sopenharmony_ciprotected: 29cb93a386Sopenharmony_ci void onOnceBeforeDraw() override { 30cb93a386Sopenharmony_ci const unsigned oneColor = ToolUtils::color_to_565(0xFF8080FF); 31cb93a386Sopenharmony_ci const unsigned twoColor = 0x807F1f1f; 32cb93a386Sopenharmony_ci SkColor blendColor = blend(oneColor, twoColor); 33cb93a386Sopenharmony_ci makePaint(&fOnePaint, oneColor); 34cb93a386Sopenharmony_ci makePaint(&fTwoPaint, twoColor); 35cb93a386Sopenharmony_ci makePaint(&fOpPaint[kDifference_SkPathOp], oneColor); 36cb93a386Sopenharmony_ci makePaint(&fOpPaint[kIntersect_SkPathOp], blendColor); 37cb93a386Sopenharmony_ci makePaint(&fOpPaint[kUnion_SkPathOp], ToolUtils::color_to_565(0xFFc0FFc0)); 38cb93a386Sopenharmony_ci makePaint(&fOpPaint[kReverseDifference_SkPathOp], twoColor); 39cb93a386Sopenharmony_ci makePaint(&fOpPaint[kXOR_SkPathOp], ToolUtils::color_to_565(0xFFa0FFe0)); 40cb93a386Sopenharmony_ci makePaint(&fOutlinePaint, 0xFF000000); 41cb93a386Sopenharmony_ci fOutlinePaint.setStyle(SkPaint::kStroke_Style); 42cb93a386Sopenharmony_ci } 43cb93a386Sopenharmony_ci 44cb93a386Sopenharmony_ci SkColor blend(SkColor one, SkColor two) { 45cb93a386Sopenharmony_ci SkBitmap temp; 46cb93a386Sopenharmony_ci temp.allocN32Pixels(1, 1); 47cb93a386Sopenharmony_ci SkCanvas canvas(temp); 48cb93a386Sopenharmony_ci canvas.drawColor(one); 49cb93a386Sopenharmony_ci canvas.drawColor(two); 50cb93a386Sopenharmony_ci void* pixels = temp.getPixels(); 51cb93a386Sopenharmony_ci return *(SkColor*) pixels; 52cb93a386Sopenharmony_ci } 53cb93a386Sopenharmony_ci 54cb93a386Sopenharmony_ci void makePaint(SkPaint* paint, SkColor color) { 55cb93a386Sopenharmony_ci paint->setAntiAlias(true); 56cb93a386Sopenharmony_ci paint->setStyle(SkPaint::kFill_Style); 57cb93a386Sopenharmony_ci paint->setColor(color); 58cb93a386Sopenharmony_ci } 59cb93a386Sopenharmony_ci 60cb93a386Sopenharmony_ci SkString onShortName() override { 61cb93a386Sopenharmony_ci return SkString("pathopsinverse"); 62cb93a386Sopenharmony_ci } 63cb93a386Sopenharmony_ci 64cb93a386Sopenharmony_ci SkISize onISize() override { 65cb93a386Sopenharmony_ci return SkISize::Make(1200, 900); 66cb93a386Sopenharmony_ci } 67cb93a386Sopenharmony_ci 68cb93a386Sopenharmony_ci void onDraw(SkCanvas* canvas) override { 69cb93a386Sopenharmony_ci SkPath one, two; 70cb93a386Sopenharmony_ci int yPos = 0; 71cb93a386Sopenharmony_ci for (int oneFill = 0; oneFill <= 1; ++oneFill) { 72cb93a386Sopenharmony_ci SkPathFillType oneF = oneFill ? SkPathFillType::kInverseEvenOdd 73cb93a386Sopenharmony_ci : SkPathFillType::kEvenOdd; 74cb93a386Sopenharmony_ci for (int twoFill = 0; twoFill <= 1; ++twoFill) { 75cb93a386Sopenharmony_ci SkPathFillType twoF = twoFill ? SkPathFillType::kInverseEvenOdd 76cb93a386Sopenharmony_ci : SkPathFillType::kEvenOdd; 77cb93a386Sopenharmony_ci one.reset(); 78cb93a386Sopenharmony_ci one.setFillType(oneF); 79cb93a386Sopenharmony_ci one.addRect(10, 10, 70, 70); 80cb93a386Sopenharmony_ci two.reset(); 81cb93a386Sopenharmony_ci two.setFillType(twoF); 82cb93a386Sopenharmony_ci two.addRect(40, 40, 100, 100); 83cb93a386Sopenharmony_ci canvas->save(); 84cb93a386Sopenharmony_ci canvas->translate(0, SkIntToScalar(yPos)); 85cb93a386Sopenharmony_ci canvas->clipRect(SkRect::MakeWH(110, 110), true); 86cb93a386Sopenharmony_ci canvas->drawPath(one, fOnePaint); 87cb93a386Sopenharmony_ci canvas->drawPath(one, fOutlinePaint); 88cb93a386Sopenharmony_ci canvas->drawPath(two, fTwoPaint); 89cb93a386Sopenharmony_ci canvas->drawPath(two, fOutlinePaint); 90cb93a386Sopenharmony_ci canvas->restore(); 91cb93a386Sopenharmony_ci int xPos = 150; 92cb93a386Sopenharmony_ci for (int op = kDifference_SkPathOp; op <= kReverseDifference_SkPathOp; ++op) { 93cb93a386Sopenharmony_ci SkPath result; 94cb93a386Sopenharmony_ci Op(one, two, (SkPathOp) op, &result); 95cb93a386Sopenharmony_ci canvas->save(); 96cb93a386Sopenharmony_ci canvas->translate(SkIntToScalar(xPos), SkIntToScalar(yPos)); 97cb93a386Sopenharmony_ci canvas->clipRect(SkRect::MakeWH(110, 110), true); 98cb93a386Sopenharmony_ci canvas->drawPath(result, fOpPaint[op]); 99cb93a386Sopenharmony_ci canvas->drawPath(result, fOutlinePaint); 100cb93a386Sopenharmony_ci canvas->restore(); 101cb93a386Sopenharmony_ci xPos += 150; 102cb93a386Sopenharmony_ci } 103cb93a386Sopenharmony_ci yPos += 150; 104cb93a386Sopenharmony_ci } 105cb93a386Sopenharmony_ci } 106cb93a386Sopenharmony_ci } 107cb93a386Sopenharmony_ci 108cb93a386Sopenharmony_ciprivate: 109cb93a386Sopenharmony_ci SkPaint fOnePaint; 110cb93a386Sopenharmony_ci SkPaint fTwoPaint; 111cb93a386Sopenharmony_ci SkPaint fOutlinePaint; 112cb93a386Sopenharmony_ci SkPaint fOpPaint[kReverseDifference_SkPathOp - kDifference_SkPathOp + 1]; 113cb93a386Sopenharmony_ci using INHERITED = GM; 114cb93a386Sopenharmony_ci}; 115cb93a386Sopenharmony_ci 116cb93a386Sopenharmony_ci////////////////////////////////////////////////////////////////////////////// 117cb93a386Sopenharmony_ci 118cb93a386Sopenharmony_ciDEF_GM( return new PathOpsInverseGM; ) 119cb93a386Sopenharmony_ci 120cb93a386Sopenharmony_ci} // namespace skiagm 121cb93a386Sopenharmony_ci 122cb93a386Sopenharmony_ci#include "include/pathops/SkPathOps.h" 123cb93a386Sopenharmony_ci#include "include/utils/SkParsePath.h" 124cb93a386Sopenharmony_ci 125cb93a386Sopenharmony_ciDEF_SIMPLE_GM(pathops_skbug_10155, canvas, 256, 256) { 126cb93a386Sopenharmony_ci const char* svgStr[] = { 127cb93a386Sopenharmony_ci "M474.889 27.0952C474.889 27.1002 474.888 27.1018 474.889 27.1004L479.872 27.5019C479.883 27.3656 479.889 27.2299 479.889 27.0952L474.889 27.0952L474.889 27.0952Z", 128cb93a386Sopenharmony_ci "M474.94 26.9405C474.93 26.9482 474.917 26.9576 474.901 26.9683L477.689 31.1186C477.789 31.0512 477.888 30.9804 477.985 30.9059L474.94 26.9405L474.94 26.9405Z" 129cb93a386Sopenharmony_ci }; 130cb93a386Sopenharmony_ci 131cb93a386Sopenharmony_ci SkPath path[2], resultPath; 132cb93a386Sopenharmony_ci SkOpBuilder builder; 133cb93a386Sopenharmony_ci 134cb93a386Sopenharmony_ci for (int i = 0; i < 2; i++) 135cb93a386Sopenharmony_ci { 136cb93a386Sopenharmony_ci SkParsePath::FromSVGString(svgStr[i], &path[i]); 137cb93a386Sopenharmony_ci builder.add(path[i], kUnion_SkPathOp); 138cb93a386Sopenharmony_ci } 139cb93a386Sopenharmony_ci 140cb93a386Sopenharmony_ci builder.resolve(&resultPath); 141cb93a386Sopenharmony_ci 142cb93a386Sopenharmony_ci auto r = path[0].getBounds(); 143cb93a386Sopenharmony_ci canvas->translate(30, 30); 144cb93a386Sopenharmony_ci canvas->scale(200 / r.width(), 200 / r.width()); 145cb93a386Sopenharmony_ci canvas->translate(-r.fLeft, -r.fTop); 146cb93a386Sopenharmony_ci 147cb93a386Sopenharmony_ci SkPaint paint; 148cb93a386Sopenharmony_ci paint.setColor(SK_ColorRED); 149cb93a386Sopenharmony_ci paint.setAntiAlias(true); 150cb93a386Sopenharmony_ci paint.setStyle(SkPaint::kStroke_Style); 151cb93a386Sopenharmony_ci paint.setStrokeWidth(0); 152cb93a386Sopenharmony_ci 153cb93a386Sopenharmony_ci canvas->drawPath(path[0], paint); 154cb93a386Sopenharmony_ci canvas->drawPath(path[1], paint); 155cb93a386Sopenharmony_ci 156cb93a386Sopenharmony_ci // The blue draw should (nearly) overdraw all of the red (except where the two paths intersect) 157cb93a386Sopenharmony_ci paint.setColor(SK_ColorBLUE); 158cb93a386Sopenharmony_ci canvas->drawPath(resultPath, paint); 159cb93a386Sopenharmony_ci} 160