| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2015 Google Inc. | 2 * Copyright 2015 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "SkCanvas.h" | 8 #include "SkCanvas.h" |
| 9 #include "SkLazyPtr.h" | 9 #include "SkLazyPtr.h" |
| 10 #include "SkMiniRecorder.h" | 10 #include "SkMiniRecorder.h" |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 65 } | 65 } |
| 66 SkASSERT(fState == State::kEmpty); | 66 SkASSERT(fState == State::kEmpty); |
| 67 } | 67 } |
| 68 | 68 |
| 69 #define TRY_TO_STORE(Type, ...) \ | 69 #define TRY_TO_STORE(Type, ...) \ |
| 70 if (fState != State::kEmpty) { return false; } \ | 70 if (fState != State::kEmpty) { return false; } \ |
| 71 fState = State::k##Type; \ | 71 fState = State::k##Type; \ |
| 72 new (fBuffer.get()) Type(__VA_ARGS__); \ | 72 new (fBuffer.get()) Type(__VA_ARGS__); \ |
| 73 return true | 73 return true |
| 74 | 74 |
| 75 bool SkMiniRecorder::drawBitmapRectToRect(const SkBitmap& bm, const SkRect* src,
const SkRect& dst, | 75 bool SkMiniRecorder::drawBitmapRect(const SkBitmap& bm, const SkRect* src, const
SkRect& dst, |
| 76 const SkPaint* p, SkCanvas::DrawBitmap
RectFlags flags) { | 76 const SkPaint* p, SkCanvas::SrcRectConstrain
t constraint) { |
| 77 SkRect bounds; | 77 SkRect bounds; |
| 78 if (!src) { | 78 if (!src) { |
| 79 bm.getBounds(&bounds); | 79 bm.getBounds(&bounds); |
| 80 src = &bounds; | 80 src = &bounds; |
| 81 } | 81 } |
| 82 SkTLazy<SkPaint> defaultPaint; | 82 SkTLazy<SkPaint> defaultPaint; |
| 83 if (!p) { | 83 if (!p) { |
| 84 p = defaultPaint.init(); | 84 p = defaultPaint.init(); |
| 85 } | 85 } |
| 86 TRY_TO_STORE(DrawBitmapRectToRectFixedSize, *p, bm, *src, dst, flags); | 86 TRY_TO_STORE(DrawBitmapRectFixedSize, *p, bm, *src, dst, constraint); |
| 87 } | 87 } |
| 88 | 88 |
| 89 bool SkMiniRecorder::drawRect(const SkRect& rect, const SkPaint& paint) { | 89 bool SkMiniRecorder::drawRect(const SkRect& rect, const SkPaint& paint) { |
| 90 TRY_TO_STORE(DrawRect, paint, rect); | 90 TRY_TO_STORE(DrawRect, paint, rect); |
| 91 } | 91 } |
| 92 | 92 |
| 93 bool SkMiniRecorder::drawPath(const SkPath& path, const SkPaint& paint) { | 93 bool SkMiniRecorder::drawPath(const SkPath& path, const SkPaint& paint) { |
| 94 TRY_TO_STORE(DrawPath, paint, path); | 94 TRY_TO_STORE(DrawPath, paint, path); |
| 95 } | 95 } |
| 96 | 96 |
| 97 bool SkMiniRecorder::drawTextBlob(const SkTextBlob* b, SkScalar x, SkScalar y, c
onst SkPaint& p) { | 97 bool SkMiniRecorder::drawTextBlob(const SkTextBlob* b, SkScalar x, SkScalar y, c
onst SkPaint& p) { |
| 98 TRY_TO_STORE(DrawTextBlob, p, b, x, y); | 98 TRY_TO_STORE(DrawTextBlob, p, b, x, y); |
| 99 } | 99 } |
| 100 #undef TRY_TO_STORE | 100 #undef TRY_TO_STORE |
| 101 | 101 |
| 102 | 102 |
| 103 SkPicture* SkMiniRecorder::detachAsPicture(const SkRect& cull) { | 103 SkPicture* SkMiniRecorder::detachAsPicture(const SkRect& cull) { |
| 104 #define CASE(Type) \ | 104 #define CASE(Type) \ |
| 105 case State::k##Type: \ | 105 case State::k##Type: \ |
| 106 fState = State::kEmpty; \ | 106 fState = State::kEmpty; \ |
| 107 return SkNEW_ARGS(SkMiniPicture<Type>, (cull, reinterpret_cast<Type*>(fB
uffer.get()))) | 107 return SkNEW_ARGS(SkMiniPicture<Type>, (cull, reinterpret_cast<Type*>(fB
uffer.get()))) |
| 108 | 108 |
| 109 switch (fState) { | 109 switch (fState) { |
| 110 case State::kEmpty: return SkRef(gEmptyPicture.get()); | 110 case State::kEmpty: return SkRef(gEmptyPicture.get()); |
| 111 CASE(DrawBitmapRectToRectFixedSize); | 111 CASE(DrawBitmapRectFixedSize); |
| 112 CASE(DrawPath); | 112 CASE(DrawPath); |
| 113 CASE(DrawRect); | 113 CASE(DrawRect); |
| 114 CASE(DrawTextBlob); | 114 CASE(DrawTextBlob); |
| 115 } | 115 } |
| 116 SkASSERT(false); | 116 SkASSERT(false); |
| 117 return nullptr; | 117 return nullptr; |
| 118 #undef CASE | 118 #undef CASE |
| 119 } | 119 } |
| 120 | 120 |
| 121 void SkMiniRecorder::flushAndReset(SkCanvas* canvas) { | 121 void SkMiniRecorder::flushAndReset(SkCanvas* canvas) { |
| 122 #define CASE(Type) \ | 122 #define CASE(Type) \ |
| 123 case State::k##Type: { \ | 123 case State::k##Type: { \ |
| 124 fState = State::kEmpty; \ | 124 fState = State::kEmpty; \ |
| 125 Type* op = reinterpret_cast<Type*>(fBuffer.get()); \ | 125 Type* op = reinterpret_cast<Type*>(fBuffer.get()); \ |
| 126 SkRecords::Draw(canvas, nullptr, nullptr, 0, nullptr)(*op); \ | 126 SkRecords::Draw(canvas, nullptr, nullptr, 0, nullptr)(*op); \ |
| 127 op->~Type(); \ | 127 op->~Type(); \ |
| 128 } return | 128 } return |
| 129 | 129 |
| 130 switch (fState) { | 130 switch (fState) { |
| 131 case State::kEmpty: return; | 131 case State::kEmpty: return; |
| 132 CASE(DrawBitmapRectToRectFixedSize); | 132 CASE(DrawBitmapRectFixedSize); |
| 133 CASE(DrawPath); | 133 CASE(DrawPath); |
| 134 CASE(DrawRect); | 134 CASE(DrawRect); |
| 135 CASE(DrawTextBlob); | 135 CASE(DrawTextBlob); |
| 136 } | 136 } |
| 137 SkASSERT(false); | 137 SkASSERT(false); |
| 138 #undef CASE | 138 #undef CASE |
| 139 } | 139 } |
| OLD | NEW |