diff options
author | Romain Guy <romainguy@google.com> | 2010-09-26 19:04:05 -0700 |
---|---|---|
committer | Romain Guy <romainguy@google.com> | 2010-09-26 19:04:05 -0700 |
commit | 4a2d03230b226721bd250ab722f0bec5fdb26021 (patch) | |
tree | 99462cffde1630ec0dca597f73258749483e383e /include | |
parent | ad711393f2afcb3cb8abcf8879dccfa91db8eec2 (diff) | |
download | external_skia-4a2d03230b226721bd250ab722f0bec5fdb26021.zip external_skia-4a2d03230b226721bd250ab722f0bec5fdb26021.tar.gz external_skia-4a2d03230b226721bd250ab722f0bec5fdb26021.tar.bz2 |
Expose SkPictureFlat
Change-Id: Ib6c873b7e7e42a3680a3d9110dae1fc369dfa393
Diffstat (limited to 'include')
-rw-r--r-- | include/core/SkPictureFlat.h | 209 |
1 files changed, 209 insertions, 0 deletions
diff --git a/include/core/SkPictureFlat.h b/include/core/SkPictureFlat.h new file mode 100644 index 0000000..2c0af5a --- /dev/null +++ b/include/core/SkPictureFlat.h @@ -0,0 +1,209 @@ +#ifndef SkPictureFlat_DEFINED +#define SkPictureFlat_DEFINED + +#include "SkChunkAlloc.h" +#include "SkBitmap.h" +#include "SkPicture.h" +#include "SkMatrix.h" +#include "SkPaint.h" +#include "SkPath.h" +#include "SkRegion.h" + +enum DrawType { + UNUSED, + CLIP_PATH, + CLIP_REGION, + CLIP_RECT, + CONCAT, + DRAW_BITMAP, + DRAW_BITMAP_MATRIX, + DRAW_BITMAP_RECT, + DRAW_DATA, + DRAW_PAINT, + DRAW_PATH, + DRAW_PICTURE, + DRAW_POINTS, + DRAW_POS_TEXT, + DRAW_POS_TEXT_H, + DRAW_POS_TEXT_H_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT_H + DRAW_RECT, + DRAW_SHAPE, + DRAW_SPRITE, + DRAW_TEXT, + DRAW_TEXT_ON_PATH, + DRAW_TEXT_TOP_BOTTOM, // fast variant of DRAW_TEXT + DRAW_VERTICES, + RESTORE, + ROTATE, + SAVE, + SAVE_LAYER, + SCALE, + SET_MATRIX, + SKEW, + TRANSLATE +}; + +enum DrawVertexFlags { + DRAW_VERTICES_HAS_TEXS = 0x01, + DRAW_VERTICES_HAS_COLORS = 0x02, + DRAW_VERTICES_HAS_INDICES = 0x04 +}; + +class SkRefCntPlayback { +public: + SkRefCntPlayback(); + virtual ~SkRefCntPlayback(); + + int count() const { return fCount; } + + void reset(const SkRefCntRecorder*); + + void setCount(int count); + SkRefCnt* set(int index, SkRefCnt*); + + virtual void setupBuffer(SkFlattenableReadBuffer& buffer) const { + buffer.setRefCntArray(fArray, fCount); + } + +protected: + int fCount; + SkRefCnt** fArray; +}; + +class SkTypefacePlayback : public SkRefCntPlayback { +public: + virtual void setupBuffer(SkFlattenableReadBuffer& buffer) const { + buffer.setTypefaceArray((SkTypeface**)fArray, fCount); + } +}; + +class SkFactoryPlayback { +public: + SkFactoryPlayback(int count) : fCount(count) { + fArray = SkNEW_ARRAY(SkFlattenable::Factory, count); + } + + ~SkFactoryPlayback() { + SkDELETE_ARRAY(fArray); + } + + SkFlattenable::Factory* base() const { return fArray; } + + void setupBuffer(SkFlattenableReadBuffer& buffer) const { + buffer.setFactoryPlayback(fArray, fCount); + } + +private: + int fCount; + SkFlattenable::Factory* fArray; +}; + +class SkFlatData { +public: + static int Compare(const SkFlatData* a, const SkFlatData* b) { + return memcmp(&a->fAllocSize, &b->fAllocSize, a->fAllocSize); + } + + int index() const { return fIndex; } + +#ifdef SK_DEBUG_SIZE + size_t size() const { return sizeof(fIndex) + fAllocSize; } +#endif + +protected: + static SkFlatData* Alloc(SkChunkAlloc* heap, int32_t size, int index); + + int fIndex; + int32_t fAllocSize; +}; + +class SkFlatBitmap : public SkFlatData { +public: + static SkFlatBitmap* Flatten(SkChunkAlloc*, const SkBitmap&, int index, + SkRefCntRecorder*); + + void unflatten(SkBitmap* bitmap, SkRefCntPlayback* rcp) const { + SkFlattenableReadBuffer buffer(fBitmapData); + if (rcp) { + rcp->setupBuffer(buffer); + } + bitmap->unflatten(buffer); + } + +#ifdef SK_DEBUG_VALIDATE + void validate() const { + // to be written + } +#endif + +private: + char fBitmapData[1]; + typedef SkFlatData INHERITED; +}; + +class SkFlatMatrix : public SkFlatData { +public: + static SkFlatMatrix* Flatten(SkChunkAlloc* heap, const SkMatrix& matrix, int index); + + void unflatten(SkMatrix* result) const { + memcpy(result, fMatrixData, sizeof(SkMatrix)); + } + +#ifdef SK_DEBUG_DUMP + void dump() const; +#endif + +#ifdef SK_DEBUG_VALIDATE + void validate() const { + // to be written + } +#endif + +private: + char fMatrixData[1]; + typedef SkFlatData INHERITED; +}; + +class SkFlatPaint : public SkFlatData { +public: + static SkFlatPaint* Flatten(SkChunkAlloc* heap, const SkPaint& paint, + int index, SkRefCntRecorder*, + SkRefCntRecorder* faceRecorder); + + void unflatten(SkPaint* result, SkRefCntPlayback* rcp, + SkTypefacePlayback* facePlayback) const { + Read(fPaintData, result, rcp, facePlayback); + } + + static void Read(const void* storage, SkPaint* paint, SkRefCntPlayback*, + SkTypefacePlayback* facePlayback); + +#ifdef SK_DEBUG_DUMP + void dump() const; +#endif + +private: + char fPaintData[1]; + typedef SkFlatData INHERITED; +}; + +class SkFlatRegion : public SkFlatData { +public: + static SkFlatRegion* Flatten(SkChunkAlloc* heap, const SkRegion& region, int index); + + void unflatten(SkRegion* result) const { + result->unflatten(fRegionData); + } + +#ifdef SK_DEBUG_VALIDATE + void validate() const { + // to be written + } +#endif + +private: + char fRegionData[1]; + typedef SkFlatData INHERITED; +}; + +#endif |