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