1 2 /* 3 * Copyright 2012 Google Inc. 4 * 5 * Use of this source code is governed by a BSD-style license that can be 6 * found in the LICENSE file. 7 */ 8 9 #include "gm/gm.h" 10 #include "include/core/SkCanvas.h" 11 #include "include/core/SkColor.h" 12 #include "include/core/SkPath.h" 13 #include "include/core/SkPicture.h" 14 #include "include/core/SkPictureRecorder.h" 15 #include "include/core/SkRect.h" 16 #include "include/core/SkRefCnt.h" 17 #include "include/core/SkScalar.h" 18 #include "include/core/SkSize.h" 19 #include "include/core/SkString.h" 20 21 namespace skiagm { 22 23 class DistantClipGM : public GM { onShortName()24 SkString onShortName() override { return SkString("distantclip"); } 25 onISize()26 SkISize onISize() override { return {100, 100}; } 27 onDraw(SkCanvas * canvas)28 void onDraw(SkCanvas* canvas) override { 29 constexpr SkScalar kOffset = 35000.0f; 30 constexpr SkScalar kExtents = 1000.0f; 31 32 SkPictureRecorder recorder; 33 // We record a picture of huge vertical extents in which we clear the canvas to red, create 34 // a 'extents' by 'extents' round rect clip at a vertical offset of 'offset', then draw 35 // green into that. 36 SkCanvas* rec = recorder.beginRecording(kExtents, kOffset + kExtents); 37 rec->drawColor(SK_ColorRED); 38 rec->save(); 39 SkRect r = SkRect::MakeXYWH(-kExtents, kOffset - kExtents, 2 * kExtents, 2 * kExtents); 40 rec->clipPath(SkPath::RRect(r, 5, 5), true); 41 rec->drawColor(SK_ColorGREEN); 42 rec->restore(); 43 sk_sp<SkPicture> pict(recorder.finishRecordingAsPicture()); 44 45 // Next we play that picture into another picture of the same size. 46 pict->playback(recorder.beginRecording(pict->cullRect().width(), 47 pict->cullRect().height())); 48 sk_sp<SkPicture> pict2(recorder.finishRecordingAsPicture()); 49 50 // Finally we play the part of that second picture that should be green into the canvas. 51 canvas->save(); 52 canvas->translate(kExtents / 2, -(kOffset - kExtents / 2)); 53 pict2->playback(canvas); 54 canvas->restore(); 55 56 // If the image is red, we erroneously decided the clipPath was empty and didn't record 57 // the green drawColor, if it's green we're all good. 58 } 59 }; 60 61 /////////////////////////////////////////////////////////////////////////////// 62 63 DEF_GM( return new DistantClipGM; ) 64 65 } // namespace skiagm 66