| 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 "core/html/canvas/CanvasAsyncBlobCreator.h" | 5 #include "core/html/canvas/CanvasAsyncBlobCreator.h" |
| 6 | 6 |
| 7 #include "core/dom/Document.h" | 7 #include "core/dom/Document.h" |
| 8 #include "core/dom/TaskRunnerHelper.h" | 8 #include "core/dom/TaskRunnerHelper.h" |
| 9 #include "core/fileapi/Blob.h" | 9 #include "core/fileapi/Blob.h" |
| 10 #include "platform/CrossThreadFunctional.h" | 10 #include "platform/CrossThreadFunctional.h" |
| (...skipping 263 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 274 WTF::bind(&CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent, | 274 WTF::bind(&CanvasAsyncBlobCreator::idleTaskStartTimeoutEvent, |
| 275 wrapPersistent(this), quality), | 275 wrapPersistent(this), quality), |
| 276 IdleTaskStartTimeoutDelay); | 276 IdleTaskStartTimeoutDelay); |
| 277 } | 277 } |
| 278 } | 278 } |
| 279 | 279 |
| 280 void CanvasAsyncBlobCreator::scheduleInitiateJpegEncoding( | 280 void CanvasAsyncBlobCreator::scheduleInitiateJpegEncoding( |
| 281 const double& quality) { | 281 const double& quality) { |
| 282 m_scheduleInitiateStartTime = WTF::monotonicallyIncreasingTime(); | 282 m_scheduleInitiateStartTime = WTF::monotonicallyIncreasingTime(); |
| 283 Platform::current()->currentThread()->scheduler()->postIdleTask( | 283 Platform::current()->currentThread()->scheduler()->postIdleTask( |
| 284 BLINK_FROM_HERE, WTF::bind(&CanvasAsyncBlobCreator::initiateJpegEncoding, | 284 BLINK_FROM_HERE, |
| 285 wrapPersistent(this), quality)); | 285 WTF::bind(&CanvasAsyncBlobCreator::initiateJpegEncoding, |
| 286 wrapPersistent(this), quality)); |
| 286 } | 287 } |
| 287 | 288 |
| 288 void CanvasAsyncBlobCreator::initiateJpegEncoding(const double& quality, | 289 void CanvasAsyncBlobCreator::initiateJpegEncoding(const double& quality, |
| 289 double deadlineSeconds) { | 290 double deadlineSeconds) { |
| 290 recordElapsedTimeHistogram( | 291 recordElapsedTimeHistogram( |
| 291 InitiateEncodingDelay, MimeTypeJpeg, | 292 InitiateEncodingDelay, MimeTypeJpeg, |
| 292 WTF::monotonicallyIncreasingTime() - m_scheduleInitiateStartTime); | 293 WTF::monotonicallyIncreasingTime() - m_scheduleInitiateStartTime); |
| 293 if (m_idleTaskStatus == IdleTaskSwitchedToImmediateTask) { | 294 if (m_idleTaskStatus == IdleTaskSwitchedToImmediateTask) { |
| 294 return; | 295 return; |
| 295 } | 296 } |
| 296 | 297 |
| 297 DCHECK(m_idleTaskStatus == IdleTaskNotStarted); | 298 DCHECK(m_idleTaskStatus == IdleTaskNotStarted); |
| 298 m_idleTaskStatus = IdleTaskStarted; | 299 m_idleTaskStatus = IdleTaskStarted; |
| 299 | 300 |
| 300 if (!initializeJpegStruct(quality)) { | 301 if (!initializeJpegStruct(quality)) { |
| 301 m_idleTaskStatus = IdleTaskFailed; | 302 m_idleTaskStatus = IdleTaskFailed; |
| 302 return; | 303 return; |
| 303 } | 304 } |
| 304 this->idleEncodeRowsJpeg(deadlineSeconds); | 305 this->idleEncodeRowsJpeg(deadlineSeconds); |
| 305 } | 306 } |
| 306 | 307 |
| 307 void CanvasAsyncBlobCreator::scheduleInitiatePngEncoding() { | 308 void CanvasAsyncBlobCreator::scheduleInitiatePngEncoding() { |
| 308 m_scheduleInitiateStartTime = WTF::monotonicallyIncreasingTime(); | 309 m_scheduleInitiateStartTime = WTF::monotonicallyIncreasingTime(); |
| 309 Platform::current()->currentThread()->scheduler()->postIdleTask( | 310 Platform::current()->currentThread()->scheduler()->postIdleTask( |
| 310 BLINK_FROM_HERE, WTF::bind(&CanvasAsyncBlobCreator::initiatePngEncoding, | 311 BLINK_FROM_HERE, |
| 311 wrapPersistent(this))); | 312 WTF::bind(&CanvasAsyncBlobCreator::initiatePngEncoding, |
| 313 wrapPersistent(this))); |
| 312 } | 314 } |
| 313 | 315 |
| 314 void CanvasAsyncBlobCreator::initiatePngEncoding(double deadlineSeconds) { | 316 void CanvasAsyncBlobCreator::initiatePngEncoding(double deadlineSeconds) { |
| 315 recordElapsedTimeHistogram( | 317 recordElapsedTimeHistogram( |
| 316 InitiateEncodingDelay, MimeTypePng, | 318 InitiateEncodingDelay, MimeTypePng, |
| 317 WTF::monotonicallyIncreasingTime() - m_scheduleInitiateStartTime); | 319 WTF::monotonicallyIncreasingTime() - m_scheduleInitiateStartTime); |
| 318 if (m_idleTaskStatus == IdleTaskSwitchedToImmediateTask) { | 320 if (m_idleTaskStatus == IdleTaskSwitchedToImmediateTask) { |
| 319 return; | 321 return; |
| 320 } | 322 } |
| 321 | 323 |
| (...skipping 13 matching lines...) Expand all Loading... |
| 335 } | 337 } |
| 336 | 338 |
| 337 double startTime = WTF::monotonicallyIncreasingTime(); | 339 double startTime = WTF::monotonicallyIncreasingTime(); |
| 338 unsigned char* inputPixels = | 340 unsigned char* inputPixels = |
| 339 m_data->data() + m_pixelRowStride * m_numRowsCompleted; | 341 m_data->data() + m_pixelRowStride * m_numRowsCompleted; |
| 340 for (int y = m_numRowsCompleted; y < m_size.height(); ++y) { | 342 for (int y = m_numRowsCompleted; y < m_size.height(); ++y) { |
| 341 if (isDeadlineNearOrPassed(deadlineSeconds)) { | 343 if (isDeadlineNearOrPassed(deadlineSeconds)) { |
| 342 m_numRowsCompleted = y; | 344 m_numRowsCompleted = y; |
| 343 m_elapsedTime += (WTF::monotonicallyIncreasingTime() - startTime); | 345 m_elapsedTime += (WTF::monotonicallyIncreasingTime() - startTime); |
| 344 Platform::current()->currentThread()->scheduler()->postIdleTask( | 346 Platform::current()->currentThread()->scheduler()->postIdleTask( |
| 345 BLINK_FROM_HERE, WTF::bind(&CanvasAsyncBlobCreator::idleEncodeRowsPng, | 347 BLINK_FROM_HERE, |
| 346 wrapPersistent(this))); | 348 WTF::bind(&CanvasAsyncBlobCreator::idleEncodeRowsPng, |
| 349 wrapPersistent(this))); |
| 347 return; | 350 return; |
| 348 } | 351 } |
| 349 PNGImageEncoder::writeOneRowToPng(inputPixels, m_pngEncoderState.get()); | 352 PNGImageEncoder::writeOneRowToPng(inputPixels, m_pngEncoderState.get()); |
| 350 inputPixels += m_pixelRowStride; | 353 inputPixels += m_pixelRowStride; |
| 351 } | 354 } |
| 352 m_numRowsCompleted = m_size.height(); | 355 m_numRowsCompleted = m_size.height(); |
| 353 PNGImageEncoder::finalizePng(m_pngEncoderState.get()); | 356 PNGImageEncoder::finalizePng(m_pngEncoderState.get()); |
| 354 | 357 |
| 355 m_idleTaskStatus = IdleTaskCompleted; | 358 m_idleTaskStatus = IdleTaskCompleted; |
| 356 m_elapsedTime += (WTF::monotonicallyIncreasingTime() - startTime); | 359 m_elapsedTime += (WTF::monotonicallyIncreasingTime() - startTime); |
| (...skipping 29 matching lines...) Expand all Loading... |
| 386 WTF::bind(&CanvasAsyncBlobCreator::createBlobAndReturnResult, | 389 WTF::bind(&CanvasAsyncBlobCreator::createBlobAndReturnResult, |
| 387 wrapPersistent(this))); | 390 wrapPersistent(this))); |
| 388 } else { | 391 } else { |
| 389 this->createBlobAndReturnResult(); | 392 this->createBlobAndReturnResult(); |
| 390 } | 393 } |
| 391 } else if (m_numRowsCompleted == JPEGImageEncoder::ProgressiveEncodeFailed) { | 394 } else if (m_numRowsCompleted == JPEGImageEncoder::ProgressiveEncodeFailed) { |
| 392 m_idleTaskStatus = IdleTaskFailed; | 395 m_idleTaskStatus = IdleTaskFailed; |
| 393 this->createNullAndReturnResult(); | 396 this->createNullAndReturnResult(); |
| 394 } else { | 397 } else { |
| 395 Platform::current()->currentThread()->scheduler()->postIdleTask( | 398 Platform::current()->currentThread()->scheduler()->postIdleTask( |
| 396 BLINK_FROM_HERE, WTF::bind(&CanvasAsyncBlobCreator::idleEncodeRowsJpeg, | 399 BLINK_FROM_HERE, |
| 397 wrapPersistent(this))); | 400 WTF::bind(&CanvasAsyncBlobCreator::idleEncodeRowsJpeg, |
| 401 wrapPersistent(this))); |
| 398 } | 402 } |
| 399 } | 403 } |
| 400 | 404 |
| 401 void CanvasAsyncBlobCreator::forceEncodeRowsPngOnCurrentThread() { | 405 void CanvasAsyncBlobCreator::forceEncodeRowsPngOnCurrentThread() { |
| 402 DCHECK(m_idleTaskStatus == IdleTaskSwitchedToImmediateTask); | 406 DCHECK(m_idleTaskStatus == IdleTaskSwitchedToImmediateTask); |
| 403 | 407 |
| 404 // Continue encoding from the last completed row | 408 // Continue encoding from the last completed row |
| 405 unsigned char* inputPixels = | 409 unsigned char* inputPixels = |
| 406 m_data->data() + m_pixelRowStride * m_numRowsCompleted; | 410 m_data->data() + m_pixelRowStride * m_numRowsCompleted; |
| 407 for (int y = m_numRowsCompleted; y < m_size.height(); ++y) { | 411 for (int y = m_numRowsCompleted; y < m_size.height(); ++y) { |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 450 void CanvasAsyncBlobCreator::createBlobAndReturnResult() { | 454 void CanvasAsyncBlobCreator::createBlobAndReturnResult() { |
| 451 recordIdleTaskStatusHistogram(m_idleTaskStatus); | 455 recordIdleTaskStatusHistogram(m_idleTaskStatus); |
| 452 recordElapsedTimeHistogram(ToBlobDuration, m_mimeType, | 456 recordElapsedTimeHistogram(ToBlobDuration, m_mimeType, |
| 453 WTF::monotonicallyIncreasingTime() - m_startTime); | 457 WTF::monotonicallyIncreasingTime() - m_startTime); |
| 454 | 458 |
| 455 Blob* resultBlob = | 459 Blob* resultBlob = |
| 456 Blob::create(m_encodedImage->data(), m_encodedImage->size(), | 460 Blob::create(m_encodedImage->data(), m_encodedImage->size(), |
| 457 convertMimeTypeEnumToString(m_mimeType)); | 461 convertMimeTypeEnumToString(m_mimeType)); |
| 458 if (m_functionType == HTMLCanvasToBlobCallback) { | 462 if (m_functionType == HTMLCanvasToBlobCallback) { |
| 459 TaskRunnerHelper::get(TaskType::CanvasBlobSerialization, m_document) | 463 TaskRunnerHelper::get(TaskType::CanvasBlobSerialization, m_document) |
| 460 ->postTask(BLINK_FROM_HERE, WTF::bind(&BlobCallback::handleEvent, | 464 ->postTask(BLINK_FROM_HERE, |
| 461 wrapPersistent(m_callback.get()), | 465 WTF::bind(&BlobCallback::handleEvent, |
| 462 wrapPersistent(resultBlob))); | 466 wrapPersistent(m_callback.get()), |
| 467 wrapPersistent(resultBlob))); |
| 463 } else { | 468 } else { |
| 464 m_scriptPromiseResolver->resolve(resultBlob); | 469 m_scriptPromiseResolver->resolve(resultBlob); |
| 465 } | 470 } |
| 466 // Avoid unwanted retention, see dispose(). | 471 // Avoid unwanted retention, see dispose(). |
| 467 dispose(); | 472 dispose(); |
| 468 } | 473 } |
| 469 | 474 |
| 470 void CanvasAsyncBlobCreator::createNullAndReturnResult() { | 475 void CanvasAsyncBlobCreator::createNullAndReturnResult() { |
| 471 recordIdleTaskStatusHistogram(m_idleTaskStatus); | 476 recordIdleTaskStatusHistogram(m_idleTaskStatus); |
| 472 if (m_functionType == HTMLCanvasToBlobCallback) { | 477 if (m_functionType == HTMLCanvasToBlobCallback) { |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 614 | 619 |
| 615 DEFINE_TRACE(CanvasAsyncBlobCreator) { | 620 DEFINE_TRACE(CanvasAsyncBlobCreator) { |
| 616 visitor->trace(m_document); | 621 visitor->trace(m_document); |
| 617 visitor->trace(m_data); | 622 visitor->trace(m_data); |
| 618 visitor->trace(m_callback); | 623 visitor->trace(m_callback); |
| 619 visitor->trace(m_parentFrameTaskRunner); | 624 visitor->trace(m_parentFrameTaskRunner); |
| 620 visitor->trace(m_scriptPromiseResolver); | 625 visitor->trace(m_scriptPromiseResolver); |
| 621 } | 626 } |
| 622 | 627 |
| 623 } // namespace blink | 628 } // namespace blink |
| OLD | NEW |