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" 9227b516f233df5870d79d3f8dcbdaa02336b7356mike@reedtribe.org#include "SkPtrRecorder.h" 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 11f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com/////////////////////////////////////////////////////////////////////////////// 12f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com 138b0e8ac5f582de80356019406e2975079bf0829dcommit-bot@chromium.orgvoid SkFlattenable::flatten(SkWriteBuffer&) const 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{ 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /* we don't write anything at the moment, but this allows our subclasses 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com to not know that, since we want them to always call INHERITED::flatten() 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com in their code. 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 230c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comSkNamedFactorySet::SkNamedFactorySet() : fNextAddedFactory(0) {} 240c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 250c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comuint32_t SkNamedFactorySet::find(SkFlattenable::Factory factory) { 260c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com uint32_t index = fFactorySet.find(factory); 270c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (index > 0) { 280c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com return index; 290c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 300c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com const char* name = SkFlattenable::FactoryToName(factory); 310c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (NULL == name) { 320c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com return 0; 330c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 340c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com *fNames.append() = name; 350c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com return fFactorySet.add(factory); 360c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com} 370c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 380c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.comconst char* SkNamedFactorySet::getNextAddedFactoryName() { 390c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com if (fNextAddedFactory < fNames.count()) { 400c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com return fNames[fNextAddedFactory++]; 410c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com } 420c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com return NULL; 430c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com} 440c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 450c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com/////////////////////////////////////////////////////////////////////////////// 460c3e5fe728ce4b8606819ee919a4b82f4d9efc85scroggo@google.com 47e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkRefCntSet::~SkRefCntSet() { 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // call this now, while our decPtr() is sill in scope 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->reset(); 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 52e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgvoid SkRefCntSet::incPtr(void* ptr) { 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ((SkRefCnt*)ptr)->ref(); 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 56e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgvoid SkRefCntSet::decPtr(void* ptr) { 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com ((SkRefCnt*)ptr)->unref(); 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 64c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org#define MAX_ENTRY_COUNT 1024 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 66c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgstruct Entry { 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com const char* fName; 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFlattenable::Factory fFactory; 69c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkFlattenable::Type fType; 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic int gCount; 73c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgstatic Entry gEntries[MAX_ENTRY_COUNT]; 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 75c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgvoid SkFlattenable::Register(const char name[], Factory factory, SkFlattenable::Type type) { 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(name); 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkASSERT(factory); 7882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 79c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org static bool gOnce = false; 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com if (!gOnce) { 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com gCount = 0; 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com gOnce = true; 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 8482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 85c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkASSERT(gCount < MAX_ENTRY_COUNT); 8682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com 87c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org gEntries[gCount].fName = name; 88c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org gEntries[gCount].fFactory = factory; 89c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org gEntries[gCount].fType = type; 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com gCount += 1; 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 93a0c2bc24381fea063008f9c8823756eb020603b3scroggo@google.com#ifdef SK_DEBUG 94d26147adbbdca85f07dff432025afee0c8614387caryclark@google.comstatic void report_no_entries(const char* functionName) { 95d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com if (!gCount) { 96c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkDebugf("%s has no registered name/factory/type entries." 97c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org " Call SkFlattenable::InitializeFlattenablesIfNeeded() before using gEntries", 989245498e40399199ed6d32aa67fe028b634cc582caryclark@google.com functionName); 99d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com } 100d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com} 101d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif 102d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenable::Factory SkFlattenable::NameToFactory(const char name[]) { 104c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org InitializeFlattenablesIfNeeded(); 105a0c2bc24381fea063008f9c8823756eb020603b3scroggo@google.com#ifdef SK_DEBUG 106d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com report_no_entries(__FUNCTION__); 107d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif 108c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org const Entry* entries = gEntries; 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for (int i = gCount - 1; i >= 0; --i) { 110c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org if (strcmp(entries[i].fName, name) == 0) { 111c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org return entries[i].fFactory; 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 117c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.orgbool SkFlattenable::NameToType(const char name[], SkFlattenable::Type* type) { 118c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org SkASSERT(NULL != type); 119c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org InitializeFlattenablesIfNeeded(); 120c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org#ifdef SK_DEBUG 121c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org report_no_entries(__FUNCTION__); 122c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org#endif 123c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org const Entry* entries = gEntries; 124c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org for (int i = gCount - 1; i >= 0; --i) { 125c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org if (strcmp(entries[i].fName, name) == 0) { 126c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org *type = entries[i].fType; 127c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org return true; 128c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org } 129c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org } 130c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org return false; 131c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org} 132c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char* SkFlattenable::FactoryToName(Factory fact) { 134c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org InitializeFlattenablesIfNeeded(); 135a0c2bc24381fea063008f9c8823756eb020603b3scroggo@google.com#ifdef SK_DEBUG 136d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com report_no_entries(__FUNCTION__); 137d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif 138c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org const Entry* entries = gEntries; 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com for (int i = gCount - 1; i >= 0; --i) { 140c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org if (entries[i].fFactory == fact) { 141c0b7e10c6a68f59e1653e6c18e6bc954b3c3f0cfcommit-bot@chromium.org return entries[i].fName; 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return NULL; 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com} 146