Index: src/core/SkOffsetTable.h |
=================================================================== |
--- src/core/SkOffsetTable.h (revision 0) |
+++ src/core/SkOffsetTable.h (revision 0) |
@@ -0,0 +1,115 @@ |
+/* |
+ * Copyright 2014 Google Inc. |
+ * |
+ * Use of this source code is governed by a BSD-style license that can be |
+ * found in the LICENSE file. |
+ */ |
+ |
+#ifndef SkOffsetTable_DEFINED |
+#define SkOffsetTable_DEFINED |
+ |
+#include "SkRefCnt.h" |
+#include "SkTDArray.h" |
+ |
+// A 2D table of skp offsets. Each row is indexed by an int. This is used |
+// to store the command offsets that reference a particular bitmap using |
+// the bitmap's index in the bitmap heap as the 'id' here. It has to be |
+// ref-countable so SkPicturePlayback can take ownership of it. |
+// Note that this class assumes that the ids are densely packed. |
+ |
+// TODO: This needs to be sped up. We could replace the offset table with |
+// a hash table. |
+class SkOffsetTable : public SkRefCnt { |
+public: |
+ SkOffsetTable() {} |
+ ~SkOffsetTable() { |
+ fOffsetArrays.deleteAll(); |
+ } |
+ |
+ // Record that this 'id' is used by the command starting at this 'offset'. |
+ // Offsets for a given 'id' should always be added in increasing order. |
+ void add(int id, size_t offset) { |
+ if (id >= fOffsetArrays.count()) { |
+ int oldCount = fOffsetArrays.count(); |
+ fOffsetArrays.setCount(id+1); |
+ for (int i = oldCount; i <= id; ++i) { |
+ fOffsetArrays[i] = NULL; |
+ } |
+ } |
+ |
+ if (NULL == fOffsetArrays[id]) { |
+ fOffsetArrays[id] = SkNEW(OffsetArray); |
+ } |
+ fOffsetArrays[id]->add(offset); |
+ } |
+ |
+ int numIDs() const { |
+ return fOffsetArrays.count(); |
+ } |
+ |
+ // Do the offsets of any commands referencing this ID fall in the |
+ // range [min, max] (both inclusive) |
+ bool overlap(int id, size_t min, size_t max) { |
+ SkASSERT(id < fOffsetArrays.count()); |
+ |
+ if (NULL == fOffsetArrays[id]) { |
+ return false; |
+ } |
+ |
+ // If this id has an offset array it should have at least one use |
+ SkASSERT(fOffsetArrays[id]->count() > 0); |
+ if (max < fOffsetArrays[id]->min() || min > fOffsetArrays[id]->max()) { |
+ return false; |
+ } |
+ |
+ return true; |
+ } |
+ |
+ bool includes(int id, size_t offset) { |
+ SkASSERT(id < fOffsetArrays.count()); |
+ |
+ OffsetArray* array = fOffsetArrays[id]; |
+ |
+ for (int i = 0; i < array->fOffsets.count(); ++i) { |
+ if (array->fOffsets[i] == offset) { |
+ return true; |
+ } else if (array->fOffsets[i] > offset) { |
+ return false; |
+ } |
+ } |
+ |
+ // Calls to 'includes' should be gaurded by an overlap() call, so we |
+ // should always find something. |
+ SkASSERT(0); |
+ return false; |
+ } |
+ |
+protected: |
+ class OffsetArray { |
+ public: |
+ void add(size_t offset) { |
+ SkASSERT(fOffsets.count() == 0 || offset > this->max()); |
+ *fOffsets.append() = offset; |
+ } |
+ size_t min() const { |
+ SkASSERT(fOffsets.count() > 0); |
+ return fOffsets[0]; |
+ } |
+ size_t max() const { |
+ SkASSERT(fOffsets.count() > 0); |
+ return fOffsets[fOffsets.count()-1]; |
+ } |
+ int count() const { |
+ return fOffsets.count(); |
+ } |
+ |
+ SkTDArray<size_t> fOffsets; |
+ }; |
+ |
+ SkTDArray<OffsetArray*> fOffsetArrays; |
+ |
+private: |
+ typedef SkRefCnt INHERITED; |
+}; |
+ |
+#endif |
Property changes on: src\core\SkOffsetTable.h |
___________________________________________________________________ |
Added: svn:eol-style |
+ LF |