11cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/*
21cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Copyright 2010 Google Inc.
31cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
41cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be
51cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger * found in the LICENSE file.
61cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
71cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
81cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifndef SkRasterClip_DEFINED
91cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#define SkRasterClip_DEFINED
101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkRegion.h"
121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#include "SkAAClip.h"
131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkRasterClip {
151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRasterClip();
171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRasterClip(const SkIRect&);
181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRasterClip(const SkRasterClip&);
191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ~SkRasterClip();
201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool isBW() const { return fIsBW; }
221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool isAA() const { return !fIsBW; }
231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkRegion& bwRgn() const { SkASSERT(fIsBW); return fBW; }
241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkAAClip& aaRgn() const { SkASSERT(!fIsBW); return fAA; }
251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool isEmpty() const;
271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool isRect() const;
281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool isComplex() const;
291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkIRect& getBounds() const;
301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool setEmpty();
321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool setRect(const SkIRect&);
331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool setPath(const SkPath& path, const SkRegion& clip, bool doAA);
351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool setPath(const SkPath& path, const SkIRect& clip, bool doAA);
361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool setPath(const SkPath& path, const SkRasterClip&, bool doAA);
371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool op(const SkIRect&, SkRegion::Op);
391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool op(const SkRegion&, SkRegion::Op);
401cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool op(const SkRasterClip&, SkRegion::Op);
411cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool op(const SkRect&, SkRegion::Op, bool doAA);
421cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
431cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void translate(int dx, int dy, SkRasterClip* dst) const;
441cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void translate(int dx, int dy) {
451cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        this->translate(dx, dy, this);
461cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
471cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
481cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool quickContains(const SkIRect& rect) const;
491cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool quickContains(int left, int top, int right, int bottom) const {
501cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return quickContains(SkIRect::MakeLTRB(left, top, right, bottom));
511cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
521cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
531cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    /**
541cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  Return true if this region is empty, or if the specified rectangle does
551cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  not intersect the region. Returning false is not a guarantee that they
561cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     *  intersect, but returning true is a guarantee that they do not.
571cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger     */
581cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool quickReject(const SkIRect& rect) const {
591cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return this->isEmpty() || rect.isEmpty() ||
601cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger               !SkIRect::Intersects(this->getBounds(), rect);
611cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
621cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
631cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // hack for SkCanvas::getTotalClip
641cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkRegion& forceGetBW();
651cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
661cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_DEBUG
671cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void validate() const;
681cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#else
691cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void validate() const {}
701cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
711cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
721cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
731cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRegion    fBW;
741cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAAClip    fAA;
751cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    bool        fIsBW;
761cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
771cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void convertToAA();
781cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
791cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
801cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkAutoRasterClipValidate : SkNoncopyable {
811cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
821cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAutoRasterClipValidate(const SkRasterClip& rc) : fRC(rc) {
831cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fRC.validate();
841cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
851cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    ~SkAutoRasterClipValidate() {
861cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        fRC.validate();
871cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
881cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
891cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkRasterClip& fRC;
901cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
911cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
921cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#ifdef SK_DEBUG
931cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #define AUTO_RASTERCLIP_VALIDATE(rc)    SkAutoRasterClipValidate arcv(rc)
941cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#else
951cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    #define AUTO_RASTERCLIP_VALIDATE(rc)
961cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
971cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
981cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger///////////////////////////////////////////////////////////////////////////////
991cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1001cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger/**
1011cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  Encapsulates the logic of deciding if we need to change/wrap the blitter
1021cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  for aaclipping. If so, getRgn and getBlitter return modified values. If
1031cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  not, they return the raw blitter and (bw) clip region.
1041cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *
1051cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  We need to keep the constructor/destructor cost as small as possible, so we
1061cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  can freely put this guy on the stack, and not pay too much for the case when
1071cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger *  we're really BW anyways.
1081cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger */
1091cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerclass SkAAClipBlitterWrapper {
1101cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerpublic:
1111cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAAClipBlitterWrapper();
1121cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAAClipBlitterWrapper(const SkRasterClip&, SkBlitter*);
1131cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAAClipBlitterWrapper(const SkAAClip*, SkBlitter*);
1141cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1151cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    void init(const SkRasterClip&, SkBlitter*);
1161cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1171cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkIRect& getBounds() const {
1181cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkASSERT(fClipRgn);
1191cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return fClipRgn->getBounds();
1201cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1211cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkRegion& getRgn() const {
1221cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkASSERT(fClipRgn);
1231cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return *fClipRgn;
1241cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1251cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkBlitter* getBlitter() {
1261cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        SkASSERT(fBlitter);
1271cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger        return fBlitter;
1281cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    }
1291cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1301cab2921ab279367f8206cdadc9259d12e603548Derek Sollenbergerprivate:
1311cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkAAClip* fAAClip;
1321cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkRegion        fBWRgn;
1331cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkAAClipBlitter fAABlitter;
1341cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    // what we return
1351cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    const SkRegion* fClipRgn;
1361cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger    SkBlitter* fBlitter;
1371cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger};
1381cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger
1391cab2921ab279367f8206cdadc9259d12e603548Derek Sollenberger#endif
140