change SkAnnotation to not inherit from SkFlattenable (does not need dynamic factories)
BUG=
R=scroggo@google.com
Review URL: https://codereview.chromium.org/26606004
git-svn-id: http://skia.googlecode.com/svn/trunk@11762 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/pipe/SkGPipePriv.h b/src/pipe/SkGPipePriv.h
index 0d25b5a..2954ebf 100644
--- a/src/pipe/SkGPipePriv.h
+++ b/src/pipe/SkGPipePriv.h
@@ -25,9 +25,8 @@
kShader_PaintFlat,
kImageFilter_PaintFlat,
kXfermode_PaintFlat,
- kAnnotation_PaintFlat,
- kLast_PaintFlat = kAnnotation_PaintFlat
+ kLast_PaintFlat = kXfermode_PaintFlat
};
#define kCount_PaintFlats (kLast_PaintFlat + 1)
@@ -70,6 +69,7 @@
kPaintOp_DrawOp,
kSetTypeface_DrawOp,
+ kSetAnnotation_DrawOp,
kDef_Typeface_DrawOp,
kDef_Flattenable_DrawOp,
@@ -226,7 +226,7 @@
kJoin_PaintOp, // arg inline
kCap_PaintOp, // arg inline
kWidth_PaintOp, // arg scalar
- kMiter_PaintOp,// arg scalar
+ kMiter_PaintOp, // arg scalar
kEncoding_PaintOp, // arg inline - text
kHinting_PaintOp, // arg inline - text
@@ -236,6 +236,8 @@
kTextSkewX_PaintOp, // arg scalar - text
kTypeface_PaintOp, // arg inline (index) - text
+ kAnnotation_PaintOp,// arg SkAnnotation_flat, data=bool-has-size
+
kFlatIndex_PaintOp, // flags=paintflat, data=index
};
diff --git a/src/pipe/SkGPipeRead.cpp b/src/pipe/SkGPipeRead.cpp
index a5f7144..6275469 100644
--- a/src/pipe/SkGPipeRead.cpp
+++ b/src/pipe/SkGPipeRead.cpp
@@ -15,6 +15,7 @@
#include "SkReader32.h"
#include "SkStream.h"
+#include "SkAnnotation.h"
#include "SkColorFilter.h"
#include "SkDrawLooper.h"
#include "SkMaskFilter.h"
@@ -53,9 +54,6 @@
case kXfermode_PaintFlat:
paint->setXfermode((SkXfermode*)obj);
break;
- case kAnnotation_PaintFlat:
- paint->setAnnotation((SkAnnotation*)obj);
- break;
default:
SkDEBUGFAIL("never gets here");
}
@@ -672,6 +670,22 @@
p->setTypeface(static_cast<SkTypeface*>(reader->readPtr()));
}
+static void annotation_rp(SkCanvas*, SkReader32* reader, uint32_t op32,
+ SkGPipeState* state) {
+ SkPaint* p = state->editPaint();
+
+ if (SkToBool(PaintOp_unpackData(op32))) {
+ const size_t size = reader->readU32();
+ SkAutoMalloc storage(size);
+
+ reader->read(storage.get(), size);
+ SkOrderedReadBuffer buffer(storage.get(), size);
+ p->setAnnotation(SkNEW_ARGS(SkAnnotation, (buffer)))->unref();
+ } else {
+ p->setAnnotation(NULL);
+ }
+}
+
///////////////////////////////////////////////////////////////////////////////
static void def_Typeface_rp(SkCanvas*, SkReader32*, uint32_t, SkGPipeState* state) {
@@ -755,6 +769,8 @@
paintOp_rp,
typeface_rp,
+ annotation_rp,
+
def_Typeface_rp,
def_PaintFlat_rp,
def_Bitmap_rp,
diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp
index 58ba102..05fbb48 100644
--- a/src/pipe/SkGPipeWrite.cpp
+++ b/src/pipe/SkGPipeWrite.cpp
@@ -48,7 +48,6 @@
case kShader_PaintFlat: return paint.getShader();
case kImageFilter_PaintFlat: return paint.getImageFilter();
case kXfermode_PaintFlat: return paint.getXfermode();
- case kAnnotation_PaintFlat: return paint.getAnnotation();
}
SkDEBUGFAIL("never gets here");
return NULL;
@@ -1123,6 +1122,26 @@
// SkDebugf("[%d] %08X\n", i, storage[i]);
}
}
+
+ //
+ // Do these after we've written kPaintOp_DrawOp
+
+ if (base.getAnnotation() != paint.getAnnotation()) {
+ if (NULL == paint.getAnnotation()) {
+ this->writeOp(kSetAnnotation_DrawOp, 0, 0);
+ } else {
+ SkOrderedWriteBuffer buffer(1024);
+ paint.getAnnotation()->writeToBuffer(buffer);
+ size = buffer.bytesWritten();
+
+ SkAutoMalloc storage(size);
+ buffer.writeToMemory(storage.get());
+
+ this->writeOp(kSetAnnotation_DrawOp, 0, 1);
+ fWriter.write32(size);
+ fWriter.write(storage.get(), size);
+ }
+ }
}
///////////////////////////////////////////////////////////////////////////////