167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com/*
267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com * Copyright 2012 Google Inc.
367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com *
467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com * Use of this source code is governed by a BSD-style license that can be
567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com * found in the LICENSE file.
667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com */
767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com#include "gm.h"
933d2055e594177b27360f84e0631b26d74a55a9bMike Klein#include "sk_tool_utils.h"
10fb8c1fcab19c99b56d2fdcf6234751d6f0465142reed#include "SkAAClip.h"
11d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkCanvas.h"
12d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkPath.h"
1367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
1467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comnamespace skiagm {
1567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
1667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comstatic void paint_rgn(SkCanvas* canvas, const SkAAClip& clip,
1767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                      const SkPaint& paint) {
1867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkMask mask;
1967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkBitmap bm;
2067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
2167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    clip.copyToMask(&mask);
2267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
2367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkAutoMaskFreeImage amfi(mask.fImage);
2467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
25dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org    bm.installMaskPixels(mask);
2667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
2767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    // need to copy for deferred drawing test to work
2867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkBitmap bm2;
2967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
306285f4f7662853336b788d6ee3e177c396f7fb01commit-bot@chromium.org    bm.deepCopyTo(&bm2);
3167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
3267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    canvas->drawBitmap(bm2,
3367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                       SK_Scalar1 * mask.fBounds.fLeft,
3467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                       SK_Scalar1 * mask.fBounds.fTop,
3567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                       &paint);
3667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com}
3767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
3867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com//////////////////////////////////////////////////////////////////////////////
3967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com/*
40d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com * This GM tests anti aliased single operation booleans with SkAAClips,
4167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com * SkRect and SkPaths.
4267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com */
4367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comclass SimpleClipGM : public GM {
4467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.compublic:
4567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    enum SkGeomTypes {
4667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        kRect_GeomType,
4767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        kPath_GeomType,
4867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        kAAClip_GeomType
4967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    };
5067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
5167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SimpleClipGM(SkGeomTypes geomType)
5267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    : fGeomType(geomType) {
5363c684a8a609d39da11b4a656223cebf52ca85dccaryclark    }
5467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
5563c684a8a609d39da11b4a656223cebf52ca85dccaryclarkprotected:
5636352bf5e38f45a70ee4f4fc132a38048d38206dmtklein    void onOnceBeforeDraw() override {
5767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        // offset the rects a bit so we get anti-aliasing in the rect case
584b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        fBase.set(100.65f,
594b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org                  100.65f,
604b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org                  150.65f,
614b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org                  150.65f);
6267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        fRect = fBase;
6367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        fRect.inset(5, 5);
6467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        fRect.offset(25, 25);
6567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
6667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        fBasePath.addRoundRect(fBase, SkIntToScalar(5), SkIntToScalar(5));
6767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        fRectPath.addRoundRect(fRect, SkIntToScalar(5), SkIntToScalar(5));
6865cdba6ba78aaec0c0a4596bb5941020c789482bcaryclark        INHERITED::setBGColor(sk_tool_utils::color_to_565(0xFFDDDDDD));
6967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
7067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
71c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed    void buildRgn(SkAAClip* clip, SkClipOp op) {
7296fcdcc219d2a0d3579719b84b28bede76efba64halcanary        clip->setPath(fBasePath, nullptr, true);
7367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
7467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkAAClip clip2;
7596fcdcc219d2a0d3579719b84b28bede76efba64halcanary        clip2.setPath(fRectPath, nullptr, true);
7673603f3c52ffd89fe9d035be827b566a0e7d3b79reed        clip->op(clip2, (SkRegion::Op)op);
7767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
7867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
7967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    void drawOrig(SkCanvas* canvas) {
8067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkPaint     paint;
81d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
8267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        paint.setStyle(SkPaint::kStroke_Style);
8367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        paint.setColor(SK_ColorBLACK);
84d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
8567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        canvas->drawRect(fBase, paint);
8667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        canvas->drawRect(fRect, paint);
8767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
88d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
89c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed    void drawRgnOped(SkCanvas* canvas, SkClipOp op, SkColor color) {
9067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
9167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkAAClip clip;
9267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
9367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        this->buildRgn(&clip, op);
9467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        this->drawOrig(canvas);
9567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
9667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkPaint paint;
9767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        paint.setColor(color);
9867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        paint_rgn(canvas, clip, paint);
9967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
10067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
101c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed    void drawPathsOped(SkCanvas* canvas, SkClipOp op, SkColor color) {
10267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
10367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        this->drawOrig(canvas);
10467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
10567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        canvas->save();
10667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
10767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        // create the clip mask with the supplied boolean op
10867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        if (kPath_GeomType == fGeomType) {
10967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            // path-based case
110669983856d99b9312be3166b7dd1f8483a90c315reed            canvas->clipPath(fBasePath, true);
11167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            canvas->clipPath(fRectPath, op, true);
11267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        } else {
11367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            // rect-based case
114669983856d99b9312be3166b7dd1f8483a90c315reed            canvas->clipRect(fBase, true);
11567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            canvas->clipRect(fRect, op, true);
11667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        }
11767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
11867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        // draw a rect that will entirely cover the clip mask area
11967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkPaint paint;
12067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        paint.setColor(color);
12167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
12267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkRect r = SkRect::MakeLTRB(SkIntToScalar(90),  SkIntToScalar(90),
12367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                                    SkIntToScalar(180), SkIntToScalar(180));
12467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
12567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        canvas->drawRect(r, paint);
12667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
12767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        canvas->restore();
12867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
12967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
130f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    SkString onShortName() override {
13167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkString str;
132d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        str.printf("simpleaaclip_%s",
13367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                    kRect_GeomType == fGeomType ? "rect" :
134d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com                    (kPath_GeomType == fGeomType ? "path" :
13567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                    "aaclip"));
13667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        return str;
13767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
13867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
139f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    SkISize onISize() override {
140f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(640, 480);
14167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
14267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
143f059900f75639f1b1a03f2c25333ef9aa22d58b8mtklein    void onDraw(SkCanvas* canvas) override {
14467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
145dbfd7ab10883f173f5c1b653a233e18dc6142002mtklein        const struct {
14667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            SkColor         fColor;
14767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            const char*     fName;
148c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            SkClipOp        fOp;
14967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        } gOps[] = {
150c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            { SK_ColorBLACK,    "Difference", kDifference_SkClipOp    },
151c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            { SK_ColorRED,      "Intersect",  kIntersect_SkClipOp     },
152c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            { sk_tool_utils::color_to_565(0xFF008800), "Union", kUnion_SkClipOp },
153c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            { SK_ColorGREEN,    "Rev Diff",   kReverseDifference_SkClipOp },
154c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            { SK_ColorYELLOW,   "Replace",    kReplace_SkClipOp       },
155c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed            { SK_ColorBLUE,     "XOR",        kXOR_SkClipOp           },
15667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        };
15767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
15867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkPaint textPaint;
15967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        textPaint.setAntiAlias(true);
1601818acb6a4b11cd9a1d44ce5dde77452502a9796caryclark        sk_tool_utils::set_portable_typeface(&textPaint);
16167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        textPaint.setTextSize(SK_Scalar1*24);
1622a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com        int xOff = 0;
16367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
16467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) {
16567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            canvas->drawText(gOps[op].fName, strlen(gOps[op].fName),
166d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com                             SkIntToScalar(75), SkIntToScalar(50),
16767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                             textPaint);
16867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
16967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            if (kAAClip_GeomType == fGeomType) {
17067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                this->drawRgnOped(canvas, gOps[op].fOp, gOps[op].fColor);
17167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            } else {
17267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                this->drawPathsOped(canvas, gOps[op].fOp, gOps[op].fColor);
17367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            }
17467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
1752a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com            if (xOff >= 400) {
1762a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com                canvas->translate(SkIntToScalar(-400), SkIntToScalar(250));
1772a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com                xOff = 0;
17867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            } else {
17967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                canvas->translate(SkIntToScalar(200), 0);
1802a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com                xOff += 200;
18167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            }
18267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        }
18367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
18467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comprivate:
18567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
18667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkGeomTypes fGeomType;
18767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
18867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkRect fBase;
18967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkRect fRect;
19067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
19167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkPath fBasePath;       // fBase as a round rect
19267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkPath fRectPath;       // fRect as a round rect
19367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
19467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    typedef GM INHERITED;
19567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com};
19667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
19767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com//////////////////////////////////////////////////////////////////////////////
19867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
19967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com// rects
200de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kRect_GeomType); )
201de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kPath_GeomType); )
202de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kAAClip_GeomType); )
203a7aedfec9e28db36c97e49f11f2bc2e0eb624c30skia.committer@gmail.com
20467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com}
205