1ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 2ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 3ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com/* 4ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com * Copyright 2012 Google Inc. 5ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com * 6ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com * Use of this source code is governed by a BSD-style license that can be 7ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com * found in the LICENSE file. 8ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com */ 9ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 10ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com#include "gm.h" 11ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com#include "SkCanvas.h" 12ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com#include "SkPicture.h" 13770963f23f4fc313db0fa3bac18b1b8aafb55f17robertphillips@google.com#include "SkPictureRecorder.h" 14ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 15ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.comnamespace skiagm { 16ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 17ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.comclass DistantClipGM : public GM { 18ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.compublic: 19ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com DistantClipGM() { } 20ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 21ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.comprotected: 22ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 23ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com SkString onShortName() { 24ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com return SkString("distantclip"); 25ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com } 26ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 27f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina SkISize onISize() { return SkISize::Make(100, 100); } 28ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 29ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com virtual void onDraw(SkCanvas* canvas) { 30ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com int offset = 35000; 31ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com int extents = 1000; 32ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 3384b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkPictureRecorder recorder; 34ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com // We record a picture of huge vertical extents in which we clear the canvas to red, create 35ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com // a 'extents' by 'extents' round rect clip at a vertical offset of 'offset', then draw 36ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com // green into that. 375fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org SkCanvas* rec = recorder.beginRecording(100, offset + extents, NULL, 0); 38ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com rec->drawColor(0xffff0000); 39ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com rec->save(); 40968c17dddad328cd9e4bd3cb9dea2f47c206f231robertphillips@google.com SkRect r = { 4154339a826e460c2371f946224cca4db8482d8f5bskia.committer@gmail.com SkIntToScalar(-extents), 4254339a826e460c2371f946224cca4db8482d8f5bskia.committer@gmail.com SkIntToScalar(offset - extents), 4354339a826e460c2371f946224cca4db8482d8f5bskia.committer@gmail.com SkIntToScalar(extents), 4454339a826e460c2371f946224cca4db8482d8f5bskia.committer@gmail.com SkIntToScalar(offset + extents) 45968c17dddad328cd9e4bd3cb9dea2f47c206f231robertphillips@google.com }; 46ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com SkPath p; 47ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com p.addRoundRect(r, 5, 5); 48ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com rec->clipPath(p, SkRegion::kIntersect_Op, true); 49ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com rec->drawColor(0xff00ff00); 50ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com rec->restore(); 5184b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkAutoTUnref<SkPicture> pict(recorder.endRecording()); 52ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 53ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com // Next we play that picture into another picture of the same size. 545fb2ce38b3dcb8e60e9e112df23c9d42456d7069commit-bot@chromium.org pict->draw(recorder.beginRecording(100, offset + extents, NULL, 0)); 5584b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkAutoTUnref<SkPicture> pict2(recorder.endRecording()); 56ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 57ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com // Finally we play the part of that second picture that should be green into the canvas. 58ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com canvas->save(); 5954339a826e460c2371f946224cca4db8482d8f5bskia.committer@gmail.com canvas->translate(SkIntToScalar(extents / 2), 60968c17dddad328cd9e4bd3cb9dea2f47c206f231robertphillips@google.com SkIntToScalar(-(offset - extents / 2))); 6184b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com pict2->draw(canvas); 62ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com canvas->restore(); 63ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 64ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com // If the image is red, we erroneously decided the clipPath was empty and didn't record 65ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com // the green drawColor, if it's green we're all good. 66ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com } 67ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 68ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.comprivate: 69ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com typedef GM INHERITED; 70ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com}; 71ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 72ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com/////////////////////////////////////////////////////////////////////////////// 73ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 74ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.comstatic GM* MyFactory(void*) { return new DistantClipGM; } 75ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.comstatic GMRegistry reg(MyFactory); 76ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 77ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com} 78