skia2/include/core/SkWriteBuffer.h
Mike Reed 45ab630045 Revert "Revert "impl SkSerial picture procs""
This reverts commit 2a3009931d.

Implement SkSerialProcs for pictures

Bug: skia:
Change-Id: Icde2d912941a19999e204ac5213f519ed5387e12
Reviewed-on: https://skia-review.googlesource.com/84480
Reviewed-by: Mike Reed <reed@google.com>
Commit-Queue: Mike Reed <reed@google.com>
2017-12-13 17:02:10 +00:00

180 lines
6.0 KiB
C++

/*
* Copyright 2011 Google Inc.
*
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#ifndef SkWriteBuffer_DEFINED
#define SkWriteBuffer_DEFINED
#define SK_SUPPORT_LEGACY_SERIAL_BUFFER_OBJECTS
#include "SkData.h"
#include "SkImage.h"
#include "SkPath.h"
#include "SkPicture.h"
#include "SkRefCnt.h"
#include "SkSerialProcs.h"
#include "SkWriter32.h"
#include "../private/SkTHash.h"
#ifdef SK_SUPPORT_LEGACY_SERIAL_BUFFER_OBJECTS
#include "SkPixelSerializer.h"
#endif
class SkBitmap;
class SkDeduper;
class SkFactorySet;
class SkFlattenable;
class SkRefCntSet;
class SK_API SkWriteBuffer {
public:
SkWriteBuffer() {}
virtual ~SkWriteBuffer() {}
virtual bool isCrossProcess() const = 0;
virtual void writePad32(const void* buffer, size_t bytes) = 0;
virtual void writeByteArray(const void* data, size_t size) = 0;
void writeDataAsByteArray(SkData* data) {
this->writeByteArray(data->data(), data->size());
}
virtual void writeBool(bool value) = 0;
virtual void writeScalar(SkScalar value) = 0;
virtual void writeScalarArray(const SkScalar* value, uint32_t count) = 0;
virtual void writeInt(int32_t value) = 0;
virtual void writeIntArray(const int32_t* value, uint32_t count) = 0;
virtual void writeUInt(uint32_t value) = 0;
void write32(int32_t value) {
this->writeInt(value);
}
virtual void writeString(const char* value) = 0;
virtual void writeFlattenable(const SkFlattenable* flattenable) = 0;
virtual void writeColor(SkColor color) = 0;
virtual void writeColorArray(const SkColor* color, uint32_t count) = 0;
virtual void writeColor4f(const SkColor4f& color) = 0;
virtual void writeColor4fArray(const SkColor4f* color, uint32_t count) = 0;
virtual void writePoint(const SkPoint& point) = 0;
virtual void writePointArray(const SkPoint* point, uint32_t count) = 0;
virtual void writeMatrix(const SkMatrix& matrix) = 0;
virtual void writeIRect(const SkIRect& rect) = 0;
virtual void writeRect(const SkRect& rect) = 0;
virtual void writeRegion(const SkRegion& region) = 0;
virtual void writePath(const SkPath& path) = 0;
virtual size_t writeStream(SkStream* stream, size_t length) = 0;
virtual void writeImage(const SkImage*) = 0;
virtual void writeTypeface(SkTypeface* typeface) = 0;
virtual void writePaint(const SkPaint& paint) = 0;
void setDeduper(SkDeduper* deduper) { fDeduper = deduper; }
/**
* Return a client specified context pointer. This is not interpreted by the writebuffer.
* It defaults to nullptr, but may be set with setClientContext(...).
*/
void* getClientContext() const { return fClientCtx; }
/**
* Set the client specified context pointer. This is not interpreted by the writebuffer.
* It defaults to nullptr. It can be inspected by calling getClientContext().
*/
void setClientContext(void* ctx) { fClientCtx = ctx; }
void setSerialProcs(const SkSerialProcs& procs) { fProcs = procs; }
protected:
SkDeduper* fDeduper = nullptr;
void* fClientCtx = nullptr;
SkSerialProcs fProcs;
friend class SkPicture; // fProcs
};
/**
* Concrete implementation that serializes to a flat binary blob.
*/
class SK_API SkBinaryWriteBuffer : public SkWriteBuffer {
public:
enum Flags {
kCrossProcess_Flag = 1 << 0,
};
SkBinaryWriteBuffer(uint32_t flags = 0);
SkBinaryWriteBuffer(void* initialStorage, size_t storageSize, uint32_t flags = 0);
~SkBinaryWriteBuffer() override;
bool isCrossProcess() const override {
return SkToBool(fFlags & kCrossProcess_Flag);
}
void write(const void* buffer, size_t bytes) {
fWriter.write(buffer, bytes);
}
void writePad32(const void* buffer, size_t bytes) override {
fWriter.writePad(buffer, bytes);
}
void reset(void* storage = nullptr, size_t storageSize = 0) {
fWriter.reset(storage, storageSize);
}
size_t bytesWritten() const { return fWriter.bytesWritten(); }
void writeByteArray(const void* data, size_t size) override;
void writeBool(bool value) override;
void writeScalar(SkScalar value) override;
void writeScalarArray(const SkScalar* value, uint32_t count) override;
void writeInt(int32_t value) override;
void writeIntArray(const int32_t* value, uint32_t count) override;
void writeUInt(uint32_t value) override;
void writeString(const char* value) override;
void writeFlattenable(const SkFlattenable* flattenable) override;
void writeColor(SkColor color) override;
void writeColorArray(const SkColor* color, uint32_t count) override;
void writeColor4f(const SkColor4f& color) override;
void writeColor4fArray(const SkColor4f* color, uint32_t count) override;
void writePoint(const SkPoint& point) override;
void writePointArray(const SkPoint* point, uint32_t count) override;
void writeMatrix(const SkMatrix& matrix) override;
void writeIRect(const SkIRect& rect) override;
void writeRect(const SkRect& rect) override;
void writeRegion(const SkRegion& region) override;
void writePath(const SkPath& path) override;
size_t writeStream(SkStream* stream, size_t length) override;
void writeImage(const SkImage*) override;
void writeTypeface(SkTypeface* typeface) override;
void writePaint(const SkPaint& paint) override;
bool writeToStream(SkWStream*);
void writeToMemory(void* dst) { fWriter.flatten(dst); }
SkFactorySet* setFactoryRecorder(SkFactorySet*);
SkRefCntSet* setTypefaceRecorder(SkRefCntSet*);
#ifdef SK_SUPPORT_LEGACY_SERIAL_BUFFER_OBJECTS
void setPixelSerializer(sk_sp<SkPixelSerializer>);
#endif
private:
const uint32_t fFlags;
SkFactorySet* fFactorySet;
SkWriter32 fWriter;
SkRefCntSet* fTFSet;
// Only used if we do not have an fFactorySet
SkTHashMap<SkString, uint32_t> fFlattenableDict;
#ifdef SK_SUPPORT_LEGACY_SERIAL_BUFFER_OBJECTS
sk_sp<SkPixelSerializer> fPS;
#endif
};
#endif // SkWriteBuffer_DEFINED