reed@android.com | 8a1c16f | 2008-12-17 15:59:43 +0000 | [diff] [blame^] | 1 | #ifndef SkPictureFlat_DEFINED |
| 2 | #define SkPictureFlat_DEFINED |
| 3 | |
| 4 | #include "SkChunkAlloc.h" |
| 5 | #include "SkBitmap.h" |
| 6 | #include "SkPicture.h" |
| 7 | #include "SkMatrix.h" |
| 8 | #include "SkPaint.h" |
| 9 | #include "SkPath.h" |
| 10 | #include "SkRegion.h" |
| 11 | |
| 12 | enum DrawType { |
| 13 | UNUSED, |
| 14 | CLIP_PATH, |
| 15 | CLIP_REGION, |
| 16 | CLIP_RECT, |
| 17 | CONCAT, |
| 18 | DRAW_BITMAP, |
| 19 | DRAW_BITMAP_MATRIX, |
| 20 | DRAW_BITMAP_RECT, |
| 21 | DRAW_PAINT, |
| 22 | DRAW_PATH, |
| 23 | DRAW_PICTURE, |
| 24 | DRAW_POINTS, |
| 25 | DRAW_POS_TEXT, |
| 26 | DRAW_POS_TEXT_H, |
| 27 | DRAW_POS_TEXT_H_TOP_BOTTOM, // fast variant of DRAW_POS_TEXT_H |
| 28 | DRAW_RECT, |
| 29 | DRAW_SPRITE, |
| 30 | DRAW_TEXT, |
| 31 | DRAW_TEXT_ON_PATH, |
| 32 | DRAW_TEXT_TOP_BOTTOM, // fast variant of DRAW_TEXT |
| 33 | DRAW_VERTICES, |
| 34 | RESTORE, |
| 35 | ROTATE, |
| 36 | SAVE, |
| 37 | SAVE_LAYER, |
| 38 | SCALE, |
| 39 | SKEW, |
| 40 | TRANSLATE |
| 41 | }; |
| 42 | |
| 43 | enum DrawVertexFlags { |
| 44 | DRAW_VERTICES_HAS_TEXS = 0x01, |
| 45 | DRAW_VERTICES_HAS_COLORS = 0x02, |
| 46 | DRAW_VERTICES_HAS_INDICES = 0x04 |
| 47 | }; |
| 48 | |
| 49 | class SkRefCntPlayback { |
| 50 | public: |
| 51 | SkRefCntPlayback(); |
| 52 | ~SkRefCntPlayback(); |
| 53 | |
| 54 | int count() const { return fCount; } |
| 55 | |
| 56 | void reset(const SkRefCntRecorder*); |
| 57 | |
| 58 | void setCount(int count); |
| 59 | SkRefCnt* set(int index, SkRefCnt*); |
| 60 | |
| 61 | virtual void setupBuffer(SkFlattenableReadBuffer& buffer) const { |
| 62 | buffer.setRefCntArray(fArray, fCount); |
| 63 | } |
| 64 | |
| 65 | protected: |
| 66 | int fCount; |
| 67 | SkRefCnt** fArray; |
| 68 | }; |
| 69 | |
| 70 | class SkTypefacePlayback : public SkRefCntPlayback { |
| 71 | public: |
| 72 | virtual void setupBuffer(SkFlattenableReadBuffer& buffer) const { |
| 73 | buffer.setTypefaceArray((SkTypeface**)fArray, fCount); |
| 74 | } |
| 75 | }; |
| 76 | |
| 77 | class SkFactoryPlayback { |
| 78 | public: |
| 79 | SkFactoryPlayback(int count) : fCount(count) { |
| 80 | fArray = SkNEW_ARRAY(SkFlattenable::Factory, count); |
| 81 | } |
| 82 | |
| 83 | ~SkFactoryPlayback() { |
| 84 | SkDELETE_ARRAY(fArray); |
| 85 | } |
| 86 | |
| 87 | SkFlattenable::Factory* base() const { return fArray; } |
| 88 | |
| 89 | void setupBuffer(SkFlattenableReadBuffer& buffer) const { |
| 90 | buffer.setFactoryPlayback(fArray, fCount); |
| 91 | } |
| 92 | |
| 93 | private: |
| 94 | int fCount; |
| 95 | SkFlattenable::Factory* fArray; |
| 96 | }; |
| 97 | |
| 98 | class SkFlatData { |
| 99 | public: |
| 100 | static int Compare(const SkFlatData* a, const SkFlatData* b) { |
| 101 | return memcmp(&a->fAllocSize, &b->fAllocSize, a->fAllocSize); |
| 102 | } |
| 103 | |
| 104 | int index() const { return fIndex; } |
| 105 | |
| 106 | #ifdef SK_DEBUG_SIZE |
| 107 | size_t size() const { return sizeof(fIndex) + fAllocSize; } |
| 108 | #endif |
| 109 | |
| 110 | protected: |
| 111 | static SkFlatData* Alloc(SkChunkAlloc* heap, int32_t size, int index); |
| 112 | |
| 113 | int fIndex; |
| 114 | int32_t fAllocSize; |
| 115 | }; |
| 116 | |
| 117 | class SkFlatBitmap : public SkFlatData { |
| 118 | public: |
| 119 | static SkFlatBitmap* Flatten(SkChunkAlloc*, const SkBitmap&, int index, |
| 120 | SkRefCntRecorder*); |
| 121 | |
| 122 | void unflatten(SkBitmap* bitmap, SkRefCntPlayback* rcp) const { |
| 123 | SkFlattenableReadBuffer buffer(fBitmapData); |
| 124 | if (rcp) { |
| 125 | rcp->setupBuffer(buffer); |
| 126 | } |
| 127 | bitmap->unflatten(buffer); |
| 128 | } |
| 129 | |
| 130 | #ifdef SK_DEBUG_VALIDATE |
| 131 | void validate() const { |
| 132 | // to be written |
| 133 | } |
| 134 | #endif |
| 135 | |
| 136 | private: |
| 137 | char fBitmapData[1]; |
| 138 | typedef SkFlatData INHERITED; |
| 139 | }; |
| 140 | |
| 141 | class SkFlatMatrix : public SkFlatData { |
| 142 | public: |
| 143 | static SkFlatMatrix* Flatten(SkChunkAlloc* heap, const SkMatrix& matrix, int index); |
| 144 | |
| 145 | void unflatten(SkMatrix* result) const { |
| 146 | memcpy(result, fMatrixData, sizeof(SkMatrix)); |
| 147 | } |
| 148 | |
| 149 | #ifdef SK_DEBUG_DUMP |
| 150 | void dump() const; |
| 151 | #endif |
| 152 | |
| 153 | #ifdef SK_DEBUG_VALIDATE |
| 154 | void validate() const { |
| 155 | // to be written |
| 156 | } |
| 157 | #endif |
| 158 | |
| 159 | private: |
| 160 | char fMatrixData[1]; |
| 161 | typedef SkFlatData INHERITED; |
| 162 | }; |
| 163 | |
| 164 | class SkFlatPaint : public SkFlatData { |
| 165 | public: |
| 166 | static SkFlatPaint* Flatten(SkChunkAlloc* heap, const SkPaint& paint, |
| 167 | int index, SkRefCntRecorder*, |
| 168 | SkRefCntRecorder* faceRecorder); |
| 169 | |
| 170 | void unflatten(SkPaint* result, SkRefCntPlayback* rcp, |
| 171 | SkTypefacePlayback* facePlayback) const { |
| 172 | Read(fPaintData, result, rcp, facePlayback); |
| 173 | } |
| 174 | |
| 175 | static void Read(const void* storage, SkPaint* paint, SkRefCntPlayback*, |
| 176 | SkTypefacePlayback* facePlayback); |
| 177 | |
| 178 | #ifdef SK_DEBUG_DUMP |
| 179 | void dump() const; |
| 180 | #endif |
| 181 | |
| 182 | private: |
| 183 | char fPaintData[1]; |
| 184 | typedef SkFlatData INHERITED; |
| 185 | }; |
| 186 | |
| 187 | class SkFlatRegion : public SkFlatData { |
| 188 | public: |
| 189 | static SkFlatRegion* Flatten(SkChunkAlloc* heap, const SkRegion& region, int index); |
| 190 | |
| 191 | void unflatten(SkRegion* result) const { |
| 192 | result->unflatten(fRegionData); |
| 193 | } |
| 194 | |
| 195 | #ifdef SK_DEBUG_VALIDATE |
| 196 | void validate() const { |
| 197 | // to be written |
| 198 | } |
| 199 | #endif |
| 200 | |
| 201 | private: |
| 202 | char fRegionData[1]; |
| 203 | typedef SkFlatData INHERITED; |
| 204 | }; |
| 205 | |
| 206 | #endif |