mirror of
https://github.com/flutter/flutter.git
synced 2026-02-20 02:29:02 +08:00
On Fuchsia, add a build flag for compositing OpacityLayers using the system compositor vs Skia, which exposes a fastpath for opacity via Scenic. This will only work under certain circumstances, in particular nested OpacityLayers will not render correctly! On Fuchsia, add a build flag for compositing PhysicalShapeLayers using the system compositor vs Skia. Set to off by default, which restores performant shadows on Fuchsia. Remove the opacity exposed from ChildView, as that was added mistakenly. Finally, we centralize the logic for switching between the system-composited and in-process-composited paths inside of ContainerLayer. We also centralize the logic for computing elevation there. This allows the removal of many OS_FUCHSIA-specific code-paths. Test: Ran workstation on Fuchsia; benchmarked before and after Bug: 23711 Bug: 24163 * Fix broken tests
65 lines
1.9 KiB
C++
65 lines
1.9 KiB
C++
// Copyright 2013 The Flutter 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 "flutter/flow/layers/layer.h"
|
|
|
|
#include "flutter/flow/paint_utils.h"
|
|
#include "third_party/skia/include/core/SkColorFilter.h"
|
|
|
|
namespace {
|
|
|
|
uint64_t NextUniqueID() {
|
|
static std::atomic<uint64_t> nextID(1);
|
|
uint64_t id;
|
|
do {
|
|
id = nextID.fetch_add(1);
|
|
} while (id == 0); // 0 is reserved for an invalid id.
|
|
return id;
|
|
}
|
|
|
|
} // anonymous namespace
|
|
|
|
namespace flutter {
|
|
|
|
Layer::Layer()
|
|
: parent_(nullptr),
|
|
paint_bounds_(SkRect::MakeEmpty()),
|
|
unique_id_(NextUniqueID()),
|
|
needs_system_composite_(false) {}
|
|
|
|
Layer::AutoSaveLayer::AutoSaveLayer(const PaintContext& paint_context,
|
|
const SkRect& bounds,
|
|
const SkPaint* paint)
|
|
: paint_context_(paint_context), bounds_(bounds) {
|
|
paint_context_.internal_nodes_canvas->saveLayer(bounds_, paint);
|
|
}
|
|
|
|
Layer::AutoSaveLayer::AutoSaveLayer(const PaintContext& paint_context,
|
|
const SkCanvas::SaveLayerRec& layer_rec)
|
|
: paint_context_(paint_context), bounds_(*layer_rec.fBounds) {
|
|
paint_context_.internal_nodes_canvas->saveLayer(layer_rec);
|
|
}
|
|
|
|
Layer::AutoSaveLayer Layer::AutoSaveLayer::Create(
|
|
const PaintContext& paint_context,
|
|
const SkRect& bounds,
|
|
const SkPaint* paint) {
|
|
return Layer::AutoSaveLayer(paint_context, bounds, paint);
|
|
}
|
|
|
|
Layer::AutoSaveLayer Layer::AutoSaveLayer::Create(
|
|
const PaintContext& paint_context,
|
|
const SkCanvas::SaveLayerRec& layer_rec) {
|
|
return Layer::AutoSaveLayer(paint_context, layer_rec);
|
|
}
|
|
|
|
Layer::AutoSaveLayer::~AutoSaveLayer() {
|
|
if (paint_context_.checkerboard_offscreen_layers) {
|
|
DrawCheckerboard(paint_context_.internal_nodes_canvas, bounds_);
|
|
}
|
|
paint_context_.internal_nodes_canvas->restore();
|
|
}
|
|
|
|
} // namespace flutter
|