| Index: skia/sgl/SkFlattenable.cpp
|
| ===================================================================
|
| --- skia/sgl/SkFlattenable.cpp (revision 16859)
|
| +++ skia/sgl/SkFlattenable.cpp (working copy)
|
| @@ -1,259 +0,0 @@
|
| -#include "SkFlattenable.h"
|
| -#include "SkTypeface.h"
|
| -
|
| -void SkFlattenable::flatten(SkFlattenableWriteBuffer&)
|
| -{
|
| - /* we don't write anything at the moment, but this allows our subclasses
|
| - to not know that, since we want them to always call INHERITED::flatten()
|
| - in their code.
|
| - */
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -SkFlattenableReadBuffer::SkFlattenableReadBuffer() {
|
| - fRCArray = NULL;
|
| - fRCCount = 0;
|
| -
|
| - fTFArray = NULL;
|
| - fTFCount = 0;
|
| -
|
| - fFactoryArray = NULL;
|
| - fFactoryCount = 0;
|
| -}
|
| -
|
| -SkFlattenableReadBuffer::SkFlattenableReadBuffer(const void* data) :
|
| - INHERITED(data, 1024 * 1024) {
|
| - fRCArray = NULL;
|
| - fRCCount = 0;
|
| -
|
| - fTFArray = NULL;
|
| - fTFCount = 0;
|
| -
|
| - fFactoryArray = NULL;
|
| - fFactoryCount = 0;
|
| -}
|
| -
|
| -SkFlattenableReadBuffer::SkFlattenableReadBuffer(const void* data, size_t size)
|
| - : INHERITED(data, size) {
|
| - fRCArray = NULL;
|
| - fRCCount = 0;
|
| -
|
| - fTFArray = NULL;
|
| - fTFCount = 0;
|
| -
|
| - 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) {
|
| - uint32_t index = this->readU32();
|
| - if (index > 0) {
|
| - index -= 1;
|
| - SkASSERT(index < (unsigned)fFactoryCount);
|
| - factory = fFactoryArray[index];
|
| - // if we recorded an index, but failed to get a factory, we need
|
| - // to skip the flattened data in the buffer
|
| - if (NULL == factory) {
|
| - uint32_t size = this->readU32();
|
| - this->skip(size);
|
| - // fall through and return NULL for the object
|
| - }
|
| - }
|
| - } else {
|
| - factory = (SkFlattenable::Factory)readFunctionPtr();
|
| - }
|
| -
|
| - SkFlattenable* obj = NULL;
|
| - if (factory) {
|
| - uint32_t sizeRecorded = this->readU32();
|
| - 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();
|
| - }
|
| - }
|
| - return obj;
|
| -}
|
| -
|
| -void* SkFlattenableReadBuffer::readFunctionPtr() {
|
| - void* proc;
|
| - this->read(&proc, sizeof(proc));
|
| - return proc;
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -SkFlattenableWriteBuffer::SkFlattenableWriteBuffer(size_t minSize) :
|
| - INHERITED(minSize) {
|
| - fFlags = (Flags)0;
|
| - fRCRecorder = NULL;
|
| - fTFRecorder = NULL;
|
| - fFactoryRecorder = NULL;
|
| -}
|
| -
|
| -SkFlattenableWriteBuffer::~SkFlattenableWriteBuffer() {
|
| - fRCRecorder->safeUnref();
|
| - fTFRecorder->safeUnref();
|
| - fFactoryRecorder->safeUnref();
|
| -}
|
| -
|
| -SkRefCntRecorder* SkFlattenableWriteBuffer::setRefCntRecorder(
|
| - SkRefCntRecorder* rec) {
|
| - SkRefCnt_SafeAssign(fRCRecorder, rec);
|
| - return rec;
|
| -}
|
| -
|
| -SkRefCntRecorder* SkFlattenableWriteBuffer::setTypefaceRecorder(
|
| - SkRefCntRecorder* rec) {
|
| - SkRefCnt_SafeAssign(fTFRecorder, rec);
|
| - return rec;
|
| -}
|
| -
|
| -SkFactoryRecorder* SkFlattenableWriteBuffer::setFactoryRecorder(
|
| - SkFactoryRecorder* rec) {
|
| - SkRefCnt_SafeAssign(fFactoryRecorder, rec);
|
| - return rec;
|
| -}
|
| -
|
| -void SkFlattenableWriteBuffer::writeTypeface(SkTypeface* obj) {
|
| - if (NULL == obj || NULL == fTFRecorder) {
|
| - this->write32(0);
|
| - } else {
|
| - this->write32(fTFRecorder->record(obj));
|
| - }
|
| -}
|
| -
|
| -void SkFlattenableWriteBuffer::writeRefCnt(SkRefCnt* obj) {
|
| - if (NULL == obj || NULL == fRCRecorder) {
|
| - this->write32(0);
|
| - } else {
|
| - this->write32(fRCRecorder->record(obj));
|
| - }
|
| -}
|
| -
|
| -void SkFlattenableWriteBuffer::writeFlattenable(SkFlattenable* flattenable) {
|
| - SkFlattenable::Factory factory = NULL;
|
| - if (flattenable) {
|
| - factory = flattenable->getFactory();
|
| - }
|
| -
|
| - if (fFactoryRecorder) {
|
| - this->write32(fFactoryRecorder->record(factory));
|
| - } else {
|
| - this->writeFunctionPtr((void*)factory);
|
| - }
|
| -
|
| - if (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
|
| - 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;
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -SkRefCntRecorder::~SkRefCntRecorder() {
|
| - // call this now, while our decPtr() is sill in scope
|
| - this->reset();
|
| -}
|
| -
|
| -void SkRefCntRecorder::incPtr(void* ptr) {
|
| - ((SkRefCnt*)ptr)->ref();
|
| -}
|
| -
|
| -void SkRefCntRecorder::decPtr(void* ptr) {
|
| - ((SkRefCnt*)ptr)->unref();
|
| -}
|
| -
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -///////////////////////////////////////////////////////////////////////////////
|
| -
|
| -#define MAX_PAIR_COUNT 64
|
| -
|
| -struct Pair {
|
| - const char* fName;
|
| - SkFlattenable::Factory fFactory;
|
| -};
|
| -
|
| -static int gCount;
|
| -static Pair gPairs[MAX_PAIR_COUNT];
|
| -
|
| -void SkFlattenable::Register(const char name[], Factory factory) {
|
| - SkASSERT(name);
|
| - SkASSERT(factory);
|
| -
|
| - static bool gOnce;
|
| - if (!gOnce) {
|
| - gCount = 0;
|
| - gOnce = true;
|
| - }
|
| -
|
| - SkASSERT(gCount < MAX_PAIR_COUNT);
|
| -
|
| - gPairs[gCount].fName = name;
|
| - gPairs[gCount].fFactory = factory;
|
| - gCount += 1;
|
| -}
|
| -
|
| -SkFlattenable::Factory SkFlattenable::NameToFactory(const char name[]) {
|
| - const Pair* pairs = gPairs;
|
| - for (int i = gCount - 1; i >= 0; --i) {
|
| - if (strcmp(pairs[i].fName, name) == 0) {
|
| - return pairs[i].fFactory;
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
| -const char* SkFlattenable::FactoryToName(Factory fact) {
|
| - const Pair* pairs = gPairs;
|
| - for (int i = gCount - 1; i >= 0; --i) {
|
| - if (pairs[i].fFactory == fact) {
|
| - return pairs[i].fName;
|
| - }
|
| - }
|
| - return NULL;
|
| -}
|
| -
|
|
|