OLD | NEW |
1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "sky/engine/config.h" | 5 #include "sky/engine/config.h" |
6 #include "sky/engine/core/painting/PictureRecorder.h" | 6 #include "sky/engine/core/painting/PictureRecorder.h" |
7 | 7 |
8 #include "sky/engine/core/dom/Document.h" | 8 #include "sky/engine/core/dom/Document.h" |
9 #include "sky/engine/core/dom/Element.h" | 9 #include "sky/engine/core/dom/Element.h" |
10 #include "sky/engine/core/painting/PaintingTasks.h" | 10 #include "sky/engine/core/painting/PaintingTasks.h" |
11 #include "sky/engine/platform/geometry/IntRect.h" | 11 #include "sky/engine/platform/geometry/IntRect.h" |
12 #include "third_party/skia/include/core/SkCanvas.h" | 12 #include "third_party/skia/include/core/SkCanvas.h" |
13 | 13 |
14 namespace blink { | 14 namespace blink { |
15 | 15 |
| 16 SkRect toSkRect(const Vector<float>& rect) |
| 17 { |
| 18 ASSERT(rect.size() == 4); |
| 19 SkRect sk_rect; |
| 20 sk_rect.set(rect[0], rect[1], rect[2], rect[3]); |
| 21 return sk_rect; |
| 22 } |
| 23 |
16 Canvas::Canvas(const FloatSize& size) | 24 Canvas::Canvas(const FloatSize& size) |
17 : m_size(size) | 25 : m_size(size) |
18 { | 26 { |
19 m_displayList = adoptRef(new DisplayList); | 27 m_displayList = adoptRef(new DisplayList); |
20 m_canvas = m_displayList->beginRecording(expandedIntSize(m_size)); | 28 m_canvas = m_displayList->beginRecording(expandedIntSize(m_size)); |
21 } | 29 } |
22 | 30 |
23 Canvas::~Canvas() | 31 Canvas::~Canvas() |
24 { | 32 { |
25 } | 33 } |
26 | 34 |
27 void Canvas::drawCircle(double x, double y, double radius, Paint* paint) | 35 void Canvas::save() |
28 { | 36 { |
29 if (!m_canvas) | 37 if (!m_canvas) |
30 return; | 38 return; |
| 39 ASSERT(m_displayList->isRecording()); |
| 40 m_canvas->save(); |
| 41 } |
| 42 |
| 43 void Canvas::saveLayer(const Vector<float>& bounds, const Paint* paint) |
| 44 { |
| 45 if (!m_canvas) |
| 46 return; |
| 47 ASSERT(m_displayList->isRecording()); |
| 48 SkRect sk_bounds; |
| 49 if (!bounds.isEmpty()) |
| 50 sk_bounds = toSkRect(bounds); |
| 51 m_canvas->saveLayer(!bounds.isEmpty() ? &sk_bounds : nullptr, |
| 52 paint ? &paint->paint() : nullptr); |
| 53 } |
| 54 |
| 55 void Canvas::restore() |
| 56 { |
| 57 if (!m_canvas) |
| 58 return; |
| 59 ASSERT(m_displayList->isRecording()); |
| 60 m_canvas->restore(); |
| 61 } |
| 62 |
| 63 void Canvas::translate(float dx, float dy) |
| 64 { |
| 65 if (!m_canvas) |
| 66 return; |
| 67 ASSERT(m_displayList->isRecording()); |
| 68 m_canvas->translate(dx, dy); |
| 69 } |
| 70 |
| 71 void Canvas::scale(float sx, float sy) |
| 72 { |
| 73 if (!m_canvas) |
| 74 return; |
| 75 ASSERT(m_displayList->isRecording()); |
| 76 m_canvas->scale(sx, sy); |
| 77 } |
| 78 |
| 79 void Canvas::rotateDegrees(float degrees) |
| 80 { |
| 81 if (!m_canvas) |
| 82 return; |
| 83 ASSERT(m_displayList->isRecording()); |
| 84 m_canvas->rotate(degrees); |
| 85 } |
| 86 |
| 87 void Canvas::skew(float sx, float sy) |
| 88 { |
| 89 if (!m_canvas) |
| 90 return; |
| 91 ASSERT(m_displayList->isRecording()); |
| 92 m_canvas->skew(sx, sy); |
| 93 } |
| 94 |
| 95 void Canvas::concat(const Vector<float>& matrix) |
| 96 { |
| 97 if (!m_canvas) |
| 98 return; |
| 99 ASSERT(m_displayList->isRecording()); |
| 100 ASSERT(matrix.size() == 9); |
| 101 SkMatrix sk_matrix; |
| 102 sk_matrix.set9(matrix.data()); |
| 103 m_canvas->concat(sk_matrix); |
| 104 } |
| 105 |
| 106 void Canvas::clipRect(const Vector<float>& rect) |
| 107 { |
| 108 if (!m_canvas) |
| 109 return; |
| 110 ASSERT(m_displayList->isRecording()); |
| 111 m_canvas->clipRect(toSkRect(rect)); |
| 112 } |
| 113 |
| 114 void Canvas::drawPaint(Paint* paint) |
| 115 { |
| 116 if (!m_canvas) |
| 117 return; |
| 118 ASSERT(paint); |
| 119 ASSERT(m_displayList->isRecording()); |
| 120 m_canvas->drawPaint(paint->paint()); |
| 121 } |
| 122 |
| 123 void Canvas::drawRect(const Vector<float>& rect, const Paint* paint) |
| 124 { |
| 125 if (!m_canvas) |
| 126 return; |
| 127 ASSERT(paint); |
| 128 ASSERT(m_displayList->isRecording()); |
| 129 m_canvas->drawRect(toSkRect(rect), paint->paint()); |
| 130 } |
| 131 |
| 132 void Canvas::drawOval(const Vector<float>& rect, const Paint* paint) |
| 133 { |
| 134 if (!m_canvas) |
| 135 return; |
| 136 ASSERT(paint); |
| 137 ASSERT(m_displayList->isRecording()); |
| 138 m_canvas->drawOval(toSkRect(rect), paint->paint()); |
| 139 } |
| 140 |
| 141 void Canvas::drawCircle(float x, float y, float radius, Paint* paint) |
| 142 { |
| 143 if (!m_canvas) |
| 144 return; |
31 ASSERT(paint); | 145 ASSERT(paint); |
32 ASSERT(m_displayList->isRecording()); | 146 ASSERT(m_displayList->isRecording()); |
33 m_canvas->drawCircle(x, y, radius, paint->paint()); | 147 m_canvas->drawCircle(x, y, radius, paint->paint()); |
34 } | 148 } |
35 | 149 |
36 PassRefPtr<DisplayList> Canvas::finishRecording() | 150 PassRefPtr<DisplayList> Canvas::finishRecording() |
37 { | 151 { |
38 if (!isRecording()) | 152 if (!isRecording()) |
39 return nullptr; | 153 return nullptr; |
40 m_canvas = nullptr; | 154 m_canvas = nullptr; |
41 m_displayList->endRecording(); | 155 m_displayList->endRecording(); |
42 return m_displayList.release(); | 156 return m_displayList.release(); |
43 } | 157 } |
44 | 158 |
45 } // namespace blink | 159 } // namespace blink |
OLD | NEW |