1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129
|
// 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/CanvasSurfaceLayerBridge.h"
#include "cc/layers/layer.h"
#include "cc/layers/solid_color_layer.h"
#include "cc/layers/surface_layer.h"
#include "cc/surfaces/sequence_surface_reference_factory.h"
#include "cc/surfaces/surface_id.h"
#include "cc/surfaces/surface_info.h"
#include "cc/surfaces/surface_sequence.h"
#include "platform/graphics/GraphicsLayer.h"
#include "platform/mojo/MojoHelper.h"
#include "public/platform/InterfaceProvider.h"
#include "public/platform/Platform.h"
#include "public/platform/WebCompositorSupport.h"
#include "public/platform/WebLayer.h"
#include "public/platform/modules/offscreencanvas/offscreen_canvas_surface.mojom-blink.h"
#include "ui/gfx/geometry/size.h"
#include "wtf/Functional.h"
namespace blink {
namespace {
class OffscreenCanvasSurfaceReferenceFactory
: public cc::SequenceSurfaceReferenceFactory {
public:
OffscreenCanvasSurfaceReferenceFactory(
base::WeakPtr<CanvasSurfaceLayerBridge> bridge)
: m_bridge(bridge) {}
private:
~OffscreenCanvasSurfaceReferenceFactory() override = default;
// cc::SequenceSurfaceReferenceFactory implementation:
void RequireSequence(const cc::SurfaceId& id,
const cc::SurfaceSequence& sequence) const override {
DCHECK(m_bridge);
m_bridge->requireCallback(id, sequence);
}
void SatisfySequence(const cc::SurfaceSequence& sequence) const override {
DCHECK(m_bridge);
m_bridge->satisfyCallback(sequence);
}
base::WeakPtr<CanvasSurfaceLayerBridge> m_bridge;
DISALLOW_COPY_AND_ASSIGN(OffscreenCanvasSurfaceReferenceFactory);
};
} // namespace
CanvasSurfaceLayerBridge::CanvasSurfaceLayerBridge(
CanvasSurfaceLayerBridgeObserver* observer)
: m_weakFactory(this),
m_observer(observer),
m_binding(this),
m_frameSinkId(Platform::current()->generateFrameSinkId()) {
m_refFactory =
new OffscreenCanvasSurfaceReferenceFactory(m_weakFactory.GetWeakPtr());
DCHECK(!m_service.is_bound());
mojom::blink::OffscreenCanvasSurfaceFactoryPtr serviceFactory;
Platform::current()->interfaceProvider()->getInterface(
mojo::MakeRequest(&serviceFactory));
serviceFactory->CreateOffscreenCanvasSurface(
m_frameSinkId, m_binding.CreateInterfacePtrAndBind(),
mojo::MakeRequest(&m_service));
}
CanvasSurfaceLayerBridge::~CanvasSurfaceLayerBridge() {
m_observer = nullptr;
}
void CanvasSurfaceLayerBridge::createSolidColorLayer() {
m_CCLayer = cc::SolidColorLayer::Create();
m_CCLayer->SetBackgroundColor(SK_ColorTRANSPARENT);
m_webLayer = Platform::current()->compositorSupport()->createLayerFromCCLayer(
m_CCLayer.get());
GraphicsLayer::registerContentsLayer(m_webLayer.get());
}
void CanvasSurfaceLayerBridge::OnSurfaceCreated(
const cc::SurfaceInfo& surfaceInfo) {
if (!m_currentSurfaceId.is_valid() && surfaceInfo.id().is_valid()) {
// First time a SurfaceId is received
m_currentSurfaceId = surfaceInfo.id();
GraphicsLayer::unregisterContentsLayer(m_webLayer.get());
m_webLayer->removeFromParent();
scoped_refptr<cc::SurfaceLayer> surfaceLayer =
cc::SurfaceLayer::Create(m_refFactory);
surfaceLayer->SetSurfaceInfo(surfaceInfo);
surfaceLayer->SetStretchContentToFillBounds(true);
m_CCLayer = surfaceLayer;
m_webLayer =
Platform::current()->compositorSupport()->createLayerFromCCLayer(
m_CCLayer.get());
GraphicsLayer::registerContentsLayer(m_webLayer.get());
} else if (m_currentSurfaceId != surfaceInfo.id()) {
// A different SurfaceId is received, prompting change to existing
// SurfaceLayer
m_currentSurfaceId = surfaceInfo.id();
cc::SurfaceLayer* surfaceLayer =
static_cast<cc::SurfaceLayer*>(m_CCLayer.get());
surfaceLayer->SetSurfaceInfo(surfaceInfo);
}
m_observer->OnWebLayerReplaced();
m_CCLayer->SetBounds(surfaceInfo.size_in_pixels());
}
void CanvasSurfaceLayerBridge::satisfyCallback(
const cc::SurfaceSequence& sequence) {
m_service->Satisfy(sequence);
}
void CanvasSurfaceLayerBridge::requireCallback(
const cc::SurfaceId& surfaceId,
const cc::SurfaceSequence& sequence) {
m_service->Require(surfaceId, sequence);
}
} // namespace blink
|