SkFlattenable.cpp revision f2eb5ab7806a62e89b8cb572b1b33b70b83b13ab
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkFlattenable.h"
28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypeface.h"
38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
4f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com#include "SkMatrix.h"
5f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com#include "SkRegion.h"
6f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com
7f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.comvoid SkReadMatrix(SkReader32* reader, SkMatrix* matrix) {
8f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    size_t size = matrix->unflatten(reader->peek());
9f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    SkASSERT(SkAlign4(size) == size);
10f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    (void)reader->skip(size);
11f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com}
12f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com
13f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.comvoid SkWriteMatrix(SkWriter32* writer, const SkMatrix& matrix) {
14f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    size_t size = matrix.flatten(NULL);
15f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    SkASSERT(SkAlign4(size) == size);
16f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    matrix.flatten(writer->reserve(size));
17f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com}
18f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com
19f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.comvoid SkReadRegion(SkReader32* reader, SkRegion* rgn) {
20f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    size_t size = rgn->unflatten(reader->peek());
21f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    SkASSERT(SkAlign4(size) == size);
22f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    (void)reader->skip(size);
23f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com}
24f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com
25f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.comvoid SkWriteRegion(SkWriter32* writer, const SkRegion& rgn) {
26f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    size_t size = rgn.flatten(NULL);
27f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    SkASSERT(SkAlign4(size) == size);
28f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com    rgn.flatten(writer->reserve(size));
29f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com}
30f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com
31f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com///////////////////////////////////////////////////////////////////////////////
32f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFlattenable::flatten(SkFlattenableWriteBuffer&)
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /*  we don't write anything at the moment, but this allows our subclasses
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        to not know that, since we want them to always call INHERITED::flatten()
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        in their code.
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenableReadBuffer::SkFlattenableReadBuffer() {
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fRCArray = NULL;
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fRCCount = 0;
4782065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fTFArray = NULL;
498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fTFCount = 0;
5082065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFactoryArray = NULL;
528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFactoryCount = 0;
538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenableReadBuffer::SkFlattenableReadBuffer(const void* data) :
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        INHERITED(data, 1024 * 1024) {
578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fRCArray = NULL;
588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fRCCount = 0;
5982065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fTFArray = NULL;
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fTFCount = 0;
6282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFactoryArray = NULL;
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFactoryCount = 0;
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenableReadBuffer::SkFlattenableReadBuffer(const void* data, size_t size)
688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        : INHERITED(data, size) {
698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fRCArray = NULL;
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fRCCount = 0;
7182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fTFArray = NULL;
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fTFCount = 0;
7482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFactoryArray = NULL;
768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFactoryCount = 0;
778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkTypeface* SkFlattenableReadBuffer::readTypeface() {
808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t index = this->readU32();
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (0 == index || index > (unsigned)fTFCount) {
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (index) {
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkDebugf("====== typeface index %d\n", index);
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return NULL;
868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(fTFArray);
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return fTFArray[index - 1];
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkRefCnt* SkFlattenableReadBuffer::readRefCnt() {
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    uint32_t index = this->readU32();
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (0 == index || index > (unsigned)fRCCount) {
958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return NULL;
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        SkASSERT(fRCArray);
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        return fRCArray[index - 1];
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenable* SkFlattenableReadBuffer::readFlattenable() {
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkFlattenable::Factory factory = NULL;
10482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (fFactoryCount > 0) {
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        uint32_t index = this->readU32();
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (index > 0) {
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            index -= 1;
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            SkASSERT(index < (unsigned)fFactoryCount);
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            factory = fFactoryArray[index];
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            // if we recorded an index, but failed to get a factory, we need
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            // to skip the flattened data in the buffer
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            if (NULL == factory) {
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                uint32_t size = this->readU32();
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                this->skip(size);
1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com                // fall through and return NULL for the object
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            }
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        factory = (SkFlattenable::Factory)readFunctionPtr();
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkFlattenable* obj = NULL;
1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (factory) {
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        uint32_t sizeRecorded = this->readU32();
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        uint32_t offset = this->offset();
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        obj = (*factory)(*this);
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        // check that we read the amount we expected
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        uint32_t sizeRead = this->offset() - offset;
1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (sizeRecorded != sizeRead) {
1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            // we could try to fix up the offset...
1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            sk_throw();
1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return obj;
1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid* SkFlattenableReadBuffer::readFunctionPtr() {
1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    void* proc;
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->read(&proc, sizeof(proc));
1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return proc;
1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenableWriteBuffer::SkFlattenableWriteBuffer(size_t minSize) :
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        INHERITED(minSize) {
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFlags = (Flags)0;
149e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    fRCSet = NULL;
150e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    fTFSet = NULL;
151e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    fFactorySet = NULL;
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenableWriteBuffer::~SkFlattenableWriteBuffer() {
155e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkSafeUnref(fRCSet);
156e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkSafeUnref(fTFSet);
157e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkSafeUnref(fFactorySet);
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
160e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkRefCntSet* SkFlattenableWriteBuffer::setRefCntRecorder(SkRefCntSet* rec) {
161e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkRefCnt_SafeAssign(fRCSet, rec);
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return rec;
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
165e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkRefCntSet* SkFlattenableWriteBuffer::setTypefaceRecorder(SkRefCntSet* rec) {
166e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkRefCnt_SafeAssign(fTFSet, rec);
1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return rec;
1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
170e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkFactorySet* SkFlattenableWriteBuffer::setFactoryRecorder(SkFactorySet* rec) {
171e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkRefCnt_SafeAssign(fFactorySet, rec);
1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return rec;
1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFlattenableWriteBuffer::writeTypeface(SkTypeface* obj) {
176e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    if (NULL == obj || NULL == fTFSet) {
1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->write32(0);
1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
179e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org        this->write32(fTFSet->add(obj));
1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFlattenableWriteBuffer::writeRefCnt(SkRefCnt* obj) {
184e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    if (NULL == obj || NULL == fRCSet) {
1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->write32(0);
1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
187e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org        this->write32(fRCSet->add(obj));
1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFlattenableWriteBuffer::writeFlattenable(SkFlattenable* flattenable) {
1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkFlattenable::Factory factory = NULL;
1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (flattenable) {
1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        factory = flattenable->getFactory();
1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
197e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    if (fFactorySet) {
198e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org        this->write32(fFactorySet->add(factory));
1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->writeFunctionPtr((void*)factory);
2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
20282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (factory) {
2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        // make room for the size of the flatttened object
2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        (void)this->reserve(sizeof(uint32_t));
2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        // record the current size, so we can subtract after the object writes.
2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        uint32_t offset = this->size();
2088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        // now flatten the object
2098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        flattenable->flatten(*this);
2108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        uint32_t objSize = this->size() - offset;
2118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        // record the obj's size
2128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        *this->peek32(offset - sizeof(uint32_t)) = objSize;
2138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFlattenableWriteBuffer::writeFunctionPtr(void* proc) {
2178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    *(void**)this->reserve(sizeof(void*)) = proc;
2188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
2218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
222e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkRefCntSet::~SkRefCntSet() {
2238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // call this now, while our decPtr() is sill in scope
2248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->reset();
2258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
227e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgvoid SkRefCntSet::incPtr(void* ptr) {
2288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ((SkRefCnt*)ptr)->ref();
2298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
231e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgvoid SkRefCntSet::decPtr(void* ptr) {
2328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ((SkRefCnt*)ptr)->unref();
2338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
2368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
2378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
2388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define MAX_PAIR_COUNT  64
2408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct Pair {
2428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char*             fName;
2438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkFlattenable::Factory  fFactory;
2448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
2458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic int gCount;
2478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic Pair gPairs[MAX_PAIR_COUNT];
2488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFlattenable::Register(const char name[], Factory factory) {
2508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(name);
2518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(factory);
25282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static bool gOnce;
2548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (!gOnce) {
2558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gCount = 0;
2568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gOnce = true;
2578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
25882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(gCount < MAX_PAIR_COUNT);
26082065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
2618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    gPairs[gCount].fName = name;
2628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    gPairs[gCount].fFactory = factory;
2638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    gCount += 1;
2648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenable::Factory SkFlattenable::NameToFactory(const char name[]) {
2678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const Pair* pairs = gPairs;
2688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int i = gCount - 1; i >= 0; --i) {
2698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (strcmp(pairs[i].fName, name) == 0) {
2708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return pairs[i].fFactory;
2718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return NULL;
2748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char* SkFlattenable::FactoryToName(Factory fact) {
2778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const Pair* pairs = gPairs;
2788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int i = gCount - 1; i >= 0; --i) {
2798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (pairs[i].fFactory == fact) {
2808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return pairs[i].fName;
2818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
2828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
2838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return NULL;
2848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
2868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.combool SkFlattenable::toDumpString(SkString* str) const {
2878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return false;
2888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
2898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
290