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