180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/*
280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Copyright 2010 Google Inc.
380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *
480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * Use of this source code is governed by a BSD-style license that can be
580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru * found in the LICENSE file.
680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#include "SkRasterClip.h"
980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkRasterClip::SkRasterClip() {
1280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsBW = true;
1380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsEmpty = true;
1480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsRect = false;
1580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDEBUGCODE(this->validate();)
1680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
1780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
1880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkRasterClip::SkRasterClip(const SkRasterClip& src) {
1980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    AUTO_RASTERCLIP_VALIDATE(src);
2080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsBW = src.fIsBW;
2280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fIsBW) {
2380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fBW = src.fBW;
2480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else {
2580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fAA = src.fAA;
2680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
2780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
2880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsEmpty = src.isEmpty();
2980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsRect = src.isRect();
3080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDEBUGCODE(this->validate();)
3180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
3380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkRasterClip::SkRasterClip(const SkIRect& bounds) : fBW(bounds) {
3480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsBW = true;
3580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsEmpty = this->computeIsEmpty();  // bounds might be empty, so compute
3680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsRect = !fIsEmpty;
3780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDEBUGCODE(this->validate();)
3880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
3980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkRasterClip::~SkRasterClip() {
4180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDEBUGCODE(this->validate();)
4280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::isComplex() const {
4580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fIsBW ? fBW.isComplex() : !fAA.isEmpty();
4680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
4780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
4880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkIRect& SkRasterClip::getBounds() const {
4980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fIsBW ? fBW.getBounds() : fAA.getBounds();
5080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
5180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::setEmpty() {
5380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    AUTO_RASTERCLIP_VALIDATE(*this);
5480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
5580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsBW = true;
5680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fBW.setEmpty();
5780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fAA.setEmpty();
5880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsEmpty = true;
5980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsRect = false;
6080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return false;
6180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
6280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::setRect(const SkIRect& rect) {
6480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    AUTO_RASTERCLIP_VALIDATE(*this);
6580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
6680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsBW = true;
6780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fAA.setEmpty();
6880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsRect = fBW.setRect(rect);
6980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsEmpty = !fIsRect;
7080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fIsRect;
7180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
7280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::setPath(const SkPath& path, const SkRegion& clip, bool doAA) {
7480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    AUTO_RASTERCLIP_VALIDATE(*this);
7580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
7680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (this->isBW() && !doAA) {
7780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (void)fBW.setPath(path, clip);
7880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else {
7980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // TODO: since we are going to over-write fAA completely (aren't we?)
8080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // we should just clear our BW data (if any) and set fIsAA=true
8180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (this->isBW()) {
8280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            this->convertToAA();
8380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
8480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (void)fAA.setPath(path, &clip, doAA);
8580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
8680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->updateCacheAndReturnNonEmpty();
8780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
8880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
8980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::setPath(const SkPath& path, const SkIRect& clip, bool doAA) {
9080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkRegion tmp;
9180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    tmp.setRect(clip);
9280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->setPath(path, tmp, doAA);
9380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
9480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::op(const SkIRect& rect, SkRegion::Op op) {
9680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    AUTO_RASTERCLIP_VALIDATE(*this);
9780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
9880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsBW ? fBW.op(rect, op) : fAA.op(rect, op);
9980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->updateCacheAndReturnNonEmpty();
10080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
10180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::op(const SkRegion& rgn, SkRegion::Op op) {
10380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    AUTO_RASTERCLIP_VALIDATE(*this);
10480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
10580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fIsBW) {
10680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (void)fBW.op(rgn, op);
10780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else {
10880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkAAClip tmp;
10980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        tmp.setRegion(rgn);
11080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (void)fAA.op(tmp, op);
11180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
11280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->updateCacheAndReturnNonEmpty();
11380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
11480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::op(const SkRasterClip& clip, SkRegion::Op op) {
11680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    AUTO_RASTERCLIP_VALIDATE(*this);
11780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    clip.validate();
11880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
11980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (this->isBW() && clip.isBW()) {
12080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (void)fBW.op(clip.fBW, op);
12180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else {
12280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkAAClip tmp;
12380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const SkAAClip* other;
12480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
12580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (this->isBW()) {
12680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            this->convertToAA();
12780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
12880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (clip.isBW()) {
12980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            tmp.setRegion(clip.bwRgn());
13080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            other = &tmp;
13180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        } else {
13280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            other = &clip.aaRgn();
13380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
13480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (void)fAA.op(*other, op);
13580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
13680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->updateCacheAndReturnNonEmpty();
13780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
13880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
13980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru/**
14080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  Our antialiasing currently has a granularity of 1/4 of a pixel along each
14180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  axis. Thus we can treat an axis coordinate as an integer if it differs
14280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru *  from its nearest int by < half of that value (1.8 in this case).
14380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru */
14480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querustatic bool nearly_integral(SkScalar x) {
14580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static const SkScalar domain = SK_Scalar1 / 4;
14680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    static const SkScalar halfDomain = domain / 2;
14780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
14880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    x += halfDomain;
14980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return x - SkScalarFloorToScalar(x) < domain;
15080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
15180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::op(const SkRect& r, SkRegion::Op op, bool doAA) {
15380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    AUTO_RASTERCLIP_VALIDATE(*this);
15480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
15580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fIsBW && doAA) {
15680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // check that the rect really needs aa, or is it close enought to
15780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // integer boundaries that we can just treat it as a BW rect?
15880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (nearly_integral(r.fLeft) && nearly_integral(r.fTop) &&
15980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            nearly_integral(r.fRight) && nearly_integral(r.fBottom)) {
16080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            doAA = false;
16180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
16280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
16380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
16480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fIsBW && !doAA) {
16580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkIRect ir;
16680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        r.round(&ir);
16780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (void)fBW.op(ir, op);
16880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else {
16980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        if (fIsBW) {
17080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru            this->convertToAA();
17180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        }
17280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        (void)fAA.op(r, op, doAA);
17380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
17480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return this->updateCacheAndReturnNonEmpty();
17580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
17680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
17780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkRasterClip::translate(int dx, int dy, SkRasterClip* dst) const {
17880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (NULL == dst) {
17980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return;
18080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
18180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    AUTO_RASTERCLIP_VALIDATE(*this);
18380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
18480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (this->isEmpty()) {
18580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        dst->setEmpty();
18680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return;
18780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
18880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (0 == (dx | dy)) {
18980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        *dst = *this;
19080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        return;
19180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
19280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
19380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dst->fIsBW = fIsBW;
19480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fIsBW) {
19580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fBW.translate(dx, dy, &dst->fBW);
19680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        dst->fAA.setEmpty();
19780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else {
19880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fAA.translate(dx, dy, &dst->fAA);
19980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        dst->fBW.setEmpty();
20080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
20180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    dst->updateCacheAndReturnNonEmpty();
20280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
20380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Querubool SkRasterClip::quickContains(const SkIRect& ir) const {
20580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fIsBW ? fBW.quickContains(ir) : fAA.quickContains(ir);
20680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
20780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
20880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
20980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruconst SkRegion& SkRasterClip::forceGetBW() {
21180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    AUTO_RASTERCLIP_VALIDATE(*this);
21280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (!fIsBW) {
21480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fBW.setRect(fAA.getBounds());
21580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
21680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    return fBW;
21780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
21880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
21980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkRasterClip::convertToAA() {
22080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    AUTO_RASTERCLIP_VALIDATE(*this);
22180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(fIsBW);
22380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fAA.setRegion(fBW);
22480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fIsBW = false;
22580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    (void)this->updateCacheAndReturnNonEmpty();
22680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
22780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
22880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#ifdef SK_DEBUG
22980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkRasterClip::validate() const {
23080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // can't ever assert that fBW is empty, since we may have called forceGetBW
23180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (fIsBW) {
23280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        SkASSERT(fAA.isEmpty());
23380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
23480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fBW.validate();
23680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fAA.validate();
23780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
23880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(this->computeIsEmpty() == fIsEmpty);
23980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(this->computeIsRect() == fIsRect);
24080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
24180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru#endif
24280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru///////////////////////////////////////////////////////////////////////////////
24480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
24580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkAAClipBlitterWrapper::SkAAClipBlitterWrapper() {
24680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDEBUGCODE(fClipRgn = NULL;)
24780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkDEBUGCODE(fBlitter = NULL;)
24880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
24980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
25080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkAAClipBlitterWrapper::SkAAClipBlitterWrapper(const SkRasterClip& clip,
25180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                               SkBlitter* blitter) {
25280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    this->init(clip, blitter);
25380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
25480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
25580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste QueruSkAAClipBlitterWrapper::SkAAClipBlitterWrapper(const SkAAClip* aaclip,
25680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru                                               SkBlitter* blitter) {
25780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(blitter);
25880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(aaclip);
25980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fBWRgn.setRect(aaclip->getBounds());
26080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fAABlitter.init(blitter, aaclip);
26180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    // now our return values
26280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fClipRgn = &fBWRgn;
26380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    fBlitter = &fAABlitter;
26480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
26580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru
26680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queruvoid SkAAClipBlitterWrapper::init(const SkRasterClip& clip, SkBlitter* blitter) {
26780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    SkASSERT(blitter);
26880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    if (clip.isBW()) {
26980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fClipRgn = &clip.bwRgn();
27080bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fBlitter = blitter;
27180bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    } else {
27280bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        const SkAAClip& aaclip = clip.aaRgn();
27380bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fBWRgn.setRect(aaclip.getBounds());
27480bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fAABlitter.init(blitter, &aaclip);
27580bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        // now our return values
27680bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fClipRgn = &fBWRgn;
27780bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru        fBlitter = &fAABlitter;
27880bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru    }
27980bacfeb4bda06541e8695bd502229727bccfeaJean-Baptiste Queru}
280