1 2 3 /* 4 * Copyright 2012 Google Inc. 5 * 6 * Use of this source code is governed by a BSD-style license that can be 7 * found in the LICENSE file. 8 */ 9 10 #include "gm.h" 11 #include "SkCanvas.h" 12 #include "SkPicture.h" 13 14 namespace skiagm { 15 16 class DistantClipGM : public GM { 17 public: 18 DistantClipGM() { } 19 20 protected: 21 22 SkString onShortName() { 23 return SkString("distantclip"); 24 } 25 26 SkISize onISize() { return make_isize(100, 100); } 27 28 virtual void onDraw(SkCanvas* canvas) { 29 int offset = 35000; 30 int extents = 1000; 31 32 // We record a picture of huge vertical extents in which we clear the canvas to red, create 33 // a 'extents' by 'extents' round rect clip at a vertical offset of 'offset', then draw 34 // green into that. 35 SkPicture pict; 36 SkCanvas* rec = pict.beginRecording(100, offset + extents); 37 rec->drawColor(0xffff0000); 38 rec->save(); 39 SkRect r = { 40 SkIntToScalar(-extents), 41 SkIntToScalar(offset - extents), 42 SkIntToScalar(extents), 43 SkIntToScalar(offset + extents) 44 }; 45 SkPath p; 46 p.addRoundRect(r, 5, 5); 47 rec->clipPath(p, SkRegion::kIntersect_Op, true); 48 rec->drawColor(0xff00ff00); 49 rec->restore(); 50 pict.endRecording(); 51 52 // Next we play that picture into another picture of the same size. 53 SkPicture pict2; 54 pict.draw(pict2.beginRecording(100, offset + extents)); 55 pict2.endRecording(); 56 57 // Finally we play the part of that second picture that should be green into the canvas. 58 canvas->save(); 59 canvas->translate(SkIntToScalar(extents / 2), 60 SkIntToScalar(-(offset - extents / 2))); 61 pict2.draw(canvas); 62 canvas->restore(); 63 64 // If the image is red, we erroneously decided the clipPath was empty and didn't record 65 // the green drawColor, if it's green we're all good. 66 } 67 68 private: 69 typedef GM INHERITED; 70 }; 71 72 /////////////////////////////////////////////////////////////////////////////// 73 74 static GM* MyFactory(void*) { return new DistantClipGM; } 75 static GMRegistry reg(MyFactory); 76 77 } 78