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#include "SkRecorder.h"
9b3c9d1c33caf325aada244204215eb790c228c12dandov#include "SkPatchUtils.h"
10e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#include "SkPicture.h"
11e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
12e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// SkCanvas will fail in mysterious ways if it doesn't know the real width and height.
13a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.orgSkRecorder::SkRecorder(SkRecord* record, int width, int height)
14d954498c01ccf0417feacf89e45d0c62a06a813breed    : SkCanvas(width, height, SkCanvas::kConservativeRasterClip_InitFlag)
1529dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    , fRecord(record)
1629dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    , fSaveLayerCount(0) {}
17e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
18732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.orgvoid SkRecorder::forgetRecord() {
19732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org    fRecord = NULL;
20732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org}
21732bd66ac2aea4bacd1e7e8f33628f7efb50f1d0commit-bot@chromium.org
22e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// To make appending to fRecord a little less verbose.
23e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org#define APPEND(T, ...) \
24e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org        SkNEW_PLACEMENT_ARGS(fRecord->append<SkRecords::T>(), SkRecords::T, (__VA_ARGS__))
25e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
26a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org// For methods which must call back into SkCanvas.
27a095041f5148dd1e71f38d0546335ed94199104bcommit-bot@chromium.org#define INHERITED(method, ...) this->SkCanvas::method(__VA_ARGS__)
28d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org
29e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// The structs we're creating all copy their constructor arguments.  Given the way the SkRecords
30e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// framework works, sometimes they happen to technically be copied twice, which is fine and elided
31e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// into a single copy unless the class has a non-trivial copy constructor.  For classes with
32e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// non-trivial copy constructors, we skip the first copy (and its destruction) by wrapping the value
33e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// with delay_copy(), forcing the argument to be passed by const&.
34e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org//
35e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// This is used below for SkBitmap, SkPaint, SkPath, and SkRegion, which all have non-trivial copy
36e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// constructors and destructors.  You'll know you've got a good candidate T if you see ~T() show up
37e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// unexpectedly on a profile of record time.  Otherwise don't bother.
38e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgtemplate <typename T>
39e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgclass Reference {
40e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgpublic:
41e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    Reference(const T& x) : fX(x) {}
42e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    operator const T&() const { return fX; }
43e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgprivate:
44e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    const T& fX;
45e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org};
46e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
47e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgtemplate <typename T>
48e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgstatic Reference<T> delay_copy(const T& x) { return Reference<T>(x); }
49e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
50e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Use copy() only for optional arguments, to be copied if present or skipped if not.
51e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// (For most types we just pass by value and let copy constructors do their thing.)
52e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgtemplate <typename T>
53e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgT* SkRecorder::copy(const T* src) {
54e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    if (NULL == src) {
55e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org        return NULL;
56e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    }
57e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    return SkNEW_PLACEMENT_ARGS(fRecord->alloc<T>(), T, (*src));
58e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
59e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
60e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// This copy() is for arrays.
61e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// It will work with POD or non-POD, though currently we only use it for POD.
62e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgtemplate <typename T>
632347b624678fedf1d2f7ab1d79b9ad70087c3392reedT* SkRecorder::copy(const T src[], size_t count) {
64e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    if (NULL == src) {
65e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org        return NULL;
66e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    }
67e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    T* dst = fRecord->alloc<T>(count);
682347b624678fedf1d2f7ab1d79b9ad70087c3392reed    for (size_t i = 0; i < count; i++) {
69e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org        SkNEW_PLACEMENT_ARGS(dst + i, T, (src[i]));
70e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    }
71e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    return dst;
72e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
73e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
74e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// Specialization for copying strings, using memcpy.
75e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// This measured around 2x faster for copying code points,
76e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org// but I found no corresponding speedup for other arrays.
77e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgtemplate <>
782347b624678fedf1d2f7ab1d79b9ad70087c3392reedchar* SkRecorder::copy(const char src[], size_t count) {
79e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    if (NULL == src) {
80e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org        return NULL;
81e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    }
82e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    char* dst = fRecord->alloc<char>(count);
83e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    memcpy(dst, src, count);
84e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    return dst;
85e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
86e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
875f0e82204ecca0805a7689cdba5f802458e103f4mtklein// As above, assuming and copying a terminating \0.
885f0e82204ecca0805a7689cdba5f802458e103f4mtkleintemplate <>
895f0e82204ecca0805a7689cdba5f802458e103f4mtkleinchar* SkRecorder::copy(const char* src) {
905f0e82204ecca0805a7689cdba5f802458e103f4mtklein    return this->copy(src, strlen(src)+1);
915f0e82204ecca0805a7689cdba5f802458e103f4mtklein}
925f0e82204ecca0805a7689cdba5f802458e103f4mtklein
935f0e82204ecca0805a7689cdba5f802458e103f4mtklein
94e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::clear(SkColor color) {
95e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    APPEND(Clear, color);
96e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
97e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
98e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawPaint(const SkPaint& paint) {
99e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    APPEND(DrawPaint, delay_copy(paint));
100e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
101e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
102e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawPoints(PointMode mode,
103e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                            size_t count,
104e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                            const SkPoint pts[],
105e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                            const SkPaint& paint) {
10637f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org    APPEND(DrawPoints, delay_copy(paint), mode, count, this->copy(pts, count));
107e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
108e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
109e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawRect(const SkRect& rect, const SkPaint& paint) {
11037f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org    APPEND(DrawRect, delay_copy(paint), rect);
111e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
112e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
113e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawOval(const SkRect& oval, const SkPaint& paint) {
11437f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org    APPEND(DrawOval, delay_copy(paint), oval);
115e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
116e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
117e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawRRect(const SkRRect& rrect, const SkPaint& paint) {
11837f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org    APPEND(DrawRRect, delay_copy(paint), rrect);
119e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
120e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
121d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.orgvoid SkRecorder::onDrawDRRect(const SkRRect& outer, const SkRRect& inner, const SkPaint& paint) {
12237f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org    APPEND(DrawDRRect, delay_copy(paint), outer, inner);
123d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org}
124d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org
125e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawPath(const SkPath& path, const SkPaint& paint) {
12637f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org    APPEND(DrawPath, delay_copy(paint), delay_copy(path));
127e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
128e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
129e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawBitmap(const SkBitmap& bitmap,
130e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                            SkScalar left,
131e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                            SkScalar top,
132e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                            const SkPaint* paint) {
13337f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org    APPEND(DrawBitmap, this->copy(paint), delay_copy(bitmap), left, top);
134e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
135e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
136e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawBitmapRectToRect(const SkBitmap& bitmap,
137e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                                      const SkRect* src,
138e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                                      const SkRect& dst,
139e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                                      const SkPaint* paint,
140e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                                      DrawBitmapRectFlags flags) {
141e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    APPEND(DrawBitmapRectToRect,
14237f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           this->copy(paint), delay_copy(bitmap), this->copy(src), dst, flags);
143e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
144e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
145e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawBitmapMatrix(const SkBitmap& bitmap,
146e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                                  const SkMatrix& matrix,
147e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                                  const SkPaint* paint) {
14837f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org    APPEND(DrawBitmapMatrix, this->copy(paint), delay_copy(bitmap), matrix);
149e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
150e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
151e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawBitmapNine(const SkBitmap& bitmap,
152e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                                const SkIRect& center,
153e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                                const SkRect& dst,
154e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                                const SkPaint* paint) {
15537f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org    APPEND(DrawBitmapNine, this->copy(paint), delay_copy(bitmap), center, dst);
156e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
157e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
158e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawSprite(const SkBitmap& bitmap, int left, int top, const SkPaint* paint) {
15937f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org    APPEND(DrawSprite, this->copy(paint), delay_copy(bitmap), left, top);
160e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
161e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
162e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkRecorder::onDrawText(const void* text, size_t byteLength,
163e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                            SkScalar x, SkScalar y, const SkPaint& paint) {
164e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    APPEND(DrawText,
16537f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           delay_copy(paint), this->copy((const char*)text, byteLength), byteLength, x, y);
166e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
167e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
168e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkRecorder::onDrawPosText(const void* text, size_t byteLength,
169e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                               const SkPoint pos[], const SkPaint& paint) {
170e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    const unsigned points = paint.countText(text, byteLength);
171e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    APPEND(DrawPosText,
17237f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           delay_copy(paint),
17337f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           this->copy((const char*)text, byteLength),
17437f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           byteLength,
17537f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           this->copy(pos, points));
176e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
177e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
178e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkRecorder::onDrawPosTextH(const void* text, size_t byteLength,
179e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                                const SkScalar xpos[], SkScalar constY, const SkPaint& paint) {
180e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    const unsigned points = paint.countText(text, byteLength);
181e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    APPEND(DrawPosTextH,
18237f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           delay_copy(paint),
18337f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           this->copy((const char*)text, byteLength),
18437f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           byteLength,
18537f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           this->copy(xpos, points),
18637f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           constY);
187e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
188e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
189e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.comvoid SkRecorder::onDrawTextOnPath(const void* text, size_t byteLength, const SkPath& path,
190e0d9ce890e67d02727ac2811bb456ddb64f827d4reed@google.com                                  const SkMatrix* matrix, const SkPaint& paint) {
191e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    APPEND(DrawTextOnPath,
19237f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           delay_copy(paint),
19337f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           this->copy((const char*)text, byteLength),
19437f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           byteLength,
19537f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           delay_copy(path),
19637f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org           this->copy(matrix));
197e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
198e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
19900d5c2c6523321d25b32905ff4822f083a4173eefmalitavoid SkRecorder::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y,
20000d5c2c6523321d25b32905ff4822f083a4173eefmalita                                const SkPaint& paint) {
20100d5c2c6523321d25b32905ff4822f083a4173eefmalita    APPEND(DrawTextBlob, delay_copy(paint), blob, x, y);
20200d5c2c6523321d25b32905ff4822f083a4173eefmalita}
20300d5c2c6523321d25b32905ff4822f083a4173eefmalita
204d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reedvoid SkRecorder::onDrawPicture(const SkPicture* pic, const SkMatrix* matrix, const SkPaint* paint) {
205d5fa1a455aad61f3e99081fe7a9b065cb3b115c6reed    APPEND(DrawPicture, this->copy(paint), pic, this->copy(matrix));
206e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
207e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
208e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::drawVertices(VertexMode vmode,
209e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                              int vertexCount, const SkPoint vertices[],
210e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                              const SkPoint texs[], const SkColor colors[],
211e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                              SkXfermode* xmode,
212e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                              const uint16_t indices[], int indexCount, const SkPaint& paint) {
21337f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org    APPEND(DrawVertices, delay_copy(paint),
21437f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org                         vmode,
215e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                         vertexCount,
216e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                         this->copy(vertices, vertexCount),
217e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                         texs ? this->copy(texs, vertexCount) : NULL,
218e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                         colors ? this->copy(colors, vertexCount) : NULL,
219e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                         xmode,
220e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                         this->copy(indices, indexCount),
22137f6e62f114b72d34bcd3140b16b3b30fe5750c8commit-bot@chromium.org                         indexCount);
222e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
223e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
224b3c9d1c33caf325aada244204215eb790c228c12dandovvoid SkRecorder::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4],
225b3c9d1c33caf325aada244204215eb790c228c12dandov                             const SkPoint texCoords[4], SkXfermode* xmode, const SkPaint& paint) {
226b3c9d1c33caf325aada244204215eb790c228c12dandov    APPEND(DrawPatch, delay_copy(paint),
227b3c9d1c33caf325aada244204215eb790c228c12dandov           cubics ? this->copy(cubics, SkPatchUtils::kNumCtrlPts) : NULL,
228b3c9d1c33caf325aada244204215eb790c228c12dandov           colors ? this->copy(colors, SkPatchUtils::kNumCorners) : NULL,
229b3c9d1c33caf325aada244204215eb790c228c12dandov           texCoords ? this->copy(texCoords, SkPatchUtils::kNumCorners) : NULL,
230b3c9d1c33caf325aada244204215eb790c228c12dandov           xmode);
231963137b75c0a1fe91f35e9826742f36309f5e65ddandov}
232963137b75c0a1fe91f35e9826742f36309f5e65ddandov
2335f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malitavoid SkRecorder::willSave() {
23429dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    fSaveIsSaveLayer.push(false);
2355f6102d07982043542343ff0a6c67b1319ac9fc7Florin Malita    APPEND(Save);
236e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
237e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
238e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgSkCanvas::SaveLayerStrategy SkRecorder::willSaveLayer(const SkRect* bounds,
239e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                                                      const SkPaint* paint,
240e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org                                                      SkCanvas::SaveFlags flags) {
24129dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    fSaveLayerCount++;
24229dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    fSaveIsSaveLayer.push(true);
243e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    APPEND(SaveLayer, this->copy(bounds), this->copy(paint), flags);
244e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    return SkCanvas::kNoLayer_SaveLayerStrategy;
245e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
246e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
2476cfa73a29a26edf1d03bca224ad6860396308ffcmtkleinvoid SkRecorder::didRestore() {
24829dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    SkBool8 saveLayer;
24929dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    fSaveIsSaveLayer.pop(&saveLayer);
25029dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    if (saveLayer) {
25129dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein        fSaveLayerCount--;
25229dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    }
253a723b576aed31a6eb2bdda6388e6bd779d04c6b0mtklein    APPEND(Restore, this->devBounds(), this->getTotalMatrix());
254e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
255e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
25603a99b8f96b56d3349fa7b6832638e3b9830d169commit-bot@chromium.orgvoid SkRecorder::onPushCull(const SkRect& rect) {
25788c3e279ab79125e5741b0b0b3175291e2e2bbeecommit-bot@chromium.org    APPEND(PushCull, rect);
25803a99b8f96b56d3349fa7b6832638e3b9830d169commit-bot@chromium.org}
25903a99b8f96b56d3349fa7b6832638e3b9830d169commit-bot@chromium.org
26003a99b8f96b56d3349fa7b6832638e3b9830d169commit-bot@chromium.orgvoid SkRecorder::onPopCull() {
26103a99b8f96b56d3349fa7b6832638e3b9830d169commit-bot@chromium.org    APPEND(PopCull);
26203a99b8f96b56d3349fa7b6832638e3b9830d169commit-bot@chromium.org}
26303a99b8f96b56d3349fa7b6832638e3b9830d169commit-bot@chromium.org
264e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::didConcat(const SkMatrix& matrix) {
2656332f1dd20d73a6d8b9564af7c27d09394eb6596mtklein    this->didSetMatrix(this->getTotalMatrix());
266e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
267e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
268e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::didSetMatrix(const SkMatrix& matrix) {
26946bc6217ca41178c357a68be2869b8b2f6defe47mtklein    SkDEVCODE(if (matrix != this->getTotalMatrix()) {
270ec924b9696277df4c684e73315194482e1d43e50mtklein        matrix.dump();
271ec924b9696277df4c684e73315194482e1d43e50mtklein        this->getTotalMatrix().dump();
272ec924b9696277df4c684e73315194482e1d43e50mtklein        SkASSERT(matrix == this->getTotalMatrix());
273ec924b9696277df4c684e73315194482e1d43e50mtklein    })
274e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org    APPEND(SetMatrix, matrix);
275e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
276e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
277e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::onClipRect(const SkRect& rect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
278d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org    INHERITED(onClipRect, rect, op, edgeStyle);
279a723b576aed31a6eb2bdda6388e6bd779d04c6b0mtklein    APPEND(ClipRect, this->devBounds(), rect, op, edgeStyle == kSoft_ClipEdgeStyle);
280e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
281e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
282e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::onClipRRect(const SkRRect& rrect, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
283d954498c01ccf0417feacf89e45d0c62a06a813breed    INHERITED(onClipRRect, rrect, op, edgeStyle);
284a723b576aed31a6eb2bdda6388e6bd779d04c6b0mtklein    APPEND(ClipRRect, this->devBounds(), rrect, op, edgeStyle == kSoft_ClipEdgeStyle);
285e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
286e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
287e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::onClipPath(const SkPath& path, SkRegion::Op op, ClipEdgeStyle edgeStyle) {
288d954498c01ccf0417feacf89e45d0c62a06a813breed    INHERITED(onClipPath, path, op, edgeStyle);
289a723b576aed31a6eb2bdda6388e6bd779d04c6b0mtklein    APPEND(ClipPath, this->devBounds(), delay_copy(path), op, edgeStyle == kSoft_ClipEdgeStyle);
290e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
291e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org
292e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.orgvoid SkRecorder::onClipRegion(const SkRegion& deviceRgn, SkRegion::Op op) {
293d9ce2be6b24b1c89d13c2edb63c3462b0f5c6aa3commit-bot@chromium.org    INHERITED(onClipRegion, deviceRgn, op);
294a723b576aed31a6eb2bdda6388e6bd779d04c6b0mtklein    APPEND(ClipRegion, this->devBounds(), delay_copy(deviceRgn), op);
295e3ff558a4baf4cb924e7513a81c8073ddae385fccommit-bot@chromium.org}
2965f0e82204ecca0805a7689cdba5f802458e103f4mtklein
2975f0e82204ecca0805a7689cdba5f802458e103f4mtkleinvoid SkRecorder::beginCommentGroup(const char* description) {
2985f0e82204ecca0805a7689cdba5f802458e103f4mtklein    APPEND(BeginCommentGroup, this->copy(description));
2995f0e82204ecca0805a7689cdba5f802458e103f4mtklein}
3005f0e82204ecca0805a7689cdba5f802458e103f4mtklein
3015f0e82204ecca0805a7689cdba5f802458e103f4mtkleinvoid SkRecorder::addComment(const char* key, const char* value) {
3025f0e82204ecca0805a7689cdba5f802458e103f4mtklein    APPEND(AddComment, this->copy(key), this->copy(value));
3035f0e82204ecca0805a7689cdba5f802458e103f4mtklein}
3045f0e82204ecca0805a7689cdba5f802458e103f4mtklein
3055f0e82204ecca0805a7689cdba5f802458e103f4mtkleinvoid SkRecorder::endCommentGroup() {
3065f0e82204ecca0805a7689cdba5f802458e103f4mtklein    APPEND(EndCommentGroup);
3075f0e82204ecca0805a7689cdba5f802458e103f4mtklein}
30829dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein
30929dfaa80f5776904f42b72b387a99e75f8dc5f5fmtkleinbool SkRecorder::isDrawingToLayer() const {
31029dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    return fSaveLayerCount > 0;
31129dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein}
31229dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein
31329dfaa80f5776904f42b72b387a99e75f8dc5f5fmtkleinvoid SkRecorder::drawData(const void* data, size_t length) {
31429dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein    APPEND(DrawData, copy((const char*)data), length);
31529dfaa80f5776904f42b72b387a99e75f8dc5f5fmtklein}
316