SkRecords.h revision 449d9b7e2d1b2e20963f18639c6e541ef953f069
1c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org/*
2c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org * Copyright 2014 Google Inc.
3c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org *
4c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org * Use of this source code is governed by a BSD-style license that can be
5c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org * found in the LICENSE file.
6c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org */
7c4b21e6c03a6cdb03e116b9f510eb10cf8daedb1commit-bot@chromium.org
8e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#ifndef SkRecords_DEFINED
9e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#define SkRecords_DEFINED
10e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
11e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#include "SkCanvas.h"
123cb3840c9af6f70896cf5565a38d4ee03c02d767reed#include "SkDrawable.h"
13a8db72864a43ad1fbba3c2892cf5cd88060a43efreed#include "SkMatrix.h"
14d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkPath.h"
152347b624678fedf1d2f7ab1d79b9ad70087c3392reed#include "SkPicture.h"
16d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkRect.h"
17d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkRRect.h"
1871c3c760a83123ee0b3127b8c65c6394ce541c50reed#include "SkRSXform.h"
1900d5c2c6523321d25b32905ff4822f083a4173eefmalita#include "SkTextBlob.h"
202347b624678fedf1d2f7ab1d79b9ad70087c3392reed
2100d5c2c6523321d25b32905ff4822f083a4173eefmalitanamespace SkRecords {
2200d5c2c6523321d25b32905ff4822f083a4173eefmalita
23e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// A list of all the types of canvas calls we can record.
24e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Each of these is reified into a struct below.
25e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org//
26e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// (We're using the macro-of-macro trick here to do several different things with the same list.)
27e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org//
28e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// We leave this SK_RECORD_TYPES macro defined for use by code that wants to operate on SkRecords
29e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// types polymorphically.  (See SkRecord::Record::{visit,mutate} for an example.)
3037f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org//
3137f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// Order doesn't technically matter here, but the compiler can generally generate better code if
3237f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// you keep them semantically grouped, especially the Draws.  It's also nice to leave NoOp at 0.
3388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org#define SK_RECORD_TYPES(M)                                          \
3488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(NoOp)                                                         \
3588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(Restore)                                                      \
3688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(Save)                                                         \
3788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(SaveLayer)                                                    \
3888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(SetMatrix)                                                    \
3988c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipPath)                                                     \
4088c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRRect)                                                    \
4188c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRect)                                                     \
4288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRegion)                                                   \
4388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawBitmap)                                                   \
4488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawBitmapNine)                                               \
45a5517e2b190a8083b38964972b031c13e99f1012reed    M(DrawBitmapRect)                                               \
46a5517e2b190a8083b38964972b031c13e99f1012reed    M(DrawBitmapRectFast)                                           \
47a5517e2b190a8083b38964972b031c13e99f1012reed    M(DrawBitmapRectFixedSize)                                      \
486be2aa9a251bf6022570a03140f956655b3ef1dareed    M(DrawDrawable)                                                 \
4965151754b9fdb6a968d7307764c20655d1b680a0piotaixr    M(DrawImage)                                                    \
5065151754b9fdb6a968d7307764c20655d1b680a0piotaixr    M(DrawImageRect)                                                \
514c21dc5ddf3b482293ed34eead876d8d61a662c3reed    M(DrawImageNine)                                                \
5288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawDRRect)                                                   \
5388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawOval)                                                     \
5488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPaint)                                                    \
5588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPath)                                                     \
56963137b75c0a1fe91f35e9826742f36309f5e65ddandov    M(DrawPatch)                                                    \
572347b624678fedf1d2f7ab1d79b9ad70087c3392reed    M(DrawPicture)                                                  \
5888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPoints)                                                   \
5988c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPosText)                                                  \
6088c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPosTextH)                                                 \
61c551d9fcae98ff7b9d56f315947e89a26632aeecmtklein    M(DrawText)                                                     \
62c551d9fcae98ff7b9d56f315947e89a26632aeecmtklein    M(DrawTextOnPath)                                               \
6388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawRRect)                                                    \
6488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawRect)                                                     \
6588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawSprite)                                                   \
6629dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    M(DrawTextBlob)                                                 \
6771c3c760a83123ee0b3127b8c65c6394ce541c50reed    M(DrawAtlas)                                                    \
68f4078ad1ec42f549369ac4f639aab18d00afae95mtklein    M(DrawVertices)
69e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
70e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Defines SkRecords::Type, an enum of all record types.
71e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#define ENUM(T) T##_Type,
72e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgenum Type { SK_RECORD_TYPES(ENUM) };
73e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#undef ENUM
74e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
759b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein#define ACT_AS_PTR(ptr)                 \
769b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    operator T*() const { return ptr; } \
779b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    T* operator->() const { return ptr; }
7888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
7953fecfb15d254397ab03032b888daa9d15c487b6mtkleintemplate <typename T>
8053fecfb15d254397ab03032b888daa9d15c487b6mtkleinclass RefBox : SkNoncopyable {
8153fecfb15d254397ab03032b888daa9d15c487b6mtkleinpublic:
829db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    RefBox() {}
839b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    RefBox(T* obj) : fObj(SkSafeRef(obj)) {}
84449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    RefBox(RefBox&& o) : fObj(o.fObj) {
85449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        o.fObj = nullptr;
86449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    }
879b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    ~RefBox() { SkSafeUnref(fObj); }
8853fecfb15d254397ab03032b888daa9d15c487b6mtklein
8953fecfb15d254397ab03032b888daa9d15c487b6mtklein    ACT_AS_PTR(fObj);
9053fecfb15d254397ab03032b888daa9d15c487b6mtklein
9153fecfb15d254397ab03032b888daa9d15c487b6mtkleinprivate:
9253fecfb15d254397ab03032b888daa9d15c487b6mtklein    T* fObj;
9353fecfb15d254397ab03032b888daa9d15c487b6mtklein};
9453fecfb15d254397ab03032b888daa9d15c487b6mtklein
95653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org// An Optional doesn't own the pointer's memory, but may need to destroy non-POD data.
96653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgtemplate <typename T>
97653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgclass Optional : SkNoncopyable {
98653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgpublic:
999db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    Optional() : fPtr(nullptr) {}
100653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    Optional(T* ptr) : fPtr(ptr) {}
101449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    Optional(Optional&& o) : fPtr(o.fPtr) {
102449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        o.fPtr = nullptr;
103449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    }
104653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    ~Optional() { if (fPtr) fPtr->~T(); }
105653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
10688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
10788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgprivate:
10888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    T* fPtr;
10988c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org};
11088c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
11188c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org// Like Optional, but ptr must not be NULL.
11288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgtemplate <typename T>
11388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgclass Adopted : SkNoncopyable {
11488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgpublic:
11588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    Adopted(T* ptr) : fPtr(ptr) { SkASSERT(fPtr); }
116f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    Adopted(Adopted* source) {
117f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        // Transfer ownership from source to this.
118f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        fPtr = source->fPtr;
119f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        source->fPtr = NULL;
120f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    }
121f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    ~Adopted() { if (fPtr) fPtr->~T(); }
12288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
12388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
124653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgprivate:
125653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    T* fPtr;
126653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org};
127653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
128653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org// PODArray doesn't own the pointer's memory, and we assume the data is POD.
129653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgtemplate <typename T>
130f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.orgclass PODArray {
131653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgpublic:
1329db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    PODArray() {}
133653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    PODArray(T* ptr) : fPtr(ptr) {}
134f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    // Default copy and assign.
135653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
13688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
137653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgprivate:
138653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    T* fPtr;
139653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org};
140653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
14116307bd65011667ecdcb755465ce632eef204749commit-bot@chromium.org#undef ACT_AS_PTR
14216307bd65011667ecdcb755465ce632eef204749commit-bot@chromium.org
143e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Like SkBitmap, but deep copies pixels if they're not immutable.
144e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Using this, we guarantee the immutability of all bitmaps we record.
145f55c314bfa6db980941f8d0ab485beb2e08589abmtkleinclass ImmutableBitmap : SkNoncopyable {
146f55c314bfa6db980941f8d0ab485beb2e08589abmtkleinpublic:
1479db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    ImmutableBitmap() {}
148449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    ImmutableBitmap(const SkBitmap& bitmap);
149449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    ImmutableBitmap(ImmutableBitmap&& o) {
150449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        fBitmap.swap(o.fBitmap);
151449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    }
152f55c314bfa6db980941f8d0ab485beb2e08589abmtklein
153f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    int width()  const { return fBitmap.width();  }
154f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    int height() const { return fBitmap.height(); }
155f55c314bfa6db980941f8d0ab485beb2e08589abmtklein
156f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    // While the pixels are immutable, SkBitmap itself is not thread-safe, so return a copy.
157f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    SkBitmap shallowCopy() const { return fBitmap; }
158f55c314bfa6db980941f8d0ab485beb2e08589abmtkleinprivate:
159f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    SkBitmap fBitmap;
160af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein};
161e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
162af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// SkPath::getBounds() isn't thread safe unless we precache the bounds in a singlethreaded context.
16314ed0fd498639d1742e9b25ca4105193fa93b139mtklein// SkPath::cheapComputeDirection() is similar.
16414ed0fd498639d1742e9b25ca4105193fa93b139mtklein// Recording is a convenient time to cache these, or we can delay it to between record and playback.
16514ed0fd498639d1742e9b25ca4105193fa93b139mtkleinstruct PreCachedPath : public SkPath {
1669db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    PreCachedPath() {}
167449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    PreCachedPath(const SkPath& path);
168af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein};
169e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
170af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// Like SkPath::getBounds(), SkMatrix::getType() isn't thread safe unless we precache it.
171af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// This may not cover all SkMatrices used by the picture (e.g. some could be hiding in a shader).
172af57903f330a0afd0c10244d4a66f64fdbef5d1emtkleinstruct TypedMatrix : public SkMatrix {
1739db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    TypedMatrix() {}
174449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    TypedMatrix(const SkMatrix& matrix);
175e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org};
176e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
177449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinenum Tags {
178449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kDraw_Tag      = 1,   // May draw something (usually named DrawFoo).
179449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kHasImage_Tag  = 2,   // Contains an SkImage or SkBitmap.
180449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kHasText_Tag   = 4,   // Contains text.
181449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein};
182e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
183449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein// A macro to make it a little easier to define a struct that can be stored in SkRecord.
184449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein#define RECORD(T, tags, ...)            \
185449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinstruct T {                              \
186449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    static const Type kType = T##_Type; \
187449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    static const int kTags = tags;      \
188449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    __VA_ARGS__;                        \
189449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein};
190449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein
191449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(NoOp, 0);
192449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(Restore, 0,
193449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
194449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
195449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(Save, 0);
196e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
197449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(SaveLayer, 0,
198449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein       Optional<SkRect> bounds;
199449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein       Optional<SkPaint> paint;
200449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein       SkCanvas::SaveFlags flags);
201449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein
202449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(SetMatrix, 0,
203449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
204e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
205cdeeb095a629b0db9f0ddff09516f2b78255c047mtkleinstruct RegionOpAndAA {
2069db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    RegionOpAndAA() {}
207cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    RegionOpAndAA(SkRegion::Op op, bool aa) : op(op), aa(aa) {}
208cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    SkRegion::Op op : 31;  // This really only needs to be 3, but there's no win today to do so.
209cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    unsigned     aa :  1;  // MSVC won't pack an enum with an bool, so we call this an unsigned.
210cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein};
21199fe82260633fcf5d92cca38d12ef0937ecca61cbungemanstatic_assert(sizeof(RegionOpAndAA) == 4, "RegionOpAndAASize");
212cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein
213449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipPath, 0,
214449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
215449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path;
216449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
217449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRRect, 0,
218449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
219449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect rrect;
220449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
221449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRect, 0,
222449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
223449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect rect;
224449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
225449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRegion, 0,
226449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
227449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRegion region;
228449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRegion::Op op);
229e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
23037f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// While not strictly required, if you have an SkPaint, it's fastest to put it first.
231449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmap, kDraw_Tag|kHasImage_Tag,
232449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
233449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
234449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar left;
235449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar top);
236449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapNine, kDraw_Tag|kHasImage_Tag,
237449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
238449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
239449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect center;
240449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
241449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapRect, kDraw_Tag|kHasImage_Tag,
242449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
243449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
244449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> src;
245449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
246449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapRectFast, kDraw_Tag|kHasImage_Tag,
247449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
248449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
249449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> src;
250449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
251449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapRectFixedSize, kDraw_Tag|kHasImage_Tag,
252449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
253449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
254449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect src;
255449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst;
256449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::SrcRectConstraint constraint);
257449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawDRRect, kDraw_Tag,
258449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
259449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect outer;
260449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect inner);
261449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawDrawable, kDraw_Tag,
262449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkMatrix> matrix;
263449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect worstCaseBounds;
264449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int32_t index);
265449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawImage, kDraw_Tag|kHasImage_Tag,
266449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
267449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> image;
268449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar left;
269449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar top);
270449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawImageRect, kDraw_Tag|kHasImage_Tag,
271449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
272449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> image;
273449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> src;
274449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst;
275449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::SrcRectConstraint constraint);
276449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawImageNine, kDraw_Tag|kHasImage_Tag,
277449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
278449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> image;
279449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect center;
280449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
281449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawOval, kDraw_Tag,
282449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
283449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect oval);
284449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPaint, kDraw_Tag,
285449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint);
286449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPath, kDraw_Tag,
287449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
288449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path);
289449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPicture, kDraw_Tag,
290449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
291449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkPicture> picture;
292449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
293449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPoints, kDraw_Tag,
294449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
295449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::PointMode mode;
296449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        unsigned count;
297449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPoint* pts);
298449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPosText, kDraw_Tag|kHasText_Tag,
299449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
300449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
301449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
302449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> pos);
303449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPosTextH, kDraw_Tag|kHasText_Tag,
304449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
305449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
306449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        unsigned byteLength;
307449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y;
308449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkScalar> xpos);
309449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawRRect, kDraw_Tag,
310449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
311449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect rrect);
312449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawRect, kDraw_Tag,
313449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
314449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect rect);
315449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawSprite, kDraw_Tag|kHasImage_Tag,
316449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
317449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
318449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int left;
319449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int top);
320449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawText, kDraw_Tag|kHasText_Tag,
321449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
322449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
323449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
324449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar x;
325449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y);
326449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawTextBlob, kDraw_Tag|kHasText_Tag,
327449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
328449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkTextBlob> blob;
329449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar x;
330449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y);
331449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawTextOnPath, kDraw_Tag|kHasText_Tag,
332449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
333449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
334449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
335449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path;
336449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
337449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPatch, kDraw_Tag,
338449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
339449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> cubics;
340449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
341449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> texCoords;
342449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<SkXfermode> xmode);
343449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawAtlas, kDraw_Tag|kHasImage_Tag,
344449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
345449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> atlas;
346449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkRSXform> xforms;
347449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkRect> texs;
348449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
349449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int count;
350449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkXfermode::Mode mode;
351449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> cull);
352449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawVertices, kDraw_Tag,
353449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
354449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::VertexMode vmode;
355449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int vertexCount;
356449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> vertices;
357449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> texs;
358449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
359449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<SkXfermode> xmode;
360449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<uint16_t> indices;
361449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int indexCount);
362449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein
363449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein#undef RECORD
364e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
365e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}  // namespace SkRecords
366e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
367e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#endif//SkRecords_DEFINED
368