Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(777)

Side by Side Diff: sky/engine/core/painting/Canvas.cpp

Issue 1190123003: Decouple Canvas from DisplayList and map Picture and PictureRecorder more directly to their Skia co… (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
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 "math.h" 5 #include "math.h"
6 6
7 #include "sky/engine/config.h" 7 #include "sky/engine/config.h"
8 #include "sky/engine/core/painting/Canvas.h" 8 #include "sky/engine/core/painting/Canvas.h"
9 9
10 #include "sky/engine/core/dom/Document.h" 10 #include "sky/engine/core/dom/Document.h"
11 #include "sky/engine/core/dom/Element.h" 11 #include "sky/engine/core/dom/Element.h"
12 #include "sky/engine/core/painting/CanvasImage.h" 12 #include "sky/engine/core/painting/CanvasImage.h"
13 #include "sky/engine/core/painting/PaintingTasks.h" 13 #include "sky/engine/core/painting/PaintingTasks.h"
14 #include "sky/engine/platform/geometry/IntRect.h" 14 #include "sky/engine/platform/geometry/IntRect.h"
15 #include "third_party/skia/include/core/SkCanvas.h" 15 #include "third_party/skia/include/core/SkCanvas.h"
16 #include "third_party/skia/include/core/SkBitmap.h" 16 #include "third_party/skia/include/core/SkBitmap.h"
17 17
18 namespace blink { 18 namespace blink {
19 19
20 Canvas::Canvas(const FloatSize& size) 20 Canvas::Canvas(SkCanvas* skCanvas)
21 : m_size(size) 21 : m_canvas(skCanvas)
22 { 22 {
23 m_displayList = adoptRef(new DisplayList);
24 m_canvas = m_displayList->beginRecording(expandedIntSize(m_size));
25 } 23 }
26 24
27 Canvas::~Canvas() 25 Canvas::~Canvas()
28 { 26 {
29 } 27 }
30 28
31 void Canvas::save() 29 void Canvas::save()
32 { 30 {
33 if (!m_canvas) 31 if (!m_canvas)
34 return; 32 return;
35 ASSERT(m_displayList->isRecording()); 33 ASSERT(isRecording());
36 m_canvas->save(); 34 m_canvas->save();
37 } 35 }
38 36
39 void Canvas::saveLayer(const Rect& bounds, const Paint* paint) 37 void Canvas::saveLayer(const Rect& bounds, const Paint* paint)
40 { 38 {
41 if (!m_canvas) 39 if (!m_canvas)
42 return; 40 return;
43 ASSERT(m_displayList->isRecording()); 41 ASSERT(isRecording());
44 m_canvas->saveLayer(!bounds.is_null ? &bounds.sk_rect : nullptr, 42 m_canvas->saveLayer(!bounds.is_null ? &bounds.sk_rect : nullptr,
45 paint ? &paint->paint() : nullptr); 43 paint ? &paint->paint() : nullptr);
46 } 44 }
47 45
48 void Canvas::restore() 46 void Canvas::restore()
49 { 47 {
50 if (!m_canvas) 48 if (!m_canvas)
51 return; 49 return;
52 ASSERT(m_displayList->isRecording()); 50 ASSERT(isRecording());
53 m_canvas->restore(); 51 m_canvas->restore();
54 } 52 }
55 53
56 void Canvas::translate(float dx, float dy) 54 void Canvas::translate(float dx, float dy)
57 { 55 {
58 if (!m_canvas) 56 if (!m_canvas)
59 return; 57 return;
60 ASSERT(m_displayList->isRecording()); 58 ASSERT(isRecording());
61 m_canvas->translate(dx, dy); 59 m_canvas->translate(dx, dy);
62 } 60 }
63 61
64 void Canvas::scale(float sx, float sy) 62 void Canvas::scale(float sx, float sy)
65 { 63 {
66 if (!m_canvas) 64 if (!m_canvas)
67 return; 65 return;
68 ASSERT(m_displayList->isRecording()); 66 ASSERT(isRecording());
69 m_canvas->scale(sx, sy); 67 m_canvas->scale(sx, sy);
70 } 68 }
71 69
72 void Canvas::rotate(float radians) 70 void Canvas::rotate(float radians)
73 { 71 {
74 if (!m_canvas) 72 if (!m_canvas)
75 return; 73 return;
76 ASSERT(m_displayList->isRecording()); 74 ASSERT(isRecording());
77 m_canvas->rotate(radians * 180.0/M_PI); 75 m_canvas->rotate(radians * 180.0/M_PI);
78 } 76 }
79 77
80 void Canvas::skew(float sx, float sy) 78 void Canvas::skew(float sx, float sy)
81 { 79 {
82 if (!m_canvas) 80 if (!m_canvas)
83 return; 81 return;
84 ASSERT(m_displayList->isRecording()); 82 ASSERT(isRecording());
85 m_canvas->skew(sx, sy); 83 m_canvas->skew(sx, sy);
86 } 84 }
87 85
88 void Canvas::concat(const Float32List& matrix4) 86 void Canvas::concat(const Float32List& matrix4)
89 { 87 {
90 if (!m_canvas) 88 if (!m_canvas)
91 return; 89 return;
92 ASSERT(m_displayList->isRecording()); 90 ASSERT(isRecording());
abarth-chromium 2015/06/18 00:03:52 Does this function just check m_canvas for null?
iansf 2015/06/20 00:02:38 Done.
93 ASSERT(matrix4.data()); 91 ASSERT(matrix4.data());
94 92
95 // TODO(mpcomplete): how can we raise an error in this case? 93 // TODO(mpcomplete): how can we raise an error in this case?
96 if (matrix4.num_elements() != 16) 94 if (matrix4.num_elements() != 16)
97 return; 95 return;
98 96
99 SkMatrix sk_matrix; 97 SkMatrix sk_matrix;
100 // Mappings from SkMatrix-index to input-index. 98 // Mappings from SkMatrix-index to input-index.
101 static const int kMappings[] = { 99 static const int kMappings[] = {
102 0, 4, 12, 100 0, 4, 12,
103 1, 5, 13, 101 1, 5, 13,
104 3, 7, 15, 102 3, 7, 15,
105 }; 103 };
106 for (intptr_t i = 0; i < 9; ++i) 104 for (intptr_t i = 0; i < 9; ++i)
107 sk_matrix[i] = matrix4.data()[kMappings[i]]; 105 sk_matrix[i] = matrix4.data()[kMappings[i]];
108 106
109 m_canvas->concat(sk_matrix); 107 m_canvas->concat(sk_matrix);
110 } 108 }
111 109
112 void Canvas::clipRect(const Rect& rect) 110 void Canvas::clipRect(const Rect& rect)
113 { 111 {
114 if (!m_canvas) 112 if (!m_canvas)
115 return; 113 return;
116 ASSERT(m_displayList->isRecording()); 114 ASSERT(isRecording());
117 m_canvas->clipRect(rect.sk_rect); 115 m_canvas->clipRect(rect.sk_rect);
118 } 116 }
119 117
120 void Canvas::clipRRect(const RRect* rrect) 118 void Canvas::clipRRect(const RRect* rrect)
121 { 119 {
122 if (!m_canvas) 120 if (!m_canvas)
123 return; 121 return;
124 ASSERT(m_displayList->isRecording()); 122 ASSERT(isRecording());
125 m_canvas->clipRRect(rrect->rrect()); 123 m_canvas->clipRRect(rrect->rrect());
126 } 124 }
127 125
128 void Canvas::clipPath(const CanvasPath* path) 126 void Canvas::clipPath(const CanvasPath* path)
129 { 127 {
130 if (!m_canvas) 128 if (!m_canvas)
131 return; 129 return;
132 ASSERT(m_displayList->isRecording()); 130 ASSERT(isRecording());
133 m_canvas->clipPath(path->path()); 131 m_canvas->clipPath(path->path());
134 } 132 }
135 133
136 void Canvas::drawLine(float x0, float y0, float x1, float y1, const Paint* paint ) 134 void Canvas::drawLine(float x0, float y0, float x1, float y1, const Paint* paint )
137 { 135 {
138 if (!m_canvas) 136 if (!m_canvas)
139 return; 137 return;
140 ASSERT(paint); 138 ASSERT(paint);
141 ASSERT(m_displayList->isRecording()); 139 ASSERT(isRecording());
142 m_canvas->drawLine(x0, y0, x1, y1, paint->paint()); 140 m_canvas->drawLine(x0, y0, x1, y1, paint->paint());
143 } 141 }
144 142
145 void Canvas::drawPicture(Picture* picture) 143 void Canvas::drawPicture(Picture* picture)
146 { 144 {
147 if (!m_canvas) 145 if (!m_canvas)
148 return; 146 return;
149 ASSERT(picture); 147 ASSERT(picture);
150 ASSERT(m_displayList->isRecording()); 148 ASSERT(isRecording());
151 m_canvas->drawPicture(picture->toSkia()); 149 m_canvas->drawPicture(picture->toSkia());
152 } 150 }
153 151
154 void Canvas::drawPaint(const Paint* paint) 152 void Canvas::drawPaint(const Paint* paint)
155 { 153 {
156 if (!m_canvas) 154 if (!m_canvas)
157 return; 155 return;
158 ASSERT(paint); 156 ASSERT(paint);
159 ASSERT(m_displayList->isRecording()); 157 ASSERT(isRecording());
160 m_canvas->drawPaint(paint->paint()); 158 m_canvas->drawPaint(paint->paint());
161 } 159 }
162 160
163 void Canvas::drawRect(const Rect& rect, const Paint* paint) 161 void Canvas::drawRect(const Rect& rect, const Paint* paint)
164 { 162 {
165 if (!m_canvas) 163 if (!m_canvas)
166 return; 164 return;
167 ASSERT(paint); 165 ASSERT(paint);
168 ASSERT(m_displayList->isRecording()); 166 ASSERT(isRecording());
169 m_canvas->drawRect(rect.sk_rect, paint->paint()); 167 m_canvas->drawRect(rect.sk_rect, paint->paint());
170 } 168 }
171 169
172 void Canvas::drawRRect(const RRect* rrect, const Paint* paint) 170 void Canvas::drawRRect(const RRect* rrect, const Paint* paint)
173 { 171 {
174 if (!m_canvas) 172 if (!m_canvas)
175 return; 173 return;
176 ASSERT(rrect); 174 ASSERT(rrect);
177 ASSERT(paint); 175 ASSERT(paint);
178 ASSERT(m_displayList->isRecording()); 176 ASSERT(isRecording());
179 m_canvas->drawRRect(rrect->rrect(), paint->paint()); 177 m_canvas->drawRRect(rrect->rrect(), paint->paint());
180 } 178 }
181 179
182 void Canvas::drawOval(const Rect& rect, const Paint* paint) 180 void Canvas::drawOval(const Rect& rect, const Paint* paint)
183 { 181 {
184 if (!m_canvas) 182 if (!m_canvas)
185 return; 183 return;
186 ASSERT(paint); 184 ASSERT(paint);
187 ASSERT(m_displayList->isRecording()); 185 ASSERT(isRecording());
188 m_canvas->drawOval(rect.sk_rect, paint->paint()); 186 m_canvas->drawOval(rect.sk_rect, paint->paint());
189 } 187 }
190 188
191 void Canvas::drawCircle(float x, float y, float radius, const Paint* paint) 189 void Canvas::drawCircle(float x, float y, float radius, const Paint* paint)
192 { 190 {
193 if (!m_canvas) 191 if (!m_canvas)
194 return; 192 return;
195 ASSERT(paint); 193 ASSERT(paint);
196 ASSERT(m_displayList->isRecording()); 194 ASSERT(isRecording());
197 m_canvas->drawCircle(x, y, radius, paint->paint()); 195 m_canvas->drawCircle(x, y, radius, paint->paint());
198 } 196 }
199 197
200 void Canvas::drawPath(const CanvasPath* path, const Paint* paint) 198 void Canvas::drawPath(const CanvasPath* path, const Paint* paint)
201 { 199 {
202 if (!m_canvas) 200 if (!m_canvas)
203 return; 201 return;
204 ASSERT(path); 202 ASSERT(path);
205 ASSERT(paint); 203 ASSERT(paint);
206 ASSERT(m_displayList->isRecording()); 204 ASSERT(isRecording());
207 m_canvas->drawPath(path->path(), paint->paint()); 205 m_canvas->drawPath(path->path(), paint->paint());
208 } 206 }
209 207
210 void Canvas::drawImage(const CanvasImage* image, 208 void Canvas::drawImage(const CanvasImage* image,
211 float x, 209 float x,
212 float y, 210 float y,
213 const Paint* paint) { 211 const Paint* paint) {
214 if (!m_canvas) 212 if (!m_canvas)
215 return; 213 return;
216 ASSERT(image); 214 ASSERT(image);
217 ASSERT(m_displayList->isRecording()); 215 ASSERT(isRecording());
218 m_canvas->drawBitmap(image->bitmap(), x, y, &paint->paint()); 216 m_canvas->drawBitmap(image->bitmap(), x, y, &paint->paint());
219 } 217 }
220 218
221 PassRefPtr<DisplayList> Canvas::finishRecording()
222 {
223 if (!isRecording())
224 return nullptr;
225 m_canvas = nullptr;
226 m_displayList->endRecording();
227 return m_displayList.release();
228 }
229
230 } // namespace blink 219 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698