1685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com 2685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com/* 3685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Copyright 2011 Google Inc. 4685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * 5685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * Use of this source code is governed by a BSD-style license that can be 6685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com * found in the LICENSE file. 7685cfc0ee13d7c355ae2f4f3d225ad45e945763fepoger@google.com */ 8bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com#include "SkFlattenable.h" 97fe2414be8d83797ff0c450a79bc2de165171555mike@reedtribe.org#include "SkPtrRecorder.h" 10bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 1186dbfc4180c99e8934ac930f87c569d5babbf838robertphillips@google.comSK_DEFINE_INST_COUNT(SkFlattenable) 1286dbfc4180c99e8934ac930f87c569d5babbf838robertphillips@google.com 139f9b3ce4dcfd9a9dff15ab5f2331009c72038af3reed@google.com/////////////////////////////////////////////////////////////////////////////// 149f9b3ce4dcfd9a9dff15ab5f2331009c72038af3reed@google.com 15cd2e444e946f5cfec4723f5bc46e9487d82e8e54djsollen@google.comvoid SkFlattenable::flatten(SkFlattenableWriteBuffer&) const 16bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com{ 17bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com /* we don't write anything at the moment, but this allows our subclasses 18bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com to not know that, since we want them to always call INHERITED::flatten() 19bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com in their code. 20bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com */ 21bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 22bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 23bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com/////////////////////////////////////////////////////////////////////////////// 24bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 25179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.comSkNamedFactorySet::SkNamedFactorySet() : fNextAddedFactory(0) {} 26179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com 27179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.comuint32_t SkNamedFactorySet::find(SkFlattenable::Factory factory) { 28179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com uint32_t index = fFactorySet.find(factory); 29179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com if (index > 0) { 30179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com return index; 31179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com } 32179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com const char* name = SkFlattenable::FactoryToName(factory); 33179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com if (NULL == name) { 34179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com return 0; 35179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com } 36179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com *fNames.append() = name; 37179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com return fFactorySet.add(factory); 38179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com} 39179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com 40179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.comconst char* SkNamedFactorySet::getNextAddedFactoryName() { 41179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com if (fNextAddedFactory < fNames.count()) { 42179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com return fNames[fNextAddedFactory++]; 43179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com } 44179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com return NULL; 45179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com} 46179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com 47179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com/////////////////////////////////////////////////////////////////////////////// 48179ef2cb7e5d795bad40000017b645fd4534418escroggo@google.com 498709d226741e55fd8db1576461c6ab784dfd56a5mike@reedtribe.orgSkRefCntSet::~SkRefCntSet() { 50bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com // call this now, while our decPtr() is sill in scope 51bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com this->reset(); 52bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 53bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 548709d226741e55fd8db1576461c6ab784dfd56a5mike@reedtribe.orgvoid SkRefCntSet::incPtr(void* ptr) { 55bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com ((SkRefCnt*)ptr)->ref(); 56bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 57bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 588709d226741e55fd8db1576461c6ab784dfd56a5mike@reedtribe.orgvoid SkRefCntSet::decPtr(void* ptr) { 59bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com ((SkRefCnt*)ptr)->unref(); 60bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 61bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 62bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com/////////////////////////////////////////////////////////////////////////////// 63bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com/////////////////////////////////////////////////////////////////////////////// 64bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com/////////////////////////////////////////////////////////////////////////////// 65bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 668ea5ff09b191a7cad1916c8f12827fad7807275bbungeman@google.com#define MAX_PAIR_COUNT 1024 67bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 68bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comstruct Pair { 69bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const char* fName; 70bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkFlattenable::Factory fFactory; 71bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com}; 72bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 73bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comstatic int gCount; 74bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comstatic Pair gPairs[MAX_PAIR_COUNT]; 75bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 76bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comvoid SkFlattenable::Register(const char name[], Factory factory) { 77bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(name); 78bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(factory); 79919114813d58933c9d9433b141e0222c34b700b1reed@google.com 80bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com static bool gOnce; 81bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (!gOnce) { 82bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com gCount = 0; 83bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com gOnce = true; 84bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 85919114813d58933c9d9433b141e0222c34b700b1reed@google.com 86bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com SkASSERT(gCount < MAX_PAIR_COUNT); 87919114813d58933c9d9433b141e0222c34b700b1reed@google.com 88bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com gPairs[gCount].fName = name; 89bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com gPairs[gCount].fFactory = factory; 90bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com gCount += 1; 91bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 92bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 934c71aa6d608da02ad623faf779894c4c9a049605scroggo@google.com#ifdef SK_DEBUG 94d4a9619748aea7758b82a24e882955233cae899ccaryclark@google.comstatic void report_no_entries(const char* functionName) { 95d4a9619748aea7758b82a24e882955233cae899ccaryclark@google.com if (!gCount) { 96d4a9619748aea7758b82a24e882955233cae899ccaryclark@google.com SkDebugf("%s has no registered name/factory pairs." 97a83a53204ee63883282ffb054511fbcb4c5eaec4caryclark@google.com " Call SkGraphics::Init() at process initialization time.", 98a83a53204ee63883282ffb054511fbcb4c5eaec4caryclark@google.com functionName); 99d4a9619748aea7758b82a24e882955233cae899ccaryclark@google.com } 100d4a9619748aea7758b82a24e882955233cae899ccaryclark@google.com} 101d4a9619748aea7758b82a24e882955233cae899ccaryclark@google.com#endif 102d4a9619748aea7758b82a24e882955233cae899ccaryclark@google.com 103bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comSkFlattenable::Factory SkFlattenable::NameToFactory(const char name[]) { 1044c71aa6d608da02ad623faf779894c4c9a049605scroggo@google.com#ifdef SK_DEBUG 105d4a9619748aea7758b82a24e882955233cae899ccaryclark@google.com report_no_entries(__FUNCTION__); 106d4a9619748aea7758b82a24e882955233cae899ccaryclark@google.com#endif 107bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const Pair* pairs = gPairs; 108bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com for (int i = gCount - 1; i >= 0; --i) { 109bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (strcmp(pairs[i].fName, name) == 0) { 110bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return pairs[i].fFactory; 111bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 112bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 113bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return NULL; 114bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 115bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com 116bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.comconst char* SkFlattenable::FactoryToName(Factory fact) { 1174c71aa6d608da02ad623faf779894c4c9a049605scroggo@google.com#ifdef SK_DEBUG 118d4a9619748aea7758b82a24e882955233cae899ccaryclark@google.com report_no_entries(__FUNCTION__); 119d4a9619748aea7758b82a24e882955233cae899ccaryclark@google.com#endif 120bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com const Pair* pairs = gPairs; 121bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com for (int i = gCount - 1; i >= 0; --i) { 122bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com if (pairs[i].fFactory == fact) { 123bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return pairs[i].fName; 124bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 125bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com } 126bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com return NULL; 127bcd4d5ab12df062500a4df90ec90d0f2d764931reed@android.com} 128