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