OLD | NEW |
1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "platform/graphics/RecordingImageBufferSurface.h" | 5 #include "platform/graphics/RecordingImageBufferSurface.h" |
6 | 6 |
7 #include "platform/Histogram.h" | 7 #include "platform/Histogram.h" |
8 #include "platform/graphics/CanvasMetrics.h" | 8 #include "platform/graphics/CanvasMetrics.h" |
9 #include "platform/graphics/ExpensiveCanvasHeuristicParameters.h" | 9 #include "platform/graphics/ExpensiveCanvasHeuristicParameters.h" |
10 #include "platform/graphics/GraphicsContext.h" | 10 #include "platform/graphics/GraphicsContext.h" |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
80 } | 80 } |
81 | 81 |
82 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, canvasFallbackHistogra
m, new EnumerationHistogram("Canvas.DisplayListFallbackReason", FallbackReasonCo
unt)); | 82 DEFINE_THREAD_SAFE_STATIC_LOCAL(EnumerationHistogram, canvasFallbackHistogra
m, new EnumerationHistogram("Canvas.DisplayListFallbackReason", FallbackReasonCo
unt)); |
83 canvasFallbackHistogram.count(reason); | 83 canvasFallbackHistogram.count(reason); |
84 | 84 |
85 m_fallbackSurface = m_fallbackFactory->createSurface(size(), getOpacityMode(
), colorSpace()); | 85 m_fallbackSurface = m_fallbackFactory->createSurface(size(), getOpacityMode(
), colorSpace()); |
86 m_fallbackSurface->setImageBuffer(m_imageBuffer); | 86 m_fallbackSurface->setImageBuffer(m_imageBuffer); |
87 | 87 |
88 if (m_previousFrame) { | 88 if (m_previousFrame) { |
89 m_previousFrame->playback(m_fallbackSurface->canvas()); | 89 m_previousFrame->playback(m_fallbackSurface->canvas()); |
90 m_previousFrame.clear(); | 90 m_previousFrame.reset(); |
91 } | 91 } |
92 | 92 |
93 if (m_currentFrame) { | 93 if (m_currentFrame) { |
94 m_currentFrame->finishRecordingAsPicture()->playback(m_fallbackSurface->
canvas()); | 94 m_currentFrame->finishRecordingAsPicture()->playback(m_fallbackSurface->
canvas()); |
95 m_currentFrame.reset(); | 95 m_currentFrame.reset(); |
96 } | 96 } |
97 | 97 |
98 if (m_imageBuffer) { | 98 if (m_imageBuffer) { |
99 m_imageBuffer->resetCanvas(m_fallbackSurface->canvas()); | 99 m_imageBuffer->resetCanvas(m_fallbackSurface->canvas()); |
100 } | 100 } |
(...skipping 28 matching lines...) Expand all Loading... |
129 return RecordingImageBufferSurface::FallbackReasonSnapshotForUnitTests; | 129 return RecordingImageBufferSurface::FallbackReasonSnapshotForUnitTests; |
130 case SnapshotReasonGetCopiedImage: | 130 case SnapshotReasonGetCopiedImage: |
131 return RecordingImageBufferSurface::FallbackReasonSnapshotGetCopiedImage
; | 131 return RecordingImageBufferSurface::FallbackReasonSnapshotGetCopiedImage
; |
132 case SnapshotReasonWebGLDrawImageIntoBuffer: | 132 case SnapshotReasonWebGLDrawImageIntoBuffer: |
133 return RecordingImageBufferSurface::FallbackReasonSnapshotWebGLDrawImage
IntoBuffer; | 133 return RecordingImageBufferSurface::FallbackReasonSnapshotWebGLDrawImage
IntoBuffer; |
134 } | 134 } |
135 ASSERT_NOT_REACHED(); | 135 ASSERT_NOT_REACHED(); |
136 return RecordingImageBufferSurface::FallbackReasonUnknown; | 136 return RecordingImageBufferSurface::FallbackReasonUnknown; |
137 } | 137 } |
138 | 138 |
139 PassRefPtr<SkImage> RecordingImageBufferSurface::newImageSnapshot(AccelerationHi
nt hint, SnapshotReason reason) | 139 sk_sp<SkImage> RecordingImageBufferSurface::newImageSnapshot(AccelerationHint hi
nt, SnapshotReason reason) |
140 { | 140 { |
141 if (!m_fallbackSurface) | 141 if (!m_fallbackSurface) |
142 fallBackToRasterCanvas(snapshotReasonToFallbackReason(reason)); | 142 fallBackToRasterCanvas(snapshotReasonToFallbackReason(reason)); |
143 return m_fallbackSurface->newImageSnapshot(hint, reason); | 143 return m_fallbackSurface->newImageSnapshot(hint, reason); |
144 } | 144 } |
145 | 145 |
146 SkCanvas* RecordingImageBufferSurface::canvas() | 146 SkCanvas* RecordingImageBufferSurface::canvas() |
147 { | 147 { |
148 if (m_fallbackSurface) | 148 if (m_fallbackSurface) |
149 return m_fallbackSurface->canvas(); | 149 return m_fallbackSurface->canvas(); |
(...skipping 26 matching lines...) Expand all Loading... |
176 ASSERT_NOT_REACHED(); | 176 ASSERT_NOT_REACHED(); |
177 return RecordingImageBufferSurface::FallbackReasonUnknown; | 177 return RecordingImageBufferSurface::FallbackReasonUnknown; |
178 } | 178 } |
179 | 179 |
180 void RecordingImageBufferSurface::disableDeferral(DisableDeferralReason reason) | 180 void RecordingImageBufferSurface::disableDeferral(DisableDeferralReason reason) |
181 { | 181 { |
182 if (!m_fallbackSurface) | 182 if (!m_fallbackSurface) |
183 fallBackToRasterCanvas(disableDeferralReasonToFallbackReason(reason)); | 183 fallBackToRasterCanvas(disableDeferralReasonToFallbackReason(reason)); |
184 } | 184 } |
185 | 185 |
186 PassRefPtr<SkPicture> RecordingImageBufferSurface::getPicture() | 186 sk_sp<SkPicture> RecordingImageBufferSurface::getPicture() |
187 { | 187 { |
188 if (m_fallbackSurface) | 188 if (m_fallbackSurface) |
189 return nullptr; | 189 return nullptr; |
190 | 190 |
191 FallbackReason fallbackReason = FallbackReasonUnknown; | 191 FallbackReason fallbackReason = FallbackReasonUnknown; |
192 bool canUsePicture = finalizeFrameInternal(&fallbackReason); | 192 bool canUsePicture = finalizeFrameInternal(&fallbackReason); |
193 m_imageBuffer->didFinalizeFrame(); | 193 m_imageBuffer->didFinalizeFrame(); |
194 | 194 |
195 ASSERT(canUsePicture || m_fallbackFactory); | 195 ASSERT(canUsePicture || m_fallbackFactory); |
196 | 196 |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
232 void RecordingImageBufferSurface::flush(FlushReason reason) | 232 void RecordingImageBufferSurface::flush(FlushReason reason) |
233 { | 233 { |
234 if (!m_fallbackSurface) | 234 if (!m_fallbackSurface) |
235 fallBackToRasterCanvas(flushReasonToFallbackReason(reason)); | 235 fallBackToRasterCanvas(flushReasonToFallbackReason(reason)); |
236 m_fallbackSurface->flush(reason); | 236 m_fallbackSurface->flush(reason); |
237 } | 237 } |
238 | 238 |
239 void RecordingImageBufferSurface::willOverwriteCanvas() | 239 void RecordingImageBufferSurface::willOverwriteCanvas() |
240 { | 240 { |
241 m_frameWasCleared = true; | 241 m_frameWasCleared = true; |
242 m_previousFrame.clear(); | 242 m_previousFrame.reset(); |
243 m_previousFrameHasExpensiveOp = false; | 243 m_previousFrameHasExpensiveOp = false; |
244 m_previousFramePixelCount = 0; | 244 m_previousFramePixelCount = 0; |
245 if (m_didRecordDrawCommandsInCurrentFrame) { | 245 if (m_didRecordDrawCommandsInCurrentFrame) { |
246 // Discard previous draw commands | 246 // Discard previous draw commands |
247 m_currentFrame->finishRecordingAsPicture(); | 247 m_currentFrame->finishRecordingAsPicture(); |
248 initializeCurrentFrame(); | 248 initializeCurrentFrame(); |
249 } | 249 } |
250 } | 250 } |
251 | 251 |
252 void RecordingImageBufferSurface::didDraw(const FloatRect& rect) | 252 void RecordingImageBufferSurface::didDraw(const FloatRect& rect) |
253 { | 253 { |
254 m_didRecordDrawCommandsInCurrentFrame = true; | 254 m_didRecordDrawCommandsInCurrentFrame = true; |
255 IntRect pixelBounds = enclosingIntRect(rect); | 255 IntRect pixelBounds = enclosingIntRect(rect); |
256 m_currentFramePixelCount += pixelBounds.width() * pixelBounds.height(); | 256 m_currentFramePixelCount += pixelBounds.width() * pixelBounds.height(); |
257 } | 257 } |
258 | 258 |
259 bool RecordingImageBufferSurface::finalizeFrameInternal(FallbackReason* fallback
Reason) | 259 bool RecordingImageBufferSurface::finalizeFrameInternal(FallbackReason* fallback
Reason) |
260 { | 260 { |
261 CHECK(!m_fallbackSurface); | 261 CHECK(!m_fallbackSurface); |
262 CHECK(m_currentFrame); | 262 CHECK(m_currentFrame); |
263 ASSERT(m_currentFrame->getRecordingCanvas()); | 263 ASSERT(m_currentFrame->getRecordingCanvas()); |
264 ASSERT(fallbackReason); | 264 ASSERT(fallbackReason); |
265 ASSERT(*fallbackReason == FallbackReasonUnknown); | 265 ASSERT(*fallbackReason == FallbackReasonUnknown); |
266 | 266 |
267 if (!m_imageBuffer->isDirty()) { | 267 if (!m_imageBuffer->isDirty()) { |
268 if (!m_previousFrame) { | 268 if (!m_previousFrame) { |
269 // Create an initial blank frame | 269 // Create an initial blank frame |
270 m_previousFrame = fromSkSp(m_currentFrame->finishRecordingAsPicture(
)); | 270 m_previousFrame = m_currentFrame->finishRecordingAsPicture(); |
271 initializeCurrentFrame(); | 271 initializeCurrentFrame(); |
272 } | 272 } |
273 CHECK(m_currentFrame); | 273 CHECK(m_currentFrame); |
274 return true; | 274 return true; |
275 } | 275 } |
276 | 276 |
277 if (!m_frameWasCleared) { | 277 if (!m_frameWasCleared) { |
278 *fallbackReason = FallbackReasonCanvasNotClearedBetweenFrames; | 278 *fallbackReason = FallbackReasonCanvasNotClearedBetweenFrames; |
279 return false; | 279 return false; |
280 } | 280 } |
281 | 281 |
282 if (m_fallbackFactory && m_currentFrame->getRecordingCanvas()->getSaveCount(
) > ExpensiveCanvasHeuristicParameters::ExpensiveRecordingStackDepth) { | 282 if (m_fallbackFactory && m_currentFrame->getRecordingCanvas()->getSaveCount(
) > ExpensiveCanvasHeuristicParameters::ExpensiveRecordingStackDepth) { |
283 *fallbackReason = FallbackReasonRunawayStateStack; | 283 *fallbackReason = FallbackReasonRunawayStateStack; |
284 return false; | 284 return false; |
285 } | 285 } |
286 | 286 |
287 m_previousFrame = fromSkSp(m_currentFrame->finishRecordingAsPicture()); | 287 m_previousFrame = m_currentFrame->finishRecordingAsPicture(); |
288 m_previousFrameHasExpensiveOp = m_currentFrameHasExpensiveOp; | 288 m_previousFrameHasExpensiveOp = m_currentFrameHasExpensiveOp; |
289 m_previousFramePixelCount = m_currentFramePixelCount; | 289 m_previousFramePixelCount = m_currentFramePixelCount; |
290 initializeCurrentFrame(); | 290 initializeCurrentFrame(); |
291 | 291 |
292 m_frameWasCleared = false; | 292 m_frameWasCleared = false; |
293 return true; | 293 return true; |
294 } | 294 } |
295 | 295 |
296 void RecordingImageBufferSurface::draw(GraphicsContext& context, const FloatRect
& destRect, const FloatRect& srcRect, SkXfermode::Mode op) | 296 void RecordingImageBufferSurface::draw(GraphicsContext& context, const FloatRect
& destRect, const FloatRect& srcRect, SkXfermode::Mode op) |
297 { | 297 { |
298 if (m_fallbackSurface) { | 298 if (m_fallbackSurface) { |
299 m_fallbackSurface->draw(context, destRect, srcRect, op); | 299 m_fallbackSurface->draw(context, destRect, srcRect, op); |
300 return; | 300 return; |
301 } | 301 } |
302 | 302 |
303 RefPtr<SkPicture> picture = getPicture(); | 303 sk_sp<SkPicture> picture = getPicture(); |
304 if (picture) { | 304 if (picture) { |
305 context.compositePicture(picture.get(), destRect, srcRect, op); | 305 context.compositePicture(std::move(picture), destRect, srcRect, op); |
306 } else { | 306 } else { |
307 ImageBufferSurface::draw(context, destRect, srcRect, op); | 307 ImageBufferSurface::draw(context, destRect, srcRect, op); |
308 } | 308 } |
309 } | 309 } |
310 | 310 |
311 bool RecordingImageBufferSurface::isExpensiveToPaint() | 311 bool RecordingImageBufferSurface::isExpensiveToPaint() |
312 { | 312 { |
313 if (m_fallbackSurface) | 313 if (m_fallbackSurface) |
314 return m_fallbackSurface->isExpensiveToPaint(); | 314 return m_fallbackSurface->isExpensiveToPaint(); |
315 | 315 |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 | 360 |
361 void RecordingImageBufferSurface::setIsHidden(bool hidden) | 361 void RecordingImageBufferSurface::setIsHidden(bool hidden) |
362 { | 362 { |
363 if (m_fallbackSurface) | 363 if (m_fallbackSurface) |
364 m_fallbackSurface->setIsHidden(hidden); | 364 m_fallbackSurface->setIsHidden(hidden); |
365 else | 365 else |
366 ImageBufferSurface::setIsHidden(hidden); | 366 ImageBufferSurface::setIsHidden(hidden); |
367 } | 367 } |
368 | 368 |
369 } // namespace blink | 369 } // namespace blink |
OLD | NEW |