: fBitmapHeap(NULL)
, fTypefaceSet(NULL)
, fTypefacePlayback(NULL)
-, fFactorySet(NULL) {}
+, fFactorySet(NULL)
+, fWriteBufferFlags(0) {}
SkFlatController::~SkFlatController() {
SkSafeUnref(fBitmapHeap);
///////////////////////////////////////////////////////////////////////////////
SkFlatData* SkFlatData::Create(SkFlatController* controller, const void* obj,
- int index, void (*flattenProc)(SkOrderedWriteBuffer&, const void*),
- uint32_t writeBufferflags) {
+ int index, void (*flattenProc)(SkOrderedWriteBuffer&, const void*)) {
// a buffer of 256 bytes should be sufficient for most paints, regions,
// and matrices.
intptr_t storage[256];
buffer.setBitmapHeap(controller->getBitmapHeap());
buffer.setTypefaceRecorder(controller->getTypefaceSet());
buffer.setNamedFactoryRecorder(controller->getNamedFactorySet());
- buffer.setFlags(writeBufferflags);
+ buffer.setFlags(controller->getWriteBufferFlags());
flattenProc(buffer, obj);
uint32_t size = buffer.size();
*/
SkNamedFactorySet* getNamedFactorySet() { return fFactorySet; }
+ /**
+ * Flags to use during creation of SkFlatData objects. Defaults to zero.
+ */
+ uint32_t getWriteBufferFlags() { return fWriteBufferFlags; }
+
protected:
/**
* Set an SkBitmapHeap to be used to store/read SkBitmaps. Ref counted.
*/
SkNamedFactorySet* setNamedFactorySet(SkNamedFactorySet*);
+ /**
+ * Set the flags to be used during flattening.
+ */
+ void setWriteBufferFlags(uint32_t flags) { fWriteBufferFlags = flags; }
+
private:
SkBitmapHeap* fBitmapHeap;
SkRefCntSet* fTypefaceSet;
SkTypefacePlayback* fTypefacePlayback;
SkNamedFactorySet* fFactorySet;
+ uint32_t fWriteBufferFlags;
};
class SkFlatData {
#endif
static SkFlatData* Create(SkFlatController* controller, const void* obj, int index,
- void (*flattenProc)(SkOrderedWriteBuffer&, const void*),
- uint32_t writeBufferflags);
+ void (*flattenProc)(SkOrderedWriteBuffer&, const void*));
void unflatten(void* result,
void (*unflattenProc)(SkOrderedReadBuffer&, void*),
* the entry in the dictionary, it returns the actual SkFlatData.
*/
const SkFlatData* findAndReplace(const T& element,
- uint32_t writeBufferFlags,
const SkFlatData* toReplace, bool* added,
bool* replaced) {
SkASSERT(added != NULL && replaced != NULL);
int oldCount = fData.count();
- const SkFlatData* flat = this->findAndReturnFlat(element,
- writeBufferFlags);
+ const SkFlatData* flat = this->findAndReturnFlat(element);
*added = fData.count() == oldCount + 1;
*replaced = false;
if (*added && toReplace != NULL) {
* This trick allows Compare to always loop until failure. If it fails on
* the sentinal value, we know the blocks are equal.
*/
- int find(const T& element, uint32_t writeBufferflags = 0) {
- return this->findAndReturnFlat(element, writeBufferflags)->index();
+ int find(const T& element) {
+ return this->findAndReturnFlat(element)->index();
}
/**
int fNextIndex;
SkTDArray<const SkFlatData*> fData;
- const SkFlatData* findAndReturnFlat(const T& element,
- uint32_t writeBufferflags) {
- SkFlatData* flat = SkFlatData::Create(fController, &element, fNextIndex,
- fFlattenProc, writeBufferflags);
+ const SkFlatData* findAndReturnFlat(const T& element) {
+ SkFlatData* flat = SkFlatData::Create(fController, &element, fNextIndex, fFlattenProc);
int hashIndex = ChecksumToHashIndex(flat->checksum());
const SkFlatData* candidate = fHash[hashIndex];
class FlattenableHeap : public SkFlatController {
public:
- FlattenableHeap(int numFlatsToKeep, SkNamedFactorySet* fset)
+ FlattenableHeap(int numFlatsToKeep, SkNamedFactorySet* fset, bool isCrossProcess)
: fNumFlatsToKeep(numFlatsToKeep) {
- this->setNamedFactorySet(fset);
+ SkASSERT((isCrossProcess && fset != NULL) || (!isCrossProcess && NULL == fset));
+ if (isCrossProcess) {
+ this->setNamedFactorySet(fset);
+ this->setWriteBufferFlags(SkFlattenableWriteBuffer::kCrossProcess_Flag);
+ }
}
~FlattenableHeap() {
return 0;
}
- uint32_t writeBufferFlags;
- if (isCrossProcess(fFlags)) {
- writeBufferFlags = SkFlattenableWriteBuffer::kCrossProcess_Flag;
- } else {
- // TODO: See if we can safely move this into the controller
- writeBufferFlags = 0;
- }
fBitmapHeap->deferAddingOwners();
bool added, replaced;
- const SkFlatData* flat = fFlatDictionary.findAndReplace(
- *obj, writeBufferFlags, fFlattenableHeap.flatToReplace(), &added, &replaced);
+ const SkFlatData* flat = fFlatDictionary.findAndReplace(*obj, fFlattenableHeap.flatToReplace(),
+ &added, &replaced);
fBitmapHeap->endAddingOwnersDeferral(added);
int index = flat->index();
if (added) {
: fFactorySet(isCrossProcess(flags) ? SkNEW(SkNamedFactorySet) : NULL)
, fWriter(*writer)
, fFlags(flags)
-, fFlattenableHeap(FLATTENABLES_TO_KEEP, fFactorySet)
+, fFlattenableHeap(FLATTENABLES_TO_KEEP, fFactorySet, isCrossProcess(flags))
, fFlatDictionary(&fFlattenableHeap) {
fController = controller;
fDone = false;