diff options
-rw-r--r-- | gyp/core.gyp | 2 | ||||
-rw-r--r-- | include/core/SkFlattenable.h | 106 | ||||
-rw-r--r-- | include/core/SkOrderedReadBuffer.h | 61 | ||||
-rw-r--r-- | include/core/SkOrderedWriteBuffer.h | 59 | ||||
-rw-r--r-- | include/core/SkReader32.h | 14 | ||||
-rw-r--r-- | include/core/SkWriter32.h | 14 | ||||
-rw-r--r-- | src/core/SkFlattenable.cpp | 235 | ||||
-rw-r--r-- | src/core/SkOrderedReadBuffer.cpp | 106 | ||||
-rw-r--r-- | src/core/SkOrderedWriteBuffer.cpp | 94 | ||||
-rw-r--r-- | src/core/SkPaint.cpp | 7 | ||||
-rw-r--r-- | src/core/SkPathHeap.cpp | 4 | ||||
-rw-r--r-- | src/core/SkPictureFlat.cpp | 9 | ||||
-rw-r--r-- | src/core/SkPictureFlat.h | 3 | ||||
-rw-r--r-- | src/core/SkPicturePlayback.cpp | 6 | ||||
-rw-r--r-- | src/core/SkPicturePlayback.h | 3 | ||||
-rw-r--r-- | src/core/SkScalerContext.cpp | 3 | ||||
-rw-r--r-- | src/core/SkShader.cpp | 4 | ||||
-rw-r--r-- | src/effects/Sk1DPathEffect.cpp | 4 | ||||
-rw-r--r-- | src/effects/Sk2DPathEffect.cpp | 4 | ||||
-rw-r--r-- | src/effects/SkGradientShader.cpp | 45 | ||||
-rw-r--r-- | src/pipe/SkGPipeRead.cpp | 13 | ||||
-rw-r--r-- | src/pipe/SkGPipeWrite.cpp | 11 | ||||
-rw-r--r-- | tests/ColorFilterTest.cpp | 6 |
23 files changed, 496 insertions, 317 deletions
diff --git a/gyp/core.gyp b/gyp/core.gyp index c60059e48f..5cab78a7cc 100644 --- a/gyp/core.gyp +++ b/gyp/core.gyp @@ -87,6 +87,8 @@ '../src/core/SkMatrix.cpp', '../src/core/SkMetaData.cpp', '../src/core/SkMMapStream.cpp', + '../src/core/SkOrderedReadBuffer.cpp', + '../src/core/SkOrderedWriteBuffer.cpp', '../src/core/SkPackBits.cpp', '../src/core/SkPaint.cpp', '../src/core/SkPath.cpp', diff --git a/include/core/SkFlattenable.h b/include/core/SkFlattenable.h index ba1495ff66..5714f9d542 100644 --- a/include/core/SkFlattenable.h +++ b/include/core/SkFlattenable.h @@ -12,6 +12,8 @@ #include "SkRefCnt.h" #include "SkBitmap.h" +#include "SkPath.h" +#include "SkPoint.h" #include "SkReader32.h" #include "SkTDArray.h" #include "SkWriter32.h" @@ -119,12 +121,38 @@ extern void SkWriteRegion(SkWriter32*, const SkRegion&); class SkTypeface; -class SkFlattenableReadBuffer : public SkReader32 { +class SkFlattenableReadBuffer { public: SkFlattenableReadBuffer(); - explicit SkFlattenableReadBuffer(const void* data); - SkFlattenableReadBuffer(const void* data, size_t size); - + virtual ~SkFlattenableReadBuffer() {} + + + virtual uint8_t readU8() = 0; + virtual uint16_t readU16() = 0; + virtual uint32_t readU32() = 0; + virtual void read(void* dst, size_t size) = 0; + virtual bool readBool() = 0; + virtual int32_t readInt() = 0; + virtual SkScalar readScalar() = 0; + virtual const void* skip(size_t size) = 0; + + virtual int32_t readS32() { return readInt(); } + template <typename T> const T& skipT() { + SkASSERT(SkAlign4(sizeof(T)) == sizeof(T)); + return *(const T*)this->skip(sizeof(T)); + } + + virtual void readMatrix(SkMatrix*) = 0; + virtual void readPath(SkPath*) = 0; + virtual void readPoint(SkPoint*) = 0; + + // helper function for classes with const SkPoint members + SkPoint readPoint() { + SkPoint point; + this->readPoint(&point); + return point; + } + void setRefCntArray(SkRefCnt* array[], int count) { fRCArray = array; fRCCount = count; @@ -156,12 +184,12 @@ public: fFactoryCount = 0; } - SkTypeface* readTypeface(); - SkRefCnt* readRefCnt(); - void* readFunctionPtr(); - SkFlattenable* readFlattenable(); + virtual SkTypeface* readTypeface() = 0; + virtual SkRefCnt* readRefCnt() = 0; + virtual void* readFunctionPtr() = 0; + virtual SkFlattenable* readFlattenable() = 0; -private: +protected: SkRefCnt** fRCArray; int fRCCount; @@ -171,8 +199,6 @@ private: SkTDArray<SkFlattenable::Factory>* fFactoryTDArray; SkFlattenable::Factory* fFactoryArray; int fFactoryCount; - - typedef SkReader32 INHERITED; }; /////////////////////////////////////////////////////////////////////////////// @@ -187,7 +213,7 @@ private: class SkRefCntSet : public SkTPtrSet<SkRefCnt*> { public: virtual ~SkRefCntSet(); - + protected: // overrides virtual void incPtr(void*); @@ -196,22 +222,47 @@ protected: class SkFactorySet : public SkTPtrSet<SkFlattenable::Factory> {}; -class SkFlattenableWriteBuffer : public SkWriter32 { +class SkFlattenableWriteBuffer { public: - SkFlattenableWriteBuffer(size_t minSize); + SkFlattenableWriteBuffer(); virtual ~SkFlattenableWriteBuffer(); + // deprecated naming convention that will be removed after callers are updated + virtual bool writeBool(bool value) = 0; + virtual void writeInt(int32_t value) = 0; + virtual void write8(int32_t value) = 0; + virtual void write16(int32_t value) = 0; + virtual void write32(int32_t value) = 0; + virtual void writeScalar(SkScalar value) = 0; + virtual void writeMul4(const void* values, size_t size) = 0; + + virtual void writePad(const void* src, size_t size) = 0; + virtual void writeString(const char* str, size_t len = (size_t)-1) = 0; + virtual uint32_t* reserve(size_t size) = 0; + virtual void flatten(void* dst) = 0; + virtual uint32_t size() = 0; + virtual void write(const void* values, size_t size) = 0; + virtual void writeRect(const SkRect& rect) = 0; + virtual size_t readFromStream(SkStream*, size_t length) = 0; + + virtual void writeMatrix(const SkMatrix& matrix) = 0; + virtual void writePath(const SkPath& path) = 0; + virtual void writePoint(const SkPoint& point) = 0; + + virtual bool writeToStream(SkWStream*) = 0; + + virtual void writeFunctionPtr(void*)= 0; + virtual void writeFlattenable(SkFlattenable* flattenable)= 0; + void writeTypeface(SkTypeface*); - void writeRefCnt(SkRefCnt*); - void writeFunctionPtr(void*); - void writeFlattenable(SkFlattenable* flattenable); - + void writeRefCnt(SkRefCnt* obj); + SkRefCntSet* getTypefaceRecorder() const { return fTFSet; } SkRefCntSet* setTypefaceRecorder(SkRefCntSet*); - + SkRefCntSet* getRefCntRecorder() const { return fRCSet; } SkRefCntSet* setRefCntRecorder(SkRefCntSet*); - + SkFactorySet* getFactoryRecorder() const { return fFactorySet; } SkFactorySet* setFactoryRecorder(SkFactorySet*); @@ -225,7 +276,7 @@ public: }; Flags getFlags() const { return (Flags)fFlags; } void setFlags(Flags flags) { fFlags = flags; } - + bool isCrossProcess() const { return SkToBool(fFlags & kCrossProcess_Flag); } @@ -236,16 +287,21 @@ public: bool persistBitmapPixels() const { return (fFlags & kCrossProcess_Flag) != 0; } - + bool persistTypeface() const { return (fFlags & kCrossProcess_Flag) != 0; } -private: +protected: + + // A helper function so that each subclass does not have to be a friend of + // SkFlattenable. + void flattenObject(SkFlattenable* obj, SkFlattenableWriteBuffer& buffer) { + obj->flatten(buffer); + } + uint32_t fFlags; SkRefCntSet* fTFSet; SkRefCntSet* fRCSet; SkFactorySet* fFactorySet; - - typedef SkWriter32 INHERITED; }; #endif diff --git a/include/core/SkOrderedReadBuffer.h b/include/core/SkOrderedReadBuffer.h new file mode 100644 index 0000000000..c1dbc7e251 --- /dev/null +++ b/include/core/SkOrderedReadBuffer.h @@ -0,0 +1,61 @@ + +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkOrderedReadBuffer_DEFINED +#define SkOrderedReadBuffer_DEFINED + +#include "SkRefCnt.h" +#include "SkBitmap.h" +#include "SkFlattenable.h" +#include "SkWriter32.h" +#include "SkPath.h" + +class SkOrderedReadBuffer : public SkFlattenableReadBuffer { +public: + SkOrderedReadBuffer() : INHERITED() {} + SkOrderedReadBuffer(const void* data, size_t size); + + void setMemory(const void* data, size_t size) { fReader.setMemory(data, size); } + uint32_t size() { return fReader.size(); } + const void* base() { return fReader.base(); } + uint32_t offset() { return fReader.offset(); } + bool eof() { return fReader.eof(); } + void rewind() { fReader.rewind(); } + void setOffset(size_t offset) { fReader.setOffset(offset); } + + SkReader32* getReader32() { return &fReader; } + + virtual uint8_t readU8() { return fReader.readU8(); } + virtual uint16_t readU16() { return fReader.readU16(); } + virtual uint32_t readU32() { return fReader.readU32(); } + virtual void read(void* dst, size_t size) { return fReader.read(dst, size); } + virtual bool readBool() { return fReader.readBool(); } + virtual int32_t readInt() { return fReader.readInt(); } + virtual SkScalar readScalar() { return fReader.readScalar(); } + virtual const void* skip(size_t size) { return fReader.skip(size); } + + virtual void readMatrix(SkMatrix* m) { fReader.readMatrix(m); } + virtual void readPath(SkPath* p) { p->unflatten(fReader); } + virtual void readPoint(SkPoint* p) { + p->fX = fReader.readScalar(); + p->fY = fReader.readScalar(); + } + + virtual SkTypeface* readTypeface(); + virtual SkRefCnt* readRefCnt(); + virtual void* readFunctionPtr(); + virtual SkFlattenable* readFlattenable(); + +private: + SkReader32 fReader; + + typedef SkFlattenableReadBuffer INHERITED; +}; + +#endif // SkOrderedReadBuffer_DEFINED + diff --git a/include/core/SkOrderedWriteBuffer.h b/include/core/SkOrderedWriteBuffer.h new file mode 100644 index 0000000000..6183218af3 --- /dev/null +++ b/include/core/SkOrderedWriteBuffer.h @@ -0,0 +1,59 @@ + +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#ifndef SkOrderedWriteBuffer_DEFINED +#define SkOrderedWriteBuffer_DEFINED + +#include "SkRefCnt.h" +#include "SkBitmap.h" +#include "SkFlattenable.h" +#include "SkWriter32.h" +#include "SkPath.h" + +class SkOrderedWriteBuffer : public SkFlattenableWriteBuffer { +public: + SkOrderedWriteBuffer(size_t minSize); + virtual ~SkOrderedWriteBuffer() {} + + // deprecated naming convention that will be removed after callers are updated + virtual bool writeBool(bool value) { return fWriter.writeBool(value); } + virtual void writeInt(int32_t value) { fWriter.writeInt(value); } + virtual void write8(int32_t value) { fWriter.write8(value); } + virtual void write16(int32_t value) { fWriter.write16(value); } + virtual void write32(int32_t value) { fWriter.write32(value); } + virtual void writeScalar(SkScalar value) { fWriter.writeScalar(value); } + virtual void writeMul4(const void* values, size_t size) { fWriter.writeMul4(values, size); } + + virtual void writePad(const void* src, size_t size) { fWriter.writePad(src, size); } + virtual void writeString(const char* str, size_t len = (size_t)-1) { fWriter.writeString(str, len); } + virtual bool writeToStream(SkWStream* stream) { return fWriter.writeToStream(stream); } + virtual void write(const void* values, size_t size) { fWriter.write(values, size); } + virtual void writeRect(const SkRect& rect) { fWriter.writeRect(rect); } + virtual size_t readFromStream(SkStream* s, size_t length) { return fWriter.readFromStream(s, length); } + + virtual void writeMatrix(const SkMatrix& matrix) { fWriter.writeMatrix(matrix); } + virtual void writePath(const SkPath& path) { path.flatten(fWriter); }; + virtual void writePoint(const SkPoint& point) { + fWriter.writeScalar(point.fX); + fWriter.writeScalar(point.fY); + } + + virtual uint32_t* reserve(size_t size) { return fWriter.reserve(size); } + virtual void flatten(void* dst) { fWriter.flatten(dst); } + virtual uint32_t size() { return fWriter.size(); } + + virtual void writeFunctionPtr(void*); + virtual void writeFlattenable(SkFlattenable* flattenable); + +private: + SkWriter32 fWriter; + typedef SkFlattenableWriteBuffer INHERITED; +}; + +#endif // SkOrderedWriteBuffer_DEFINED + diff --git a/include/core/SkReader32.h b/include/core/SkReader32.h index 37ace5c5d6..98385e430a 100644 --- a/include/core/SkReader32.h +++ b/include/core/SkReader32.h @@ -10,6 +10,8 @@ #ifndef SkReader32_DEFINED #define SkReader32_DEFINED +#include "SkMatrix.h" +#include "SkRegion.h" #include "SkScalar.h" class SkString; @@ -90,6 +92,18 @@ public: int32_t readS32() { return this->readInt(); } uint32_t readU32() { return this->readInt(); } + void readMatrix(SkMatrix* matrix) { + size_t size = matrix->unflatten(this->peek()); + SkASSERT(SkAlign4(size) == size); + (void)this->skip(size); + } + + void readRegion(SkRegion* rgn) { + size_t size = rgn->unflatten(this->peek()); + SkASSERT(SkAlign4(size) == size); + (void)this->skip(size); + } + /** * Read the length of a string (written by SkWriter32::writeString) into * len (if len is not NULL) and return the null-ternimated address of the diff --git a/include/core/SkWriter32.h b/include/core/SkWriter32.h index d7159ff290..1b475958fb 100644 --- a/include/core/SkWriter32.h +++ b/include/core/SkWriter32.h @@ -15,6 +15,8 @@ #include "SkScalar.h" #include "SkPoint.h" #include "SkRect.h" +#include "SkMatrix.h" +#include "SkRegion.h" class SkStream; class SkWStream; @@ -76,7 +78,19 @@ public: void writeRect(const SkRect& rect) { *(SkRect*)this->reserve(sizeof(rect)) = rect; } + + void writeMatrix(const SkMatrix& matrix) { + size_t size = matrix.flatten(NULL); + SkASSERT(SkAlign4(size) == size); + matrix.flatten(this->reserve(size)); + } + void writeRegion(const SkRegion& rgn) { + size_t size = rgn.flatten(NULL); + SkASSERT(SkAlign4(size) == size); + rgn.flatten(this->reserve(size)); + } + // write count bytes (must be a multiple of 4) void writeMul4(const void* values, size_t size) { this->write(values, size); diff --git a/src/core/SkFlattenable.cpp b/src/core/SkFlattenable.cpp index 6a445ea751..b8001f0cdc 100644 --- a/src/core/SkFlattenable.cpp +++ b/src/core/SkFlattenable.cpp @@ -8,33 +8,6 @@ #include "SkFlattenable.h" #include "SkTypeface.h" -#include "SkMatrix.h" -#include "SkRegion.h" - -void SkReadMatrix(SkReader32* reader, SkMatrix* matrix) { - size_t size = matrix->unflatten(reader->peek()); - SkASSERT(SkAlign4(size) == size); - (void)reader->skip(size); -} - -void SkWriteMatrix(SkWriter32* writer, const SkMatrix& matrix) { - size_t size = matrix.flatten(NULL); - SkASSERT(SkAlign4(size) == size); - matrix.flatten(writer->reserve(size)); -} - -void SkReadRegion(SkReader32* reader, SkRegion* rgn) { - size_t size = rgn->unflatten(reader->peek()); - SkASSERT(SkAlign4(size) == size); - (void)reader->skip(size); -} - -void SkWriteRegion(SkWriter32* writer, const SkRegion& rgn) { - size_t size = rgn.flatten(NULL); - SkASSERT(SkAlign4(size) == size); - rgn.flatten(writer->reserve(size)); -} - /////////////////////////////////////////////////////////////////////////////// void SkFlattenable::flatten(SkFlattenableWriteBuffer&) const @@ -46,7 +19,6 @@ void SkFlattenable::flatten(SkFlattenableWriteBuffer&) const } /////////////////////////////////////////////////////////////////////////////// -/////////////////////////////////////////////////////////////////////////////// SkFlattenableReadBuffer::SkFlattenableReadBuffer() { fRCArray = NULL; @@ -60,126 +32,9 @@ SkFlattenableReadBuffer::SkFlattenableReadBuffer() { fFactoryCount = 0; } -SkFlattenableReadBuffer::SkFlattenableReadBuffer(const void* data) : - INHERITED(data, 1024 * 1024) { - fRCArray = NULL; - fRCCount = 0; - - fTFArray = NULL; - fTFCount = 0; - - fFactoryTDArray = NULL; - fFactoryArray = NULL; - fFactoryCount = 0; -} - -SkFlattenableReadBuffer::SkFlattenableReadBuffer(const void* data, size_t size) - : INHERITED(data, size) { - fRCArray = NULL; - fRCCount = 0; - - fTFArray = NULL; - fTFCount = 0; - - fFactoryTDArray = NULL; - fFactoryArray = NULL; - fFactoryCount = 0; -} - -SkTypeface* SkFlattenableReadBuffer::readTypeface() { - uint32_t index = this->readU32(); - if (0 == index || index > (unsigned)fTFCount) { - if (index) { - SkDebugf("====== typeface index %d\n", index); - } - return NULL; - } else { - SkASSERT(fTFArray); - return fTFArray[index - 1]; - } -} - -SkRefCnt* SkFlattenableReadBuffer::readRefCnt() { - uint32_t index = this->readU32(); - if (0 == index || index > (unsigned)fRCCount) { - return NULL; - } else { - SkASSERT(fRCArray); - return fRCArray[index - 1]; - } -} - -SkFlattenable* SkFlattenableReadBuffer::readFlattenable() { - SkFlattenable::Factory factory = NULL; - - if (fFactoryCount > 0) { - int32_t index = this->readU32(); - if (0 == index) { - return NULL; // writer failed to give us the flattenable - } - index = -index; // we stored the negative of the index - index -= 1; // we stored the index-base-1 - SkASSERT(index < fFactoryCount); - factory = fFactoryArray[index]; - } else if (fFactoryTDArray) { - const int32_t* peek = (const int32_t*)this->peek(); - if (*peek <= 0) { - int32_t index = this->readU32(); - if (0 == index) { - return NULL; // writer failed to give us the flattenable - } - index = -index; // we stored the negative of the index - index -= 1; // we stored the index-base-1 - factory = (*fFactoryTDArray)[index]; - } else { - const char* name = this->readString(); - factory = SkFlattenable::NameToFactory(name); - if (factory) { - SkASSERT(fFactoryTDArray->find(factory) < 0); - *fFactoryTDArray->append() = factory; - } else { -// SkDebugf("can't find factory for [%s]\n", name); - } - // if we didn't find a factory, that's our failure, not the writer's, - // so we fall through, so we can skip the sizeRecorded data. - } - } else { - factory = (SkFlattenable::Factory)readFunctionPtr(); - if (NULL == factory) { - return NULL; // writer failed to give us the flattenable - } - } - - // if we get here, factory may still be null, but if that is the case, the - // failure was ours, not the writer. - SkFlattenable* obj = NULL; - uint32_t sizeRecorded = this->readU32(); - if (factory) { - uint32_t offset = this->offset(); - obj = (*factory)(*this); - // check that we read the amount we expected - uint32_t sizeRead = this->offset() - offset; - if (sizeRecorded != sizeRead) { - // we could try to fix up the offset... - sk_throw(); - } - } else { - // we must skip the remaining data - this->skip(sizeRecorded); - } - return obj; -} - -void* SkFlattenableReadBuffer::readFunctionPtr() { - void* proc; - this->read(&proc, sizeof(proc)); - return proc; -} - /////////////////////////////////////////////////////////////////////////////// -SkFlattenableWriteBuffer::SkFlattenableWriteBuffer(size_t minSize) : - INHERITED(minSize) { +SkFlattenableWriteBuffer::SkFlattenableWriteBuffer() { fFlags = (Flags)0; fRCSet = NULL; fTFSet = NULL; @@ -207,15 +62,8 @@ SkFactorySet* SkFlattenableWriteBuffer::setFactoryRecorder(SkFactorySet* rec) { return rec; } -void SkFlattenableWriteBuffer::writeTypeface(SkTypeface* obj) { - if (NULL == obj || NULL == fTFSet) { - this->write32(0); - } else { - this->write32(fTFSet->add(obj)); - } -} - void SkFlattenableWriteBuffer::writeRefCnt(SkRefCnt* obj) { + SkASSERT(!isCrossProcess()); if (NULL == obj || NULL == fRCSet) { this->write32(0); } else { @@ -223,83 +71,12 @@ void SkFlattenableWriteBuffer::writeRefCnt(SkRefCnt* obj) { } } -void SkFlattenableWriteBuffer::writeFlattenable(SkFlattenable* flattenable) { - /* - * If we have a factoryset, then the first 32bits tell us... - * 0: failure to write the flattenable - * <0: we store the negative of the (1-based) index - * >0: the length of the name - * If we don't have a factoryset, then the first "ptr" is either the - * factory, or null for failure. - * - * The distinction is important, since 0-index is 32bits (always), but a - * 0-functionptr might be 32 or 64 bits. - */ - - SkFlattenable::Factory factory = NULL; - if (flattenable) { - factory = flattenable->getFactory(); - } - if (NULL == factory) { - if (fFactorySet) { - this->write32(0); - } else { - this->writeFunctionPtr(NULL); - } - return; - } - - /* - * We can write 1 of 3 versions of the flattenable: - * 1. function-ptr : this is the fastest for the reader, but assumes that - * the writer and reader are in the same process. - * 2. index into fFactorySet : This is assumes the writer will later - * resolve the function-ptrs into strings for its reader. SkPicture - * does exactly this, by writing a table of names (matching the indices) - * up front in its serialized form. - * 3. names : Reuse fFactorySet to store indices, but only after we've - * written the name the first time. SkGPipe uses this technique, as it - * doesn't require the reader to be told to know the table of names - * up front. - */ - if (fFactorySet) { - if (this->inlineFactoryNames()) { - int index = fFactorySet->find(factory); - if (index) { - // we write the negative of the index, to distinguish it from - // the length of a string - this->write32(-index); - } else { - const char* name = SkFlattenable::FactoryToName(factory); - if (NULL == name) { - this->write32(0); - return; - } - this->writeString(name); - index = fFactorySet->add(factory); - } - } else { - // we write the negative of the index, to distinguish it from - // the length of a string - this->write32(-(int)fFactorySet->add(factory)); - } +void SkFlattenableWriteBuffer::writeTypeface(SkTypeface* obj) { + if (NULL == obj || NULL == fTFSet) { + this->write32(0); } else { - this->writeFunctionPtr((void*)factory); + this->write32(fTFSet->add(obj)); } - - // make room for the size of the flatttened object - (void)this->reserve(sizeof(uint32_t)); - // record the current size, so we can subtract after the object writes. - uint32_t offset = this->size(); - // now flatten the object - flattenable->flatten(*this); - uint32_t objSize = this->size() - offset; - // record the obj's size - *this->peek32(offset - sizeof(uint32_t)) = objSize; -} - -void SkFlattenableWriteBuffer::writeFunctionPtr(void* proc) { - *(void**)this->reserve(sizeof(void*)) = proc; } /////////////////////////////////////////////////////////////////////////////// diff --git a/src/core/SkOrderedReadBuffer.cpp b/src/core/SkOrderedReadBuffer.cpp new file mode 100644 index 0000000000..e3a56dbb07 --- /dev/null +++ b/src/core/SkOrderedReadBuffer.cpp @@ -0,0 +1,106 @@ + +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkOrderedReadBuffer.h" +#include "SkTypeface.h" + + +SkOrderedReadBuffer::SkOrderedReadBuffer(const void* data, size_t size) + : INHERITED() { + fReader.setMemory(data, size); +} + +SkTypeface* SkOrderedReadBuffer::readTypeface() { + uint32_t index = fReader.readU32(); + if (0 == index || index > (unsigned)fTFCount) { + if (index) { + SkDebugf("====== typeface index %d\n", index); + } + return NULL; + } else { + SkASSERT(fTFArray); + return fTFArray[index - 1]; + } +} + +SkRefCnt* SkOrderedReadBuffer::readRefCnt() { + uint32_t index = fReader.readU32(); + if (0 == index || index > (unsigned)fRCCount) { + return NULL; + } else { + SkASSERT(fRCArray); + return fRCArray[index - 1]; + } +} + +SkFlattenable* SkOrderedReadBuffer::readFlattenable() { + SkFlattenable::Factory factory = NULL; + + if (fFactoryCount > 0) { + int32_t index = fReader.readU32(); + if (0 == index) { + return NULL; // writer failed to give us the flattenable + } + index = -index; // we stored the negative of the index + index -= 1; // we stored the index-base-1 + SkASSERT(index < fFactoryCount); + factory = fFactoryArray[index]; + } else if (fFactoryTDArray) { + const int32_t* peek = (const int32_t*)fReader.peek(); + if (*peek <= 0) { + int32_t index = fReader.readU32(); + if (0 == index) { + return NULL; // writer failed to give us the flattenable + } + index = -index; // we stored the negative of the index + index -= 1; // we stored the index-base-1 + factory = (*fFactoryTDArray)[index]; + } else { + const char* name = fReader.readString(); + factory = SkFlattenable::NameToFactory(name); + if (factory) { + SkASSERT(fFactoryTDArray->find(factory) < 0); + *fFactoryTDArray->append() = factory; + } else { +// SkDebugf("can't find factory for [%s]\n", name); + } + // if we didn't find a factory, that's our failure, not the writer's, + // so we fall through, so we can skip the sizeRecorded data. + } + } else { + factory = (SkFlattenable::Factory)readFunctionPtr(); + if (NULL == factory) { + return NULL; // writer failed to give us the flattenable + } + } + + // if we get here, factory may still be null, but if that is the case, the + // failure was ours, not the writer. + SkFlattenable* obj = NULL; + uint32_t sizeRecorded = fReader.readU32(); + if (factory) { + uint32_t offset = fReader.offset(); + obj = (*factory)(*this); + // check that we read the amount we expected + uint32_t sizeRead = fReader.offset() - offset; + if (sizeRecorded != sizeRead) { + // we could try to fix up the offset... + sk_throw(); + } + } else { + // we must skip the remaining data + fReader.skip(sizeRecorded); + } + return obj; +} + +void* SkOrderedReadBuffer::readFunctionPtr() { + void* proc; + fReader.read(&proc, sizeof(proc)); + return proc; +} diff --git a/src/core/SkOrderedWriteBuffer.cpp b/src/core/SkOrderedWriteBuffer.cpp new file mode 100644 index 0000000000..bfe2bfc0b4 --- /dev/null +++ b/src/core/SkOrderedWriteBuffer.cpp @@ -0,0 +1,94 @@ + +/* + * Copyright 2011 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "SkOrderedWriteBuffer.h" +#include "SkTypeface.h" + +SkOrderedWriteBuffer::SkOrderedWriteBuffer(size_t minSize) : + INHERITED(), + fWriter(minSize) { +} + +void SkOrderedWriteBuffer::writeFlattenable(SkFlattenable* flattenable) { + /* + * If we have a factoryset, then the first 32bits tell us... + * 0: failure to write the flattenable + * <0: we store the negative of the (1-based) index + * >0: the length of the name + * If we don't have a factoryset, then the first "ptr" is either the + * factory, or null for failure. + * + * The distinction is important, since 0-index is 32bits (always), but a + * 0-functionptr might be 32 or 64 bits. + */ + + SkFlattenable::Factory factory = NULL; + if (flattenable) { + factory = flattenable->getFactory(); + } + if (NULL == factory) { + if (fFactorySet) { + this->write32(0); + } else { + this->writeFunctionPtr(NULL); + } + return; + } + + /* + * We can write 1 of 3 versions of the flattenable: + * 1. function-ptr : this is the fastest for the reader, but assumes that + * the writer and reader are in the same process. + * 2. index into fFactorySet : This is assumes the writer will later + * resolve the function-ptrs into strings for its reader. SkPicture + * does exactly this, by writing a table of names (matching the indices) + * up front in its serialized form. + * 3. names : Reuse fFactorySet to store indices, but only after we've + * written the name the first time. SkGPipe uses this technique, as it + * doesn't require the reader to be told to know the table of names + * up front. + */ + if (fFactorySet) { + if (this->inlineFactoryNames()) { + int index = fFactorySet->find(factory); + if (index) { + // we write the negative of the index, to distinguish it from + // the length of a string + this->write32(-index); + } else { + const char* name = SkFlattenable::FactoryToName(factory); + if (NULL == name) { + this->write32(0); + return; + } + this->writeString(name); + index = fFactorySet->add(factory); + } + } else { + // we write the negative of the index, to distinguish it from + // the length of a string + this->write32(-(int)fFactorySet->add(factory)); + } + } else { + this->writeFunctionPtr((void*)factory); + } + + // make room for the size of the flatttened object + (void)this->reserve(sizeof(uint32_t)); + // record the current size, so we can subtract after the object writes. + uint32_t offset = this->size(); + // now flatten the object + flattenObject(flattenable, *this); + uint32_t objSize = this->size() - offset; + // record the obj's size + *fWriter.peek32(offset - sizeof(uint32_t)) = objSize; +} + +void SkOrderedWriteBuffer::writeFunctionPtr(void* proc) { + *(void**)this->reserve(sizeof(void*)) = proc; +} diff --git a/src/core/SkPaint.cpp b/src/core/SkPaint.cpp index 6a16e24ba2..15fdbd196e 100644 --- a/src/core/SkPaint.cpp +++ b/src/core/SkPaint.cpp @@ -24,6 +24,7 @@ #include "SkAutoKern.h" #include "SkGlyphCache.h" #include "SkPaintDefaults.h" +#include "SkOrderedWriteBuffer.h" // define this to get a printf for out-of-range parameter in setters // e.g. setTextSize(-1) @@ -1682,9 +1683,9 @@ void SkPaint::descriptorProc(const SkMatrix* deviceMatrix, SkMaskFilter* mf = this->getMaskFilter(); SkRasterizer* ra = this->getRasterizer(); - SkFlattenableWriteBuffer peBuffer(MIN_SIZE_FOR_EFFECT_BUFFER); - SkFlattenableWriteBuffer mfBuffer(MIN_SIZE_FOR_EFFECT_BUFFER); - SkFlattenableWriteBuffer raBuffer(MIN_SIZE_FOR_EFFECT_BUFFER); + SkOrderedWriteBuffer peBuffer(MIN_SIZE_FOR_EFFECT_BUFFER); + SkOrderedWriteBuffer mfBuffer(MIN_SIZE_FOR_EFFECT_BUFFER); + SkOrderedWriteBuffer raBuffer(MIN_SIZE_FOR_EFFECT_BUFFER); if (pe) { peBuffer.writeFlattenable(pe); diff --git a/src/core/SkPathHeap.cpp b/src/core/SkPathHeap.cpp index 9bf77c1d9c..a9183c3242 100644 --- a/src/core/SkPathHeap.cpp +++ b/src/core/SkPathHeap.cpp @@ -26,7 +26,7 @@ SkPathHeap::SkPathHeap(SkFlattenableReadBuffer& buffer) for (int i = 0; i < count; i++) { new (p) SkPath; - p->unflatten(buffer); + buffer.readPath(p); *ptr++ = p; // record the pointer p++; // move to the next storage location } @@ -55,7 +55,7 @@ void SkPathHeap::flatten(SkFlattenableWriteBuffer& buffer) const { SkPath** iter = fPaths.begin(); SkPath** stop = fPaths.end(); while (iter < stop) { - (*iter)->flatten(buffer); + buffer.writePath(**iter); iter++; } } diff --git a/src/core/SkPictureFlat.cpp b/src/core/SkPictureFlat.cpp index 1058526912..5064ab82e9 100644 --- a/src/core/SkPictureFlat.cpp +++ b/src/core/SkPictureFlat.cpp @@ -14,6 +14,8 @@ #include "SkShader.h" #include "SkTypeface.h" #include "SkXfermode.h" +#include "SkOrderedReadBuffer.h" +#include "SkOrderedWriteBuffer.h" SkFlatData* SkFlatData::Alloc(SkChunkAlloc* heap, int32_t size, int index) { SkFlatData* result = (SkFlatData*) heap->allocThrow(size + sizeof(SkFlatData)); @@ -24,7 +26,7 @@ SkFlatData* SkFlatData::Alloc(SkChunkAlloc* heap, int32_t size, int index) { SkFlatBitmap* SkFlatBitmap::Flatten(SkChunkAlloc* heap, const SkBitmap& bitmap, int index, SkRefCntSet* rec) { - SkFlattenableWriteBuffer buffer(1024); + SkOrderedWriteBuffer buffer(1024); buffer.setRefCntRecorder(rec); bitmap.flatten(buffer); @@ -91,7 +93,8 @@ void SkFlatMatrix::dump() const { SkFlatPaint* SkFlatPaint::Flatten(SkChunkAlloc* heap, const SkPaint& paint, int index, SkRefCntSet* rec, SkRefCntSet* faceRecorder) { - SkFlattenableWriteBuffer buffer(2*sizeof(SkPaint)); + SkOrderedWriteBuffer buffer(2*sizeof(SkPaint)); + buffer.setRefCntRecorder(rec); buffer.setTypefaceRecorder(faceRecorder); @@ -104,7 +107,7 @@ SkFlatPaint* SkFlatPaint::Flatten(SkChunkAlloc* heap, const SkPaint& paint, void SkFlatPaint::Read(const void* storage, SkPaint* paint, SkRefCntPlayback* rcp, SkTypefacePlayback* facePlayback) { - SkFlattenableReadBuffer buffer(storage); + SkOrderedReadBuffer buffer(storage, 1024*1024); if (rcp) { rcp->setupBuffer(buffer); } diff --git a/src/core/SkPictureFlat.h b/src/core/SkPictureFlat.h index 983bfc5f25..60e7f2c895 100644 --- a/src/core/SkPictureFlat.h +++ b/src/core/SkPictureFlat.h @@ -10,6 +10,7 @@ #include "SkChunkAlloc.h" #include "SkBitmap.h" +#include "SkOrderedReadBuffer.h" #include "SkPicture.h" #include "SkMatrix.h" #include "SkPaint.h" @@ -151,7 +152,7 @@ public: SkRefCntSet*); void unflatten(SkBitmap* bitmap, SkRefCntPlayback* rcp) const { - SkFlattenableReadBuffer buffer(fBitmapData); + SkOrderedReadBuffer buffer(fBitmapData, 1024*1024); if (rcp) { rcp->setupBuffer(buffer); } diff --git a/src/core/SkPicturePlayback.cpp b/src/core/SkPicturePlayback.cpp index c51ddcca7f..2ca2fc79bf 100644 --- a/src/core/SkPicturePlayback.cpp +++ b/src/core/SkPicturePlayback.cpp @@ -8,6 +8,8 @@ #include "SkPicturePlayback.h" #include "SkPictureRecord.h" #include "SkTypeface.h" +#include "SkOrderedReadBuffer.h" +#include "SkOrderedWriteBuffer.h" #include <new> /* Define this to spew out a debug statement whenever we skip the remainder of @@ -319,7 +321,7 @@ void SkPicturePlayback::serialize(SkWStream* stream) const { SkRefCntSet typefaceSet; SkFactorySet factSet; - SkFlattenableWriteBuffer buffer(1024); + SkOrderedWriteBuffer buffer(1024); buffer.setFlags(SkFlattenableWriteBuffer::kCrossProcess_Flag); buffer.setTypefaceRecorder(&typefaceSet); @@ -431,7 +433,7 @@ SkPicturePlayback::SkPicturePlayback(SkStream* stream) { SkAutoMalloc storage(tagSize); stream->read(storage.get(), tagSize); - SkFlattenableReadBuffer buffer(storage.get(), tagSize); + SkOrderedReadBuffer buffer(storage.get(), tagSize); fFactoryPlayback->setupBuffer(buffer); fTFPlayback.setupBuffer(buffer); diff --git a/src/core/SkPicturePlayback.h b/src/core/SkPicturePlayback.h index f78f15e4ee..b82e9dbb05 100644 --- a/src/core/SkPicturePlayback.h +++ b/src/core/SkPicturePlayback.h @@ -13,6 +13,7 @@ #include "SkBitmap.h" #include "SkMatrix.h" +#include "SkOrderedReadBuffer.h" #include "SkPaint.h" #include "SkPath.h" #include "SkPathHeap.h" @@ -166,7 +167,7 @@ private: int fPaintCount; SkRegion* fRegions; int fRegionCount; - mutable SkFlattenableReadBuffer fReader; + mutable SkOrderedReadBuffer fReader; SkPicture** fPictureRefs; int fPictureCount; diff --git a/src/core/SkScalerContext.cpp b/src/core/SkScalerContext.cpp index 1799b2c11c..50dbfc52b1 100644 --- a/src/core/SkScalerContext.cpp +++ b/src/core/SkScalerContext.cpp @@ -13,6 +13,7 @@ #include "SkDraw.h" #include "SkFontHost.h" #include "SkMaskFilter.h" +#include "SkOrderedReadBuffer.h" #include "SkPathEffect.h" #include "SkRasterizer.h" #include "SkRasterClip.h" @@ -64,7 +65,7 @@ static SkFlattenable* load_flattenable(const SkDescriptor* desc, uint32_t tag) { const void* data = desc->findEntry(tag, &len); if (data) { - SkFlattenableReadBuffer buffer(data, len); + SkOrderedReadBuffer buffer(data, len); obj = buffer.readFlattenable(); SkASSERT(buffer.offset() == buffer.size()); } diff --git a/src/core/SkShader.cpp b/src/core/SkShader.cpp index bfdebc1b07..695361268a 100644 --- a/src/core/SkShader.cpp +++ b/src/core/SkShader.cpp @@ -20,7 +20,7 @@ SkShader::SkShader(SkFlattenableReadBuffer& buffer) : INHERITED(buffer), fLocalMatrix(NULL) { if (buffer.readBool()) { SkMatrix matrix; - SkReadMatrix(&buffer, &matrix); + buffer.readMatrix(&matrix); setLocalMatrix(matrix); } SkDEBUGCODE(fInSession = false;) @@ -45,7 +45,7 @@ void SkShader::flatten(SkFlattenableWriteBuffer& buffer) const { this->INHERITED::flatten(buffer); buffer.writeBool(fLocalMatrix != NULL); if (fLocalMatrix) { - SkWriteMatrix(&buffer, *fLocalMatrix); + buffer.writeMatrix(*fLocalMatrix); } } diff --git a/src/effects/Sk1DPathEffect.cpp b/src/effects/Sk1DPathEffect.cpp index 62ca7b39b8..108653846a 100644 --- a/src/effects/Sk1DPathEffect.cpp +++ b/src/effects/Sk1DPathEffect.cpp @@ -141,7 +141,7 @@ static void morphpath(SkPath* dst, const SkPath& src, SkPathMeasure& meas, SkPath1DPathEffect::SkPath1DPathEffect(SkFlattenableReadBuffer& buffer) { fAdvance = buffer.readScalar(); if (fAdvance > 0) { - fPath.unflatten(buffer); + buffer.readPath(&fPath); fInitialOffset = buffer.readScalar(); fStyle = (Style) buffer.readU8(); } else { @@ -160,7 +160,7 @@ void SkPath1DPathEffect::flatten(SkFlattenableWriteBuffer& buffer) const { this->INHERITED::flatten(buffer); buffer.writeScalar(fAdvance); if (fAdvance > 0) { - fPath.flatten(buffer); + buffer.writePath(fPath); buffer.writeScalar(fInitialOffset); buffer.write8(fStyle); } diff --git a/src/effects/Sk2DPathEffect.cpp b/src/effects/Sk2DPathEffect.cpp index 9a9216215a..f2f9e37c0c 100644 --- a/src/effects/Sk2DPathEffect.cpp +++ b/src/effects/Sk2DPathEffect.cpp @@ -90,12 +90,12 @@ SkPath2DPathEffect::SkPath2DPathEffect(const SkMatrix& m, const SkPath& p) SkPath2DPathEffect::SkPath2DPathEffect(SkFlattenableReadBuffer& buffer) : INHERITED(buffer) { - fPath.unflatten(buffer); + buffer.readPath(&fPath); } void SkPath2DPathEffect::flatten(SkFlattenableWriteBuffer& buffer) const { this->INHERITED::flatten(buffer); - fPath.flatten(buffer); + buffer.writePath(fPath); } void SkPath2DPathEffect::next(const SkPoint& loc, int u, int v, SkPath* dst) { diff --git a/src/effects/SkGradientShader.cpp b/src/effects/SkGradientShader.cpp index 6e8d2fe0f1..8b78984d78 100644 --- a/src/effects/SkGradientShader.cpp +++ b/src/effects/SkGradientShader.cpp @@ -38,17 +38,6 @@ static void sk_memset32_dither(uint32_t dst[], uint32_t v0, uint32_t v1, } } -/////////////////////////////////////////////////////////////////////////////// -// Can't use a two-argument function with side effects like this in a -// constructor's initializer's argument list because the order of -// evaluations in that context is undefined (and backwards on linux/gcc). -static SkPoint unflatten_point(SkReader32& buffer) { - SkPoint retval; - retval.fX = buffer.readScalar(); - retval.fY = buffer.readScalar(); - return retval; -} - // Clamp static SkFixed clamp_tileproc(SkFixed x) { @@ -371,7 +360,7 @@ Gradient_Shader::Gradient_Shader(SkFlattenableReadBuffer& buffer) : recs[i].fScale = buffer.readU32(); } } - SkReadMatrix(&buffer, &fPtsToUnit); + buffer.readMatrix(&fPtsToUnit); this->initCommon(); } @@ -408,7 +397,7 @@ void Gradient_Shader::flatten(SkFlattenableWriteBuffer& buffer) const { buffer.write32(recs[i].fScale); } } - SkWriteMatrix(&buffer, fPtsToUnit); + buffer.writeMatrix(fPtsToUnit); } bool Gradient_Shader::isOpaque() const { @@ -813,15 +802,13 @@ public: protected: Linear_Gradient(SkFlattenableReadBuffer& buffer) : INHERITED(buffer), - fStart(unflatten_point(buffer)), - fEnd(unflatten_point(buffer)) { + fStart(buffer.readPoint()), + fEnd(buffer.readPoint()) { } virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { this->INHERITED::flatten(buffer); - buffer.writeScalar(fStart.fX); - buffer.writeScalar(fStart.fY); - buffer.writeScalar(fEnd.fX); - buffer.writeScalar(fEnd.fY); + buffer.writePoint(fStart); + buffer.writePoint(fEnd); } private: @@ -1470,13 +1457,12 @@ public: protected: Radial_Gradient(SkFlattenableReadBuffer& buffer) : INHERITED(buffer), - fCenter(unflatten_point(buffer)), + fCenter(buffer.readPoint()), fRadius(buffer.readScalar()) { } virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { this->INHERITED::flatten(buffer); - buffer.writeScalar(fCenter.fX); - buffer.writeScalar(fCenter.fY); + buffer.writePoint(fCenter); buffer.writeScalar(fRadius); } @@ -2001,8 +1987,8 @@ public: protected: Two_Point_Radial_Gradient(SkFlattenableReadBuffer& buffer) : INHERITED(buffer), - fCenter1(unflatten_point(buffer)), - fCenter2(unflatten_point(buffer)), + fCenter1(buffer.readPoint()), + fCenter2(buffer.readPoint()), fRadius1(buffer.readScalar()), fRadius2(buffer.readScalar()) { init(); @@ -2010,10 +1996,8 @@ protected: virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { this->INHERITED::flatten(buffer); - buffer.writeScalar(fCenter1.fX); - buffer.writeScalar(fCenter1.fY); - buffer.writeScalar(fCenter2.fX); - buffer.writeScalar(fCenter2.fY); + buffer.writePoint(fCenter1); + buffer.writePoint(fCenter2); buffer.writeScalar(fRadius1); buffer.writeScalar(fRadius2); } @@ -2087,12 +2071,11 @@ public: protected: Sweep_Gradient(SkFlattenableReadBuffer& buffer) : INHERITED(buffer), - fCenter(unflatten_point(buffer)) { + fCenter(buffer.readPoint()) { } virtual void flatten(SkFlattenableWriteBuffer& buffer) const SK_OVERRIDE { this->INHERITED::flatten(buffer); - buffer.writeScalar(fCenter.fX); - buffer.writeScalar(fCenter.fY); + buffer.writePoint(fCenter); } private: diff --git a/src/pipe/SkGPipeRead.cpp b/src/pipe/SkGPipeRead.cpp index f30f1050d0..471ec638f2 100644 --- a/src/pipe/SkGPipeRead.cpp +++ b/src/pipe/SkGPipeRead.cpp @@ -18,6 +18,7 @@ #include "SkColorFilter.h" #include "SkDrawLooper.h" #include "SkMaskFilter.h" +#include "SkOrderedReadBuffer.h" #include "SkPathEffect.h" #include "SkRasterizer.h" #include "SkShader.h" @@ -131,7 +132,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; - SkReadRegion(reader, &rgn); + reader->readRegion(&rgn); canvas->clipRegion(rgn, (SkRegion::Op)DrawOp_unpackData(op32)); } @@ -145,14 +146,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; - SkReadMatrix(reader, &matrix); + reader->readMatrix(&matrix); canvas->setMatrix(matrix); } static void concat_rp(SkCanvas* canvas, SkReader32* reader, uint32_t op32, SkGPipeState* state) { SkMatrix matrix; - SkReadMatrix(reader, &matrix); + reader->readMatrix(&matrix); canvas->concat(matrix); } @@ -315,7 +316,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) { - SkReadMatrix(reader, &matrixStorage); + reader->readMatrix(&matrixStorage); matrix = &matrixStorage; } @@ -508,7 +509,7 @@ SkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, SkASSERT(SK_ARRAY_COUNT(gReadTable) == (kDone_DrawOp + 1)); const ReadProc* table = gReadTable; - SkFlattenableReadBuffer reader(data, length); + SkOrderedReadBuffer reader(data, length); SkCanvas* canvas = fCanvas; Status status = kEOF_Status; @@ -527,7 +528,7 @@ SkGPipeReader::Status SkGPipeReader::playback(const void* data, size_t length, status = kDone_Status; break; } - table[op](canvas, &reader, op32, fState); + table[op](canvas, reader.getReader32(), op32, fState); if (readAtom && (table[op] != paintOp_rp && table[op] != def_Typeface_rp && diff --git a/src/pipe/SkGPipeWrite.cpp b/src/pipe/SkGPipeWrite.cpp index ee6e2c72f6..fff2b56899 100644 --- a/src/pipe/SkGPipeWrite.cpp +++ b/src/pipe/SkGPipeWrite.cpp @@ -23,6 +23,7 @@ #include "SkMaskFilter.h" #include "SkRasterizer.h" #include "SkShader.h" +#include "SkOrderedWriteBuffer.h" static SkFlattenable* get_paintflat(const SkPaint& paint, unsigned paintFlat) { SkASSERT(paintFlat < kCount_PaintFlats); @@ -194,7 +195,7 @@ int SkGPipeCanvas::flattenToIndex(SkFlattenable* obj, PaintFlats paintflat) { return 0; } - SkFlattenableWriteBuffer tmpWriter(1024); + SkOrderedWriteBuffer tmpWriter(1024); tmpWriter.setFlags(SkFlattenableWriteBuffer::kInlineFactoryNames_Flag); tmpWriter.setFactoryRecorder(fFactorySet); @@ -388,7 +389,7 @@ bool SkGPipeCanvas::concat(const SkMatrix& matrix) { NOTIFY_SETUP(this); if (this->needOpBytes(matrix.flatten(NULL))) { this->writeOp(kConcat_DrawOp); - SkWriteMatrix(&fWriter, matrix); + fWriter.writeMatrix(matrix); } } return this->INHERITED::concat(matrix); @@ -398,7 +399,7 @@ void SkGPipeCanvas::setMatrix(const SkMatrix& matrix) { NOTIFY_SETUP(this); if (this->needOpBytes(matrix.flatten(NULL))) { this->writeOp(kSetMatrix_DrawOp); - SkWriteMatrix(&fWriter, matrix); + fWriter.writeMatrix(matrix); } this->INHERITED::setMatrix(matrix); } @@ -426,7 +427,7 @@ bool SkGPipeCanvas::clipRegion(const SkRegion& region, SkRegion::Op rgnOp) { NOTIFY_SETUP(this); if (this->needOpBytes(region.flatten(NULL))) { this->writeOp(kClipRegion_DrawOp, 0, rgnOp); - SkWriteRegion(&fWriter, region); + fWriter.writeRegion(region); } return this->INHERITED::clipRegion(region, rgnOp); } @@ -575,7 +576,7 @@ void SkGPipeCanvas::drawTextOnPath(const void* text, size_t byteLength, path.flatten(fWriter); if (matrix) { - SkWriteMatrix(&fWriter, *matrix); + fWriter.writeMatrix(*matrix); } } } diff --git a/tests/ColorFilterTest.cpp b/tests/ColorFilterTest.cpp index 20760ac6eb..6bfd9f26a2 100644 --- a/tests/ColorFilterTest.cpp +++ b/tests/ColorFilterTest.cpp @@ -10,9 +10,11 @@ #include "SkColorFilter.h" #include "SkRandom.h" #include "SkXfermode.h" +#include "SkOrderedReadBuffer.h" +#include "SkOrderedWriteBuffer.h" static SkFlattenable* reincarnate_flattenable(SkFlattenable* obj) { - SkFlattenableWriteBuffer wb(1024); + SkOrderedWriteBuffer wb(1024); wb.writeFlattenable(obj); size_t size = wb.size(); @@ -20,7 +22,7 @@ static SkFlattenable* reincarnate_flattenable(SkFlattenable* obj) { // make a copy into storage wb.flatten(storage.get()); - SkFlattenableReadBuffer rb(storage.get(), size); + SkOrderedReadBuffer rb(storage.get(), size); return rb.readFlattenable(); } |