SkFlattenable.cpp revision a0c2bc24381fea063008f9c8823756eb020603b3
17cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 27cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines/* 37cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * Copyright 2011 Google Inc. 47cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * 57cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * Use of this source code is governed by a BSD-style license that can be 67cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines * found in the LICENSE file. 77cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines */ 87cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#include "SkFlattenable.h" 97cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#include "SkPtrRecorder.h" 107cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 117cd4c49d575478b2380f129dcd376a4e5e37939cStephen HinesSK_DEFINE_INST_COUNT(SkFlattenable) 127cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 137cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines/////////////////////////////////////////////////////////////////////////////// 147cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 157cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesvoid SkFlattenable::flatten(SkFlattenableWriteBuffer&) const 167cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines{ 177cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines /* we don't write anything at the moment, but this allows our subclasses 187cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines to not know that, since we want them to always call INHERITED::flatten() 197cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines in their code. 207cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines */ 217cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines} 227cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 237cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines/////////////////////////////////////////////////////////////////////////////// 247cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 257cd4c49d575478b2380f129dcd376a4e5e37939cStephen HinesSkNamedFactorySet::SkNamedFactorySet() : fNextAddedFactory(0) {} 267cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 277cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesuint32_t SkNamedFactorySet::find(SkFlattenable::Factory factory) { 287cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines uint32_t index = fFactorySet.find(factory); 297cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines if (index > 0) { 307cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines return index; 317cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines } 327cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines const char* name = SkFlattenable::FactoryToName(factory); 337cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines if (NULL == name) { 347cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines return 0; 357cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines } 367cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines *fNames.append() = name; 377cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines return fFactorySet.add(factory); 387cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines} 397cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 407cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesconst char* SkNamedFactorySet::getNextAddedFactoryName() { 417cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines if (fNextAddedFactory < fNames.count()) { 427cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines return fNames[fNextAddedFactory++]; 437cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines } 447cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines return NULL; 457cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines} 467cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 477cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines/////////////////////////////////////////////////////////////////////////////// 487cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 497cd4c49d575478b2380f129dcd376a4e5e37939cStephen HinesSkRefCntSet::~SkRefCntSet() { 507cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines // call this now, while our decPtr() is sill in scope 517cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines this->reset(); 527cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines} 5326218cebf31dd9d0ec3c677fec91e1847a87a6d2Stephen Hines 547cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesvoid SkRefCntSet::incPtr(void* ptr) { 5526218cebf31dd9d0ec3c677fec91e1847a87a6d2Stephen Hines ((SkRefCnt*)ptr)->ref(); 567cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines} 577cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 587cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesvoid SkRefCntSet::decPtr(void* ptr) { 597cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines ((SkRefCnt*)ptr)->unref(); 607cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines} 617cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 627cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines/////////////////////////////////////////////////////////////////////////////// 637cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines/////////////////////////////////////////////////////////////////////////////// 647cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines/////////////////////////////////////////////////////////////////////////////// 657cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 667cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#define MAX_PAIR_COUNT 1024 677cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 687cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesstruct Pair { 697cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines const char* fName; 707cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines SkFlattenable::Factory fFactory; 717cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines}; 727cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 737cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesstatic int gCount; 747cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesstatic Pair gPairs[MAX_PAIR_COUNT]; 757cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 767cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesvoid SkFlattenable::Register(const char name[], Factory factory) { 777cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines SkASSERT(name); 787cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines SkASSERT(factory); 797cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 807cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines static bool gOnce; 817cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines if (!gOnce) { 827cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines gCount = 0; 837cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines gOnce = true; 847cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines } 857cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 867cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines SkASSERT(gCount < MAX_PAIR_COUNT); 877cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 887cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines gPairs[gCount].fName = name; 897cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines gPairs[gCount].fFactory = factory; 907cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines gCount += 1; 917cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines} 927cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 937cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#ifdef SK_DEBUG 947cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesstatic void report_no_entries(const char* functionName) { 957cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines if (!gCount) { 967cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines SkDebugf("%s has no registered name/factory pairs." 977cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines " Call SkGraphics::Init() at process initialization time.", 987cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines functionName); 997cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines } 1007cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines} 1017cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#endif 1027cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 1037cd4c49d575478b2380f129dcd376a4e5e37939cStephen HinesSkFlattenable::Factory SkFlattenable::NameToFactory(const char name[]) { 1047cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#ifdef SK_DEBUG 1057cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines report_no_entries(__FUNCTION__); 1067cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#endif 1077cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines const Pair* pairs = gPairs; 1087cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines for (int i = gCount - 1; i >= 0; --i) { 1097cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines if (strcmp(pairs[i].fName, name) == 0) { 1107cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines return pairs[i].fFactory; 1117cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines } 1127cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines } 1137cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines return NULL; 1147cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines} 1157cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines 1167cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hinesconst char* SkFlattenable::FactoryToName(Factory fact) { 1177cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines#ifdef SK_DEBUG 1187cd4c49d575478b2380f129dcd376a4e5e37939cStephen Hines report_no_entries(__FUNCTION__); 119#endif 120 const Pair* pairs = gPairs; 121 for (int i = gCount - 1; i >= 0; --i) { 122 if (pairs[i].fFactory == fact) { 123 return pairs[i].fName; 124 } 125 } 126 return NULL; 127} 128