SkFlattenable.cpp revision 227b516f233df5870d79d3f8dcbdaa02336b7356
1d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis
277349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek/*
377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * Copyright 2011 Google Inc.
477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek *
577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * Use of this source code is governed by a BSD-style license that can be
677349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek * found in the LICENSE file.
777349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek */
877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#include "SkFlattenable.h"
977349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek#include "SkPtrRecorder.h"
10b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek
11d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios KyrtzidisSK_DEFINE_INST_COUNT(SkFlattenable)
12b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek
1377349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek///////////////////////////////////////////////////////////////////////////////
1477349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek
1577349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenekvoid SkFlattenable::flatten(SkFlattenableWriteBuffer&) const
16d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis{
17d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis    /*  we don't write anything at the moment, but this allows our subclasses
18d065d6080f0620bb80b933f3f5d52d37bb2ea770Ted Kremenek        to not know that, since we want them to always call INHERITED::flatten()
1930a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth        in their code.
2030a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth    */
214ef19205b6912316296db74a9073ad6fa60e4ccaTed Kremenek}
2230a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruth
239b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek///////////////////////////////////////////////////////////////////////////////
249b663716449b618ba0390b1dbebc54fa8e971124Ted Kremenek
2518c66fdc3c4008d335885695fe36fb5353c5f672Ted KremenekSkNamedFactorySet::SkNamedFactorySet() : fNextAddedFactory(0) {}
265903a373db3d27794c90b25687e0dd6adb0e497dAnna Zaks
2730a2e16f6c27f888dd11eba6bbbae1e980078fcbChandler Carruthuint32_t SkNamedFactorySet::find(SkFlattenable::Factory factory) {
2877349cb20bfd7069d081f84c91975bfa8ef60a32Ted Kremenek    uint32_t index = fFactorySet.find(factory);
291eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    if (index > 0) {
305a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis        return index;
311d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek    }
32337e4dbc6859589b8878146a88bebf754e916702Ted Kremenek    const char* name = SkFlattenable::FactoryToName(factory);
33c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer    if (NULL == name) {
34c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer        return 0;
35c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer    }
36c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer    *fNames.append() = name;
37c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer    return fFactorySet.add(factory);
38c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer}
39c35fb7d67d515659ad2325b4f6ec97c9fe64fb63Benjamin Kramer
405a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidisconst char* SkNamedFactorySet::getNextAddedFactoryName() {
41b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek    if (fNextAddedFactory < fNames.count()) {
429ef6537a894c33003359b1f9b9676e9178e028b7Ted Kremenek        return fNames[fNextAddedFactory++];
435a4f98ff943e6a501b0fe47ade007c9bbf96cb88Argyrios Kyrtzidis    }
445e2d2c2ee3cf410643e0f9a5701708e51409d973Benjamin Kramer    return NULL;
45740d490593e0de8732a697c9f77b90ddd463863bJordan Rose}
4669f87c956b3ac2b80124fd9604af012e1061473aJordan Rose
47bc403861bc4e6f7ad1371e9e129f0f25b38b3a9aJordan Rose///////////////////////////////////////////////////////////////////////////////
48f494b579b22f9950f5af021f0bf9879a91bb8b41Steve Naroff
49d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios KyrtzidisSkRefCntSet::~SkRefCntSet() {
5075f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks    // call this now, while our decPtr() is sill in scope
5175f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks    this->reset();
5275f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks}
5375f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks
5475f31c4862643ab09479c979fabf754e7ffe1460Anna Zaksvoid SkRefCntSet::incPtr(void* ptr) {
5575f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks    ((SkRefCnt*)ptr)->ref();
5675f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks}
5775f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks
5875f31c4862643ab09479c979fabf754e7ffe1460Anna Zaksvoid SkRefCntSet::decPtr(void* ptr) {
5975f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks    ((SkRefCnt*)ptr)->unref();
6025e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu}
61b1b5daf30d2597e066936772bd206500232d7d65Ted Kremenek
621d26f48dc2eea1c07431ca1519d7034a21b9bcffTed Kremenek///////////////////////////////////////////////////////////////////////////////
6325e695b2d574d919cc1bbddf3a2efe073d449b1cZhongxing Xu///////////////////////////////////////////////////////////////////////////////
64d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis///////////////////////////////////////////////////////////////////////////////
651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
66b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek#define MAX_PAIR_COUNT  1024
67031ccc0555a82afc2e8afe29e19dd57ff204e2deZhongxing Xu
681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstruct Pair {
69b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    const char*             fName;
7018c66fdc3c4008d335885695fe36fb5353c5f672Ted Kremenek    SkFlattenable::Factory  fFactory;
71cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek};
72b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek
73b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenekstatic int gCount;
741eb4433ac451dc16f4133a88af2d002ac26c58efMike Stumpstatic Pair gPairs[MAX_PAIR_COUNT];
75846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek
76846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenekvoid SkFlattenable::Register(const char name[], Factory factory) {
771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    SkASSERT(name);
7866c486f275531df6362b3511fc3af6563561801bTed Kremenek    SkASSERT(factory);
7966c486f275531df6362b3511fc3af6563561801bTed Kremenek
804ef19205b6912316296db74a9073ad6fa60e4ccaTed Kremenek    static bool gOnce;
814ef19205b6912316296db74a9073ad6fa60e4ccaTed Kremenek    if (!gOnce) {
824ef19205b6912316296db74a9073ad6fa60e4ccaTed Kremenek        gCount = 0;
834ef19205b6912316296db74a9073ad6fa60e4ccaTed Kremenek        gOnce = true;
8417a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose    }
8517a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose
8617a38e2636a8b1ce473fc6504c4b16cb09db29f4Jordy Rose    SkASSERT(gCount < MAX_PAIR_COUNT);
871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
889e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek    gPairs[gCount].fName = name;
899e9595b12e9b55586c4d50d370f429c7a3c92a90Ted Kremenek    gPairs[gCount].fFactory = factory;
90d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis    gCount += 1;
91cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek}
921eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
93fbcb3f11fc90e9f00e6074e9b118b8dc11ca604cAnna Zaks#if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_DEBUG)
94fbcb3f11fc90e9f00e6074e9b118b8dc11ca604cAnna Zaksstatic void report_no_entries(const char* functionName) {
95fbcb3f11fc90e9f00e6074e9b118b8dc11ca604cAnna Zaks    if (!gCount) {
96fbcb3f11fc90e9f00e6074e9b118b8dc11ca604cAnna Zaks        SkDebugf("%s has no registered name/factory pairs."
9775f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks                 " Call SkGraphics::Init() at process initialization time.",
9875f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks                 functionName);
9975f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks    }
100b22d589e2ccd09cada0bcea136f0966883a8bb11Ted Kremenek}
1016a86082f3a06a2dcceaaf63f78a0e52d64bcbaa3Anna Zaks#endif
102fbcb3f11fc90e9f00e6074e9b118b8dc11ca604cAnna Zaks
10375f31c4862643ab09479c979fabf754e7ffe1460Anna ZaksSkFlattenable::Factory SkFlattenable::NameToFactory(const char name[]) {
10475f31c4862643ab09479c979fabf754e7ffe1460Anna Zaks#if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_DEBUG)
105cf118d41f7930a18dce97416ef7834a62642f587Ted Kremenek    report_no_entries(__FUNCTION__);
106d2592a34a059e7cbb2b11dc53649ac4912422909Argyrios Kyrtzidis#endif
1071eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump    const Pair* pairs = gPairs;
108253955ca25c7e7049963b5db613c0cd15d66e4f8Anna Zaks    for (int i = gCount - 1; i >= 0; --i) {
109253955ca25c7e7049963b5db613c0cd15d66e4f8Anna Zaks        if (strcmp(pairs[i].fName, name) == 0) {
110253955ca25c7e7049963b5db613c0cd15d66e4f8Anna Zaks            return pairs[i].fFactory;
1112ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu        }
1122ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu    }
1132ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu    return NULL;
1142ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu}
115253955ca25c7e7049963b5db613c0cd15d66e4f8Anna Zaks
116253955ca25c7e7049963b5db613c0cd15d66e4f8Anna Zaksconst char* SkFlattenable::FactoryToName(Factory fact) {
117253955ca25c7e7049963b5db613c0cd15d66e4f8Anna Zaks#if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_DEBUG)
1188bef8238181a30e52dea380789a7e2d760eac532Ted Kremenek    report_no_entries(__FUNCTION__);
1192ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu#endif
120253955ca25c7e7049963b5db613c0cd15d66e4f8Anna Zaks    const Pair* pairs = gPairs;
121b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek    for (int i = gCount - 1; i >= 0; --i) {
1221eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump        if (pairs[i].fFactory == fact) {
123b387a3f23e423d62c053be86294b703da1d1a222Ted Kremenek            return pairs[i].fName;
1249c378f705405d37f49795d5e915989de774fe11fTed Kremenek        }
1255032ffe4259e7d436f2eb19e5a29fdae559e7c12Zhongxing Xu    }
1262ce43c8f43254a9edea53a20dc0e69195bc82ae0Zhongxing Xu    return NULL;
1271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump}
128769ce3e93ad35bd9ac28e4d8b8f035ae4fd9a5b5Argyrios Kyrtzidis