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
967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com#include "gm.h"
1067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com#include "SkCanvas.h"
1167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com#include "SkAAClip.h"
1267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
1367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comnamespace skiagm {
1467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
1567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comstatic void paint_rgn(SkCanvas* canvas, const SkAAClip& clip,
1667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                      const SkPaint& paint) {
1767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkMask mask;
1867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkBitmap bm;
1967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
2067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    clip.copyToMask(&mask);
2167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
2267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkAutoMaskFreeImage amfi(mask.fImage);
2367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
24dac522589e9395b4654a1a708f1bd971f37f95a5commit-bot@chromium.org    bm.installMaskPixels(mask);
2567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
2667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    // need to copy for deferred drawing test to work
2767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkBitmap bm2;
2867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
296285f4f7662853336b788d6ee3e177c396f7fb01commit-bot@chromium.org    bm.deepCopyTo(&bm2);
3067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
3167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    canvas->drawBitmap(bm2,
3267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                       SK_Scalar1 * mask.fBounds.fLeft,
3367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                       SK_Scalar1 * mask.fBounds.fTop,
3467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                       &paint);
3567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com}
3667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
3767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com//////////////////////////////////////////////////////////////////////////////
3867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com/*
39d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com * This GM tests anti aliased single operation booleans with SkAAClips,
4067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com * SkRect and SkPaths.
4167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com */
4267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comclass SimpleClipGM : public GM {
4367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.compublic:
4467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    enum SkGeomTypes {
4567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        kRect_GeomType,
4667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        kPath_GeomType,
4767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        kAAClip_GeomType
4867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    };
4967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
5067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SimpleClipGM(SkGeomTypes geomType)
5167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    : fGeomType(geomType) {
5267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
5367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        // offset the rects a bit so we get anti-aliasing in the rect case
544b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org        fBase.set(100.65f,
554b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org                  100.65f,
564b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org                  150.65f,
574b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org                  150.65f);
5867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        fRect = fBase;
5967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        fRect.inset(5, 5);
6067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        fRect.offset(25, 25);
6167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
6267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        fBasePath.addRoundRect(fBase, SkIntToScalar(5), SkIntToScalar(5));
6367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        fRectPath.addRoundRect(fRect, SkIntToScalar(5), SkIntToScalar(5));
6467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        INHERITED::setBGColor(0xFFDDDDDD);
6567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
6667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
6767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comprotected:
6867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    void buildRgn(SkAAClip* clip, SkRegion::Op op) {
6967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        clip->setPath(fBasePath, NULL, true);
7067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
7167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkAAClip clip2;
7267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        clip2.setPath(fRectPath, NULL, true);
7367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        clip->op(clip2, op);
7467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
7567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
7667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    void drawOrig(SkCanvas* canvas) {
7767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkPaint     paint;
78d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
7967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        paint.setStyle(SkPaint::kStroke_Style);
8067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        paint.setColor(SK_ColorBLACK);
81d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
8267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        canvas->drawRect(fBase, paint);
8367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        canvas->drawRect(fRect, paint);
8467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
85d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com
8667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    void drawRgnOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) {
8767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
8867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkAAClip clip;
8967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
9067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        this->buildRgn(&clip, op);
9167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        this->drawOrig(canvas);
9267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
9367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkPaint paint;
9467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        paint.setColor(color);
9567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        paint_rgn(canvas, clip, paint);
9667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
9767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
9867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    void drawPathsOped(SkCanvas* canvas, SkRegion::Op op, SkColor color) {
9967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
10067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        this->drawOrig(canvas);
10167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
10267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        canvas->save();
10367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
10467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        // create the clip mask with the supplied boolean op
10567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        if (kPath_GeomType == fGeomType) {
10667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            // path-based case
10767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            canvas->clipPath(fBasePath, SkRegion::kReplace_Op, true);
10867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            canvas->clipPath(fRectPath, op, true);
10967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        } else {
11067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            // rect-based case
11167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            canvas->clipRect(fBase, SkRegion::kReplace_Op, true);
11267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            canvas->clipRect(fRect, op, true);
11367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        }
11467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
11567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        // draw a rect that will entirely cover the clip mask area
11667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkPaint paint;
11767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        paint.setColor(color);
11867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
11967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkRect r = SkRect::MakeLTRB(SkIntToScalar(90),  SkIntToScalar(90),
12067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                                    SkIntToScalar(180), SkIntToScalar(180));
12167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
12267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        canvas->drawRect(r, paint);
12367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
12467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        canvas->restore();
12567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
12667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
12767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    virtual SkString onShortName() {
12867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkString str;
129d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com        str.printf("simpleaaclip_%s",
13067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                    kRect_GeomType == fGeomType ? "rect" :
131d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com                    (kPath_GeomType == fGeomType ? "path" :
13267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                    "aaclip"));
13367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        return str;
13467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
13567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
13667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    virtual SkISize onISize() {
137f539318f0d3dba743ec1886d5d9df0fb1be628a1tfarina        return SkISize::Make(640, 480);
13867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
13967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
14067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    virtual void onDraw(SkCanvas* canvas) {
14167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
14267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        static const struct {
14367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            SkColor         fColor;
14467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            const char*     fName;
14567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            SkRegion::Op    fOp;
14667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        } gOps[] = {
14767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            { SK_ColorBLACK,    "Difference", SkRegion::kDifference_Op    },
14867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            { SK_ColorRED,      "Intersect",  SkRegion::kIntersect_Op     },
14967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            { 0xFF008800,       "Union",      SkRegion::kUnion_Op         },
15067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            { SK_ColorGREEN,    "Rev Diff",   SkRegion::kReverseDifference_Op },
1512a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com            { SK_ColorYELLOW,   "Replace",    SkRegion::kReplace_Op       },
1522a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com            { SK_ColorBLUE,     "XOR",        SkRegion::kXOR_Op           },
15367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        };
15467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
15567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        SkPaint textPaint;
15667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        textPaint.setAntiAlias(true);
157992c7b03ef7914a18bfd78e965b0b4c99a5f5672Cary Clark        sk_tool_utils::set_portable_typeface(&textPaint);
15867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        textPaint.setTextSize(SK_Scalar1*24);
1592a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com        int xOff = 0;
16067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
16167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        for (size_t op = 0; op < SK_ARRAY_COUNT(gOps); op++) {
16267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            canvas->drawText(gOps[op].fName, strlen(gOps[op].fName),
163d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.com                             SkIntToScalar(75), SkIntToScalar(50),
16467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                             textPaint);
16567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
16667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            if (kAAClip_GeomType == fGeomType) {
16767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                this->drawRgnOped(canvas, gOps[op].fOp, gOps[op].fColor);
16867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            } else {
16967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                this->drawPathsOped(canvas, gOps[op].fOp, gOps[op].fColor);
17067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            }
17167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
1722a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com            if (xOff >= 400) {
1732a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com                canvas->translate(SkIntToScalar(-400), SkIntToScalar(250));
1742a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com                xOff = 0;
17567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            } else {
17667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com                canvas->translate(SkIntToScalar(200), 0);
1772a021292f5a024e6f6b99be375e8ec2bf61718a8robertphillips@google.com                xOff += 200;
17867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com            }
17967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com        }
18067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    }
18167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.comprivate:
18267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
18367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkGeomTypes fGeomType;
18467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
18567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkRect fBase;
18667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkRect fRect;
18767febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
18867febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkPath fBasePath;       // fBase as a round rect
18967febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    SkPath fRectPath;       // fRect as a round rect
19067febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
19167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com    typedef GM INHERITED;
19267febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com};
19367febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
19467febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com//////////////////////////////////////////////////////////////////////////////
19567febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com
19667febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com// rects
197de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kRect_GeomType); )
198de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kPath_GeomType); )
199de1fc47dff8d771c99518d83c484d3b500f6e945reed@google.comDEF_GM( return new SimpleClipGM(SimpleClipGM::kAAClip_GeomType); )
200a7aedfec9e28db36c97e49f11f2bc2e0eb624c30skia.committer@gmail.com
20167febd9506629568d6e63b4a9e673ace4b42fa2arobertphillips@google.com}
202