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"
19267be7fbc38174652c750ec69d8dc1feaa72db0cMike Reed#include "SkRegion.h"
20d3ebb48320cf1b7e969974673e4bd7743816985ebungeman#include "SkRRect.h"
2171c3c760a83123ee0b3127b8c65c6394ce541c50reed#include "SkRSXform.h"
22f70b531daaf47db1ee95c70da9843f1dd1f418d3reed#include "SkString.h"
2300d5c2c6523321d25b32905ff4822f083a4173eefmalita#include "SkTextBlob.h"
2414583e11fd622c686993b741499060a6f3527055Mike Reed#include "SkVertices.h"
252347b624678fedf1d2f7ab1d79b9ad70087c3392reed
264dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary// Windows.h, will pull in all of the GDI defines.  GDI #defines
274dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary// DrawText to DrawTextA or DrawTextW, but SkRecord has a struct
284dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary// called DrawText. Since this file does not use GDI, undefing
294dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary// DrawText makes things less confusing.
304dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary#ifdef DrawText
314dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary#undef DrawText
324dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary#endif
334dbbd04314cc0606f8d3bafe515c97e52c180f73halcanary
3400d5c2c6523321d25b32905ff4822f083a4173eefmalitanamespace SkRecords {
3500d5c2c6523321d25b32905ff4822f083a4173eefmalita
36e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// A list of all the types of canvas calls we can record.
37e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Each of these is reified into a struct below.
38e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org//
39e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// (We're using the macro-of-macro trick here to do several different things with the same list.)
40e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org//
41e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// We leave this SK_RECORD_TYPES macro defined for use by code that wants to operate on SkRecords
42e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// types polymorphically.  (See SkRecord::Record::{visit,mutate} for an example.)
4337f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org//
4437f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// Order doesn't technically matter here, but the compiler can generally generate better code if
4537f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// you keep them semantically grouped, especially the Draws.  It's also nice to leave NoOp at 0.
4688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org#define SK_RECORD_TYPES(M)                                          \
4788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(NoOp)                                                         \
4888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(Restore)                                                      \
4988c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(Save)                                                         \
5088c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(SaveLayer)                                                    \
5188c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(SetMatrix)                                                    \
52cbdf007bc2eb85056a1a5c75c088202becba2d16mtklein    M(Translate)                                                    \
53e5de130788c8637d2f7df9ddb0241b78e04d5882vjiaoblack    M(TranslateZ)                                                   \
54e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtklein    M(Concat)                                                       \
5588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipPath)                                                     \
5688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRRect)                                                    \
5788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRect)                                                     \
5888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRegion)                                                   \
59ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon    M(DrawArc)                                                      \
606be2aa9a251bf6022570a03140f956655b3ef1dareed    M(DrawDrawable)                                                 \
6165151754b9fdb6a968d7307764c20655d1b680a0piotaixr    M(DrawImage)                                                    \
62c573a40ed5024b463e47088d307e3164a486dba5msarett    M(DrawImageLattice)                                             \
6365151754b9fdb6a968d7307764c20655d1b680a0piotaixr    M(DrawImageRect)                                                \
644c21dc5ddf3b482293ed34eead876d8d61a662c3reed    M(DrawImageNine)                                                \
6588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawDRRect)                                                   \
6688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawOval)                                                     \
6788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPaint)                                                    \
6888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPath)                                                     \
69963137b75c0a1fe91f35e9826742f36309f5e65ddandov    M(DrawPatch)                                                    \
702347b624678fedf1d2f7ab1d79b9ad70087c3392reed    M(DrawPicture)                                                  \
7195302da19d8b0a3bcd9d9be0e79f486760787f09vjiaoblack    M(DrawShadowedPicture)                                          \
7288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPoints)                                                   \
7388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPosText)                                                  \
7488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPosTextH)                                                 \
75c551d9fcae98ff7b9d56f315947e89a26632aeecmtklein    M(DrawText)                                                     \
76c551d9fcae98ff7b9d56f315947e89a26632aeecmtklein    M(DrawTextOnPath)                                               \
7745561a0b15fe045ba272c328684c3f7ae290785areed    M(DrawTextRSXform)                                              \
7888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawRRect)                                                    \
7988c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawRect)                                                     \
8044df651ebefc284acc2f66425dff3ea0b0e14b36msarett    M(DrawRegion)                                                   \
8129dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    M(DrawTextBlob)                                                 \
8271c3c760a83123ee0b3127b8c65c6394ce541c50reed    M(DrawAtlas)                                                    \
83f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    M(DrawVertices)                                                 \
84f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    M(DrawAnnotation)
85e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
86e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Defines SkRecords::Type, an enum of all record types.
87e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#define ENUM(T) T##_Type,
88e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgenum Type { SK_RECORD_TYPES(ENUM) };
89e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#undef ENUM
90e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
919b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein#define ACT_AS_PTR(ptr)                 \
929b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    operator T*() const { return ptr; } \
939b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    T* operator->() const { return ptr; }
9488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
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
106fc6c37b981daeece7474ce61070c707c37eefa62Mike Klein    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
123fc6c37b981daeece7474ce61070c707c37eefa62Mike Klein    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
136fc6c37b981daeece7474ce61070c707c37eefa62Mike Klein    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
143af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// SkPath::getBounds() isn't thread safe unless we precache the bounds in a singlethreaded context.
14414ed0fd498639d1742e9b25ca4105193fa93b139mtklein// SkPath::cheapComputeDirection() is similar.
14514ed0fd498639d1742e9b25ca4105193fa93b139mtklein// Recording is a convenient time to cache these, or we can delay it to between record and playback.
14614ed0fd498639d1742e9b25ca4105193fa93b139mtkleinstruct PreCachedPath : public SkPath {
1479db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    PreCachedPath() {}
148449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    PreCachedPath(const SkPath& path);
149af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein};
150e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
151af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// Like SkPath::getBounds(), SkMatrix::getType() isn't thread safe unless we precache it.
152af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// This may not cover all SkMatrices used by the picture (e.g. some could be hiding in a shader).
153af57903f330a0afd0c10244d4a66f64fdbef5d1emtkleinstruct TypedMatrix : public SkMatrix {
1549db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    TypedMatrix() {}
155449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    TypedMatrix(const SkMatrix& matrix);
156e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org};
157e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
158449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinenum Tags {
159449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kDraw_Tag      = 1,   // May draw something (usually named DrawFoo).
160449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kHasImage_Tag  = 2,   // Contains an SkImage or SkBitmap.
161449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kHasText_Tag   = 4,   // Contains text.
1621bb5fecbea494d77d7d5633522be1cdc76d043aemtklein    kHasPaint_Tag  = 8,   // May have an SkPaint field, at least optionally.
163449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein};
164e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
165449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein// A macro to make it a little easier to define a struct that can be stored in SkRecord.
166449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein#define RECORD(T, tags, ...)            \
167449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinstruct T {                              \
168449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    static const Type kType = T##_Type; \
169449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    static const int kTags = tags;      \
170449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    __VA_ARGS__;                        \
171449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein};
172449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein
173449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(NoOp, 0);
174449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(Restore, 0,
175449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
176449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
177449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(Save, 0);
178e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
1791bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(SaveLayer, kHasPaint_Tag,
180449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein       Optional<SkRect> bounds;
181449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein       Optional<SkPaint> paint;
182da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein       sk_sp<const SkImageFilter> backdrop;
1834960eeec4a1f2a772654883d7f3615d47bcd5dc3reed       SkCanvas::SaveLayerFlags saveLayerFlags);
184449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein
185449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(SetMatrix, 0,
186449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
187e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtkleinRECORD(Concat, 0,
188e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtklein        TypedMatrix matrix);
189e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
190cbdf007bc2eb85056a1a5c75c088202becba2d16mtkleinRECORD(Translate, 0,
191cbdf007bc2eb85056a1a5c75c088202becba2d16mtklein        SkScalar dx;
192cbdf007bc2eb85056a1a5c75c088202becba2d16mtklein        SkScalar dy);
193e5de130788c8637d2f7df9ddb0241b78e04d5882vjiaoblackRECORD(TranslateZ, 0, SkScalar z);
194e5de130788c8637d2f7df9ddb0241b78e04d5882vjiaoblack
19573603f3c52ffd89fe9d035be827b566a0e7d3b79reedstruct ClipOpAndAA {
19673603f3c52ffd89fe9d035be827b566a0e7d3b79reed    ClipOpAndAA() {}
197ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed    ClipOpAndAA(SkClipOp op, bool aa) : fOp(static_cast<unsigned>(op)), fAA(aa) {}
198ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed
199ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed    SkClipOp op() const { return static_cast<SkClipOp>(fOp); }
200ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed    bool aa() const { return fAA != 0; }
201ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed
202ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reedprivate:
203ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed    unsigned fOp : 31;  // This really only needs to be 3, but there's no win today to do so.
204ebfce6d9b42198e04288a15953f40c395a7b6139Mike Reed    unsigned fAA :  1;  // MSVC won't pack an enum with an bool, so we call this an unsigned.
205cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein};
20673603f3c52ffd89fe9d035be827b566a0e7d3b79reedstatic_assert(sizeof(ClipOpAndAA) == 4, "ClipOpAndAASize");
207cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein
208449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipPath, 0,
209449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
210449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path;
21173603f3c52ffd89fe9d035be827b566a0e7d3b79reed        ClipOpAndAA opAA);
212449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRRect, 0,
213449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
214449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect rrect;
21573603f3c52ffd89fe9d035be827b566a0e7d3b79reed        ClipOpAndAA opAA);
216449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRect, 0,
217449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
218449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect rect;
21973603f3c52ffd89fe9d035be827b566a0e7d3b79reed        ClipOpAndAA opAA);
220449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRegion, 0,
221449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
222449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRegion region;
223c1f7774e8d327e3c98b4094c9c01d26e27013f71Mike Reed        SkClipOp op);
224e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
22537f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// While not strictly required, if you have an SkPaint, it's fastest to put it first.
226ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomonRECORD(DrawArc, kDraw_Tag|kHasPaint_Tag,
227ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon       SkPaint paint;
228ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon       SkRect oval;
229ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon       SkScalar startAngle;
230ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon       SkScalar sweepAngle;
231ac3aa245acc7b469aa2f0d0078e53401d78ac8b9bsalomon       unsigned useCenter);
2321bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawDRRect, kDraw_Tag|kHasPaint_Tag,
233449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
234449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect outer;
235449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect inner);
236449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawDrawable, kDraw_Tag,
237449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkMatrix> matrix;
238449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect worstCaseBounds;
239449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int32_t index);
2401bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawImage, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
241449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
242da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkImage> image;
243449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar left;
244449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar top);
245c573a40ed5024b463e47088d307e3164a486dba5msarettRECORD(DrawImageLattice, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
246c573a40ed5024b463e47088d307e3164a486dba5msarett        Optional<SkPaint> paint;
247c573a40ed5024b463e47088d307e3164a486dba5msarett        sk_sp<const SkImage> image;
248c573a40ed5024b463e47088d307e3164a486dba5msarett        int xCount;
249c573a40ed5024b463e47088d307e3164a486dba5msarett        PODArray<int> xDivs;
250c573a40ed5024b463e47088d307e3164a486dba5msarett        int yCount;
251c573a40ed5024b463e47088d307e3164a486dba5msarett        PODArray<int> yDivs;
2520764efe6a9ae65ad83992f614f57ca9db5b1f191msarett        int flagCount;
2530764efe6a9ae65ad83992f614f57ca9db5b1f191msarett        PODArray<SkCanvas::Lattice::Flags> flags;
25471df2d7bc1bbc83ad4cf005f9027df4cb3b88a9bmsarett        SkIRect src;
255c573a40ed5024b463e47088d307e3164a486dba5msarett        SkRect dst);
2561bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawImageRect, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
257449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
258da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkImage> image;
259449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> src;
260449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst;
261449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::SrcRectConstraint constraint);
2621bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawImageNine, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
263449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
264da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkImage> image;
265449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect center;
266449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
2671bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawOval, kDraw_Tag|kHasPaint_Tag,
268449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
269449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect oval);
2701bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPaint, kDraw_Tag|kHasPaint_Tag,
271449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint);
2721bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPath, kDraw_Tag|kHasPaint_Tag,
273449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
274449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path);
2751bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPicture, kDraw_Tag|kHasPaint_Tag,
276449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
277da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkPicture> picture;
278449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
2791bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawShadowedPicture, kDraw_Tag|kHasPaint_Tag,
28095302da19d8b0a3bcd9d9be0e79f486760787f09vjiaoblack        Optional<SkPaint> paint;
281da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkPicture> picture;
282e6f5d5623160a69e1585f5121a3695092327dfe0vjiaoblack        TypedMatrix matrix;
283e6f5d5623160a69e1585f5121a3695092327dfe0vjiaoblack        const SkShadowParams& params);
2841bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPoints, kDraw_Tag|kHasPaint_Tag,
285449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
286449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::PointMode mode;
287449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        unsigned count;
288449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPoint* pts);
2891bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPosText, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
290449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
291449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
292449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
293449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> pos);
2941bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPosTextH, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
295449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
296449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
297449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        unsigned byteLength;
298449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y;
299449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkScalar> xpos);
3001bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawRRect, kDraw_Tag|kHasPaint_Tag,
301449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
302449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect rrect);
3031bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawRect, kDraw_Tag|kHasPaint_Tag,
304449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
305449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect rect);
30644df651ebefc284acc2f66425dff3ea0b0e14b36msarettRECORD(DrawRegion, kDraw_Tag|kHasPaint_Tag,
30744df651ebefc284acc2f66425dff3ea0b0e14b36msarett        SkPaint paint;
30844df651ebefc284acc2f66425dff3ea0b0e14b36msarett        SkRegion region);
3091bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawText, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
310449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
311449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
312449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
313449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar x;
314449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y);
3151bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawTextBlob, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
316449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
317da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkTextBlob> blob;
318449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar x;
319449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y);
3201bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawTextOnPath, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
321449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
322449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
323449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
324449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path;
325449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
3261bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawTextRSXform, kDraw_Tag|kHasText_Tag|kHasPaint_Tag,
32745561a0b15fe045ba272c328684c3f7ae290785areed        SkPaint paint;
32845561a0b15fe045ba272c328684c3f7ae290785areed        PODArray<char> text;
32945561a0b15fe045ba272c328684c3f7ae290785areed        size_t byteLength;
33045561a0b15fe045ba272c328684c3f7ae290785areed        PODArray<SkRSXform> xforms;
33145561a0b15fe045ba272c328684c3f7ae290785areed        Optional<SkRect> cull);
3321bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawPatch, kDraw_Tag|kHasPaint_Tag,
333449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
334449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> cubics;
335449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
336449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> texCoords;
3377d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed        SkBlendMode bmode);
3381bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawAtlas, kDraw_Tag|kHasImage_Tag|kHasPaint_Tag,
339449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
340da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein        sk_sp<const SkImage> atlas;
341449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkRSXform> xforms;
342449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkRect> texs;
343449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
344449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int count;
3457d954ad797176afedb9262fdea4507d0fc60eb9dMike Reed        SkBlendMode mode;
346449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> cull);
3471bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawVertices, kDraw_Tag|kHasPaint_Tag,
348449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
34914583e11fd622c686993b741499060a6f3527055Mike Reed        sk_sp<SkVertices> vertices;
35014583e11fd622c686993b741499060a6f3527055Mike Reed        SkBlendMode bmode);
3511bb5fecbea494d77d7d5633522be1cdc76d043aemtkleinRECORD(DrawAnnotation, 0,  // TODO: kDraw_Tag, skia:5548
352f70b531daaf47db1ee95c70da9843f1dd1f418d3reed       SkRect rect;
353f70b531daaf47db1ee95c70da9843f1dd1f418d3reed       SkString key;
354da574d17f864ed70323a1c0fc6e4e969153a4c98mtklein       sk_sp<SkData> value);
355449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein#undef RECORD
356e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
357e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}  // namespace SkRecords
358e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
359e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#endif//SkRecords_DEFINED
360