SkFlattenable.h revision 7ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577
18a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/* 28a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Copyright (C) 2006 The Android Open Source Project 38a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 48a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Licensed under the Apache License, Version 2.0 (the "License"); 58a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * you may not use this file except in compliance with the License. 68a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * You may obtain a copy of the License at 78a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 88a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * http://www.apache.org/licenses/LICENSE-2.0 98a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * 108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * Unless required by applicable law or agreed to in writing, software 118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * distributed under the License is distributed on an "AS IS" BASIS, 128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * See the License for the specific language governing permissions and 148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com * limitations under the License. 158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#ifndef SkFlattenable_DEFINED 188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#define SkFlattenable_DEFINED 198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkRefCnt.h" 218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkBitmap.h" 228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkReader32.h" 238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkTDArray.h" 248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkWriter32.h" 258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkFlattenableReadBuffer; 278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkFlattenableWriteBuffer; 288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkString; 298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/** \class SkFlattenable 318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFlattenable is the base class for objects that need to be flattened 338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com into a data stream for either transport or as part of the key to the 348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com font cache. 358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 367ffb1b21abcc7bbed5a0fc711f6dd7b9dbb4f577ctguil@chromium.orgclass SK_API SkFlattenable : public SkRefCnt { 378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkFlattenable* (*Factory)(SkFlattenableReadBuffer&); 398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFlattenable() {} 418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /** Implement this to return a factory function pointer that can be called 438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com to recreate your class given a buffer (previously written to by your 448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com override of flatten(). 458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual Factory getFactory() = 0; 478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /** Override this to write data specific to your subclass into the buffer, 488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com being sure to call your super-class' version first. This data will later 498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com be passed to your Factory function, returned by getFactory(). 508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void flatten(SkFlattenableWriteBuffer&); 528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /** Set the string to describe the sublass and return true. If this is not 548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com overridden, ignore the string param and return false. 558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual bool toDumpString(SkString*) const; 578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static Factory NameToFactory(const char name[]); 598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static const char* FactoryToName(Factory); 608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com static void Register(const char name[], Factory); 618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com class Registrar { 638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com public: 648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Registrar(const char name[], Factory factory) { 658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFlattenable::Register(name, factory); 668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFlattenable(SkFlattenableReadBuffer&) {} 718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkTypeface; 778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkFlattenableReadBuffer : public SkReader32 { 798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFlattenableReadBuffer(); 818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com explicit SkFlattenableReadBuffer(const void* data); 828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFlattenableReadBuffer(const void* data, size_t size); 838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void setRefCntArray(SkRefCnt* array[], int count) { 858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fRCArray = array; 868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fRCCount = count; 878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void setTypefaceArray(SkTypeface* array[], int count) { 908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fTFArray = array; 918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fTFCount = count; 928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void setFactoryPlayback(SkFlattenable::Factory array[], int count) { 958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fFactoryArray = array; 968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com fFactoryCount = count; 978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTypeface* readTypeface(); 1008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRefCnt* readRefCnt(); 1018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void* readFunctionPtr(); 1028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFlattenable* readFlattenable(); 1038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRefCnt** fRCArray; 1068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int fRCCount; 1078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1088a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkTypeface** fTFArray; 1098a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int fTFCount; 1108a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1118a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFlattenable::Factory* fFactoryArray; 1128a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com int fFactoryCount; 1138a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1148a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkReader32 INHERITED; 1158a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1168a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1178a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com/////////////////////////////////////////////////////////////////////////////// 1188a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1198a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#include "SkPtrRecorder.h" 1208a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1218a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkRefCntRecorder : public SkPtrRecorder { 1228a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 1238a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkRefCntRecorder(); 1248a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1258a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /** Add a refcnt object to the set and ref it if not already present, 1268a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com or if it is already present, do nothing. Either way, returns 0 if obj 1278a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com is null, or a base-1 index if obj is not null. 1288a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 1298a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint32_t record(SkRefCnt* ref) { 1308a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->recordPtr(ref); 1318a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1328a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1338a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // This does not change the owner counts on the objects 1348a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void get(SkRefCnt* array[]) const { 1358a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->getPtrs((void**)array); 1368a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1378a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1388a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprotected: 1398a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com // overrides 1408a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void incPtr(void*); 1418a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual void decPtr(void*); 1428a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1438a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1448a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkPtrRecorder INHERITED; 1458a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1468a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1478a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkFactoryRecorder : public SkPtrRecorder { 1488a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 1498a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com /** Add a factory to the set. If it is null return 0, otherwise return a 1508a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com base-1 index for the factory. 1518a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com */ 1528a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com uint32_t record(SkFlattenable::Factory fact) { 1538a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return this->recordPtr((void*)fact); 1548a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1558a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1568a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void get(SkFlattenable::Factory array[]) const { 1578a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com this->getPtrs((void**)array); 1588a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1598a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1608a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1618a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkPtrRecorder INHERITED; 1628a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 1638a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1648a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comclass SkFlattenableWriteBuffer : public SkWriter32 { 1658a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.compublic: 1668a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFlattenableWriteBuffer(size_t minSize); 1678a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com virtual ~SkFlattenableWriteBuffer(); 1688a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1698a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void writeTypeface(SkTypeface*); 1708a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void writeRefCnt(SkRefCnt*); 1718a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void writeFunctionPtr(void*); 1728a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void writeFlattenable(SkFlattenable* flattenable); 1738a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1748a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRefCntRecorder* getTypefaceRecorder() const { return fTFRecorder; } 1758a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRefCntRecorder* setTypefaceRecorder(SkRefCntRecorder*); 1768a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1778a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRefCntRecorder* getRefCntRecorder() const { return fRCRecorder; } 1788a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRefCntRecorder* setRefCntRecorder(SkRefCntRecorder*); 1798a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1808a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFactoryRecorder* getFactoryRecorder() const { return fFactoryRecorder; } 1818a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFactoryRecorder* setFactoryRecorder(SkFactoryRecorder*); 1828a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1838a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com enum Flags { 1848a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com kCrossProcess_Flag = 0x01 1858a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com }; 1868a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Flags getFlags() const { return fFlags; } 1878a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com void setFlags(Flags flags) { fFlags = flags; } 1888a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1898a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool isCrossProcess() const { return (fFlags & kCrossProcess_Flag) != 0; } 1908a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1918a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool persistBitmapPixels() const { 1928a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com return (fFlags & kCrossProcess_Flag) != 0; 1938a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com } 1948a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1958a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com bool persistTypeface() const { return (fFlags & kCrossProcess_Flag) != 0; } 1968a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 1978a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.comprivate: 1988a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com Flags fFlags; 1998a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRefCntRecorder* fTFRecorder; 2008a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkRefCntRecorder* fRCRecorder; 2018a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com SkFactoryRecorder* fFactoryRecorder; 2028a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2038a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com typedef SkWriter32 INHERITED; 2048a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com}; 2058a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 2068a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com#endif 2078a1c16ff38322f0210116fa7293eb8817c7e477ereed@android.com 208