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" |
11 #include "platform/graphics/ImageBuffer.h" | 11 #include "platform/graphics/ImageBuffer.h" |
12 #include "third_party/skia/include/core/SkCanvas.h" | 12 #include "platform/graphics/paint/PaintRecorder.h" |
13 #include "third_party/skia/include/core/SkPictureRecorder.h" | |
14 #include "wtf/PassRefPtr.h" | 13 #include "wtf/PassRefPtr.h" |
15 #include "wtf/PtrUtil.h" | 14 #include "wtf/PtrUtil.h" |
16 #include <memory> | 15 #include <memory> |
17 | 16 |
18 namespace blink { | 17 namespace blink { |
19 | 18 |
20 RecordingImageBufferSurface::RecordingImageBufferSurface( | 19 RecordingImageBufferSurface::RecordingImageBufferSurface( |
21 const IntSize& size, | 20 const IntSize& size, |
22 std::unique_ptr<RecordingImageBufferFallbackSurfaceFactory> fallbackFactory, | 21 std::unique_ptr<RecordingImageBufferFallbackSurfaceFactory> fallbackFactory, |
23 OpacityMode opacityMode, | 22 OpacityMode opacityMode, |
24 sk_sp<SkColorSpace> colorSpace, | 23 sk_sp<SkColorSpace> colorSpace, |
25 SkColorType colorType) | 24 SkColorType colorType) |
26 : ImageBufferSurface(size, opacityMode, std::move(colorSpace), colorType), | 25 : ImageBufferSurface(size, opacityMode, std::move(colorSpace), colorType), |
27 m_imageBuffer(0), | 26 m_imageBuffer(0), |
28 m_currentFramePixelCount(0), | 27 m_currentFramePixelCount(0), |
29 m_previousFramePixelCount(0), | 28 m_previousFramePixelCount(0), |
30 m_frameWasCleared(true), | 29 m_frameWasCleared(true), |
31 m_didRecordDrawCommandsInCurrentFrame(false), | 30 m_didRecordDrawCommandsInCurrentFrame(false), |
32 m_currentFrameHasExpensiveOp(false), | 31 m_currentFrameHasExpensiveOp(false), |
33 m_previousFrameHasExpensiveOp(false), | 32 m_previousFrameHasExpensiveOp(false), |
34 m_fallbackFactory(std::move(fallbackFactory)) { | 33 m_fallbackFactory(std::move(fallbackFactory)) { |
35 initializeCurrentFrame(); | 34 initializeCurrentFrame(); |
36 } | 35 } |
37 | 36 |
38 RecordingImageBufferSurface::~RecordingImageBufferSurface() {} | 37 RecordingImageBufferSurface::~RecordingImageBufferSurface() {} |
39 | 38 |
40 void RecordingImageBufferSurface::initializeCurrentFrame() { | 39 void RecordingImageBufferSurface::initializeCurrentFrame() { |
41 static SkRTreeFactory rTreeFactory; | 40 static SkRTreeFactory rTreeFactory; |
42 m_currentFrame = WTF::wrapUnique(new SkPictureRecorder); | 41 m_currentFrame = WTF::wrapUnique(new PaintRecorder); |
43 SkCanvas* canvas = m_currentFrame->beginRecording( | 42 PaintCanvas* canvas = m_currentFrame->beginRecording( |
44 size().width(), size().height(), &rTreeFactory); | 43 size().width(), size().height(), &rTreeFactory); |
45 // Always save an initial frame, to support resetting the top level matrix | 44 // Always save an initial frame, to support resetting the top level matrix |
46 // and clip. | 45 // and clip. |
47 canvas->save(); | 46 canvas->save(); |
48 | 47 |
49 if (m_imageBuffer) { | 48 if (m_imageBuffer) { |
50 m_imageBuffer->resetCanvas(canvas); | 49 m_imageBuffer->resetCanvas(canvas); |
51 } | 50 } |
52 m_didRecordDrawCommandsInCurrentFrame = false; | 51 m_didRecordDrawCommandsInCurrentFrame = false; |
53 m_currentFrameHasExpensiveOp = false; | 52 m_currentFrameHasExpensiveOp = false; |
(...skipping 119 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
173 } | 172 } |
174 | 173 |
175 sk_sp<SkImage> RecordingImageBufferSurface::newImageSnapshot( | 174 sk_sp<SkImage> RecordingImageBufferSurface::newImageSnapshot( |
176 AccelerationHint hint, | 175 AccelerationHint hint, |
177 SnapshotReason reason) { | 176 SnapshotReason reason) { |
178 if (!m_fallbackSurface) | 177 if (!m_fallbackSurface) |
179 fallBackToRasterCanvas(snapshotReasonToFallbackReason(reason)); | 178 fallBackToRasterCanvas(snapshotReasonToFallbackReason(reason)); |
180 return m_fallbackSurface->newImageSnapshot(hint, reason); | 179 return m_fallbackSurface->newImageSnapshot(hint, reason); |
181 } | 180 } |
182 | 181 |
183 SkCanvas* RecordingImageBufferSurface::canvas() { | 182 PaintCanvas* RecordingImageBufferSurface::canvas() { |
184 if (m_fallbackSurface) | 183 if (m_fallbackSurface) |
185 return m_fallbackSurface->canvas(); | 184 return m_fallbackSurface->canvas(); |
186 | 185 |
187 ASSERT(m_currentFrame->getRecordingCanvas()); | 186 ASSERT(m_currentFrame->getRecordingCanvas()); |
188 return m_currentFrame->getRecordingCanvas(); | 187 return m_currentFrame->getRecordingCanvas(); |
189 } | 188 } |
190 | 189 |
191 static RecordingImageBufferSurface::FallbackReason | 190 static RecordingImageBufferSurface::FallbackReason |
192 disableDeferralReasonToFallbackReason(DisableDeferralReason reason) { | 191 disableDeferralReasonToFallbackReason(DisableDeferralReason reason) { |
193 switch (reason) { | 192 switch (reason) { |
(...skipping 22 matching lines...) Expand all Loading... |
216 ASSERT_NOT_REACHED(); | 215 ASSERT_NOT_REACHED(); |
217 return RecordingImageBufferSurface::FallbackReasonUnknown; | 216 return RecordingImageBufferSurface::FallbackReasonUnknown; |
218 } | 217 } |
219 | 218 |
220 void RecordingImageBufferSurface::disableDeferral( | 219 void RecordingImageBufferSurface::disableDeferral( |
221 DisableDeferralReason reason) { | 220 DisableDeferralReason reason) { |
222 if (!m_fallbackSurface) | 221 if (!m_fallbackSurface) |
223 fallBackToRasterCanvas(disableDeferralReasonToFallbackReason(reason)); | 222 fallBackToRasterCanvas(disableDeferralReasonToFallbackReason(reason)); |
224 } | 223 } |
225 | 224 |
226 sk_sp<SkPicture> RecordingImageBufferSurface::getPicture() { | 225 sk_sp<PaintRecord> RecordingImageBufferSurface::getPicture() { |
227 if (m_fallbackSurface) | 226 if (m_fallbackSurface) |
228 return nullptr; | 227 return nullptr; |
229 | 228 |
230 FallbackReason fallbackReason = FallbackReasonUnknown; | 229 FallbackReason fallbackReason = FallbackReasonUnknown; |
231 bool canUsePicture = finalizeFrameInternal(&fallbackReason); | 230 bool canUsePicture = finalizeFrameInternal(&fallbackReason); |
232 m_imageBuffer->didFinalizeFrame(); | 231 m_imageBuffer->didFinalizeFrame(); |
233 | 232 |
234 ASSERT(canUsePicture || m_fallbackFactory); | 233 ASSERT(canUsePicture || m_fallbackFactory); |
235 | 234 |
236 if (canUsePicture) { | 235 if (canUsePicture) { |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
335 | 334 |
336 void RecordingImageBufferSurface::draw(GraphicsContext& context, | 335 void RecordingImageBufferSurface::draw(GraphicsContext& context, |
337 const FloatRect& destRect, | 336 const FloatRect& destRect, |
338 const FloatRect& srcRect, | 337 const FloatRect& srcRect, |
339 SkBlendMode op) { | 338 SkBlendMode op) { |
340 if (m_fallbackSurface) { | 339 if (m_fallbackSurface) { |
341 m_fallbackSurface->draw(context, destRect, srcRect, op); | 340 m_fallbackSurface->draw(context, destRect, srcRect, op); |
342 return; | 341 return; |
343 } | 342 } |
344 | 343 |
345 sk_sp<SkPicture> picture = getPicture(); | 344 sk_sp<PaintRecord> picture = getPicture(); |
346 if (picture) { | 345 if (picture) { |
347 context.compositePicture(std::move(picture), destRect, srcRect, op); | 346 context.compositePicture(std::move(picture), destRect, srcRect, op); |
348 } else { | 347 } else { |
349 ImageBufferSurface::draw(context, destRect, srcRect, op); | 348 ImageBufferSurface::draw(context, destRect, srcRect, op); |
350 } | 349 } |
351 } | 350 } |
352 | 351 |
353 bool RecordingImageBufferSurface::isExpensiveToPaint() { | 352 bool RecordingImageBufferSurface::isExpensiveToPaint() { |
354 if (m_fallbackSurface) | 353 if (m_fallbackSurface) |
355 return m_fallbackSurface->isExpensiveToPaint(); | 354 return m_fallbackSurface->isExpensiveToPaint(); |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
401 } | 400 } |
402 | 401 |
403 void RecordingImageBufferSurface::setIsHidden(bool hidden) { | 402 void RecordingImageBufferSurface::setIsHidden(bool hidden) { |
404 if (m_fallbackSurface) | 403 if (m_fallbackSurface) |
405 m_fallbackSurface->setIsHidden(hidden); | 404 m_fallbackSurface->setIsHidden(hidden); |
406 else | 405 else |
407 ImageBufferSurface::setIsHidden(hidden); | 406 ImageBufferSurface::setIsHidden(hidden); |
408 } | 407 } |
409 | 408 |
410 } // namespace blink | 409 } // namespace blink |
OLD | NEW |