aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/pipe/SkGPipeRead.cpp
diff options
context:
space:
mode:
authorGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-05-11 00:42:04 +0000
committerGravatar reed@google.com <reed@google.com@2bbb7eff-a529-9590-31e7-b0007b416f81>2011-05-11 00:42:04 +0000
commitb55d118e32062b1ddd88e7fcf8fa86303f887d8f (patch)
tree2efce41e5c0ea68f9ef5acc1efda806174ff5356 /src/pipe/SkGPipeRead.cpp
parent34dae877941d1010fafa358a5ebcaebb9a23594a (diff)
check-point for pipe: flatten/unflatten objects for single paint
still need replacement policy git-svn-id: http://skia.googlecode.com/svn/trunk@1294 2bbb7eff-a529-9590-31e7-b0007b416f81
Diffstat (limited to 'src/pipe/SkGPipeRead.cpp')
-rw-r--r--src/pipe/SkGPipeRead.cpp89
1 files changed, 69 insertions, 20 deletions
diff --git a/src/pipe/SkGPipeRead.cpp b/src/pipe/SkGPipeRead.cpp
index 6ea289738e..d33258c85a 100644
--- a/src/pipe/SkGPipeRead.cpp
+++ b/src/pipe/SkGPipeRead.cpp
@@ -31,6 +31,32 @@
#include "SkTypeface.h"
#include "SkXfermode.h"
+static void set_paintflat(SkPaint* paint, SkFlattenable* obj, unsigned paintFlat) {
+ SkASSERT(paintFlat < kCount_PaintFlats);
+ switch (paintFlat) {
+ case kColorFilter_PaintFlat:
+ paint->setColorFilter((SkColorFilter*)obj);
+ break;
+ case kMaskFilter_PaintFlat:
+ paint->setMaskFilter((SkMaskFilter*)obj);
+ break;
+ case kPathEffect_PaintFlat:
+ paint->setPathEffect((SkPathEffect*)obj);
+ break;
+ case kRasterizer_PaintFlat:
+ paint->setRasterizer((SkRasterizer*)obj);
+ break;
+ case kShader_PaintFlat:
+ paint->setShader((SkShader*)obj);
+ break;
+ case kXfermode_PaintFlat:
+ paint->setXfermode((SkXfermode*)obj);
+ break;
+ default:
+ SkASSERT(!"never gets here");
+ }
+}
+
template <typename T> class SkRefCntTDArray : public SkTDArray<T> {
public:
~SkRefCntTDArray() { this->unrefAll(); }
@@ -50,6 +76,19 @@ public:
// index == count. If index > count, return NULL
SkPaint* editPaint(uint32_t drawOp32);
+ SkFlattenable* getFlat(unsigned index) const {
+ if (0 == index) {
+ return NULL;
+ }
+ return fFlatArray[index - 1];
+ }
+
+ void defFlattenable(PaintFlats pf, unsigned index) {
+ SkFlattenable* obj = fReader->readFlattenable();
+ *fFlatArray.append() = obj;
+ SkASSERT(index == fFlatArray.count());
+ }
+
void addTypeface() {
size_t size = fReader->readU32();
const void* data = fReader->skip(SkAlign4(size));
@@ -103,8 +142,10 @@ public:
paint->setXfermode(id ? fXfermodes[id - 1] : NULL);
}
-private:
SkFlattenableReadBuffer* fReader;
+ SkTDArray<SkFlattenable*> fFlatArray;
+
+private:
SkTDArray<SkPaint*> fPaints;
@@ -133,18 +174,6 @@ template <typename T> const T* skipAlign(SkReader32* reader, int count = 1) {
return reinterpret_cast<const T*>(reader->skip(size));
}
-static void readRegion(SkReader32* reader, SkRegion* rgn) {
- size_t size = rgn->unflatten(reader->peek());
- SkASSERT(SkAlign4(size) == size);
- (void)reader->skip(size);
-}
-
-static void readMatrix(SkReader32* reader, SkMatrix* matrix) {
- size_t size = matrix->unflatten(reader->peek());
- SkASSERT(SkAlign4(size) == size);
- (void)reader->skip(size);
-}
-
const SkPaint& SkGPipeState::getPaint(uint32_t op32) const {
unsigned index = DrawOp_unpackData(op32);
if (index >= fPaints.count()) {
@@ -181,7 +210,7 @@ static void clipPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
static void clipRegion_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
SkGPipeState* state) {
SkRegion rgn;
- readRegion(reader, &rgn);
+ SkReadRegion(reader, &rgn);
canvas->clipRegion(rgn, (SkRegion::Op)DrawOp_unpackData(op32));
}
@@ -195,14 +224,14 @@ static void clipRect_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
static void setMatrix_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
SkGPipeState* state) {
SkMatrix matrix;
- readMatrix(reader, &matrix);
+ SkReadMatrix(reader, &matrix);
canvas->setMatrix(matrix);
}
static void concat_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
SkGPipeState* state) {
SkMatrix matrix;
- readMatrix(reader, &matrix);
+ SkReadMatrix(reader, &matrix);
canvas->concat(matrix);
}
@@ -365,7 +394,7 @@ static void drawTextOnPath_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op3
SkMatrix matrixStorage;
const SkMatrix* matrix = NULL;
if (DrawOp_unpackFlags(op32) & kDrawTextOnPath_HasMatrix_DrawOpFlag) {
- readMatrix(reader, &matrixStorage);
+ SkReadMatrix(reader, &matrixStorage);
matrix = &matrixStorage;
}
@@ -421,7 +450,9 @@ static void drawPicture_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32,
static void paintOp_rp(SkCanvas*, SkReader32* reader, uint32_t op32,
SkGPipeState* state) {
- SkPaint* p = state->editPaint(op32);
+ size_t offset = reader->offset();
+ size_t stop = offset + PaintOp_unpackData(op32);
+ SkPaint* p = state->editPaint(0);
int done;
do {
@@ -430,7 +461,7 @@ static void paintOp_rp(SkCanvas*, SkReader32* reader, uint32_t op32,
unsigned data = PaintOp_unpackData(p32);
done = PaintOp_unpackFlags(p32) & kLastOp_PaintOpFlag;
- SkDebugf(" read %08X op=%d flags=%d data=%d\n", p32, op, done, data);
+// SkDebugf(" read %08X op=%d flags=%d data=%d\n", p32, op, done, data);
switch (op) {
case kReset_PaintOp: p->reset(); break;
@@ -450,6 +481,13 @@ static void paintOp_rp(SkCanvas*, SkReader32* reader, uint32_t op32,
case kTextScaleX_PaintOp: p->setTextScaleX(reader->readScalar()); break;
case kTextSkewX_PaintOp: p->setTextSkewX(reader->readScalar()); break;
+ case kFlatIndex_PaintOp: {
+ PaintFlats pf = (PaintFlats)PaintOp_unpackFlags(p32);
+ unsigned index = data;
+ set_paintflat(p, state->getFlat(index), pf);
+ break;
+ }
+
case kTypeface_PaintOp: state->setTypeface(p, data); break;
case kPathEffect_PaintOp: state->setPathEffect(p, data); break;
case kShader_PaintOp: state->setShader(p, data); break;
@@ -460,11 +498,20 @@ static void paintOp_rp(SkCanvas*, SkReader32* reader, uint32_t op32,
case kDrawLooper_PaintOp: state->setLooper(p, data); break;
default: SkASSERT(!"bad paintop"); return;
}
+ SkASSERT(reader->offset() <= stop);
+ done = (reader->offset() >= stop);
} while (!done);
}
///////////////////////////////////////////////////////////////////////////////
+static void def_PaintFlat_rp(SkCanvas*, SkReader32*, uint32_t op32,
+ SkGPipeState* state) {
+ PaintFlats pf = (PaintFlats)DrawOp_unpackFlags(op32);
+ unsigned index = DrawOp_unpackData(op32);
+ state->defFlattenable(pf, index);
+}
+
static void def_ColorFilter_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState* state) {
state->addColorFilter();
}
@@ -540,6 +587,7 @@ static const ReadProc gReadTable[] = {
skew_rp,
translate_rp,
paintOp_rp,
+ def_PaintFlat_rp,
def_ColorFilter_rp,
def_DrawLooper_rp,
def_MaskFilter_rp,
@@ -558,7 +606,8 @@ SkGPipeState::SkGPipeState() {
*fPaints.append() = SkNEW(SkPaint);
}
-SkGPipeState::~SkGPipeState() {
+SkGPipeState::~SkGPipeState() {
+ fFlatArray.unrefAll();
fPaints.deleteAll();
}