1f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/* 2f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Copyright 2010 Google Inc. 3f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 4f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Use of this source code is governed by a BSD-style license that can be 5f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * found in the LICENSE file. 6f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 7f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 8f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifndef SkRasterClip_DEFINED 9f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#define SkRasterClip_DEFINED 10f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 11f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkRegion.h" 12f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#include "SkAAClip.h" 13f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 14f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkRasterClip { 15f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: 16f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkRasterClip(); 17f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkRasterClip(const SkIRect&); 18f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkRasterClip(const SkRasterClip&); 19f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger ~SkRasterClip(); 20f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 21f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool isBW() const { return fIsBW; } 22f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool isAA() const { return !fIsBW; } 23f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkRegion& bwRgn() const { SkASSERT(fIsBW); return fBW; } 24f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkAAClip& aaRgn() const { SkASSERT(!fIsBW); return fAA; } 25f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 26f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool isEmpty() const; 27f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool isRect() const; 28f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool isComplex() const; 29f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkIRect& getBounds() const; 30f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 31f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool setEmpty(); 32f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool setRect(const SkIRect&); 33f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 34f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool setPath(const SkPath& path, const SkRegion& clip, bool doAA); 35f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool setPath(const SkPath& path, const SkIRect& clip, bool doAA); 36f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool setPath(const SkPath& path, const SkRasterClip&, bool doAA); 37f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 38f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool op(const SkIRect&, SkRegion::Op); 39f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool op(const SkRegion&, SkRegion::Op); 40f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool op(const SkRasterClip&, SkRegion::Op); 41f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool op(const SkRect&, SkRegion::Op, bool doAA); 42f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 43f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void translate(int dx, int dy, SkRasterClip* dst) const; 44f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void translate(int dx, int dy) { 45f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger this->translate(dx, dy, this); 46f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 47f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 48f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool quickContains(const SkIRect& rect) const; 49f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool quickContains(int left, int top, int right, int bottom) const { 50f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return quickContains(SkIRect::MakeLTRB(left, top, right, bottom)); 51f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 52f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 53f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger /** 54f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Return true if this region is empty, or if the specified rectangle does 55f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * not intersect the region. Returning false is not a guarantee that they 56f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * intersect, but returning true is a guarantee that they do not. 57f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 58f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool quickReject(const SkIRect& rect) const { 59f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return this->isEmpty() || rect.isEmpty() || 60f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger !SkIRect::Intersects(this->getBounds(), rect); 61f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 62f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 63f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // hack for SkCanvas::getTotalClip 64f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkRegion& forceGetBW(); 65f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 66f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 67f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void validate() const; 68f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#else 69f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void validate() const {} 70f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 71f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 72f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate: 73f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkRegion fBW; 74f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAAClip fAA; 75f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger bool fIsBW; 76f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 77f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void convertToAA(); 78f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}; 79f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 80f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkAutoRasterClipValidate : SkNoncopyable { 81f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: 82f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAutoRasterClipValidate(const SkRasterClip& rc) : fRC(rc) { 83f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fRC.validate(); 84f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 85f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger ~SkAutoRasterClipValidate() { 86f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger fRC.validate(); 87f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 88f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate: 89f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkRasterClip& fRC; 90f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}; 91f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 92f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#ifdef SK_DEBUG 93f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger #define AUTO_RASTERCLIP_VALIDATE(rc) SkAutoRasterClipValidate arcv(rc) 94f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#else 95f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger #define AUTO_RASTERCLIP_VALIDATE(rc) 96f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 97f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 98f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/////////////////////////////////////////////////////////////////////////////// 99f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 100f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger/** 101f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * Encapsulates the logic of deciding if we need to change/wrap the blitter 102f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * for aaclipping. If so, getRgn and getBlitter return modified values. If 103f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * not, they return the raw blitter and (bw) clip region. 104f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * 105f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * We need to keep the constructor/destructor cost as small as possible, so we 106f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * can freely put this guy on the stack, and not pay too much for the case when 107f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger * we're really BW anyways. 108f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger */ 109f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerclass SkAAClipBlitterWrapper { 110f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerpublic: 111f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAAClipBlitterWrapper(); 112f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAAClipBlitterWrapper(const SkRasterClip&, SkBlitter*); 113f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAAClipBlitterWrapper(const SkAAClip*, SkBlitter*); 114f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 115f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger void init(const SkRasterClip&, SkBlitter*); 116f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 117f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkIRect& getBounds() const { 118f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(fClipRgn); 119f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return fClipRgn->getBounds(); 120f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 121f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkRegion& getRgn() const { 122f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(fClipRgn); 123f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return *fClipRgn; 124f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 125f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkBlitter* getBlitter() { 126f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkASSERT(fBlitter); 127f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger return fBlitter; 128f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger } 129f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 130f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenbergerprivate: 131f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkAAClip* fAAClip; 132f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkRegion fBWRgn; 133f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkAAClipBlitter fAABlitter; 134f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger // what we return 135f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger const SkRegion* fClipRgn; 136f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger SkBlitter* fBlitter; 137f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger}; 138f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger 139f8cacf6b11e35785df8efb613b0c3592d535f603Derek Sollenberger#endif 140