| 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 | 
|  | 
|  |