9fbdf87518
Instead of writing all drawing and state updates into the final content stream immediately, this change creates a new ContentEntry each time the transform, clip, or paint changes. Drawing is done into a stream in the ContentEntry. When the consumer asks for the content, we combine all the ContentEntries with appropriate updates to the state (clip, transform, paint) in between. This allows us to modify the clip even after a drawing has completed. It also lets us remove ContentEntries with no drawing. Further optimization can be done to better use the stack features of PDF, for now we follow the previous model of having a single clip followed by a single transform on the graphic state stack. Push rectangle logic into SkPDFUtil::AppendRectangle. Change private functions to adhere to coding standards. Review URL: http://codereview.appspot.com/4459041 git-svn-id: http://skia.googlecode.com/svn/trunk@1269 2bbb7eff-a529-9590-31e7-b0007b416f81
82 lines
2.0 KiB
C++
82 lines
2.0 KiB
C++
#ifndef SkClipStack_DEFINED
|
|
#define SkClipStack_DEFINED
|
|
|
|
#include "SkDeque.h"
|
|
#include "SkRegion.h"
|
|
|
|
struct SkRect;
|
|
class SkPath;
|
|
|
|
class SK_API SkClipStack {
|
|
public:
|
|
SkClipStack();
|
|
SkClipStack(const SkClipStack& b);
|
|
~SkClipStack() {}
|
|
|
|
SkClipStack& operator=(const SkClipStack& b);
|
|
bool operator==(const SkClipStack& b) const;
|
|
bool operator!=(const SkClipStack& b) const { return !(*this == b); }
|
|
|
|
void reset();
|
|
|
|
int getSaveCount() const { return fSaveCount; }
|
|
void save();
|
|
void restore();
|
|
|
|
void clipDevRect(const SkIRect& ir,
|
|
SkRegion::Op op = SkRegion::kIntersect_Op) {
|
|
SkRect r;
|
|
r.set(ir);
|
|
this->clipDevRect(r, op);
|
|
}
|
|
void clipDevRect(const SkRect&, SkRegion::Op = SkRegion::kIntersect_Op);
|
|
void clipDevPath(const SkPath&, SkRegion::Op = SkRegion::kIntersect_Op);
|
|
|
|
class B2FIter {
|
|
public:
|
|
/**
|
|
* Creates an uninitialized iterator. Must be reset()
|
|
*/
|
|
B2FIter();
|
|
|
|
B2FIter(const SkClipStack& stack);
|
|
|
|
struct Clip {
|
|
friend bool operator==(const Clip& a, const Clip& b);
|
|
const SkRect* fRect; // if non-null, this is a rect clip
|
|
const SkPath* fPath; // if non-null, this is a path clip
|
|
SkRegion::Op fOp;
|
|
};
|
|
|
|
/**
|
|
* Return the clip for this element in the iterator. If next() returns
|
|
* NULL, then the iterator is done. The type of clip is determined by
|
|
* the pointers fRect and fPath:
|
|
*
|
|
* fRect==NULL fPath!=NULL path clip
|
|
* fRect!=NULL fPath==NULL rect clip
|
|
* fRect==NULL fPath==NULL empty clip
|
|
*/
|
|
const Clip* next();
|
|
|
|
/**
|
|
* Restarts the iterator on a clip stack.
|
|
*/
|
|
void reset(const SkClipStack& stack);
|
|
|
|
private:
|
|
Clip fClip;
|
|
SkDeque::F2BIter fIter;
|
|
};
|
|
|
|
private:
|
|
friend class B2FIter;
|
|
struct Rec;
|
|
|
|
SkDeque fDeque;
|
|
int fSaveCount;
|
|
};
|
|
|
|
#endif
|
|
|