123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346 |
- /*
- * 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 SkRecords_DEFINED
- #define SkRecords_DEFINED
- #include "include/core/SkCanvas.h"
- #include "include/core/SkData.h"
- #include "include/core/SkDrawable.h"
- #include "include/core/SkImage.h"
- #include "include/core/SkImageFilter.h"
- #include "include/core/SkMatrix.h"
- #include "include/core/SkPath.h"
- #include "include/core/SkPicture.h"
- #include "include/core/SkRRect.h"
- #include "include/core/SkRSXform.h"
- #include "include/core/SkRect.h"
- #include "include/core/SkRegion.h"
- #include "include/core/SkString.h"
- #include "include/core/SkTextBlob.h"
- #include "include/core/SkVertices.h"
- #include "src/core/SkDrawShadowInfo.h"
- namespace SkRecords {
- // A list of all the types of canvas calls we can record.
- // Each of these is reified into a struct below.
- //
- // (We're using the macro-of-macro trick here to do several different things with the same list.)
- //
- // We leave this SK_RECORD_TYPES macro defined for use by code that wants to operate on SkRecords
- // types polymorphically. (See SkRecord::Record::{visit,mutate} for an example.)
- //
- // Order doesn't technically matter here, but the compiler can generally generate better code if
- // you keep them semantically grouped, especially the Draws. It's also nice to leave NoOp at 0.
- #define SK_RECORD_TYPES(M) \
- M(NoOp) \
- M(Flush) \
- M(Restore) \
- M(Save) \
- M(SaveLayer) \
- M(SaveBehind) \
- M(SetMatrix) \
- M(Translate) \
- M(Concat) \
- M(ClipPath) \
- M(ClipRRect) \
- M(ClipRect) \
- M(ClipRegion) \
- M(DrawArc) \
- M(DrawDrawable) \
- M(DrawImage) \
- M(DrawImageLattice) \
- M(DrawImageRect) \
- M(DrawImageNine) \
- M(DrawDRRect) \
- M(DrawOval) \
- M(DrawBehind) \
- M(DrawPaint) \
- M(DrawPath) \
- M(DrawPatch) \
- M(DrawPicture) \
- M(DrawPoints) \
- M(DrawRRect) \
- M(DrawRect) \
- M(DrawRegion) \
- M(DrawTextBlob) \
- M(DrawAtlas) \
- M(DrawVertices) \
- M(DrawShadowRec) \
- M(DrawAnnotation) \
- M(DrawEdgeAAQuad) \
- M(DrawEdgeAAImageSet)
- // Defines SkRecords::Type, an enum of all record types.
- #define ENUM(T) T##_Type,
- enum Type { SK_RECORD_TYPES(ENUM) };
- #undef ENUM
- #define ACT_AS_PTR(ptr) \
- operator T*() const { return ptr; } \
- T* operator->() const { return ptr; }
- // An Optional doesn't own the pointer's memory, but may need to destroy non-POD data.
- template <typename T>
- class Optional {
- public:
- Optional() : fPtr(nullptr) {}
- Optional(T* ptr) : fPtr(ptr) {}
- Optional(Optional&& o) : fPtr(o.fPtr) {
- o.fPtr = nullptr;
- }
- ~Optional() { if (fPtr) fPtr->~T(); }
- ACT_AS_PTR(fPtr)
- private:
- T* fPtr;
- Optional(const Optional&) = delete;
- Optional& operator=(const Optional&) = delete;
- };
- // Like Optional, but ptr must not be NULL.
- template <typename T>
- class Adopted {
- public:
- Adopted(T* ptr) : fPtr(ptr) { SkASSERT(fPtr); }
- Adopted(Adopted* source) {
- // Transfer ownership from source to this.
- fPtr = source->fPtr;
- source->fPtr = NULL;
- }
- ~Adopted() { if (fPtr) fPtr->~T(); }
- ACT_AS_PTR(fPtr)
- private:
- T* fPtr;
- Adopted(const Adopted&) = delete;
- Adopted& operator=(const Adopted&) = delete;
- };
- // PODArray doesn't own the pointer's memory, and we assume the data is POD.
- template <typename T>
- class PODArray {
- public:
- PODArray() {}
- PODArray(T* ptr) : fPtr(ptr) {}
- // Default copy and assign.
- ACT_AS_PTR(fPtr)
- private:
- T* fPtr;
- };
- #undef ACT_AS_PTR
- // SkPath::getBounds() isn't thread safe unless we precache the bounds in a singlethreaded context.
- // SkPath::cheapComputeDirection() is similar.
- // Recording is a convenient time to cache these, or we can delay it to between record and playback.
- struct PreCachedPath : public SkPath {
- PreCachedPath() {}
- PreCachedPath(const SkPath& path);
- };
- // Like SkPath::getBounds(), SkMatrix::getType() isn't thread safe unless we precache it.
- // This may not cover all SkMatrices used by the picture (e.g. some could be hiding in a shader).
- struct TypedMatrix : public SkMatrix {
- TypedMatrix() {}
- TypedMatrix(const SkMatrix& matrix);
- };
- enum Tags {
- kDraw_Tag = 1, // May draw something (usually named DrawFoo).
- kHasImage_Tag = 2, // Contains an SkImage or SkBitmap.
- kHasText_Tag = 4, // Contains text.
- kHasPaint_Tag = 8, // May have an SkPaint field, at least optionally.
- kDrawWithPaint_Tag = kDraw_Tag | kHasPaint_Tag,
- };
- // A macro to make it a little easier to define a struct that can be stored in SkRecord.
- #define RECORD(T, tags, ...) \
- struct T { \
- static const Type kType = T##_Type; \
- static const int kTags = tags; \
- __VA_ARGS__; \
- };
- RECORD(NoOp, 0);
- RECORD(Flush, 0);
- RECORD(Restore, 0,
- TypedMatrix matrix);
- RECORD(Save, 0);
- RECORD(SaveLayer, kHasPaint_Tag,
- Optional<SkRect> bounds;
- Optional<SkPaint> paint;
- sk_sp<const SkImageFilter> backdrop;
- sk_sp<const SkImage> clipMask;
- Optional<SkMatrix> clipMatrix;
- SkCanvas::SaveLayerFlags saveLayerFlags);
- RECORD(SaveBehind, 0,
- Optional<SkRect> subset);
- RECORD(SetMatrix, 0,
- TypedMatrix matrix);
- RECORD(Concat, 0,
- TypedMatrix matrix);
- RECORD(Translate, 0,
- SkScalar dx;
- SkScalar dy);
- struct ClipOpAndAA {
- ClipOpAndAA() {}
- ClipOpAndAA(SkClipOp op, bool aa) : fOp(static_cast<unsigned>(op)), fAA(aa) {}
- SkClipOp op() const { return static_cast<SkClipOp>(fOp); }
- bool aa() const { return fAA != 0; }
- private:
- unsigned fOp : 31; // This really only needs to be 3, but there's no win today to do so.
- unsigned fAA : 1; // MSVC won't pack an enum with an bool, so we call this an unsigned.
- };
- static_assert(sizeof(ClipOpAndAA) == 4, "ClipOpAndAASize");
- RECORD(ClipPath, 0,
- PreCachedPath path;
- ClipOpAndAA opAA);
- RECORD(ClipRRect, 0,
- SkRRect rrect;
- ClipOpAndAA opAA);
- RECORD(ClipRect, 0,
- SkRect rect;
- ClipOpAndAA opAA);
- RECORD(ClipRegion, 0,
- SkRegion region;
- SkClipOp op);
- // While not strictly required, if you have an SkPaint, it's fastest to put it first.
- RECORD(DrawArc, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint;
- SkRect oval;
- SkScalar startAngle;
- SkScalar sweepAngle;
- unsigned useCenter);
- RECORD(DrawDRRect, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint;
- SkRRect outer;
- SkRRect inner);
- RECORD(DrawDrawable, kDraw_Tag,
- Optional<SkMatrix> matrix;
- SkRect worstCaseBounds;
- int32_t index);
- RECORD(DrawImage, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
- Optional<SkPaint> paint;
- sk_sp<const SkImage> image;
- SkScalar left;
- SkScalar top);
- RECORD(DrawImageLattice, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
- Optional<SkPaint> paint;
- sk_sp<const SkImage> image;
- int xCount;
- PODArray<int> xDivs;
- int yCount;
- PODArray<int> yDivs;
- int flagCount;
- PODArray<SkCanvas::Lattice::RectType> flags;
- PODArray<SkColor> colors;
- SkIRect src;
- SkRect dst);
- RECORD(DrawImageRect, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
- Optional<SkPaint> paint;
- sk_sp<const SkImage> image;
- Optional<SkRect> src;
- SkRect dst;
- SkCanvas::SrcRectConstraint constraint);
- RECORD(DrawImageNine, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
- Optional<SkPaint> paint;
- sk_sp<const SkImage> image;
- SkIRect center;
- SkRect dst);
- RECORD(DrawOval, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint;
- SkRect oval);
- RECORD(DrawPaint, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint);
- RECORD(DrawBehind, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint);
- RECORD(DrawPath, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint;
- PreCachedPath path);
- RECORD(DrawPicture, kDraw_Tag|kHasPaint_Tag,
- Optional<SkPaint> paint;
- sk_sp<const SkPicture> picture;
- TypedMatrix matrix);
- RECORD(DrawPoints, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint;
- SkCanvas::PointMode mode;
- unsigned count;
- SkPoint* pts);
- RECORD(DrawRRect, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint;
- SkRRect rrect);
- RECORD(DrawRect, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint;
- SkRect rect);
- RECORD(DrawRegion, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint;
- SkRegion region);
- RECORD(DrawTextBlob, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
- SkPaint paint;
- sk_sp<const SkTextBlob> blob;
- SkScalar x;
- SkScalar y);
- RECORD(DrawPatch, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint;
- PODArray<SkPoint> cubics;
- PODArray<SkColor> colors;
- PODArray<SkPoint> texCoords;
- SkBlendMode bmode);
- RECORD(DrawAtlas, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
- Optional<SkPaint> paint;
- sk_sp<const SkImage> atlas;
- PODArray<SkRSXform> xforms;
- PODArray<SkRect> texs;
- PODArray<SkColor> colors;
- int count;
- SkBlendMode mode;
- Optional<SkRect> cull);
- RECORD(DrawVertices, kDraw_Tag|kHasPaint_Tag,
- SkPaint paint;
- sk_sp<SkVertices> vertices;
- PODArray<SkVertices::Bone> bones;
- int boneCount;
- SkBlendMode bmode);
- RECORD(DrawShadowRec, kDraw_Tag,
- PreCachedPath path;
- SkDrawShadowRec rec);
- RECORD(DrawAnnotation, 0, // TODO: kDraw_Tag, skia:5548
- SkRect rect;
- SkString key;
- sk_sp<SkData> value);
- RECORD(DrawEdgeAAQuad, kDraw_Tag,
- SkRect rect;
- PODArray<SkPoint> clip;
- SkCanvas::QuadAAFlags aa;
- SkColor color;
- SkBlendMode mode);
- RECORD(DrawEdgeAAImageSet, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
- Optional<SkPaint> paint;
- SkAutoTArray<SkCanvas::ImageSetEntry> set;
- int count;
- PODArray<SkPoint> dstClips;
- PODArray<SkMatrix> preViewMatrices;
- SkCanvas::SrcRectConstraint constraint);
- #undef RECORD
- } // namespace SkRecords
- #endif//SkRecords_DEFINED
|