blob: 652c735b7327d3b2492a9130d0030a0af4fff9de [file] [log] [blame]
// 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/aiks_layer.h"
#include <utility>
namespace flutter {
AiksLayer::AiksLayer(const SkPoint& offset,
const std::shared_ptr<const impeller::Picture>& picture)
: offset_(offset), picture_(picture) {
#if IMPELLER_SUPPORTS_RENDERING
if (picture_) {
auto bounds = picture_->pass->GetElementsCoverage(std::nullopt)
.value_or(impeller::Rect());
bounds_ = SkRect::MakeXYWH(bounds.origin.x + offset_.x(),
bounds.origin.y + offset.y(), bounds.size.width,
bounds.size.height);
}
#endif
}
void AiksLayer::Diff(DiffContext* context, const Layer* old_layer) {
DiffContext::AutoSubtreeRestore subtree(context);
context->PushTransform(SkMatrix::Translate(offset_.x(), offset_.y()));
context->AddLayerBounds(bounds_);
context->SetLayerPaintRegion(this, context->CurrentSubtreeRegion());
}
void AiksLayer::Preroll(PrerollContext* frame) {
// There is no opacity peepholing to do here because Impeller handles that
// in the Entities, and this layer will never participate in raster caching.
FML_DCHECK(!frame->raster_cache);
set_paint_bounds(bounds_);
}
void AiksLayer::Paint(PaintContext& context) const {
FML_DCHECK(needs_painting(context));
auto mutator = context.state_stack.save();
mutator.translate(offset_.x(), offset_.y());
FML_DCHECK(!context.raster_cache);
SkScalar opacity = context.state_stack.outstanding_opacity();
if (context.enable_leaf_layer_tracing) {
// TODO(dnfield): Decide if we need to capture this for Impeller.
// We can't do this the same way as on the Skia backend, because Impeller
// does not expose primitives for flushing things down to the GPU without
// also allocating a texture.
// https://github.com/flutter/flutter/issues/131941
FML_LOG(ERROR) << "Leaf layer tracing unsupported for Impeller.";
}
context.canvas->DrawImpellerPicture(picture_, opacity);
}
} // namespace flutter