SkFlattenable.cpp revision 15e9d3e66e161ce23df30bc13f8a0c87d196b463
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com 2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/* 3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc. 4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * 5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file. 7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */ 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkFlattenable.h" 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypeface.h" 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1115e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.comSK_DEFINE_INST_COUNT(SkFlattenable) 1215e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com 13f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com/////////////////////////////////////////////////////////////////////////////// 14f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com 1554924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comvoid SkFlattenable::flatten(SkFlattenableWriteBuffer&) const 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /* we don't write anything at the moment, but this allows our subclasses 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com to not know that, since we want them to always call INHERITED::flatten() 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com in their code. 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenableReadBuffer::SkFlattenableReadBuffer() { 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fRCArray = NULL; 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fRCCount = 0; 2882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fTFArray = NULL; 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fTFCount = 0; 3182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 326bac947cd5bc460dd9166ada6310d678fd2e39f8reed@google.com fFactoryTDArray = NULL; 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fFactoryArray = NULL; 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fFactoryCount = 0; 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 392b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.comSkFlattenableWriteBuffer::SkFlattenableWriteBuffer() { 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fFlags = (Flags)0; 41e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org fRCSet = NULL; 42e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org fTFSet = NULL; 43e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org fFactorySet = NULL; 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenableWriteBuffer::~SkFlattenableWriteBuffer() { 47e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org SkSafeUnref(fRCSet); 48e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org SkSafeUnref(fTFSet); 49e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org SkSafeUnref(fFactorySet); 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 52e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkRefCntSet* SkFlattenableWriteBuffer::setRefCntRecorder(SkRefCntSet* rec) { 53e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org SkRefCnt_SafeAssign(fRCSet, rec); 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return rec; 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 57e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkRefCntSet* SkFlattenableWriteBuffer::setTypefaceRecorder(SkRefCntSet* rec) { 58e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org SkRefCnt_SafeAssign(fTFSet, rec); 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return rec; 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 62e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkFactorySet* SkFlattenableWriteBuffer::setFactoryRecorder(SkFactorySet* rec) { 63e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org SkRefCnt_SafeAssign(fFactorySet, rec); 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return rec; 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFlattenableWriteBuffer::writeRefCnt(SkRefCnt* obj) { 682b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com SkASSERT(!isCrossProcess()); 69e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org if (NULL == obj || NULL == fRCSet) { 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->write32(0); 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 72e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org this->write32(fRCSet->add(obj)); 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 762b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.comvoid SkFlattenableWriteBuffer::writeTypeface(SkTypeface* obj) { 772b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com if (NULL == obj || NULL == fTFSet) { 782b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com this->write32(0); 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } else { 802b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com this->write32(fTFSet->add(obj)); 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 86e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkRefCntSet::~SkRefCntSet() { 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // call this now, while our decPtr() is sill in scope 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->reset(); 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 91e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgvoid SkRefCntSet::incPtr(void* ptr) { 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ((SkRefCnt*)ptr)->ref(); 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 95e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgvoid SkRefCntSet::decPtr(void* ptr) { 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ((SkRefCnt*)ptr)->unref(); 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define MAX_PAIR_COUNT 64 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct Pair { 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* fName; 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFlattenable::Factory fFactory; 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic int gCount; 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic Pair gPairs[MAX_PAIR_COUNT]; 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFlattenable::Register(const char name[], Factory factory) { 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(name); 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(factory); 11682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static bool gOnce; 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!gOnce) { 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com gCount = 0; 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com gOnce = true; 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 12282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(gCount < MAX_PAIR_COUNT); 12482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com gPairs[gCount].fName = name; 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com gPairs[gCount].fFactory = factory; 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com gCount += 1; 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 130d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_DEBUG) 131d26147adbbdca85f07dff432025afee0c8614387caryclark@google.comstatic void report_no_entries(const char* functionName) { 132d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com if (!gCount) { 133d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com SkDebugf("%s has no registered name/factory pairs." 1349245498e40399199ed6d32aa67fe028b634cc582caryclark@google.com " Call SkGraphics::Init() at process initialization time.", 1359245498e40399199ed6d32aa67fe028b634cc582caryclark@google.com functionName); 136d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com } 137d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com} 138d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif 139d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenable::Factory SkFlattenable::NameToFactory(const char name[]) { 141d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_DEBUG) 142d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com report_no_entries(__FUNCTION__); 143d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const Pair* pairs = gPairs; 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for (int i = gCount - 1; i >= 0; --i) { 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (strcmp(pairs[i].fName, name) == 0) { 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return pairs[i].fFactory; 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char* SkFlattenable::FactoryToName(Factory fact) { 154d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_DEBUG) 155d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com report_no_entries(__FUNCTION__); 156d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const Pair* pairs = gPairs; 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for (int i = gCount - 1; i >= 0; --i) { 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (pairs[i].fFactory == fact) { 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return pairs[i].fName; 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 165