| 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 |