SkRecords.h revision 95302da19d8b0a3bcd9d9be0e79f486760787f09
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)                                                    \
50e5de130788c8637d2f7df9ddb0241b78e04d5882vjiaoblack    M(TranslateZ)                                                   \
51e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtklein    M(Concat)                                                       \
5288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipPath)                                                     \
5388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRRect)                                                    \
5488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRect)                                                     \
5588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRegion)                                                   \
5688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawBitmap)                                                   \
5788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawBitmapNine)                                               \
58a5517e2b190a8083b38964972b031c13e99f1012reed    M(DrawBitmapRect)                                               \
59a5517e2b190a8083b38964972b031c13e99f1012reed    M(DrawBitmapRectFast)                                           \
60a5517e2b190a8083b38964972b031c13e99f1012reed    M(DrawBitmapRectFixedSize)                                      \
616be2aa9a251bf6022570a03140f956655b3ef1dareed    M(DrawDrawable)                                                 \
6265151754b9fdb6a968d7307764c20655d1b680a0piotaixr    M(DrawImage)                                                    \
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)                                                     \
8029dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    M(DrawTextBlob)                                                 \
8171c3c760a83123ee0b3127b8c65c6394ce541c50reed    M(DrawAtlas)                                                    \
82f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    M(DrawVertices)                                                 \
83f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    M(DrawAnnotation)
84e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
85e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Defines SkRecords::Type, an enum of all record types.
86e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#define ENUM(T) T##_Type,
87e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgenum Type { SK_RECORD_TYPES(ENUM) };
88e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#undef ENUM
89e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
909b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein#define ACT_AS_PTR(ptr)                 \
919b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    operator T*() const { return ptr; } \
929b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    T* operator->() const { return ptr; }
9388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
9453fecfb15d254397ab03032b888daa9d15c487b6mtkleintemplate <typename T>
9553fecfb15d254397ab03032b888daa9d15c487b6mtkleinclass RefBox : SkNoncopyable {
9653fecfb15d254397ab03032b888daa9d15c487b6mtkleinpublic:
979db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    RefBox() {}
989b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    RefBox(T* obj) : fObj(SkSafeRef(obj)) {}
99449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    RefBox(RefBox&& o) : fObj(o.fObj) {
100449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        o.fObj = nullptr;
101449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    }
1029b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    ~RefBox() { SkSafeUnref(fObj); }
10353fecfb15d254397ab03032b888daa9d15c487b6mtklein
10453fecfb15d254397ab03032b888daa9d15c487b6mtklein    ACT_AS_PTR(fObj);
10553fecfb15d254397ab03032b888daa9d15c487b6mtklein
10653fecfb15d254397ab03032b888daa9d15c487b6mtkleinprivate:
10753fecfb15d254397ab03032b888daa9d15c487b6mtklein    T* fObj;
10853fecfb15d254397ab03032b888daa9d15c487b6mtklein};
10953fecfb15d254397ab03032b888daa9d15c487b6mtklein
110653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org// An Optional doesn't own the pointer's memory, but may need to destroy non-POD data.
111653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgtemplate <typename T>
112653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgclass Optional : SkNoncopyable {
113653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgpublic:
1149db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    Optional() : fPtr(nullptr) {}
115653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    Optional(T* ptr) : fPtr(ptr) {}
116449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    Optional(Optional&& o) : fPtr(o.fPtr) {
117449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        o.fPtr = nullptr;
118449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    }
119653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    ~Optional() { if (fPtr) fPtr->~T(); }
120653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
12188c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
12288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgprivate:
12388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    T* fPtr;
12488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org};
12588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
12688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org// Like Optional, but ptr must not be NULL.
12788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgtemplate <typename T>
12888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgclass Adopted : SkNoncopyable {
12988c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgpublic:
13088c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    Adopted(T* ptr) : fPtr(ptr) { SkASSERT(fPtr); }
131f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    Adopted(Adopted* source) {
132f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        // Transfer ownership from source to this.
133f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        fPtr = source->fPtr;
134f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        source->fPtr = NULL;
135f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    }
136f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    ~Adopted() { if (fPtr) fPtr->~T(); }
13788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
13888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
139653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgprivate:
140653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    T* fPtr;
141653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org};
142653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
143653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org// PODArray doesn't own the pointer's memory, and we assume the data is POD.
144653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgtemplate <typename T>
145f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.orgclass PODArray {
146653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgpublic:
1479db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    PODArray() {}
148653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    PODArray(T* ptr) : fPtr(ptr) {}
149f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    // Default copy and assign.
150653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
15188c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
152653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgprivate:
153653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    T* fPtr;
154653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org};
155653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
15616307bd65011667ecdcb755465ce632eef204749commit-bot@chromium.org#undef ACT_AS_PTR
15716307bd65011667ecdcb755465ce632eef204749commit-bot@chromium.org
158e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Like SkBitmap, but deep copies pixels if they're not immutable.
159e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Using this, we guarantee the immutability of all bitmaps we record.
160f55c314bfa6db980941f8d0ab485beb2e08589abmtkleinclass ImmutableBitmap : SkNoncopyable {
161f55c314bfa6db980941f8d0ab485beb2e08589abmtkleinpublic:
1629db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    ImmutableBitmap() {}
163449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    ImmutableBitmap(const SkBitmap& bitmap);
164449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    ImmutableBitmap(ImmutableBitmap&& o) {
165449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        fBitmap.swap(o.fBitmap);
166449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    }
167f55c314bfa6db980941f8d0ab485beb2e08589abmtklein
168f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    int width()  const { return fBitmap.width();  }
169f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    int height() const { return fBitmap.height(); }
170f55c314bfa6db980941f8d0ab485beb2e08589abmtklein
171f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    // While the pixels are immutable, SkBitmap itself is not thread-safe, so return a copy.
172f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    SkBitmap shallowCopy() const { return fBitmap; }
173f55c314bfa6db980941f8d0ab485beb2e08589abmtkleinprivate:
174f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    SkBitmap fBitmap;
175af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein};
176e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
177af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// SkPath::getBounds() isn't thread safe unless we precache the bounds in a singlethreaded context.
17814ed0fd498639d1742e9b25ca4105193fa93b139mtklein// SkPath::cheapComputeDirection() is similar.
17914ed0fd498639d1742e9b25ca4105193fa93b139mtklein// Recording is a convenient time to cache these, or we can delay it to between record and playback.
18014ed0fd498639d1742e9b25ca4105193fa93b139mtkleinstruct PreCachedPath : public SkPath {
1819db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    PreCachedPath() {}
182449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    PreCachedPath(const SkPath& path);
183af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein};
184e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
185af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// Like SkPath::getBounds(), SkMatrix::getType() isn't thread safe unless we precache it.
186af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// This may not cover all SkMatrices used by the picture (e.g. some could be hiding in a shader).
187af57903f330a0afd0c10244d4a66f64fdbef5d1emtkleinstruct TypedMatrix : public SkMatrix {
1889db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    TypedMatrix() {}
189449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    TypedMatrix(const SkMatrix& matrix);
190e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org};
191e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
192449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinenum Tags {
193449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kDraw_Tag      = 1,   // May draw something (usually named DrawFoo).
194449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kHasImage_Tag  = 2,   // Contains an SkImage or SkBitmap.
195449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kHasText_Tag   = 4,   // Contains text.
196449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein};
197e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
198449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein// A macro to make it a little easier to define a struct that can be stored in SkRecord.
199449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein#define RECORD(T, tags, ...)            \
200449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinstruct T {                              \
201449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    static const Type kType = T##_Type; \
202449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    static const int kTags = tags;      \
203449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    __VA_ARGS__;                        \
204449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein};
205449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein
206449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(NoOp, 0);
207449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(Restore, 0,
208449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
209449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
210449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(Save, 0);
211e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
212449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(SaveLayer, 0,
213449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein       Optional<SkRect> bounds;
214449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein       Optional<SkPaint> paint;
215bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed       RefBox<const SkImageFilter> backdrop;
2164960eeec4a1f2a772654883d7f3615d47bcd5dc3reed       SkCanvas::SaveLayerFlags saveLayerFlags);
217449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein
218449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(SetMatrix, 0,
219449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
220e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtkleinRECORD(Concat, 0,
221e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtklein        TypedMatrix matrix);
222e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
223e5de130788c8637d2f7df9ddb0241b78e04d5882vjiaoblackRECORD(TranslateZ, 0, SkScalar z);
224e5de130788c8637d2f7df9ddb0241b78e04d5882vjiaoblack
225cdeeb095a629b0db9f0ddff09516f2b78255c047mtkleinstruct RegionOpAndAA {
2269db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    RegionOpAndAA() {}
227cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    RegionOpAndAA(SkRegion::Op op, bool aa) : op(op), aa(aa) {}
228cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    SkRegion::Op op : 31;  // This really only needs to be 3, but there's no win today to do so.
229cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    unsigned     aa :  1;  // MSVC won't pack an enum with an bool, so we call this an unsigned.
230cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein};
23199fe82260633fcf5d92cca38d12ef0937ecca61cbungemanstatic_assert(sizeof(RegionOpAndAA) == 4, "RegionOpAndAASize");
232cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein
233449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipPath, 0,
234449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
235449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path;
236449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
237449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRRect, 0,
238449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
239449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect rrect;
240449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
241449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRect, 0,
242449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
243449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect rect;
244449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
245449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRegion, 0,
246449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
247449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRegion region;
248449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRegion::Op op);
249e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
25037f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// While not strictly required, if you have an SkPaint, it's fastest to put it first.
251449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmap, kDraw_Tag|kHasImage_Tag,
252449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
253449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
254449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar left;
255449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar top);
256449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapNine, kDraw_Tag|kHasImage_Tag,
257449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
258449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
259449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect center;
260449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
261449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapRect, kDraw_Tag|kHasImage_Tag,
262449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
263449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
264449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> src;
265449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
266449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapRectFast, kDraw_Tag|kHasImage_Tag,
267449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
268449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
269449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> src;
270449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
271449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapRectFixedSize, kDraw_Tag|kHasImage_Tag,
272449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
273449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
274449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect src;
275449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst;
276449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::SrcRectConstraint constraint);
277449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawDRRect, kDraw_Tag,
278449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
279449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect outer;
280449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect inner);
281449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawDrawable, kDraw_Tag,
282449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkMatrix> matrix;
283449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect worstCaseBounds;
284449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int32_t index);
285449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawImage, kDraw_Tag|kHasImage_Tag,
286449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
287449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> image;
288449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar left;
289449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar top);
290449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawImageRect, kDraw_Tag|kHasImage_Tag,
291449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
292449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> image;
293449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> src;
294449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst;
295449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::SrcRectConstraint constraint);
296449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawImageNine, kDraw_Tag|kHasImage_Tag,
297449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
298449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> image;
299449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect center;
300449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
301449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawOval, kDraw_Tag,
302449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
303449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect oval);
304449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPaint, kDraw_Tag,
305449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint);
306449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPath, kDraw_Tag,
307449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
308449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path);
309449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPicture, kDraw_Tag,
310449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
311449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkPicture> picture;
312449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
31395302da19d8b0a3bcd9d9be0e79f486760787f09vjiaoblackRECORD(DrawShadowedPicture, kDraw_Tag,
31495302da19d8b0a3bcd9d9be0e79f486760787f09vjiaoblack        Optional<SkPaint> paint;
31595302da19d8b0a3bcd9d9be0e79f486760787f09vjiaoblack        RefBox<const SkPicture> picture;
31695302da19d8b0a3bcd9d9be0e79f486760787f09vjiaoblack        TypedMatrix matrix);
317449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPoints, kDraw_Tag,
318449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
319449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::PointMode mode;
320449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        unsigned count;
321449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPoint* pts);
322449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPosText, kDraw_Tag|kHasText_Tag,
323449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
324449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
325449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
326449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> pos);
327449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPosTextH, kDraw_Tag|kHasText_Tag,
328449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
329449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
330449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        unsigned byteLength;
331449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y;
332449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkScalar> xpos);
333449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawRRect, kDraw_Tag,
334449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
335449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect rrect);
336449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawRect, kDraw_Tag,
337449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
338449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect rect);
339449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawText, kDraw_Tag|kHasText_Tag,
340449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
341449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
342449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
343449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar x;
344449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y);
345449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawTextBlob, kDraw_Tag|kHasText_Tag,
346449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
347449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkTextBlob> blob;
348449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar x;
349449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y);
350449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawTextOnPath, kDraw_Tag|kHasText_Tag,
351449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
352449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
353449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
354449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path;
355449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
35645561a0b15fe045ba272c328684c3f7ae290785areedRECORD(DrawTextRSXform, kDraw_Tag|kHasText_Tag,
35745561a0b15fe045ba272c328684c3f7ae290785areed        SkPaint paint;
35845561a0b15fe045ba272c328684c3f7ae290785areed        PODArray<char> text;
35945561a0b15fe045ba272c328684c3f7ae290785areed        size_t byteLength;
36045561a0b15fe045ba272c328684c3f7ae290785areed        PODArray<SkRSXform> xforms;
36145561a0b15fe045ba272c328684c3f7ae290785areed        Optional<SkRect> cull);
362449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPatch, kDraw_Tag,
363449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
364449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> cubics;
365449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
366449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> texCoords;
367449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<SkXfermode> xmode);
368449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawAtlas, kDraw_Tag|kHasImage_Tag,
369449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
370449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> atlas;
371449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkRSXform> xforms;
372449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkRect> texs;
373449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
374449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int count;
375449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkXfermode::Mode mode;
376449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> cull);
377449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawVertices, kDraw_Tag,
378449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
379449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::VertexMode vmode;
380449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int vertexCount;
381449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> vertices;
382449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> texs;
383449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
384449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<SkXfermode> xmode;
385449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<uint16_t> indices;
386449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int indexCount);
387f70b531daaf47db1ee95c70da9843f1dd1f418d3reedRECORD(DrawAnnotation, 0,
388f70b531daaf47db1ee95c70da9843f1dd1f418d3reed       SkRect rect;
389f70b531daaf47db1ee95c70da9843f1dd1f418d3reed       SkString key;
390f70b531daaf47db1ee95c70da9843f1dd1f418d3reed       RefBox<SkData> value);
391449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein#undef RECORD
392e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
393e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}  // namespace SkRecords
394e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
395e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#endif//SkRecords_DEFINED
396