| Index: src/gpu/GrRecordReplaceDraw.h | 
| diff --git a/src/gpu/GrRecordReplaceDraw.h b/src/gpu/GrRecordReplaceDraw.h | 
| new file mode 100644 | 
| index 0000000000000000000000000000000000000000..f59e44883e16231f9745980019d08a1c92f20ad5 | 
| --- /dev/null | 
| +++ b/src/gpu/GrRecordReplaceDraw.h | 
| @@ -0,0 +1,69 @@ | 
| +/* | 
| + * 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 GrRecordReplaceDraw_DEFINED | 
| +#define GrRecordReplaceDraw_DEFINED | 
| + | 
| +#include "SkDrawPictureCallback.h" | 
| +#include "SkRect.h" | 
| +#include "SkTDArray.h" | 
| + | 
| +class SkBBoxHierarchy; | 
| +class SkBitmap; | 
| +class SkCanvas; | 
| +class SkImage; | 
| +class SkPaint; | 
| +class SkRecord; | 
| + | 
| +// GrReplacements collects op ranges that can be replaced with | 
| +// a single drawBitmap call (using a precomputed bitmap). | 
| +class GrReplacements { | 
| +public: | 
| +    // All the operations between fStart and fStop (inclusive) will be replaced with | 
| +    // a single drawBitmap call using fPos, fBM and fPaint. | 
| +    struct ReplacementInfo { | 
| +        unsigned        fStart; | 
| +        unsigned        fStop; | 
| +        SkIPoint        fPos; | 
| +        SkImage*        fImage;  // Owns a ref | 
| +        const SkPaint*  fPaint;  // Note: this object doesn't own the paint | 
| + | 
| +        SkIRect         fSrcRect; | 
| +    }; | 
| + | 
| +    ~GrReplacements() { this->freeAll(); } | 
| + | 
| +    // Add a new replacement range. The replacement ranges should be | 
| +    // sorted in increasing order and non-overlapping (esp. no nested | 
| +    // saveLayers). | 
| +    ReplacementInfo* push(); | 
| + | 
| +    // look up a replacement range by its start offset. | 
| +    // lastLookedUp is an in/out parameter that is used to speed up the search. | 
| +    // It should be initialized to 0 on the first call and then passed back in | 
| +    // unmodified on subsequent calls. | 
| +    const ReplacementInfo* lookupByStart(size_t start, int* lastLookedUp) const; | 
| + | 
| +private: | 
| +    SkTDArray<ReplacementInfo> fReplacements; | 
| + | 
| +    void freeAll(); | 
| + | 
| +#ifdef SK_DEBUG | 
| +    void validate() const; | 
| +#endif | 
| +}; | 
| + | 
| +// Draw an SkRecord into an SkCanvas replacing saveLayer/restore blocks with | 
| +// drawBitmap calls.  A convenience wrapper around SkRecords::Draw. | 
| +void GrRecordReplaceDraw(const SkRecord&, | 
| +                         SkCanvas*, | 
| +                         const SkBBoxHierarchy*, | 
| +                         const GrReplacements*, | 
| +                         SkDrawPictureCallback*); | 
| + | 
| +#endif // GrRecordReplaceDraw_DEFINED | 
|  |