SkFlattenable.cpp revision 15e9d3e66e161ce23df30bc13f8a0c87d196b463
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2011 Google Inc.
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
6ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * found in the LICENSE file.
7ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com */
88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkFlattenable.h"
98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTypeface.h"
108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1115e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.comSK_DEFINE_INST_COUNT(SkFlattenable)
1215e9d3e66e161ce23df30bc13f8a0c87d196b463robertphillips@google.com
13f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com///////////////////////////////////////////////////////////////////////////////
14f2eb5ab7806a62e89b8cb572b1b33b70b83b13abreed@google.com
1554924243c1b65b3ee6d8fa064b50a9b1bb2a19a5djsollen@google.comvoid SkFlattenable::flatten(SkFlattenableWriteBuffer&) const
168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com{
178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    /*  we don't write anything at the moment, but this allows our subclasses
188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        to not know that, since we want them to always call INHERITED::flatten()
198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        in their code.
208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    */
218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenableReadBuffer::SkFlattenableReadBuffer() {
268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fRCArray = NULL;
278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fRCCount = 0;
2882065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fTFArray = NULL;
308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fTFCount = 0;
3182065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
326bac947cd5bc460dd9166ada6310d678fd2e39f8reed@google.com    fFactoryTDArray = NULL;
338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFactoryArray = NULL;
348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFactoryCount = 0;
358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
392b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.comSkFlattenableWriteBuffer::SkFlattenableWriteBuffer() {
408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    fFlags = (Flags)0;
41e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    fRCSet = NULL;
42e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    fTFSet = NULL;
43e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    fFactorySet = NULL;
448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenableWriteBuffer::~SkFlattenableWriteBuffer() {
47e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkSafeUnref(fRCSet);
48e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkSafeUnref(fTFSet);
49e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkSafeUnref(fFactorySet);
508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
52e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkRefCntSet* SkFlattenableWriteBuffer::setRefCntRecorder(SkRefCntSet* rec) {
53e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkRefCnt_SafeAssign(fRCSet, rec);
548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return rec;
558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
57e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkRefCntSet* SkFlattenableWriteBuffer::setTypefaceRecorder(SkRefCntSet* rec) {
58e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkRefCnt_SafeAssign(fTFSet, rec);
598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return rec;
608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
62e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkFactorySet* SkFlattenableWriteBuffer::setFactoryRecorder(SkFactorySet* rec) {
63e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    SkRefCnt_SafeAssign(fFactorySet, rec);
648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return rec;
658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFlattenableWriteBuffer::writeRefCnt(SkRefCnt* obj) {
682b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com    SkASSERT(!isCrossProcess());
69e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org    if (NULL == obj || NULL == fRCSet) {
708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        this->write32(0);
718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
72e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.org        this->write32(fRCSet->add(obj));
738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
762b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.comvoid SkFlattenableWriteBuffer::writeTypeface(SkTypeface* obj) {
772b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com    if (NULL == obj || NULL == fTFSet) {
782b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com        this->write32(0);
798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    } else {
802b2ede3e713065e1bac461787b0aafb03eaf871fdjsollen@google.com        this->write32(fTFSet->add(obj));
818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
86e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgSkRefCntSet::~SkRefCntSet() {
878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    // call this now, while our decPtr() is sill in scope
888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    this->reset();
898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
91e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgvoid SkRefCntSet::incPtr(void* ptr) {
928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ((SkRefCnt*)ptr)->ref();
938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
95e9e08cc7b29f97ee9e823e68c3daf0f55c84b21amike@reedtribe.orgvoid SkRefCntSet::decPtr(void* ptr) {
968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    ((SkRefCnt*)ptr)->unref();
978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com///////////////////////////////////////////////////////////////////////////////
1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define MAX_PAIR_COUNT  64
1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstruct Pair {
1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const char*             fName;
1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkFlattenable::Factory  fFactory;
1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com};
1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic int gCount;
1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comstatic Pair gPairs[MAX_PAIR_COUNT];
1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comvoid SkFlattenable::Register(const char name[], Factory factory) {
1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(name);
1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(factory);
11682065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    static bool gOnce;
1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    if (!gOnce) {
1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gCount = 0;
1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        gOnce = true;
1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
12282065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    SkASSERT(gCount < MAX_PAIR_COUNT);
12482065d667f64e232bcde2ad849756a6096fcbe6freed@google.com
1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    gPairs[gCount].fName = name;
1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    gPairs[gCount].fFactory = factory;
1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    gCount += 1;
1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
130d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_DEBUG)
131d26147adbbdca85f07dff432025afee0c8614387caryclark@google.comstatic void report_no_entries(const char* functionName) {
132d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com    if (!gCount) {
133d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com        SkDebugf("%s has no registered name/factory pairs."
1349245498e40399199ed6d32aa67fe028b634cc582caryclark@google.com                 " Call SkGraphics::Init() at process initialization time.",
1359245498e40399199ed6d32aa67fe028b634cc582caryclark@google.com                 functionName);
136d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com    }
137d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com}
138d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif
139d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com
1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comSkFlattenable::Factory SkFlattenable::NameToFactory(const char name[]) {
141d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_DEBUG)
142d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com    report_no_entries(__FUNCTION__);
143d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif
1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const Pair* pairs = gPairs;
1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int i = gCount - 1; i >= 0; --i) {
1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (strcmp(pairs[i].fName, name) == 0) {
1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return pairs[i].fFactory;
1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return NULL;
1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com
1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comconst char* SkFlattenable::FactoryToName(Factory fact) {
154d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS && defined(SK_DEBUG)
155d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com    report_no_entries(__FUNCTION__);
156d26147adbbdca85f07dff432025afee0c8614387caryclark@google.com#endif
1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    const Pair* pairs = gPairs;
1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    for (int i = gCount - 1; i >= 0; --i) {
1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        if (pairs[i].fFactory == fact) {
1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com            return pairs[i].fName;
1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com        }
1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    }
1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com    return NULL;
1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}
165