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