SkRecords.h revision 44df651ebefc284acc2f66425dff3ea0b0e14b36
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
11f70b531daaf47db1ee95c70da9843f1dd1f418d3reed#include "SkData.h"
12e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#include "SkCanvas.h"
133cb3840c9af6f70896cf5565a38d4ee03c02d767reed#include "SkDrawable.h"
14bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed#include "SkImageFilter.h"
15a8db72864a43ad1fbba3c2892cf5cd88060a43efreed#include "SkMatrix.h"
16d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkPath.h"
172347b624678fedf1d2f7ab1d79b9ad70087c3392reed#include "SkPicture.h"
18d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkRect.h"
19d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkRRect.h"
2071c3c760a83123ee0b3127b8c65c6394ce541c50reed#include "SkRSXform.h"
21f70b531daaf47db1ee95c70da9843f1dd1f418d3reed#include "SkString.h"
2200d5c2c6523321d25b32905ff4822f083a4173eefmalita#include "SkTextBlob.h"
232347b624678fedf1d2f7ab1d79b9ad70087c3392reed
244dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary// Windows.h, will pull in all of the GDI defines.  GDI #defines
254dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary// DrawText to DrawTextA or DrawTextW, but SkRecord has a struct
264dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary// called DrawText. Since this file does not use GDI, undefing
274dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary// DrawText makes things less confusing.
284dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary#ifdef DrawText
294dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary#undef DrawText
304dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary#endif
314dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary
3200d5c2c6523321d25b32905ff4822f083a4173eefmalitanamespace SkRecords {
3300d5c2c6523321d25b32905ff4822f083a4173eefmalita
34e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// A list of all the types of canvas calls we can record.
35e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Each of these is reified into a struct below.
36e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org//
37e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// (We're using the macro-of-macro trick here to do several different things with the same list.)
38e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org//
39e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// We leave this SK_RECORD_TYPES macro defined for use by code that wants to operate on SkRecords
40e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// types polymorphically.  (See SkRecord::Record::{visit,mutate} for an example.)
4137f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org//
4237f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// Order doesn't technically matter here, but the compiler can generally generate better code if
4337f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// you keep them semantically grouped, especially the Draws.  It's also nice to leave NoOp at 0.
4488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org#define SK_RECORD_TYPES(M)                                          \
4588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(NoOp)                                                         \
4688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(Restore)                                                      \
4788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(Save)                                                         \
4888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(SaveLayer)                                                    \
4988c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(SetMatrix)                                                    \
50cbdf007bc2eb85056a1a5c75c088202becba2d16mtklein    M(Translate)                                                    \
51e5de130788c8637d2f7df9ddb0241b78e04d5882vjiaoblack    M(TranslateZ)                                                   \
52e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtklein    M(Concat)                                                       \
5388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipPath)                                                     \
5488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRRect)                                                    \
5588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRect)                                                     \
5688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRegion)                                                   \
57ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon    M(DrawArc)                                                      \
586be2aa9a251bf6022570a03140f956655b3ef1dareed    M(DrawDrawable)                                                 \
5965151754b9fdb6a968d7307764c20655d1b680a0piotaixr    M(DrawImage)                                                    \
60c573a40ed5024b463e47088d307e3164a486dba5msarett    M(DrawImageLattice)                                             \
6165151754b9fdb6a968d7307764c20655d1b680a0piotaixr    M(DrawImageRect)                                                \
624c21dc5ddf3b482293ed34eead876d8d61a662c3reed    M(DrawImageNine)                                                \
6388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawDRRect)                                                   \
6488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawOval)                                                     \
6588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPaint)                                                    \
6688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPath)                                                     \
67963137b75c0a1fe91f35e9826742f36309f5e65ddandov    M(DrawPatch)                                                    \
682347b624678fedf1d2f7ab1d79b9ad70087c3392reed    M(DrawPicture)                                                  \
6995302da19d8b0a3bcd9d9be0e79f486760787f09vjiaoblack    M(DrawShadowedPicture)                                          \
7088c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPoints)                                                   \
7188c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPosText)                                                  \
7288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPosTextH)                                                 \
73c551d9fcae98ff7b9d56f315947e89a26632aeecmtklein    M(DrawText)                                                     \
74c551d9fcae98ff7b9d56f315947e89a26632aeecmtklein    M(DrawTextOnPath)                                               \
7545561a0b15fe045ba272c328684c3f7ae290785areed    M(DrawTextRSXform)                                              \
7688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawRRect)                                                    \
7788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawRect)                                                     \
7844df651ebefc284acc2f66425dff3ea0b0e14b36msarett    M(DrawRegion)                                                   \
7929dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    M(DrawTextBlob)                                                 \
8071c3c760a83123ee0b3127b8c65c6394ce541c50reed    M(DrawAtlas)                                                    \
81f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    M(DrawVertices)                                                 \
82f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    M(DrawAnnotation)
83e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
84e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Defines SkRecords::Type, an enum of all record types.
85e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#define ENUM(T) T##_Type,
86e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgenum Type { SK_RECORD_TYPES(ENUM) };
87e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#undef ENUM
88e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
899b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein#define ACT_AS_PTR(ptr)                 \
909b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    operator T*() const { return ptr; } \
919b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    T* operator->() const { return ptr; }
9288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
93653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org// An Optional doesn't own the pointer's memory, but may need to destroy non-POD data.
94653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgtemplate <typename T>
95653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgclass Optional : SkNoncopyable {
96653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgpublic:
979db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    Optional() : fPtr(nullptr) {}
98653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    Optional(T* ptr) : fPtr(ptr) {}
99449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    Optional(Optional&& o) : fPtr(o.fPtr) {
100449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        o.fPtr = nullptr;
101449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    }
102653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    ~Optional() { if (fPtr) fPtr->~T(); }
103653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
10488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
10588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgprivate:
10688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    T* fPtr;
10788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org};
10888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
10988c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org// Like Optional, but ptr must not be NULL.
11088c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgtemplate <typename T>
11188c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgclass Adopted : SkNoncopyable {
11288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgpublic:
11388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    Adopted(T* ptr) : fPtr(ptr) { SkASSERT(fPtr); }
114f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    Adopted(Adopted* source) {
115f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        // Transfer ownership from source to this.
116f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        fPtr = source->fPtr;
117f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        source->fPtr = NULL;
118f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    }
119f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    ~Adopted() { if (fPtr) fPtr->~T(); }
12088c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
12188c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
122653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgprivate:
123653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    T* fPtr;
124653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org};
125653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
126653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org// PODArray doesn't own the pointer's memory, and we assume the data is POD.
127653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgtemplate <typename T>
128f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.orgclass PODArray {
129653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgpublic:
1309db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    PODArray() {}
131653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    PODArray(T* ptr) : fPtr(ptr) {}
132f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    // Default copy and assign.
133653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
13488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
135653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgprivate:
136653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    T* fPtr;
137653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org};
138653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
13916307bd65011667ecdcb755465ce632eef204749commit-bot@chromium.org#undef ACT_AS_PTR
14016307bd65011667ecdcb755465ce632eef204749commit-bot@chromium.org
141af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// SkPath::getBounds() isn't thread safe unless we precache the bounds in a singlethreaded context.
14214ed0fd498639d1742e9b25ca4105193fa93b139mtklein// SkPath::cheapComputeDirection() is similar.
14314ed0fd498639d1742e9b25ca4105193fa93b139mtklein// Recording is a convenient time to cache these, or we can delay it to between record and playback.
14414ed0fd498639d1742e9b25ca4105193fa93b139mtkleinstruct PreCachedPath : public SkPath {
1459db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    PreCachedPath() {}
146449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    PreCachedPath(const SkPath& path);
147af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein};
148e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
149af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// Like SkPath::getBounds(), SkMatrix::getType() isn't thread safe unless we precache it.
150af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// This may not cover all SkMatrices used by the picture (e.g. some could be hiding in a shader).
151af57903f330a0afd0c10244d4a66f64fdbef5d1emtkleinstruct TypedMatrix : public SkMatrix {
1529db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    TypedMatrix() {}
153449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    TypedMatrix(const SkMatrix& matrix);
154e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org};
155e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
156449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinenum Tags {
157449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kDraw_Tag      = 1,   // May draw something (usually named DrawFoo).
158449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kHasImage_Tag  = 2,   // Contains an SkImage or SkBitmap.
159449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kHasText_Tag   = 4,   // Contains text.
1601bb5fecbea494d77d7d5633522be1cdc76d043aemtklein    kHasPaint_Tag  = 8,   // May have an SkPaint field, at least optionally.
161449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein};
162e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
163449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein// A macro to make it a little easier to define a struct that can be stored in SkRecord.
164449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein#define RECORD(T, tags, ...)            \
165449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinstruct T {                              \
166449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    static const Type kType = T##_Type; \
167449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    static const int kTags = tags;      \
168449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    __VA_ARGS__;                        \
169449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein};
170449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein
171449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(NoOp, 0);
172449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(Restore, 0,
173449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
174449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
175449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(Save, 0);
176e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
1771bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(SaveLayer, kHasPaint_Tag,
178449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein       Optional<SkRect> bounds;
179449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein       Optional<SkPaint> paint;
180da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein       sk_sp<const SkImageFilter> backdrop;
1814960eeec4a1f2a772654883d7f3615d47bcd5dc3reed       SkCanvas::SaveLayerFlags saveLayerFlags);
182449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein
183449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(SetMatrix, 0,
184449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
185e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtkleinRECORD(Concat, 0,
186e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtklein        TypedMatrix matrix);
187e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
188cbdf007bc2eb85056a1a5c75c088202becba2d16mtkleinRECORD(Translate, 0,
189cbdf007bc2eb85056a1a5c75c088202becba2d16mtklein        SkScalar dx;
190cbdf007bc2eb85056a1a5c75c088202becba2d16mtklein        SkScalar dy);
191e5de130788c8637d2f7df9ddb0241b78e04d5882vjiaoblackRECORD(TranslateZ, 0, SkScalar z);
192e5de130788c8637d2f7df9ddb0241b78e04d5882vjiaoblack
193cdeeb095a629b0db9f0ddff09516f2b78255c047mtkleinstruct RegionOpAndAA {
1949db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    RegionOpAndAA() {}
195cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    RegionOpAndAA(SkRegion::Op op, bool aa) : op(op), aa(aa) {}
196cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    SkRegion::Op op : 31;  // This really only needs to be 3, but there's no win today to do so.
197cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    unsigned     aa :  1;  // MSVC won't pack an enum with an bool, so we call this an unsigned.
198cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein};
19999fe82260633fcf5d92cca38d12ef0937ecca61cbungemanstatic_assert(sizeof(RegionOpAndAA) == 4, "RegionOpAndAASize");
200cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein
201449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipPath, 0,
202449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
203449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path;
204449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
205449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRRect, 0,
206449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
207449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect rrect;
208449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
209449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRect, 0,
210449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
211449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect rect;
212449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
213449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRegion, 0,
214449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
215449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRegion region;
216449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRegion::Op op);
217e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
21837f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// While not strictly required, if you have an SkPaint, it's fastest to put it first.
219ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomonRECORD(DrawArc, kDraw_Tag|kHasPaint_Tag,
220ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon       SkPaint paint;
221ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon       SkRect oval;
222ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon       SkScalar startAngle;
223ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon       SkScalar sweepAngle;
224ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon       unsigned useCenter);
2251bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawDRRect, kDraw_Tag|kHasPaint_Tag,
226449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
227449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect outer;
228449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect inner);
229449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawDrawable, kDraw_Tag,
230449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkMatrix> matrix;
231449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect worstCaseBounds;
232449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int32_t index);
2331bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawImage, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
234449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
235da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkImage> image;
236449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar left;
237449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar top);
238c573a40ed5024b463e47088d307e3164a486dba5msarettRECORD(DrawImageLattice, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
239c573a40ed5024b463e47088d307e3164a486dba5msarett        Optional<SkPaint> paint;
240c573a40ed5024b463e47088d307e3164a486dba5msarett        sk_sp<const SkImage> image;
241c573a40ed5024b463e47088d307e3164a486dba5msarett        int xCount;
242c573a40ed5024b463e47088d307e3164a486dba5msarett        PODArray<int> xDivs;
243c573a40ed5024b463e47088d307e3164a486dba5msarett        int yCount;
244c573a40ed5024b463e47088d307e3164a486dba5msarett        PODArray<int> yDivs;
245c573a40ed5024b463e47088d307e3164a486dba5msarett        SkRect dst);
2461bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawImageRect, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
247449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
248da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkImage> image;
249449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> src;
250449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst;
251449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::SrcRectConstraint constraint);
2521bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawImageNine, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
253449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
254da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkImage> image;
255449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect center;
256449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
2571bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawOval, kDraw_Tag|kHasPaint_Tag,
258449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
259449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect oval);
2601bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPaint, kDraw_Tag|kHasPaint_Tag,
261449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint);
2621bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPath, kDraw_Tag|kHasPaint_Tag,
263449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
264449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path);
2651bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPicture, kDraw_Tag|kHasPaint_Tag,
266449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
267da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkPicture> picture;
268449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
2691bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawShadowedPicture, kDraw_Tag|kHasPaint_Tag,
27095302da19d8b0a3bcd9d9be0e79f486760787f09vjiaoblack        Optional<SkPaint> paint;
271da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkPicture> picture;
272e6f5d5623160a69e1585f5121a3695092327dfe0vjiaoblack        TypedMatrix matrix;
273e6f5d5623160a69e1585f5121a3695092327dfe0vjiaoblack        const SkShadowParams& params);
2741bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPoints, kDraw_Tag|kHasPaint_Tag,
275449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
276449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::PointMode mode;
277449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        unsigned count;
278449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPoint* pts);
2791bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPosText, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
280449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
281449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
282449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
283449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> pos);
2841bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPosTextH, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
285449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
286449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
287449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        unsigned byteLength;
288449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y;
289449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkScalar> xpos);
2901bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawRRect, kDraw_Tag|kHasPaint_Tag,
291449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
292449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect rrect);
2931bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawRect, kDraw_Tag|kHasPaint_Tag,
294449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
295449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect rect);
29644df651ebefc284acc2f66425dff3ea0b0e14b36msarettRECORD(DrawRegion, kDraw_Tag|kHasPaint_Tag,
29744df651ebefc284acc2f66425dff3ea0b0e14b36msarett        SkPaint paint;
29844df651ebefc284acc2f66425dff3ea0b0e14b36msarett        SkRegion region);
2991bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawText, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
300449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
301449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
302449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
303449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar x;
304449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y);
3051bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawTextBlob, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
306449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
307da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkTextBlob> blob;
308449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar x;
309449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y);
3101bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawTextOnPath, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
311449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
312449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
313449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
314449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path;
315449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
3161bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawTextRSXform, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
31745561a0b15fe045ba272c328684c3f7ae290785areed        SkPaint paint;
31845561a0b15fe045ba272c328684c3f7ae290785areed        PODArray<char> text;
31945561a0b15fe045ba272c328684c3f7ae290785areed        size_t byteLength;
32045561a0b15fe045ba272c328684c3f7ae290785areed        PODArray<SkRSXform> xforms;
32145561a0b15fe045ba272c328684c3f7ae290785areed        Optional<SkRect> cull);
3221bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPatch, kDraw_Tag|kHasPaint_Tag,
323449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
324449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> cubics;
325449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
326449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> texCoords;
327da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<SkXfermode> xmode);
3281bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawAtlas, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
329449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
330da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkImage> atlas;
331449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkRSXform> xforms;
332449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkRect> texs;
333449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
334449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int count;
335449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkXfermode::Mode mode;
336449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> cull);
3371bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawVertices, kDraw_Tag|kHasPaint_Tag,
338449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
339449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::VertexMode vmode;
340449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int vertexCount;
341449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> vertices;
342449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> texs;
343449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
344da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<SkXfermode> xmode;
345449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<uint16_t> indices;
346449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int indexCount);
3471bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawAnnotation, 0,  // TODO: kDraw_Tag, skia:5548
348f70b531daaf47db1ee95c70da9843f1dd1f418d3reed       SkRect rect;
349f70b531daaf47db1ee95c70da9843f1dd1f418d3reed       SkString key;
350da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein       sk_sp<SkData> value);
351449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein#undef RECORD
352e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
353e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}  // namespace SkRecords
354e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
355e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#endif//SkRecords_DEFINED
356