32 virtual void draw(
SkCanvas* canvas,
const LayerMap&, LayerStateMap*)
const = 0;
34 virtual int layerID()
const {
return -1; }
49 void draw(
SkCanvas* canvas,
const LayerMap&, LayerStateMap*)
const override {
74 void draw(
SkCanvas* canvas,
const LayerMap&, LayerStateMap*)
const override;
79 const LayerMap& layerMap,
80 LayerStateMap* layerStateMap)
const {
81 const LayerCmds& layer = layerMap.at(
fLayerId);
82 LayerState* layerState = &(*layerStateMap)[
fLayerId];
83 if (!layerState->fSurface) {
84 layerState->fCurrCmd = 0;
85 layerState->fSurface = MSKPPlayer::MakeSurfaceForLayer(layer, canvas);
86 if (!layerState->fSurface) {
87 SkDebugf(
"Couldn't create surface for layer");
91 size_t cmd = layerState->fCurrCmd;
96 SkCanvas* layerCanvas = layerState->fSurface->getCanvas();
99 for (
size_t checkCmd =
fLayerCmdCnt - 1; checkCmd > cmd; --checkCmd) {
100 if (layer.fCmds[checkCmd]->isFullRedraw(layerCanvas)) {
106 if (cmd == 0 || layer.fCmds[cmd]->isFullRedraw(layerCanvas)) {
109 layer.fCmds[cmd]->draw(layerCanvas, layerMap, layerStateMap);
113 canvas->
drawImageRect(layerState->fSurface->makeImageSnapshot(),
126 : fDst(dst), fOffscreenLayers(offscreenLayers) {
211 if (fNextDrawImageFromLayerID != -1) {
212 this->recordPicCmd();
213 auto drawLayer = std::make_unique<DrawLayerCmd>();
214 drawLayer->fLayerId = fNextDrawImageFromLayerID;
215 drawLayer->fLayerCmdCnt = fOffscreenLayers->at(fNextDrawImageFromLayerID).fCmds.size();
216 drawLayer->fSrcRect = src;
217 drawLayer->fDstRect = dst;
218 drawLayer->fSampling = sampling;
219 drawLayer->fConstraint = constraint;
221 drawLayer->fPaint.init(*
paint);
223 fDst->fCmds.push_back(std::move(drawLayer));
224 fNextDrawImageFromLayerID = -1;
274#ifdef SK_BUILD_FOR_ANDROID_FRAMEWORK
295 static constexpr char kOffscreenLayerDraw[] =
"OffscreenLayerDraw";
296 static constexpr char kSurfaceID[] =
"SurfaceID";
299 if (tokens.size() == 2) {
300 if (tokens[0].
equals(kOffscreenLayerDraw)) {
304 fNextDrawPictureToLayerID = std::stoi(tokens[1].c_str());
305 fNextDrawPictureToLayerClipRect = rect.roundOut();
306 if (fOffscreenLayers->find(fNextDrawPictureToLayerID) == fOffscreenLayers->end()) {
308 fNextDrawPictureToLayerClipRect.
top() == 0);
309 (*fOffscreenLayers)[fNextDrawPictureToLayerID].fDimensions =
310 fNextDrawPictureToLayerClipRect.
size();
315 }
else if (tokens[0].
equals(kSurfaceID)) {
318 fNextDrawImageFromLayerID = std::stoi(tokens[1].c_str());
335 if (fNextDrawPictureToLayerID != -1) {
338 LayerCmds* layer = &fOffscreenLayers->at(fNextDrawPictureToLayerID);
339 CmdRecordCanvas sc(layer, fOffscreenLayers, &fNextDrawPictureToLayerClipRect);
341 fNextDrawPictureToLayerID = -1;
364 void recordPicCmd() {
365 auto cmd = std::make_unique<PicCmd>();
367 cmd->fClipRect = fClipRect;
369 fDst->fCmds.push_back(std::move(cmd));
376 LayerCmds* fDst =
nullptr;
378 int fNextDrawPictureToLayerID = -1;
380 int fNextDrawImageFromLayerID = -1;
381 LayerMap* fOffscreenLayers =
nullptr;
387 auto deserialContext = std::make_unique<SkSharingDeserialContext>();
396 std::vector<SkDocumentPage> pages(pageCount);
401 result->fRootLayers.reserve(pages.size());
402 for (
const auto& page : pages) {
405 result->fRootLayers.emplace_back();
406 result->fRootLayers.back().fDimensions = dims;
408 result->fMaxDimensions.fHeight = std::max(dims.
height(),
result->fMaxDimensions.height());
410 page.fPicture->playback(&sc);
421 return fRootLayers[i].fDimensions;
432 for (
const auto& ols : fOffscreenLayerStates) {
433 const LayerState&
state = ols.second;
434 if (
state.fSurface) {
443 const LayerCmds& layer = fRootLayers[i];
444 for (
const auto& cmd : layer.fCmds) {
445 cmd->draw(canvas, fOffscreenLayers, &fOffscreenLayerStates);
462 for (
auto& [
id,
state] : fOffscreenLayerStates) {
470 for (
auto& [
id, layer] : fOffscreenLayers) {
471 LayerState&
state = fOffscreenLayerStates[
id];
474 state.fSurface = MakeSurfaceForLayer(fOffscreenLayers[
id], canvas);
482 result.reserve(fOffscreenLayers.size());
483 for (
auto& [
id, _] : fOffscreenLayers) {
488 if (
frame <
static_cast<int>(fRootLayers.size())) {
489 this->collectReferencedLayers(fRootLayers[
frame], &
result);
495 auto iter = fOffscreenLayerStates.find(layerID);
496 if (iter == fOffscreenLayerStates.end() || !iter->second.fSurface) {
499 return iter->second.fSurface->makeImageSnapshot();
502void MSKPPlayer::collectReferencedLayers(
const LayerCmds& layer, std::vector<int>* out)
const {
503 for (
const auto& cmd : layer.fCmds) {
504 if (
int id = cmd->layerID();
id >= 0) {
506 if (std::find(out->begin(), out->end(),
id) == out->end()) {
508 auto iter = fOffscreenLayers.find(
id);
509 SkASSERT(iter != fOffscreenLayers.end());
510 this->collectReferencedLayers(iter->second, out);
constexpr SkColor SK_ColorTRANSPARENT
void SK_SPI SkDebugf(const char format[],...) SK_PRINTF_LIKE(1
static SkPath clip(const SkPath &path, const SkHalfPlane &plane)
static bool equals(T *a, T *b)
#define SkScalarCeilToInt(x)
void SkStrSplit(const char *str, const char *delimiters, SkStrSplitMode splitMode, TArray< SkString > *out)
void onDrawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint pts[], const SkPaint &paint) override
void onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4], SkBlendMode mode, const SkPaint &paint) override
void onDrawEdgeAAImageSet2(const ImageSetEntry imageSet[], int count, const SkPoint dstClips[], const SkMatrix preViewMatrices[], const SkSamplingOptions &sampling, const SkPaint *paint, SrcRectConstraint constraint) override
void onDrawBehind(const SkPaint &paint) override
void onDrawAtlas2(const SkImage *image, const SkRSXform rsxForms[], const SkRect src[], const SkColor colors[], int count, SkBlendMode mode, const SkSamplingOptions &sampling, const SkRect *cull, const SkPaint *paint) override
void onDrawOval(const SkRect &rect, const SkPaint &paint) override
void onDrawDrawable(SkDrawable *drawable, const SkMatrix *matrix) override
CmdRecordCanvas(LayerCmds *dst, LayerMap *offscreenLayers, const SkIRect *clipRect=nullptr)
void onDrawRegion(const SkRegion ®ion, const SkPaint &paint) override
void onDrawAnnotation(const SkRect &rect, const char key[], SkData *value) override
void onDrawShadowRec(const SkPath &path, const SkDrawShadowRec &rec) override
void onDrawPath(const SkPath &path, const SkPaint &paint) override
void onDrawImage2(const SkImage *image, SkScalar dx, SkScalar dy, const SkSamplingOptions &sampling, const SkPaint *paint) override
void onDrawTextBlob(const SkTextBlob *blob, SkScalar x, SkScalar y, const SkPaint &paint) override
void onDrawEdgeAAQuad(const SkRect &rect, const SkPoint clip[4], SkCanvas::QuadAAFlags aaFlags, const SkColor4f &color, SkBlendMode mode) override
void onDrawRRect(const SkRRect &rrect, const SkPaint &paint) override
void onDrawPaint(const SkPaint &paint) override
void onDrawArc(const SkRect &rect, SkScalar startAngle, SkScalar sweepAngle, bool useCenter, const SkPaint &paint) override
void onDrawRect(const SkRect &rect, const SkPaint &paint) override
void onDrawDRRect(const SkRRect &outer, const SkRRect &inner, const SkPaint &paint) override
void onDrawImageLattice2(const SkImage *image, const Lattice &lattice, const SkRect &dst, SkFilterMode mode, const SkPaint *paint) override
~CmdRecordCanvas() override
void onDrawPicture(const SkPicture *picture, const SkMatrix *matrix, const SkPaint *paint) override
void onDrawImageRect2(const SkImage *image, const SkRect &src, const SkRect &dst, const SkSamplingOptions &sampling, const SkPaint *paint, SrcRectConstraint constraint) override
std::vector< int > layerIDs(int frame=-1) const
sk_sp< SkImage > layerSnapshot(int layerID) const
static std::unique_ptr< MSKPPlayer > Make(SkStreamSeekable *stream)
bool playFrame(SkCanvas *canvas, int i)
SkISize frameDimensions(int i) const
void allocateLayers(SkCanvas *)
static void DrawBehind(SkCanvas *canvas, const SkPaint &paint)
int saveLayer(const SkRect *bounds, const SkPaint *paint)
bool getProps(SkSurfaceProps *props) const
void drawRect(const SkRect &rect, const SkPaint &paint)
void drawOval(const SkRect &oval, const SkPaint &paint)
void clipRect(const SkRect &rect, SkClipOp op, bool doAntiAlias)
void drawPoints(PointMode mode, size_t count, const SkPoint pts[], const SkPaint &paint)
void drawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4], SkBlendMode mode, const SkPaint &paint)
sk_sp< SkSurface > makeSurface(const SkImageInfo &info, const SkSurfaceProps *props=nullptr)
void clipIRect(const SkIRect &irect, SkClipOp op=SkClipOp::kIntersect)
virtual GrRecordingContext * recordingContext() const
void drawPaint(const SkPaint &paint)
void private_draw_shadow_rec(const SkPath &, const SkDrawShadowRec &)
void drawDrawable(SkDrawable *drawable, const SkMatrix *matrix=nullptr)
virtual SkISize getBaseLayerSize() const
void experimental_DrawEdgeAAQuad(const SkRect &rect, const SkPoint clip[4], QuadAAFlags aaFlags, const SkColor4f &color, SkBlendMode mode)
void experimental_DrawEdgeAAImageSet(const ImageSetEntry imageSet[], int cnt, const SkPoint dstClips[], const SkMatrix preViewMatrices[], const SkSamplingOptions &, const SkPaint *paint=nullptr, SrcRectConstraint constraint=kStrict_SrcRectConstraint)
void drawRRect(const SkRRect &rrect, const SkPaint &paint)
void drawArc(const SkRect &oval, SkScalar startAngle, SkScalar sweepAngle, bool useCenter, const SkPaint &paint)
void drawImageLattice(const SkImage *image, const Lattice &lattice, const SkRect &dst, SkFilterMode filter, const SkPaint *paint=nullptr)
void drawRegion(const SkRegion ®ion, const SkPaint &paint)
void drawImageRect(const SkImage *, const SkRect &src, const SkRect &dst, const SkSamplingOptions &, const SkPaint *, SrcRectConstraint)
void drawPath(const SkPath &path, const SkPaint &paint)
void drawAtlas(const SkImage *atlas, const SkRSXform xform[], const SkRect tex[], const SkColor colors[], int count, SkBlendMode mode, const SkSamplingOptions &sampling, const SkRect *cullRect, const SkPaint *paint)
void drawDRRect(const SkRRect &outer, const SkRRect &inner, const SkPaint &paint)
void concat(const SkMatrix &matrix)
void drawPicture(const SkPicture *picture)
SkImageInfo imageInfo() const
void drawTextBlob(const SkTextBlob *blob, SkScalar x, SkScalar y, const SkPaint &paint)
void drawImage(const SkImage *image, SkScalar left, SkScalar top)
SkCanvas * beginRecording(const SkRect &bounds, sk_sp< SkBBoxHierarchy > bbh)
SkCanvas * getRecordingCanvas()
sk_sp< SkPicture > finishRecordingAsPicture()
virtual void playback(SkCanvas *canvas, AbortCallback *callback=nullptr) const =0
SK_API bool Read(SkStreamSeekable *src, SkDocumentPage *dstArray, int dstArrayCount, const SkDeserialProcs *=nullptr)
SK_API int ReadPageCount(SkStreamSeekable *src)
virtual bool isFullRedraw(SkCanvas *) const =0
virtual int layerID() const
virtual void draw(SkCanvas *canvas, const LayerMap &, LayerStateMap *) const =0
bool isFullRedraw(SkCanvas *canvas) const override
SkCanvas::SrcRectConstraint fConstraint
SkTLazy< SkPaint > fPaint
SkSamplingOptions fSampling
void draw(SkCanvas *canvas, const LayerMap &, LayerStateMap *) const override
int layerID() const override
sk_sp< SkPicture > fContent
bool isFullRedraw(SkCanvas *canvas) const override
void draw(SkCanvas *canvas, const LayerMap &, LayerStateMap *) const override
SkDeserialImageProc fImageProc
constexpr int32_t top() const
constexpr SkISize size() const
static constexpr SkIRect MakeSize(const SkISize &size)
static constexpr SkIRect MakeEmpty()
constexpr int32_t left() const
bool contains(int32_t x, int32_t y) const
constexpr int32_t width() const
constexpr int32_t height() const
SkImageInfo makeDimensions(SkISize newSize) const
static SkRect Make(const SkISize &size)
static sk_sp< SkImage > deserializeImage(const void *data, size_t length, void *ctx)