Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(278)

Side by Side Diff: src/core/SkPictureRecord.h

Issue 187833003: First version of bitmap use tracking in SkPictureRecord (Closed) Base URL: http://skia.googlecode.com/svn/trunk/
Patch Set: Created 6 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 /* 1 /*
2 * Copyright 2011 Google Inc. 2 * Copyright 2011 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
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 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE 13 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE
14 #include "SkMatrixClipStateMgr.h" 14 #include "SkMatrixClipStateMgr.h"
15 #endif 15 #endif
16 #include "SkPathHeap.h" 16 #include "SkPathHeap.h"
17 #include "SkPicture.h" 17 #include "SkPicture.h"
18 #include "SkPictureFlat.h" 18 #include "SkPictureFlat.h"
19 #include "SkTemplates.h" 19 #include "SkTemplates.h"
20 #include "SkWriter32.h" 20 #include "SkWriter32.h"
21 21
22 class SkPictureStateTree; 22 class SkPictureStateTree;
23 class SkBBoxHierarchy; 23 class SkBBoxHierarchy;
24 24
25 // A 2D table of skp offsets. Each row is indexed by an int. This is used
26 // to store the command offsets that reference a particular bitmap using
27 // the bitmap's index in the bitmap heap as the 'id' here. It has to be
28 // ref-countable so SkPicturePlayback can take ownership of it.
29 class SkOffsetTable : public SkRefCnt {
mtklein 2014/03/06 16:20:38 Give this class its own .h/.cpp pair?
robertphillips 2014/03/06 20:18:26 Will do. I will leave that as a final refactoring
30 public:
31 SkOffsetTable() {}
32 ~SkOffsetTable() {
33 for (int i = 0; i < fOffsetArrays.count(); ++i) {
mtklein 2014/03/06 16:20:38 fOffsetArrays.deleteAll(); ?
robertphillips 2014/03/06 20:18:26 Done.
34 SkDELETE(fOffsetArrays[i]);
35 }
36 }
37
38 void add(int id, size_t offset) {
mtklein 2014/03/06 16:20:38 // Record that this ID is used by the command star
robertphillips 2014/03/06 20:18:26 Done.
39 if (id >= fOffsetArrays.count()) {
mtklein 2014/03/06 16:20:38 Can you note somewhere, maybe at the top of the cl
robertphillips 2014/03/06 20:18:26 Done.
40 int oldCount = fOffsetArrays.count();
41 fOffsetArrays.setCount(id+1);
42 for (int i = oldCount; i <= id; ++i) {
43 fOffsetArrays[i] = NULL;
44 }
45 }
mtklein 2014/03/06 16:20:38 Are we assuming |IDs| << |offsets|? If there are
robertphillips 2014/03/06 20:18:26 |IDs| is < |offsets| but it varies widely between
46
47 if (NULL == fOffsetArrays[id]) {
48 fOffsetArrays[id] = SkNEW(OffsetArray);
49 }
50 fOffsetArrays[id]->add(offset);
51 }
52
53 int numIDs() const {
54 return fOffsetArrays.count();
55 }
56
57 bool overlap(int id, size_t min, size_t max) {
mtklein 2014/03/06 16:20:38 // Do the offsets of any commands referencing this
robertphillips 2014/03/06 20:18:26 Done.
58 SkASSERT(id < fOffsetArrays.count());
59
60 if (NULL == fOffsetArrays[id]) {
61 return false;
62 }
63
64 SkASSERT(fOffsetArrays[id]->count() > 0);
mtklein 2014/03/06 16:20:38 ->front() and ->back() are about to check this any
robertphillips 2014/03/06 20:18:26 I've added a comment. The assert here was basicall
65 if (max < fOffsetArrays[id]->front() || min > fOffsetArrays[id]->back()) {
mtklein 2014/03/06 16:20:38 Might help readability here to rename front to low
robertphillips 2014/03/06 20:18:26 Done.
66 return false;
67 }
68
69 return true;
70 }
71
72 bool includes(int id, size_t offset) {
mtklein 2014/03/06 16:20:38 Note that this is linear in the number of commands
robertphillips 2014/03/06 20:18:26 Yep - right now I'm just trying to get it working.
73 SkASSERT(id < fOffsetArrays.count());
74
75 OffsetArray* array = fOffsetArrays[id];
76
77 for (int i = 0; i < array->fOffsets.count(); ++i) {
78 if (array->fOffsets[i] == offset) {
79 return true;
80 } else if (array->fOffsets[i] > offset) {
81 return false;
82 }
83 }
84
85 SkASSERT(0);
mtklein 2014/03/06 16:20:38 Why this assert? I guess we don't expect people t
robertphillips 2014/03/06 20:18:26 Given that this should always be guarded by a 'ove
mtklein 2014/03/07 13:04:08 Ah, can you add // We're guarded by an overlap() c
robertphillips 2014/03/07 13:23:00 Done.
86 return false;
87 }
88
89 protected:
90 class OffsetArray {
91 public:
92 void add(size_t offset) { *fOffsets.append() = offset; }
mtklein 2014/03/06 16:20:38 Seems like we'd want to add SkASSERT(fOffsets.co
robertphillips 2014/03/06 20:18:26 Done.
93 size_t front() const {
94 SkASSERT(fOffsets.count() > 0);
95 return fOffsets[0];
96 }
97 size_t back() const {
98 SkASSERT(fOffsets.count() > 0);
99 return fOffsets[fOffsets.count()-1];
100 }
101 int count() const {
102 return fOffsets.count();
103 }
104
105 SkTDArray<size_t> fOffsets;
106 };
107
108 SkTDArray<OffsetArray*> fOffsetArrays;
109
110 private:
111 typedef SkRefCnt INHERITED;
112 };
113
25 // These macros help with packing and unpacking a single byte value and 114 // These macros help with packing and unpacking a single byte value and
26 // a 3 byte value into/out of a uint32_t 115 // a 3 byte value into/out of a uint32_t
27 #define MASK_24 0x00FFFFFF 116 #define MASK_24 0x00FFFFFF
28 #define UNPACK_8_24(combined, small, large) \ 117 #define UNPACK_8_24(combined, small, large) \
29 small = (combined >> 24) & 0xFF; \ 118 small = (combined >> 24) & 0xFF; \
30 large = combined & MASK_24; 119 large = combined & MASK_24;
31 #define PACK_8_24(small, large) ((small << 24) | large) 120 #define PACK_8_24(small, large) ((small << 24) | large)
32 121
33 122
34 class SkPictureRecord : public SkCanvas { 123 class SkPictureRecord : public SkCanvas {
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after
157 return offset; 246 return offset;
158 } 247 }
159 248
160 void addInt(int value) { 249 void addInt(int value) {
161 fWriter.writeInt(value); 250 fWriter.writeInt(value);
162 } 251 }
163 void addScalar(SkScalar scalar) { 252 void addScalar(SkScalar scalar) {
164 fWriter.writeScalar(scalar); 253 fWriter.writeScalar(scalar);
165 } 254 }
166 255
167 void addBitmap(const SkBitmap& bitmap); 256 // The command at 'offset' in the skp uses the specified bitmap
257 void trackBitmapUse(int bitmapID, size_t offset);
258 int addBitmap(const SkBitmap& bitmap);
168 void addMatrix(const SkMatrix& matrix); 259 void addMatrix(const SkMatrix& matrix);
169 const SkFlatData* addPaint(const SkPaint& paint) { return this->addPaintPtr( &paint); } 260 const SkFlatData* addPaint(const SkPaint& paint) { return this->addPaintPtr( &paint); }
170 const SkFlatData* addPaintPtr(const SkPaint* paint); 261 const SkFlatData* addPaintPtr(const SkPaint* paint);
171 void addFlatPaint(const SkFlatData* flatPaint); 262 void addFlatPaint(const SkFlatData* flatPaint);
172 void addPath(const SkPath& path); 263 void addPath(const SkPath& path);
173 void addPicture(SkPicture& picture); 264 void addPicture(SkPicture& picture);
174 void addPoint(const SkPoint& point); 265 void addPoint(const SkPoint& point);
175 void addPoints(const SkPoint pts[], int count); 266 void addPoints(const SkPoint pts[], int count);
176 void addRect(const SkRect& rect); 267 void addRect(const SkRect& rect);
177 void addRectPtr(const SkRect* rect); 268 void addRectPtr(const SkRect* rect);
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after
287 SkPathHeap* fPathHeap; // reference counted 378 SkPathHeap* fPathHeap; // reference counted
288 SkWriter32 fWriter; 379 SkWriter32 fWriter;
289 380
290 // we ref each item in these arrays 381 // we ref each item in these arrays
291 SkTDArray<SkPicture*> fPictureRefs; 382 SkTDArray<SkPicture*> fPictureRefs;
292 383
293 uint32_t fRecordFlags; 384 uint32_t fRecordFlags;
294 bool fOptsEnabled; 385 bool fOptsEnabled;
295 int fInitialSaveCount; 386 int fInitialSaveCount;
296 387
388 SkOffsetTable* fBitmapUseOffsets;
mtklein 2014/03/06 16:20:38 SkAutoTUnref<SkOffsetTable> ?
robertphillips 2014/03/06 20:18:26 Done.
389
297 friend class SkPicturePlayback; 390 friend class SkPicturePlayback;
298 friend class SkPictureTester; // for unit testing 391 friend class SkPictureTester; // for unit testing
299 392
300 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE 393 #ifdef SK_COLLAPSE_MATRIX_CLIP_STATE
301 SkMatrixClipStateMgr fMCMgr; 394 SkMatrixClipStateMgr fMCMgr;
302 #endif 395 #endif
303 396
304 typedef SkCanvas INHERITED; 397 typedef SkCanvas INHERITED;
305 }; 398 };
306 399
307 #endif 400 #endif
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698