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