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 |