blob: 3ba43dc2f04db764ca9a3122fada0f8e14f87b18 [file] [log] [blame]
/*
* 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; // Owned by this object
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