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