SkFlattenable.h revision 9d0c6ecb8440e8e546881a4ff850eb6333f24541
1ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com
2ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com/*
3ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Copyright 2006 The Android Open Source Project
4ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com *
5ec3ed6a5ebf6f2c406d7bcf94b6bc34fcaeb976eepoger@google.com * Use of this source code is governed by a BSD-style license that can be
69d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org * found in the LICENSE file.
79d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org */
89d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
9fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org
10d537341e16524d1e22ac5e6c8b9c8f274ba1833crobertphillips#ifndef SkFlattenable_DEFINED
1169cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.com#define SkFlattenable_DEFINED
129d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
1381712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com#include "SkRefCnt.h"
14b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com#include "SkBitmap.h"
15fd03d4a829efe2d77a712fd991927c55f59a2ffecommit-bot@chromium.org#include "SkReader32.h"
16181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.com#include "SkTDArray.h"
171878651990d7c9da72cf43481432232bbef3550dcommit-bot@chromium.org#include "SkWriter32.h"
181878651990d7c9da72cf43481432232bbef3550dcommit-bot@chromium.org
1981712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.comclass SkFlattenableReadBuffer;
20181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.comclass SkFlattenableWriteBuffer;
21181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.comclass SkString;
22383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com
23383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com#if SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
24383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com
25b9086a026844e4cfd08b219e49ce3f12294cba98bsalomon@google.com#define SK_DECLARE_FLATTENABLE_REGISTRAR()
26383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com
27383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com#define SK_DEFINE_FLATTENABLE_REGISTRAR(flattenable) \
28383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com    static SkFlattenable::Registrar g##flattenable##Reg(#flattenable, \
29383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com                                                      flattenable::CreateProc);
30383963280ddd13030331765fe88d2aefa3e32130bsalomon@google.com
31181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.com#define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(flattenable)
3281712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com#define SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(flattenable) \
33181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.com    static SkFlattenable::Registrar g##flattenable##Reg(#flattenable, \
34181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.com                                                      flattenable::CreateProc);
35181e9bd9484ece4132e0cc5cfcff602134e5489dbsalomon@google.com#define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END
36b5b3168a645802f66233234a06dd5a3764f18018bsalomon@google.com
374b413c8bb123e42ca4b9c7bfa6bc2167283cb84ccommit-bot@chromium.org#else
389d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
39972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org#define SK_DECLARE_FLATTENABLE_REGISTRAR() static void Init();
4081712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com
41c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com#define SK_DEFINE_FLATTENABLE_REGISTRAR(flattenable) \
42afec7ba75962517b17293799d3fc70d39fa7dbf2tomhudson@google.com    void flattenable::Init() { \
43c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com        SkFlattenable::Registrar(#flattenable, CreateProc); \
44f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org    }
45c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com
4681712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com#define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_START(flattenable) \
47c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com    void flattenable::Init() {
489d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
499d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org#define SK_DEFINE_FLATTENABLE_REGISTRAR_ENTRY(flattenable) \
509d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        SkFlattenable::Registrar(#flattenable, flattenable::CreateProc);
519d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
529d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org#define SK_DEFINE_FLATTENABLE_REGISTRAR_GROUP_END \
539d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    }
54e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com
5561f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com#endif
5661f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com
5761f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com/** \class SkFlattenable
5861f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com
5961f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com SkFlattenable is the base class for objects that need to be flattened
6061f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com into a data stream for either transport or as part of the key to the
6161f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com font cache.
62972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org */
639d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.orgclass SK_API SkFlattenable : public SkRefCnt {
649d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.orgpublic:
659d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    typedef SkFlattenable* (*Factory)(SkFlattenableReadBuffer&);
66972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org
67972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    SkFlattenable() {}
68972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org
6981712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com    /** Implement this to return a factory function pointer that can be called
70972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org     to recreate your class given a buffer (previously written to by your
71c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com     override of flatten().
729d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org     */
739d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    virtual Factory getFactory() = 0;
749d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    /** Override this to write data specific to your subclass into the buffer,
759d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org     being sure to call your super-class' version first. This data will later
769d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org     be passed to your Factory function, returned by getFactory().
779d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org     */
789d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    virtual void flatten(SkFlattenableWriteBuffer&);
79972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org
8081712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com    /** Set the string to describe the sublass and return true. If this is not
8181712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com        overridden, ignore the string param and return false.
829d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org     */
83972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    virtual bool toDumpString(SkString*) const;
849d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
859d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    static Factory NameToFactory(const char name[]);
869d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    static const char* FactoryToName(Factory);
879d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    static void Register(const char name[], Factory);
889d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
899d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    class Registrar {
909d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    public:
91972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org        Registrar(const char name[], Factory factory) {
9281712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com            SkFlattenable::Register(name, factory);
93c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com        }
94afec7ba75962517b17293799d3fc70d39fa7dbf2tomhudson@google.com    };
95c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com
96f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.orgprotected:
97c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com    SkFlattenable(SkFlattenableReadBuffer&) {}
98972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org
99c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.comprivate:
100c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com#if !SK_ALLOW_STATIC_GLOBAL_INITIALIZERS
1012047f00e4698f83499ab91911999a65c21a951c9epoger@google.com    static void InitializeFlattenables();
102c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com#endif
1039d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
1049d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    friend class SkGraphics;
105e1ca705cac4b946993f6cbf798e2a0ba27e739f3reed@google.com};
10661f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com
10761f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com// helpers for matrix and region
10861f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com
10961f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.comclass SkMatrix;
11061f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.comextern void SkReadMatrix(SkReader32*, SkMatrix*);
11161f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.comextern void SkWriteMatrix(SkWriter32*, const SkMatrix&);
11261f3bde1ba114e7b39b53411f4aa31ed0875d159bsalomon@google.com
113972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.orgclass SkRegion;
1149d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.orgextern void SkReadRegion(SkReader32*, SkRegion*);
1159d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.orgextern void SkWriteRegion(SkWriter32*, const SkRegion&);
1169d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
117972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org///////////////////////////////////////////////////////////////////////////////
118972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org///////////////////////////////////////////////////////////////////////////////
119972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org
120972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.orgclass SkTypeface;
12181712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com
122972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.orgclass SkFlattenableReadBuffer : public SkReader32 {
123c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.compublic:
1249d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    SkFlattenableReadBuffer();
1259d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    explicit SkFlattenableReadBuffer(const void* data);
1269d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    SkFlattenableReadBuffer(const void* data, size_t size);
1279d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
1289d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    void setRefCntArray(SkRefCnt* array[], int count) {
1299d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        fRCArray = array;
1309d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        fRCCount = count;
131972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    }
13281712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com
13381712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com    void setTypefaceArray(SkTypeface* array[], int count) {
13481712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com        fTFArray = array;
1359d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        fTFCount = count;
136972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    }
13781712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com
13881712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com    /**
1399d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org     *  Call this with a pre-loaded array of Factories, in the same order as
140972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org     *  were created/written by the writer. SkPicture uses this.
1419d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org     */
1429d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    void setFactoryPlayback(SkFlattenable::Factory array[], int count) {
1439d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        fFactoryTDArray = NULL;
1449d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        fFactoryArray = array;
1459d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        fFactoryCount = count;
1469d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    }
1478d033a1b125886c62906d975b5cc28a382064526bsalomon@google.com
14881712883419f76e25d2ffec38a9438284a45a48dbsalomon@google.com    /**
149c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com     *  Call this with an initially empty array, so the reader can cache each
150afec7ba75962517b17293799d3fc70d39fa7dbf2tomhudson@google.com     *  factory it sees by name. Used by the pipe code in conjunction with
151c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com     *  the writer's kInlineFactoryNames_Flag.
152f6de475e5cbd143f348ff7738919e397b7fe7f57tfarina@chromium.org     */
153c10a88825d119054a9f4e7b7af7a3f887e30ab6btomhudson@google.com    void setFactoryArray(SkTDArray<SkFlattenable::Factory>* array) {
1549d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        fFactoryTDArray = array;
1559d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        fFactoryArray = NULL;
1569d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org        fFactoryCount = 0;
1579d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    }
1589d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
159129b8e3237b80b9d258a8f48e8f54c0073cafbdcsenorblanco@chromium.org    SkTypeface* readTypeface();
16094b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com    SkRefCnt* readRefCnt();
1619d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    void* readFunctionPtr();
162972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    SkFlattenable* readFlattenable();
16394b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com
1649d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.orgprivate:
16594b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com    SkRefCnt** fRCArray;
16694b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com    int        fRCCount;
1679d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
1689d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    SkTypeface** fTFArray;
16994b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com    int        fTFCount;
1709d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
1719d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    SkTDArray<SkFlattenable::Factory>* fFactoryTDArray;
17294b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com    SkFlattenable::Factory* fFactoryArray;
1739d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org    int                     fFactoryCount;
1749d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
17594b284d719ee5ccd3e2efbd1d7084ec554583bacbsalomon@google.com    typedef SkReader32 INHERITED;
1769d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org};
1779d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
1789d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org///////////////////////////////////////////////////////////////////////////////
1799d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
1809d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org#include "SkPtrRecorder.h"
1819d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org
1829d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org/**
1839d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org *  Subclass of SkTPtrSet specialed to call ref() and unref() when the
1849d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org *  base class's incPtr() and decPtr() are called. This makes it a valid owner
1859d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org *  of each ptr, which is released when the set is reset or destroyed.
1869d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.org */
1879d18b7873ce9b44f130a41e0cbd0a3df76ab9adfsenorblanco@chromium.orgclass SkRefCntSet : public SkTPtrSet<SkRefCnt*> {
18869cc6ad20ed03f35f9d3c8119a2c32187669a22bbsalomon@google.compublic:
189972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    virtual ~SkRefCntSet();
1901971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.com
191dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.comprotected:
192dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    // overrides
193dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    virtual void incPtr(void*);
194dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    virtual void decPtr(void*);
195f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org};
196f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org
197f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.orgclass SkFactorySet : public SkTPtrSet<SkFlattenable::Factory> {};
198dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com
199f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.orgclass SkFlattenableWriteBuffer : public SkWriter32 {
200f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.orgpublic:
201f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org    SkFlattenableWriteBuffer(size_t minSize);
202f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org    virtual ~SkFlattenableWriteBuffer();
203f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org
204f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org    void writeTypeface(SkTypeface*);
205f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org    void writeRefCnt(SkRefCnt*);
206f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org    void writeFunctionPtr(void*);
207f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org    void writeFlattenable(SkFlattenable* flattenable);
208f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org
209f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org    SkRefCntSet* getTypefaceRecorder() const { return fTFSet; }
2108491d24bdc3f48f67475c12c60babb9f9dba8047skia.committer@gmail.com    SkRefCntSet* setTypefaceRecorder(SkRefCntSet*);
211f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org
212dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    SkRefCntSet* getRefCntRecorder() const { return fRCSet; }
213dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    SkRefCntSet* setRefCntRecorder(SkRefCntSet*);
214dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com
215dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    SkFactorySet* getFactoryRecorder() const { return fFactorySet; }
216dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    SkFactorySet* setFactoryRecorder(SkFactorySet*);
217dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com
218dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    enum Flags {
219dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com        kCrossProcess_Flag       = 0x01,
220dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com        /**
221dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com         *  Instructs the writer to inline Factory names as there are seen the
222dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com         *  first time (after that we store an index). The pipe code uses this.
223dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com         */
224dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com        kInlineFactoryNames_Flag = 0x02,
225dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    };
226dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    Flags getFlags() const { return (Flags)fFlags; }
227dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    void setFlags(Flags flags) { fFlags = flags; }
228dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com
229972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org    bool isCrossProcess() const {
23020e542e00eccaf7b9e81964692a47086e6aaf568bsalomon@google.com        return SkToBool(fFlags & kCrossProcess_Flag);
23120e542e00eccaf7b9e81964692a47086e6aaf568bsalomon@google.com    }
23220e542e00eccaf7b9e81964692a47086e6aaf568bsalomon@google.com    bool inlineFactoryNames() const {
233972f9cd7a063d0544f8c919fd12b9a3adbd12b24commit-bot@chromium.org        return SkToBool(fFlags & kInlineFactoryNames_Flag);
234dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    }
2351971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.com
2361971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.com    bool persistBitmapPixels() const {
2371971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.com        return (fFlags & kCrossProcess_Flag) != 0;
2381971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.com    }
2391971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.com
2401971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.com    bool persistTypeface() const { return (fFlags & kCrossProcess_Flag) != 0; }
2411971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.com
2421971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.comprivate:
243dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    uint32_t        fFlags;
244dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    SkRefCntSet*    fTFSet;
245dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    SkRefCntSet*    fRCSet;
2461971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.com    SkFactorySet*   fFactorySet;
2471971317bb43580330a9e7e9a1c09c5025fe84aacbsalomon@google.com
248dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com    typedef SkWriter32 INHERITED;
249dc3c78076ea279d4f6d502b3b42471e9b2bba48ebsalomon@google.com};
250f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org
251f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org#endif
252f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org
253f543fd9e8c162b65fd04d1d9439b60911f8eb4c0commit-bot@chromium.org