/*
|
* Copyright 2015 Google Inc.
|
*
|
* Use of this source code is governed by a BSD-style license that can be
|
* found in the LICENSE file.
|
*/
|
|
#include "SkBBoxHierarchy.h"
|
#include "SkBigPicture.h"
|
#include "SkPictureCommon.h"
|
#include "SkRecord.h"
|
#include "SkRecordDraw.h"
|
#include "SkTraceEvent.h"
|
|
SkBigPicture::SkBigPicture(const SkRect& cull,
|
SkRecord* record,
|
SnapshotArray* drawablePicts,
|
SkBBoxHierarchy* bbh,
|
size_t approxBytesUsedBySubPictures)
|
: fCullRect(cull)
|
, fApproxBytesUsedBySubPictures(approxBytesUsedBySubPictures)
|
, fRecord(record) // Take ownership of caller's ref.
|
, fDrawablePicts(drawablePicts) // Take ownership.
|
, fBBH(bbh) // Take ownership of caller's ref.
|
{}
|
|
void SkBigPicture::playback(SkCanvas* canvas, AbortCallback* callback) const {
|
SkASSERT(canvas);
|
|
// If the query contains the whole picture, don't bother with the BBH.
|
const bool useBBH = !canvas->getLocalClipBounds().contains(this->cullRect());
|
|
SkRecordDraw(*fRecord,
|
canvas,
|
this->drawablePicts(),
|
nullptr,
|
this->drawableCount(),
|
useBBH ? fBBH.get() : nullptr,
|
callback);
|
}
|
|
void SkBigPicture::partialPlayback(SkCanvas* canvas,
|
int start,
|
int stop,
|
const SkMatrix& initialCTM) const {
|
SkASSERT(canvas);
|
SkRecordPartialDraw(*fRecord,
|
canvas,
|
this->drawablePicts(),
|
this->drawableCount(),
|
start,
|
stop,
|
initialCTM);
|
}
|
|
SkRect SkBigPicture::cullRect() const { return fCullRect; }
|
int SkBigPicture::approximateOpCount() const { return fRecord->count(); }
|
size_t SkBigPicture::approximateBytesUsed() const {
|
size_t bytes = sizeof(*this) + fRecord->bytesUsed() + fApproxBytesUsedBySubPictures;
|
if (fBBH) { bytes += fBBH->bytesUsed(); }
|
return bytes;
|
}
|
|
int SkBigPicture::drawableCount() const {
|
return fDrawablePicts ? fDrawablePicts->count() : 0;
|
}
|
|
SkPicture const* const* SkBigPicture::drawablePicts() const {
|
return fDrawablePicts ? fDrawablePicts->begin() : nullptr;
|
}
|