|  | /* | 
|  | * Copyright 2019 Google Inc. | 
|  | * | 
|  | * Use of this source code is governed by a BSD-style license that can be | 
|  | * found in the LICENSE file. | 
|  | */ | 
|  |  | 
|  | #include "gm/gm.h" | 
|  |  | 
|  | #include "include/core/SkCanvas.h" | 
|  | #include "include/core/SkPaint.h" | 
|  | #include "include/core/SkRegion.h" | 
|  |  | 
|  | static constexpr int kSize = 3*3*3*3*3; | 
|  | static constexpr int kTrans = 10; | 
|  |  | 
|  | DEF_SIMPLE_GM(clip_sierpinski_region, canvas, 2*kTrans + kSize, 2*kTrans + kSize) { | 
|  | SkRegion region; | 
|  | static constexpr int kSteps = 4; | 
|  | int n = 1; | 
|  | SkScalar s = kSize/3.f; | 
|  | for (int i = 0; i < kSteps; ++i, n*=3, s/=3.f) { | 
|  | for (int x = 0; x < n; ++x) { | 
|  | for (int y = 0; y < n; ++y) { | 
|  | region.op(SkIRect::MakeXYWH((3*x + 1)*s, (3*y + 1)*s, s, s), SkRegion::kUnion_Op); | 
|  | } | 
|  | } | 
|  | } | 
|  | // Test that a save layer with an offset works as expected. | 
|  | region.translate(kTrans, kTrans); | 
|  | canvas->saveLayer(SkRect::MakeXYWH(kTrans, kTrans, 1000, 1000), nullptr); | 
|  | // Make sure the clip call ignores the CTM. | 
|  | canvas->rotate(25.f, 50.f, 50.f); | 
|  | canvas->clipRegion(region); | 
|  | SkPaint red; | 
|  | red.setColor(SK_ColorRED); | 
|  | canvas->drawPaint(red); | 
|  | canvas->restore(); | 
|  | } |