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) { 30a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips static const SkScalar kOffset = 35000.0f; 31a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips static const SkScalar kExtents = 1000.0f; 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. 37a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips SkCanvas* rec = recorder.beginRecording(kExtents, kOffset + kExtents, NULL, 0); 38a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips rec->drawColor(SK_ColorRED); 39ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com rec->save(); 40a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips SkRect r = SkRect::MakeXYWH(-kExtents, kOffset - kExtents, 2 * kExtents, 2 * kExtents); 41ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com SkPath p; 42ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com p.addRoundRect(r, 5, 5); 43ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com rec->clipPath(p, SkRegion::kIntersect_Op, true); 44a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips rec->drawColor(SK_ColorGREEN); 45ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com rec->restore(); 4684b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkAutoTUnref<SkPicture> pict(recorder.endRecording()); 47ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 48ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com // Next we play that picture into another picture of the same size. 49c5ba71d2e5cd426def66fa49dcf003e5b2c98dc7robertphillips pict->playback(recorder.beginRecording(pict->cullRect().width(), 50c5ba71d2e5cd426def66fa49dcf003e5b2c98dc7robertphillips pict->cullRect().height(), 51c5ba71d2e5cd426def66fa49dcf003e5b2c98dc7robertphillips NULL, 0)); 5284b18c7e3e042bf206e1ace3d1b6ea5bb929fe51robertphillips@google.com SkAutoTUnref<SkPicture> pict2(recorder.endRecording()); 53ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 54ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com // Finally we play the part of that second picture that should be green into the canvas. 55ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com canvas->save(); 56a8d7f0b13cd4c6d773fcf055fe17db75d260fa05robertphillips canvas->translate(kExtents / 2, -(kOffset - kExtents / 2)); 57c5ba71d2e5cd426def66fa49dcf003e5b2c98dc7robertphillips pict2->playback(canvas); 58ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com canvas->restore(); 59ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 60ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com // If the image is red, we erroneously decided the clipPath was empty and didn't record 61ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com // the green drawColor, if it's green we're all good. 62ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com } 63ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 64ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.comprivate: 65ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com typedef GM INHERITED; 66ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com}; 67ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 68ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com/////////////////////////////////////////////////////////////////////////////// 69ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 70ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.comstatic GM* MyFactory(void*) { return new DistantClipGM; } 71ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.comstatic GMRegistry reg(MyFactory); 72ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com 73ffadfb5d43a2b09394b4650829bcfc7329ed2d30rileya@google.com} 74