Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 | 1 |
| 2 /* | 2 /* |
| 3 * Copyright 2011 Google Inc. | 3 * Copyright 2011 Google Inc. |
| 4 * | 4 * |
| 5 * Use of this source code is governed by a BSD-style license that can be | 5 * Use of this source code is governed by a BSD-style license that can be |
| 6 * found in the LICENSE file. | 6 * found in the LICENSE file. |
| 7 */ | 7 */ |
| 8 #ifndef SkPictureRecord_DEFINED | 8 #ifndef SkPictureRecord_DEFINED |
| 9 #define SkPictureRecord_DEFINED | 9 #define SkPictureRecord_DEFINED |
| 10 | 10 |
| 11 #include "SkCanvas.h" | 11 #include "SkCanvas.h" |
| 12 #include "SkFlattenable.h" | 12 #include "SkFlattenable.h" |
| 13 #include "SkPathHeap.h" | 13 #include "SkPathHeap.h" |
| 14 #include "SkPicture.h" | 14 #include "SkPicture.h" |
| 15 #include "SkPictureFlat.h" | 15 #include "SkPictureFlat.h" |
| 16 #include "SkTemplates.h" | 16 #include "SkTemplates.h" |
| 17 #include "SkWriter32.h" | 17 #include "SkWriter32.h" |
| 18 | 18 |
| 19 #ifndef SK_RECORD_BOUNDS_IN_PICTURE | |
| 20 #define SK_RECORD_BOUNDS_IN_PICTURE 0 | |
| 21 #endif | |
| 22 | |
| 19 class SkPictureStateTree; | 23 class SkPictureStateTree; |
| 20 class SkBBoxHierarchy; | 24 class SkBBoxHierarchy; |
| 21 | 25 |
| 22 // These macros help with packing and unpacking a single byte value and | 26 // These macros help with packing and unpacking a single byte value and |
| 23 // a 3 byte value into/out of a uint32_t | 27 // a 3 byte value into/out of a uint32_t |
| 24 #define MASK_24 0x00FFFFFF | 28 #define MASK_24 0x00FFFFFF |
| 25 #define UNPACK_8_24(combined, small, large) \ | 29 #define UNPACK_8_24(combined, small, large) \ |
| 26 small = (combined >> 24) & 0xFF; \ | 30 small = (combined >> 24) & 0xFF; \ |
| 27 large = combined & MASK_24; | 31 large = combined & MASK_24; |
| 28 #define PACK_8_24(small, large) ((small << 24) | large) | 32 #define PACK_8_24(small, large) ((small << 24) | large) |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 77 const SkPaint&) SK_OVERRIDE; | 81 const SkPaint&) SK_OVERRIDE; |
| 78 virtual void drawPicture(SkPicture& picture) SK_OVERRIDE; | 82 virtual void drawPicture(SkPicture& picture) SK_OVERRIDE; |
| 79 virtual void drawVertices(VertexMode, int vertexCount, | 83 virtual void drawVertices(VertexMode, int vertexCount, |
| 80 const SkPoint vertices[], const SkPoint texs[], | 84 const SkPoint vertices[], const SkPoint texs[], |
| 81 const SkColor colors[], SkXfermode*, | 85 const SkColor colors[], SkXfermode*, |
| 82 const uint16_t indices[], int indexCount, | 86 const uint16_t indices[], int indexCount, |
| 83 const SkPaint&) SK_OVERRIDE; | 87 const SkPaint&) SK_OVERRIDE; |
| 84 virtual void drawData(const void*, size_t) SK_OVERRIDE; | 88 virtual void drawData(const void*, size_t) SK_OVERRIDE; |
| 85 virtual bool isDrawingToLayer() const SK_OVERRIDE; | 89 virtual bool isDrawingToLayer() const SK_OVERRIDE; |
| 86 | 90 |
| 91 #if !(SK_RECORD_BOUNDS_IN_PICTURE) | |
| 87 void addFontMetricsTopBottom(const SkPaint& paint, const SkFlatData&, | 92 void addFontMetricsTopBottom(const SkPaint& paint, const SkFlatData&, |
| 88 SkScalar minY, SkScalar maxY); | 93 SkScalar minY, SkScalar maxY); |
| 94 #endif | |
| 89 | 95 |
| 90 const SkTDArray<SkPicture* >& getPictureRefs() const { | 96 const SkTDArray<SkPicture* >& getPictureRefs() const { |
| 91 return fPictureRefs; | 97 return fPictureRefs; |
| 92 } | 98 } |
| 93 | 99 |
| 94 void setFlags(uint32_t recordFlags) { | 100 void setFlags(uint32_t recordFlags) { |
| 95 fRecordFlags = recordFlags; | 101 fRecordFlags = recordFlags; |
| 96 } | 102 } |
| 97 | 103 |
| 98 const SkWriter32& writeStream() const { | 104 const SkWriter32& writeStream() const { |
| 99 return fWriter; | 105 return fWriter; |
| 100 } | 106 } |
| 101 | 107 |
| 102 void beginRecording(); | 108 void beginRecording(); |
| 103 void endRecording(); | 109 void endRecording(); |
| 104 | 110 |
| 111 static bool canRecordBounds(DrawType op); | |
| 105 private: | 112 private: |
| 106 bool updateClipConservativelyUsingBounds(const SkRect&, SkRegion::Op, | 113 bool updateClipConservativelyUsingBounds(const SkRect&, SkRegion::Op, |
| 107 bool doAA, bool inverseFilled); | 114 bool doAA, bool inverseFilled); |
| 108 void handleOptimization(int opt); | 115 void handleOptimization(int opt); |
| 109 void recordRestoreOffsetPlaceholder(SkRegion::Op); | 116 void recordRestoreOffsetPlaceholder(SkRegion::Op); |
| 110 void fillRestoreOffsetPlaceholdersForCurrentStackLevel( | 117 void fillRestoreOffsetPlaceholdersForCurrentStackLevel( |
| 111 uint32_t restoreOffset); | 118 uint32_t restoreOffset); |
| 112 | 119 |
| 113 SkTDArray<int32_t> fRestoreOffsetStack; | 120 SkTDArray<int32_t> fRestoreOffsetStack; |
| 114 int fFirstSavedLayerIndex; | 121 int fFirstSavedLayerIndex; |
| 115 enum { | 122 enum { |
| 116 kNoSavedLayerIndex = -1 | 123 kNoSavedLayerIndex = -1, |
| 117 }; | 124 }; |
| 125 static const uint32_t kInvalidOffset = ~0; | |
| 118 | 126 |
| 119 /* | 127 /* |
| 120 * Write the 'drawType' operation and chunk size to the skp. 'size' | 128 * Write the 'drawType' operation, chunk size and optionally the draw |
| 121 * can potentially be increased if the chunk size needs its own storage | 129 * bounds to the skp. 'size' can potentially be increased if the chunk |
| 122 * location (i.e., it overflows 24 bits). | 130 * size needs its own storage location (i.e., it overflows 24 bits). |
| 131 * Bounds are recorded in device space, if canRecordBounds(drawType) | |
| 132 * returns true; | |
|
Tom Hudson
2013/05/14 17:00:49
Nit: trailing semicolon - did you mean to do more
| |
| 123 * Returns the start offset of the chunk. This is the location at which | 133 * Returns the start offset of the chunk. This is the location at which |
| 124 * the opcode & size are stored. | 134 * the opcode & size are stored. |
| 125 * TODO: since we are handing the size into here we could call reserve | 135 * TODO: since we are handing the size into here we could call reserve |
| 126 * and then return a pointer to the memory storage. This could decrease | 136 * and then return a pointer to the memory storage. This could decrease |
| 127 * allocation overhead but could lead to more wasted space (the tail | 137 * allocation overhead but could lead to more wasted space (the tail |
| 128 * end of blocks could go unused). Possibly add a second addDraw that | 138 * end of blocks could go unused). Possibly add a second addDraw that |
| 129 * operates in this manner. | 139 * operates in this manner. |
| 130 */ | 140 */ |
| 131 uint32_t addDraw(DrawType drawType, uint32_t* size) { | 141 uint32_t addDraw(DrawType drawType, uint32_t* size, const SkPaint* paint = N ULL, |
| 132 uint32_t offset = fWriter.size(); | 142 const SkRect* localBounds = NULL); |
| 133 | |
| 134 this->predrawNotify(); | |
| 135 | |
| 136 #ifdef SK_DEBUG_TRACE | |
| 137 SkDebugf("add %s\n", DrawTypeToString(drawType)); | |
| 138 #endif | |
| 139 | |
| 140 SkASSERT(0 != *size); | |
| 141 SkASSERT(((uint8_t) drawType) == drawType); | |
| 142 | |
| 143 if (0 != (*size & ~MASK_24) || *size == MASK_24) { | |
| 144 fWriter.writeInt(PACK_8_24(drawType, MASK_24)); | |
| 145 *size += 1; | |
| 146 fWriter.writeInt(*size); | |
| 147 } else { | |
| 148 fWriter.writeInt(PACK_8_24(drawType, *size)); | |
| 149 } | |
| 150 | |
| 151 return offset; | |
| 152 } | |
| 153 | 143 |
| 154 void addInt(int value) { | 144 void addInt(int value) { |
| 155 fWriter.writeInt(value); | 145 fWriter.writeInt(value); |
| 156 } | 146 } |
| 157 void addScalar(SkScalar scalar) { | 147 void addScalar(SkScalar scalar) { |
| 158 fWriter.writeScalar(scalar); | 148 fWriter.writeScalar(scalar); |
| 159 } | 149 } |
| 160 | 150 |
| 161 void addBitmap(const SkBitmap& bitmap); | 151 void addBitmap(const SkBitmap& bitmap); |
| 162 void addMatrix(const SkMatrix& matrix); | 152 void addMatrix(const SkMatrix& matrix); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 215 | 205 |
| 216 protected: | 206 protected: |
| 217 | 207 |
| 218 // These are set to NULL in our constructor, but may be changed by | 208 // These are set to NULL in our constructor, but may be changed by |
| 219 // subclasses, in which case they will be SkSafeUnref'd in our destructor. | 209 // subclasses, in which case they will be SkSafeUnref'd in our destructor. |
| 220 SkBBoxHierarchy* fBoundingHierarchy; | 210 SkBBoxHierarchy* fBoundingHierarchy; |
| 221 SkPictureStateTree* fStateTree; | 211 SkPictureStateTree* fStateTree; |
| 222 | 212 |
| 223 // Allocated in the constructor and managed by this class. | 213 // Allocated in the constructor and managed by this class. |
| 224 SkBitmapHeap* fBitmapHeap; | 214 SkBitmapHeap* fBitmapHeap; |
| 225 | 215 #if SK_RECORD_BOUNDS_IN_PICTURE |
| 216 SkIRect fLastDrawBounds; | |
| 217 #endif | |
| 226 private: | 218 private: |
| 227 SkChunkFlatController fFlattenableHeap; | 219 SkChunkFlatController fFlattenableHeap; |
| 228 | 220 |
| 229 SkMatrixDictionary fMatrices; | 221 SkMatrixDictionary fMatrices; |
| 230 SkPaintDictionary fPaints; | 222 SkPaintDictionary fPaints; |
| 231 SkRegionDictionary fRegions; | 223 SkRegionDictionary fRegions; |
| 232 | 224 |
| 233 SkPathHeap* fPathHeap; // reference counted | 225 SkPathHeap* fPathHeap; // reference counted |
| 234 SkWriter32 fWriter; | 226 SkWriter32 fWriter; |
| 235 | 227 |
| 236 // we ref each item in these arrays | 228 // we ref each item in these arrays |
| 237 SkTDArray<SkPicture*> fPictureRefs; | 229 SkTDArray<SkPicture*> fPictureRefs; |
| 238 | 230 |
| 239 uint32_t fRecordFlags; | 231 uint32_t fRecordFlags; |
| 240 int fInitialSaveCount; | 232 int fInitialSaveCount; |
| 241 | 233 |
| 242 friend class SkPicturePlayback; | 234 friend class SkPicturePlayback; |
| 243 friend class SkPictureTester; // for unit testing | 235 friend class SkPictureTester; // for unit testing |
| 244 | 236 |
| 245 typedef SkCanvas INHERITED; | 237 typedef SkCanvas INHERITED; |
| 246 }; | 238 }; |
| 247 | 239 |
| 248 #endif | 240 #endif |
| OLD | NEW |