mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
98 lines
2.7 KiB
C++
98 lines
2.7 KiB
C++
// Copyright 2015 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 "sky/engine/core/painting/PaintingTasks.h"
|
|
|
|
#include "sky/engine/core/dom/Element.h"
|
|
#include "sky/engine/core/painting/PaintingCallback.h"
|
|
#include "sky/engine/core/painting/PaintingContext.h"
|
|
#include "sky/engine/core/rendering/RenderBox.h"
|
|
#include "sky/engine/platform/graphics/DisplayList.h"
|
|
#include "sky/engine/wtf/OwnPtr.h"
|
|
#include "sky/engine/wtf/RefPtr.h"
|
|
#include "sky/engine/wtf/Vector.h"
|
|
|
|
namespace blink {
|
|
namespace {
|
|
|
|
struct RequestTask {
|
|
RequestTask(PassRefPtr<Element> e, PassOwnPtr<PaintingCallback> c)
|
|
: element(e), callback(c) { }
|
|
|
|
RefPtr<Element> element;
|
|
OwnPtr<PaintingCallback> callback;
|
|
|
|
// Used during serviceRequests.
|
|
RefPtr<PaintingContext> context;
|
|
};
|
|
|
|
struct CommitTask {
|
|
CommitTask(PassRefPtr<Node> n, PassRefPtr<DisplayList> d)
|
|
: node(n), displayList(d) { }
|
|
|
|
RefPtr<Node> node;
|
|
RefPtr<DisplayList> displayList;
|
|
};
|
|
|
|
static Vector<OwnPtr<RequestTask>>& requests()
|
|
{
|
|
DEFINE_STATIC_LOCAL(OwnPtr<Vector<OwnPtr<RequestTask>>>, queue, (adoptPtr(new Vector<OwnPtr<RequestTask>>())));
|
|
return *queue;
|
|
}
|
|
|
|
static Vector<CommitTask>& commits()
|
|
{
|
|
DEFINE_STATIC_LOCAL(OwnPtr<Vector<CommitTask>>, queue, (adoptPtr(new Vector<CommitTask>())));
|
|
return *queue;
|
|
}
|
|
|
|
} // namespace
|
|
|
|
void PaintingTasks::enqueueRequest(PassRefPtr<Element> element, PassOwnPtr<PaintingCallback> callback)
|
|
{
|
|
requests().append(adoptPtr(new RequestTask(element, callback)));
|
|
}
|
|
|
|
void PaintingTasks::enqueueCommit(PassRefPtr<Node> node, PassRefPtr<DisplayList> displayList)
|
|
{
|
|
commits().append(CommitTask(node, displayList));
|
|
}
|
|
|
|
bool PaintingTasks::serviceRequests()
|
|
{
|
|
if (requests().isEmpty())
|
|
return false;
|
|
|
|
for (auto& request : requests()) {
|
|
RenderObject* renderer = request->element->renderer();
|
|
if (!renderer || !renderer->isBox())
|
|
continue;
|
|
request->context = PaintingContext::create(request->element, toRenderBox(renderer)->size());
|
|
}
|
|
|
|
Vector<OwnPtr<RequestTask>> local;
|
|
swap(requests(), local);
|
|
for (const auto& request : local) {
|
|
if (!request->context)
|
|
continue;
|
|
request->callback->handleEvent(request->context.get());
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
void PaintingTasks::drainCommits()
|
|
{
|
|
for (auto& commit : commits()) {
|
|
RenderObject* renderer = commit.node->renderer();
|
|
if (!renderer || !renderer->isBox())
|
|
return;
|
|
toRenderBox(renderer)->setCustomPainting(commit.displayList.release());
|
|
}
|
|
|
|
commits().clear();
|
|
}
|
|
|
|
} // namespace blink
|