distantclip.cpp revision 5fb2ce38b3dcb8e60e9e112df23c9d42456d7069
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 14namespace skiagm { 15 16class DistantClipGM : public GM { 17public: 18 DistantClipGM() { } 19 20protected: 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 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(100, offset + extents, NULL, 0); 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 SkAutoTUnref<SkPicture> pict(recorder.endRecording()); 51 52 // Next we play that picture into another picture of the same size. 53 pict->draw(recorder.beginRecording(100, offset + extents, NULL, 0)); 54 SkAutoTUnref<SkPicture> pict2(recorder.endRecording()); 55 56 // Finally we play the part of that second picture that should be green into the canvas. 57 canvas->save(); 58 canvas->translate(SkIntToScalar(extents / 2), 59 SkIntToScalar(-(offset - extents / 2))); 60 pict2->draw(canvas); 61 canvas->restore(); 62 63 // If the image is red, we erroneously decided the clipPath was empty and didn't record 64 // the green drawColor, if it's green we're all good. 65 } 66 67private: 68 typedef GM INHERITED; 69}; 70 71/////////////////////////////////////////////////////////////////////////////// 72 73static GM* MyFactory(void*) { return new DistantClipGM; } 74static GMRegistry reg(MyFactory); 75 76} 77