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#include "SkPictureRecorder.h" 14 15namespace skiagm { 16 17class DistantClipGM : public GM { 18public: 19 DistantClipGM() { } 20 21protected: 22 23 SkString onShortName() { 24 return SkString("distantclip"); 25 } 26 27 SkISize onISize() { return SkISize::Make(100, 100); } 28 29 virtual void onDraw(SkCanvas* canvas) { 30 int offset = 35000; 31 int extents = 1000; 32 33 SkPictureRecorder recorder; 34 // We record a picture of huge vertical extents in which we clear the canvas to red, create 35 // a 'extents' by 'extents' round rect clip at a vertical offset of 'offset', then draw 36 // green into that. 37 SkCanvas* rec = recorder.beginRecording(100, offset + extents, NULL, 0); 38 rec->drawColor(0xffff0000); 39 rec->save(); 40 SkRect r = { 41 SkIntToScalar(-extents), 42 SkIntToScalar(offset - extents), 43 SkIntToScalar(extents), 44 SkIntToScalar(offset + extents) 45 }; 46 SkPath p; 47 p.addRoundRect(r, 5, 5); 48 rec->clipPath(p, SkRegion::kIntersect_Op, true); 49 rec->drawColor(0xff00ff00); 50 rec->restore(); 51 SkAutoTUnref<SkPicture> pict(recorder.endRecording()); 52 53 // Next we play that picture into another picture of the same size. 54 pict->draw(recorder.beginRecording(100, offset + extents, NULL, 0)); 55 SkAutoTUnref<SkPicture> pict2(recorder.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 68private: 69 typedef GM INHERITED; 70}; 71 72/////////////////////////////////////////////////////////////////////////////// 73 74static GM* MyFactory(void*) { return new DistantClipGM; } 75static GMRegistry reg(MyFactory); 76 77} 78