blob: f9671ccab4a737dea8aa75cac29e9af5d5b47a9a [file] [log] [blame] [edit]
// 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/shell/common/dl_op_spy.h"
namespace flutter {
bool DlOpSpy::did_draw() {
return did_draw_;
}
void DlOpSpy::setColor(DlColor color) {
color_ = color;
if (color.isTransparent()) {
will_draw_ = false;
} else {
will_draw_ = true;
}
}
void DlOpSpy::setColorSource(const DlColorSource* source) {
if (!source) {
// Restore settings based on previously set color
setColor(color_);
return;
}
will_draw_ = true;
}
void DlOpSpy::save() {}
void DlOpSpy::saveLayer(const DlRect& bounds,
const SaveLayerOptions options,
const DlImageFilter* backdrop,
std::optional<int64_t> backdrop_id) {}
void DlOpSpy::restore() {}
void DlOpSpy::drawColor(DlColor color, DlBlendMode mode) {
did_draw_ |= !color.isTransparent();
}
void DlOpSpy::drawPaint() {
did_draw_ |= will_draw_;
}
// TODO(cyanglaz): check whether the shape (line, rect, oval, etc) needs to be
// evaluated. https://github.com/flutter/flutter/issues/123803
void DlOpSpy::drawLine(const DlPoint& p0, const DlPoint& p1) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawDashedLine(const DlPoint& p0,
const DlPoint& p1,
DlScalar on_length,
DlScalar off_length) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawRect(const DlRect& rect) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawOval(const DlRect& bounds) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawCircle(const DlPoint& center, DlScalar radius) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawRoundRect(const DlRoundRect& rrect) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawDiffRoundRect(const DlRoundRect& outer,
const DlRoundRect& inner) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawPath(const DlPath& path) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawArc(const DlRect& oval_bounds,
DlScalar start_degrees,
DlScalar sweep_degrees,
bool use_center) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawPoints(PointMode mode,
uint32_t count,
const DlPoint points[]) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawVertices(const std::shared_ptr<DlVertices>& vertices,
DlBlendMode mode) {
did_draw_ |= will_draw_;
}
// In theory, below drawImage methods can produce a transparent screen when a
// transparent image is provided. The operation of determine whether an image is
// transparent needs examine all the pixels in the image object, which is slow.
// Drawing a completely transparent image is not a valid use case, thus, such
// case is ignored.
void DlOpSpy::drawImage(const sk_sp<DlImage> image,
const DlPoint& point,
DlImageSampling sampling,
bool render_with_attributes) {
did_draw_ = true;
}
void DlOpSpy::drawImageRect(const sk_sp<DlImage> image,
const DlRect& src,
const DlRect& dst,
DlImageSampling sampling,
bool render_with_attributes,
SrcRectConstraint constraint) {
did_draw_ = true;
}
void DlOpSpy::drawImageNine(const sk_sp<DlImage> image,
const DlIRect& center,
const DlRect& dst,
DlFilterMode filter,
bool render_with_attributes) {
did_draw_ = true;
}
void DlOpSpy::drawAtlas(const sk_sp<DlImage> atlas,
const SkRSXform xform[],
const DlRect tex[],
const DlColor colors[],
int count,
DlBlendMode mode,
DlImageSampling sampling,
const DlRect* cull_rect,
bool render_with_attributes) {
did_draw_ = true;
}
void DlOpSpy::drawDisplayList(const sk_sp<DisplayList> display_list,
DlScalar opacity) {
if (did_draw_ || opacity == 0) {
return;
}
DlOpSpy receiver;
display_list->Dispatch(receiver);
did_draw_ |= receiver.did_draw();
}
void DlOpSpy::drawTextBlob(const sk_sp<SkTextBlob> blob,
DlScalar x,
DlScalar y) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawTextFrame(
const std::shared_ptr<impeller::TextFrame>& text_frame,
DlScalar x,
DlScalar y) {
did_draw_ |= will_draw_;
}
void DlOpSpy::drawShadow(const DlPath& path,
const DlColor color,
const DlScalar elevation,
bool transparent_occluder,
DlScalar dpr) {
did_draw_ |= !color.isTransparent();
}
} // namespace flutter