SkRecords.h revision f70b531daaf47db1ee95c70da9843f1dd1f418d3
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
2400d5c2c6523321d25b32905ff4822f083a4173eefmalitanamespace SkRecords {
2500d5c2c6523321d25b32905ff4822f083a4173eefmalita
26e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// A list of all the types of canvas calls we can record.
27e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Each of these is reified into a struct below.
28e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org//
29e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// (We're using the macro-of-macro trick here to do several different things with the same list.)
30e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org//
31e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// We leave this SK_RECORD_TYPES macro defined for use by code that wants to operate on SkRecords
32e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// types polymorphically.  (See SkRecord::Record::{visit,mutate} for an example.)
3337f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org//
3437f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// Order doesn't technically matter here, but the compiler can generally generate better code if
3537f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// you keep them semantically grouped, especially the Draws.  It's also nice to leave NoOp at 0.
3688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org#define SK_RECORD_TYPES(M)                                          \
3788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(NoOp)                                                         \
3888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(Restore)                                                      \
3988c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(Save)                                                         \
4088c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(SaveLayer)                                                    \
4188c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(SetMatrix)                                                    \
42e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtklein    M(Concat)                                                       \
4388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipPath)                                                     \
4488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRRect)                                                    \
4588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRect)                                                     \
4688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(ClipRegion)                                                   \
4788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawBitmap)                                                   \
4888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawBitmapNine)                                               \
49a5517e2b190a8083b38964972b031c13e99f1012reed    M(DrawBitmapRect)                                               \
50a5517e2b190a8083b38964972b031c13e99f1012reed    M(DrawBitmapRectFast)                                           \
51a5517e2b190a8083b38964972b031c13e99f1012reed    M(DrawBitmapRectFixedSize)                                      \
526be2aa9a251bf6022570a03140f956655b3ef1dareed    M(DrawDrawable)                                                 \
5365151754b9fdb6a968d7307764c20655d1b680a0piotaixr    M(DrawImage)                                                    \
5465151754b9fdb6a968d7307764c20655d1b680a0piotaixr    M(DrawImageRect)                                                \
554c21dc5ddf3b482293ed34eead876d8d61a662c3reed    M(DrawImageNine)                                                \
5688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawDRRect)                                                   \
5788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawOval)                                                     \
5888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPaint)                                                    \
5988c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPath)                                                     \
60963137b75c0a1fe91f35e9826742f36309f5e65ddandov    M(DrawPatch)                                                    \
612347b624678fedf1d2f7ab1d79b9ad70087c3392reed    M(DrawPicture)                                                  \
6288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPoints)                                                   \
6388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPosText)                                                  \
6488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawPosTextH)                                                 \
65c551d9fcae98ff7b9d56f315947e89a26632aeecmtklein    M(DrawText)                                                     \
66c551d9fcae98ff7b9d56f315947e89a26632aeecmtklein    M(DrawTextOnPath)                                               \
6788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawRRect)                                                    \
6888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    M(DrawRect)                                                     \
6929dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    M(DrawTextBlob)                                                 \
7071c3c760a83123ee0b3127b8c65c6394ce541c50reed    M(DrawAtlas)                                                    \
71f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    M(DrawVertices)                                                 \
72f70b531daaf47db1ee95c70da9843f1dd1f418d3reed    M(DrawAnnotation)
73e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
74e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Defines SkRecords::Type, an enum of all record types.
75e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#define ENUM(T) T##_Type,
76e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgenum Type { SK_RECORD_TYPES(ENUM) };
77e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#undef ENUM
78e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
799b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein#define ACT_AS_PTR(ptr)                 \
809b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    operator T*() const { return ptr; } \
819b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    T* operator->() const { return ptr; }
8288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
8353fecfb15d254397ab03032b888daa9d15c487b6mtkleintemplate <typename T>
8453fecfb15d254397ab03032b888daa9d15c487b6mtkleinclass RefBox : SkNoncopyable {
8553fecfb15d254397ab03032b888daa9d15c487b6mtkleinpublic:
869db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    RefBox() {}
879b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    RefBox(T* obj) : fObj(SkSafeRef(obj)) {}
88449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    RefBox(RefBox&& o) : fObj(o.fObj) {
89449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        o.fObj = nullptr;
90449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    }
919b222a5ddd3b39ca191d8443bade6052cdcb713dmtklein    ~RefBox() { SkSafeUnref(fObj); }
9253fecfb15d254397ab03032b888daa9d15c487b6mtklein
9353fecfb15d254397ab03032b888daa9d15c487b6mtklein    ACT_AS_PTR(fObj);
9453fecfb15d254397ab03032b888daa9d15c487b6mtklein
9553fecfb15d254397ab03032b888daa9d15c487b6mtkleinprivate:
9653fecfb15d254397ab03032b888daa9d15c487b6mtklein    T* fObj;
9753fecfb15d254397ab03032b888daa9d15c487b6mtklein};
9853fecfb15d254397ab03032b888daa9d15c487b6mtklein
99653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org// An Optional doesn't own the pointer's memory, but may need to destroy non-POD data.
100653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgtemplate <typename T>
101653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgclass Optional : SkNoncopyable {
102653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgpublic:
1039db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    Optional() : fPtr(nullptr) {}
104653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    Optional(T* ptr) : fPtr(ptr) {}
105449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    Optional(Optional&& o) : fPtr(o.fPtr) {
106449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        o.fPtr = nullptr;
107449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    }
108653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    ~Optional() { if (fPtr) fPtr->~T(); }
109653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
11088c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
11188c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgprivate:
11288c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    T* fPtr;
11388c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org};
11488c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
11588c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org// Like Optional, but ptr must not be NULL.
11688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgtemplate <typename T>
11788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgclass Adopted : SkNoncopyable {
11888c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.orgpublic:
11988c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    Adopted(T* ptr) : fPtr(ptr) { SkASSERT(fPtr); }
120f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    Adopted(Adopted* source) {
121f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        // Transfer ownership from source to this.
122f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        fPtr = source->fPtr;
123f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org        source->fPtr = NULL;
124f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    }
125f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    ~Adopted() { if (fPtr) fPtr->~T(); }
12688c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org
12788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
128653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgprivate:
129653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    T* fPtr;
130653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org};
131653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
132653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org// PODArray doesn't own the pointer's memory, and we assume the data is POD.
133653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgtemplate <typename T>
134f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.orgclass PODArray {
135653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgpublic:
1369db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    PODArray() {}
137653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    PODArray(T* ptr) : fPtr(ptr) {}
138f0ae5e471b759f18b614a8e0928c9151947de04ccommit-bot@chromium.org    // Default copy and assign.
139653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
14088c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    ACT_AS_PTR(fPtr);
141653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.orgprivate:
142653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org    T* fPtr;
143653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org};
144653d51867c20fc643537e4a0d73178697766ae4acommit-bot@chromium.org
14516307bd65011667ecdcb755465ce632eef204749commit-bot@chromium.org#undef ACT_AS_PTR
14616307bd65011667ecdcb755465ce632eef204749commit-bot@chromium.org
147e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Like SkBitmap, but deep copies pixels if they're not immutable.
148e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Using this, we guarantee the immutability of all bitmaps we record.
149f55c314bfa6db980941f8d0ab485beb2e08589abmtkleinclass ImmutableBitmap : SkNoncopyable {
150f55c314bfa6db980941f8d0ab485beb2e08589abmtkleinpublic:
1519db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    ImmutableBitmap() {}
152449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    ImmutableBitmap(const SkBitmap& bitmap);
153449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    ImmutableBitmap(ImmutableBitmap&& o) {
154449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        fBitmap.swap(o.fBitmap);
155449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    }
156f55c314bfa6db980941f8d0ab485beb2e08589abmtklein
157f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    int width()  const { return fBitmap.width();  }
158f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    int height() const { return fBitmap.height(); }
159f55c314bfa6db980941f8d0ab485beb2e08589abmtklein
160f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    // While the pixels are immutable, SkBitmap itself is not thread-safe, so return a copy.
161f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    SkBitmap shallowCopy() const { return fBitmap; }
162f55c314bfa6db980941f8d0ab485beb2e08589abmtkleinprivate:
163f55c314bfa6db980941f8d0ab485beb2e08589abmtklein    SkBitmap fBitmap;
164af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein};
165e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
166af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// SkPath::getBounds() isn't thread safe unless we precache the bounds in a singlethreaded context.
16714ed0fd498639d1742e9b25ca4105193fa93b139mtklein// SkPath::cheapComputeDirection() is similar.
16814ed0fd498639d1742e9b25ca4105193fa93b139mtklein// Recording is a convenient time to cache these, or we can delay it to between record and playback.
16914ed0fd498639d1742e9b25ca4105193fa93b139mtkleinstruct PreCachedPath : public SkPath {
1709db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    PreCachedPath() {}
171449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    PreCachedPath(const SkPath& path);
172af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein};
173e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
174af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// Like SkPath::getBounds(), SkMatrix::getType() isn't thread safe unless we precache it.
175af57903f330a0afd0c10244d4a66f64fdbef5d1emtklein// This may not cover all SkMatrices used by the picture (e.g. some could be hiding in a shader).
176af57903f330a0afd0c10244d4a66f64fdbef5d1emtkleinstruct TypedMatrix : public SkMatrix {
1779db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    TypedMatrix() {}
178449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    TypedMatrix(const SkMatrix& matrix);
179e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org};
180e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
181449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinenum Tags {
182449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kDraw_Tag      = 1,   // May draw something (usually named DrawFoo).
183449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kHasImage_Tag  = 2,   // Contains an SkImage or SkBitmap.
184449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    kHasText_Tag   = 4,   // Contains text.
185449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein};
186e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
187449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein// A macro to make it a little easier to define a struct that can be stored in SkRecord.
188449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein#define RECORD(T, tags, ...)            \
189449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinstruct T {                              \
190449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    static const Type kType = T##_Type; \
191449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    static const int kTags = tags;      \
192449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein    __VA_ARGS__;                        \
193449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein};
194449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein
195449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(NoOp, 0);
196449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(Restore, 0,
197449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
198449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
199449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(Save, 0);
200e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
201449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(SaveLayer, 0,
202449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein       Optional<SkRect> bounds;
203449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein       Optional<SkPaint> paint;
204bfd5f171e6a3eccd7c4bede652a85fd76bcbce2areed       RefBox<const SkImageFilter> backdrop;
2054960eeec4a1f2a772654883d7f3615d47bcd5dc3reed       SkCanvas::SaveLayerFlags saveLayerFlags);
206449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein
207449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(SetMatrix, 0,
208449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
209e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtkleinRECORD(Concat, 0,
210e9d2052e4931eeade49042a855b9c1f5ab7c84c5mtklein        TypedMatrix matrix);
211e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
212cdeeb095a629b0db9f0ddff09516f2b78255c047mtkleinstruct RegionOpAndAA {
2139db912c2ac2ab53bc24f2d50a3e5a80162051dccmtklein    RegionOpAndAA() {}
214cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    RegionOpAndAA(SkRegion::Op op, bool aa) : op(op), aa(aa) {}
215cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    SkRegion::Op op : 31;  // This really only needs to be 3, but there's no win today to do so.
216cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein    unsigned     aa :  1;  // MSVC won't pack an enum with an bool, so we call this an unsigned.
217cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein};
21899fe82260633fcf5d92cca38d12ef0937ecca61cbungemanstatic_assert(sizeof(RegionOpAndAA) == 4, "RegionOpAndAASize");
219cdeeb095a629b0db9f0ddff09516f2b78255c047mtklein
220449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipPath, 0,
221449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
222449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path;
223449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
224449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRRect, 0,
225449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
226449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect rrect;
227449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
228449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRect, 0,
229449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
230449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect rect;
231449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RegionOpAndAA opAA);
232449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(ClipRegion, 0,
233449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect devBounds;
234449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRegion region;
235449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRegion::Op op);
236e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
23737f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org// While not strictly required, if you have an SkPaint, it's fastest to put it first.
238449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmap, kDraw_Tag|kHasImage_Tag,
239449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
240449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
241449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar left;
242449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar top);
243449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapNine, kDraw_Tag|kHasImage_Tag,
244449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
245449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
246449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect center;
247449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
248449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapRect, kDraw_Tag|kHasImage_Tag,
249449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
250449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
251449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> src;
252449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
253449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapRectFast, kDraw_Tag|kHasImage_Tag,
254449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
255449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
256449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> src;
257449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
258449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawBitmapRectFixedSize, kDraw_Tag|kHasImage_Tag,
259449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
260449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        ImmutableBitmap bitmap;
261449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect src;
262449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst;
263449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::SrcRectConstraint constraint);
264449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawDRRect, kDraw_Tag,
265449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
266449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect outer;
267449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect inner);
268449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawDrawable, kDraw_Tag,
269449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkMatrix> matrix;
270449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect worstCaseBounds;
271449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int32_t index);
272449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawImage, kDraw_Tag|kHasImage_Tag,
273449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
274449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> image;
275449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar left;
276449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar top);
277449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawImageRect, kDraw_Tag|kHasImage_Tag,
278449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
279449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> image;
280449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> src;
281449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst;
282449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::SrcRectConstraint constraint);
283449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawImageNine, kDraw_Tag|kHasImage_Tag,
284449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
285449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> image;
286449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkIRect center;
287449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect dst);
288449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawOval, kDraw_Tag,
289449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
290449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect oval);
291449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPaint, kDraw_Tag,
292449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint);
293449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPath, kDraw_Tag,
294449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
295449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path);
296449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPicture, kDraw_Tag,
297449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
298449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkPicture> picture;
299449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
300449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPoints, kDraw_Tag,
301449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
302449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::PointMode mode;
303449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        unsigned count;
304449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPoint* pts);
305449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPosText, kDraw_Tag|kHasText_Tag,
306449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
307449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
308449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
309449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> pos);
310449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPosTextH, kDraw_Tag|kHasText_Tag,
311449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
312449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
313449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        unsigned byteLength;
314449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y;
315449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkScalar> xpos);
316449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawRRect, kDraw_Tag,
317449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
318449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRRect rrect);
319449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawRect, kDraw_Tag,
320449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
321449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkRect rect);
322449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawText, kDraw_Tag|kHasText_Tag,
323449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
324449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
325449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
326449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar x;
327449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y);
328449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawTextBlob, kDraw_Tag|kHasText_Tag,
329449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
330449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkTextBlob> blob;
331449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar x;
332449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkScalar y);
333449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawTextOnPath, kDraw_Tag|kHasText_Tag,
334449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
335449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<char> text;
336449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        size_t byteLength;
337449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PreCachedPath path;
338449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        TypedMatrix matrix);
339449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawPatch, kDraw_Tag,
340449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
341449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> cubics;
342449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
343449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> texCoords;
344449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<SkXfermode> xmode);
345449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawAtlas, kDraw_Tag|kHasImage_Tag,
346449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkPaint> paint;
347449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<const SkImage> atlas;
348449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkRSXform> xforms;
349449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkRect> texs;
350449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
351449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int count;
352449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkXfermode::Mode mode;
353449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        Optional<SkRect> cull);
354449d9b7e2d1b2e20963f18639c6e541ef953f069mtkleinRECORD(DrawVertices, kDraw_Tag,
355449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkPaint paint;
356449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        SkCanvas::VertexMode vmode;
357449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int vertexCount;
358449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> vertices;
359449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkPoint> texs;
360449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<SkColor> colors;
361449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        RefBox<SkXfermode> xmode;
362449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        PODArray<uint16_t> indices;
363449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein        int indexCount);
364f70b531daaf47db1ee95c70da9843f1dd1f418d3reedRECORD(DrawAnnotation, 0,
365f70b531daaf47db1ee95c70da9843f1dd1f418d3reed       SkRect rect;
366f70b531daaf47db1ee95c70da9843f1dd1f418d3reed       SkString key;
367f70b531daaf47db1ee95c70da9843f1dd1f418d3reed       RefBox<SkData> value);
368449d9b7e2d1b2e20963f18639c6e541ef953f069mtklein#undef RECORD
369e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
370e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}  // namespace SkRecords
371e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
372e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#endif//SkRecords_DEFINED
373