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