Index: src/core/SkOffsetTable.h |
=================================================================== |
--- src/core/SkOffsetTable.h (revision 14172) |
+++ src/core/SkOffsetTable.h (working copy) |
@@ -1,115 +0,0 @@ |
-/* |
- * 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 |