| Index: third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.cpp
|
| diff --git a/third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.cpp b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.cpp
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..e78f4820c4b3e90ef1f0cc06bd4ffecb6c4c3a27
|
| --- /dev/null
|
| +++ b/third_party/WebKit/Source/platform/graphics/OffscreenCanvasPlaceholder.cpp
|
| @@ -0,0 +1,89 @@
|
| +// Copyright 2016 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +#include "platform/graphics/OffscreenCanvasPlaceholder.h"
|
| +
|
| +#include "platform/CrossThreadFunctional.h"
|
| +#include "platform/WebTaskRunner.h"
|
| +#include "platform/graphics/Image.h"
|
| +#include "platform/graphics/OffscreenCanvasFrameDispatcher.h"
|
| +#include "wtf/HashMap.h"
|
| +
|
| +namespace {
|
| +
|
| +typedef HashMap<int, blink::OffscreenCanvasPlaceholder*> PlaceholderIdMap;
|
| +
|
| +PlaceholderIdMap& placeholderRegistry() {
|
| + DCHECK(isMainThread());
|
| + DEFINE_STATIC_LOCAL(PlaceholderIdMap, s_placeholderRegistry, ());
|
| + return s_placeholderRegistry;
|
| +}
|
| +
|
| +void releaseFrameToDispatcher(
|
| + WeakPtr<blink::OffscreenCanvasFrameDispatcher> dispatcher,
|
| + RefPtr<blink::Image> oldImage,
|
| + unsigned resourceId) {
|
| + oldImage = nullptr; // Needed to unref'ed on the right thread
|
| + if (dispatcher) {
|
| + dispatcher->reclaimResource(resourceId);
|
| + }
|
| +}
|
| +
|
| +} // unnamed namespace
|
| +
|
| +namespace blink {
|
| +
|
| +OffscreenCanvasPlaceholder::~OffscreenCanvasPlaceholder() {
|
| + unregisterPlaceholder();
|
| +}
|
| +
|
| +OffscreenCanvasPlaceholder* OffscreenCanvasPlaceholder::getPlaceholderById(
|
| + unsigned placeholderId) {
|
| + PlaceholderIdMap::iterator it = placeholderRegistry().find(placeholderId);
|
| + if (it == placeholderRegistry().end())
|
| + return nullptr;
|
| + return it->value;
|
| +}
|
| +
|
| +void OffscreenCanvasPlaceholder::registerPlaceholder(unsigned placeholderId) {
|
| + DCHECK(!placeholderRegistry().contains(placeholderId));
|
| + DCHECK(!isPlaceholderRegistered());
|
| + placeholderRegistry().add(placeholderId, this);
|
| + m_placeholderId = placeholderId;
|
| +}
|
| +
|
| +void OffscreenCanvasPlaceholder::unregisterPlaceholder() {
|
| + if (!isPlaceholderRegistered())
|
| + return;
|
| + DCHECK(placeholderRegistry().find(m_placeholderId)->value == this);
|
| + placeholderRegistry().remove(m_placeholderId);
|
| + m_placeholderId = kNoPlaceholderId;
|
| +}
|
| +
|
| +void OffscreenCanvasPlaceholder::setPlaceholderFrame(
|
| + RefPtr<Image> newFrame,
|
| + WeakPtr<OffscreenCanvasFrameDispatcher> dispatcher,
|
| + std::unique_ptr<WebTaskRunner> taskRunner,
|
| + unsigned resourceId) {
|
| + DCHECK(isPlaceholderRegistered());
|
| + releasePlaceholderFrame();
|
| + m_placeholderFrame = std::move(newFrame);
|
| + m_frameDispatcher = std::move(dispatcher);
|
| + m_frameDispatcherTaskRunner = std::move(taskRunner);
|
| + m_placeholderFrameResourceId = resourceId;
|
| +}
|
| +
|
| +void OffscreenCanvasPlaceholder::releasePlaceholderFrame() {
|
| + DCHECK(isPlaceholderRegistered());
|
| + if (m_placeholderFrame) {
|
| + m_placeholderFrame->transfer();
|
| + m_frameDispatcherTaskRunner->postTask(
|
| + BLINK_FROM_HERE,
|
| + crossThreadBind(releaseFrameToDispatcher, std::move(m_frameDispatcher),
|
| + std::move(m_placeholderFrame),
|
| + m_placeholderFrameResourceId));
|
| + }
|
| +}
|
| +
|
| +} // blink
|
|
|