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();
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;
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";
305 fNextDrawPictureToLayerClipRect =
rect.roundOut();
306 if (fOffscreenLayers->find(fNextDrawPictureToLayerID) == fOffscreenLayers->end()) {
308 fNextDrawPictureToLayerClipRect.
top() == 0);
309 (*fOffscreenLayers)[fNextDrawPictureToLayerID].fDimensions =
310 fNextDrawPictureToLayerClipRect.
size();
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;
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) {
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)
bool equals(SkDrawable *a, SkDrawable *b)
#define SkScalarCeilToInt(x)
void SkStrSplit(const char *str, const char *delimiters, SkStrSplitMode splitMode, TArray< SkString > *out)
int find(T *array, int N, T item)
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
static float max(float r, float g, float b)
SK_API bool Read(SkStreamSeekable *src, SkDocumentPage *dstArray, int dstArrayCount, const SkDeserialProcs *=nullptr)
SK_API int ReadPageCount(SkStreamSeekable *src)
unsigned useCenter Optional< SkMatrix > matrix
PODArray< SkPoint > dstClips
sk_sp< const SkImage > image
ClipOpAndAA opAA SkRegion region
sk_sp< const SkPicture > picture
sk_sp< SkBlender > blender SkRect rect
PODArray< SkMatrix > preViewMatrices
PODArray< SkColor > colors
SkSamplingOptions sampling
skia_private::AutoTArray< sk_sp< SkImageFilter > > filters TypedMatrix matrix TypedMatrix matrix SkScalar dx
bool stoi(std::string_view s, SKSL_INT *value)
DEF_SWITCHES_START aot vmservice shared library Name of the *so containing AOT compiled Dart assets for launching the service isolate vm snapshot The VM snapshot data that will be memory mapped as read only SnapshotAssetPath must be present isolate snapshot The isolate snapshot data that will be memory mapped as read only SnapshotAssetPath must be present cache dir path
it will be possible to load the file into Perfetto s trace viewer disable asset Prevents usage of any non test fonts unless they were explicitly Loaded via prefetched default font Indicates whether the embedding started a prefetch of the default font manager before creating the engine run In non interactive mode
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)