Index: third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
diff --git a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
index 3f7d29e4ddd84be6e9303ae3406559741c5f3dad..d2fb12dcca6ad0ef1cfe19912da63dd8a47d948e 100644 |
--- a/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
+++ b/third_party/WebKit/Source/core/html/canvas/CanvasAsyncBlobCreator.cpp |
@@ -13,27 +13,15 @@ |
#include "platform/image-encoders/skia/PNGImageEncoder.h" |
#include "platform/threading/BackgroundTaskRunner.h" |
#include "public/platform/Platform.h" |
-#include "public/platform/WebScheduler.h" |
-#include "public/platform/WebTaskRunner.h" |
#include "public/platform/WebThread.h" |
#include "public/platform/WebTraceLocation.h" |
#include "wtf/Functional.h" |
namespace blink { |
-namespace { |
- |
-const double SlackBeforeDeadline = 0.001; // a small slack period between deadline and current time for safety |
const int NumChannelsPng = 4; |
const int LongTaskImageSizeThreshold = 1000 * 1000; // The max image size we expect to encode in 14ms on Linux in PNG format |
-bool isDeadlineNearOrPassed(double deadlineSeconds) |
-{ |
- return (deadlineSeconds - SlackBeforeDeadline - Platform::current()->monotonicallyIncreasingTimeSeconds() <= 0); |
-} |
- |
-} // anonymous namespace |
- |
class CanvasAsyncBlobCreator::ContextObserver final : public NoBaseWillBeGarbageCollected<CanvasAsyncBlobCreator::ContextObserver>, public ContextLifecycleObserver { |
WILL_BE_USING_GARBAGE_COLLECTED_MIXIN(CanvasAsyncBlobCreator::ContextObserver); |
public: |
@@ -100,7 +88,7 @@ DEFINE_TRACE(CanvasAsyncBlobCreator::ContextObserver) |
ContextLifecycleObserver::trace(visitor); |
} |
-void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(bool canUseIdlePeriodScheduling, double quality) |
+void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(double quality) |
{ |
// TODO: async blob creation should be supported in worker_pool threads as well. but right now blink does not have that |
ASSERT(isMainThread()); |
@@ -108,52 +96,8 @@ void CanvasAsyncBlobCreator::scheduleAsyncBlobCreation(bool canUseIdlePeriodSche |
// Make self-reference to keep this object alive until the final task completes |
m_selfRef = this; |
- if (canUseIdlePeriodScheduling) { |
- ASSERT(m_mimeType == "image/png"); |
- Platform::current()->mainThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, WTF::bind<double>(&CanvasAsyncBlobCreator::initiatePngEncoding, this)); |
- } else { |
- BackgroundTaskRunner::TaskSize taskSize = (m_size.height() * m_size.width() >= LongTaskImageSizeThreshold) ? BackgroundTaskRunner::TaskSizeLongRunningTask : BackgroundTaskRunner::TaskSizeShortRunningTask; |
- BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, threadSafeBind(&CanvasAsyncBlobCreator::encodeImageOnEncoderThread, AllowCrossThreadAccess(this), quality), taskSize); |
- } |
-} |
- |
-void CanvasAsyncBlobCreator::initiatePngEncoding(double deadlineSeconds) |
-{ |
- m_encoderState = PNGImageEncoderState::create(m_size, m_encodedImage.get()); |
- if (!m_encoderState) { |
- Platform::current()->mainThread()->taskRunner()->postTask(BLINK_FROM_HERE, bind(&BlobCallback::handleEvent, m_callback, nullptr)); |
- m_selfRef.clear(); |
- return; |
- } |
- |
- CanvasAsyncBlobCreator::idleEncodeRowsPng(deadlineSeconds); |
-} |
- |
-void CanvasAsyncBlobCreator::scheduleIdleEncodeRowsPng() |
-{ |
- Platform::current()->currentThread()->scheduler()->postIdleTask(BLINK_FROM_HERE, WTF::bind<double>(&CanvasAsyncBlobCreator::idleEncodeRowsPng, this)); |
-} |
- |
-void CanvasAsyncBlobCreator::idleEncodeRowsPng(double deadlineSeconds) |
-{ |
- unsigned char* inputPixels = m_data->data() + m_pixelRowStride * m_numRowsCompleted; |
- for (int y = m_numRowsCompleted; y < m_size.height(); ++y) { |
- if (isDeadlineNearOrPassed(deadlineSeconds)) { |
- m_numRowsCompleted = y; |
- CanvasAsyncBlobCreator::scheduleIdleEncodeRowsPng(); |
- return; |
- } |
- PNGImageEncoder::writeOneRowToPng(inputPixels, m_encoderState.get()); |
- inputPixels += m_pixelRowStride; |
- } |
- m_numRowsCompleted = m_size.height(); |
- PNGImageEncoder::finalizePng(m_encoderState.get()); |
- |
- if (isDeadlineNearOrPassed(deadlineSeconds)) { |
- Platform::current()->mainThread()->taskRunner()->postTask(BLINK_FROM_HERE, bind(&CanvasAsyncBlobCreator::createBlobAndCall, this)); |
- } else { |
- this->createBlobAndCall(); |
- } |
+ BackgroundTaskRunner::TaskSize taskSize = (m_size.height() * m_size.width() >= LongTaskImageSizeThreshold) ? BackgroundTaskRunner::TaskSizeLongRunningTask : BackgroundTaskRunner::TaskSizeShortRunningTask; |
+ BackgroundTaskRunner::postOnBackgroundThread(BLINK_FROM_HERE, threadSafeBind(&CanvasAsyncBlobCreator::encodeImageOnEncoderThread, AllowCrossThreadAccess(this), quality), taskSize); |
} |
void CanvasAsyncBlobCreator::createBlobAndCall() |