blob: fe9d3c76cbe05e055dd5dbbe74aff9f8d1adbe93 [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.
#ifndef FLUTTER_LIB_UI_COMPOSITING_SCENE_BUILDER_H_
#define FLUTTER_LIB_UI_COMPOSITING_SCENE_BUILDER_H_
#include <cstdint>
#include <memory>
#include <vector>
#include "flutter/flow/layers/container_layer.h"
#include "flutter/lib/ui/compositing/scene.h"
#include "flutter/lib/ui/dart_wrapper.h"
#include "flutter/lib/ui/painting/color_filter.h"
#include "flutter/lib/ui/painting/engine_layer.h"
#include "flutter/lib/ui/painting/image_filter.h"
#include "flutter/lib/ui/painting/path.h"
#include "flutter/lib/ui/painting/picture.h"
#include "flutter/lib/ui/painting/rrect.h"
#include "flutter/lib/ui/painting/shader.h"
#include "third_party/tonic/typed_data/typed_list.h"
namespace flutter {
class SceneBuilder : public RefCountedDartWrappable<SceneBuilder> {
DEFINE_WRAPPERTYPEINFO();
FML_FRIEND_MAKE_REF_COUNTED(SceneBuilder);
public:
static fml::RefPtr<SceneBuilder> create() {
return fml::MakeRefCounted<SceneBuilder>();
}
~SceneBuilder() override;
void pushTransform(Dart_Handle layer_handle,
tonic::Float64List& matrix4,
fml::RefPtr<EngineLayer> oldLayer);
void pushOffset(Dart_Handle layer_handle,
double dx,
double dy,
fml::RefPtr<EngineLayer> oldLayer);
void pushClipRect(Dart_Handle layer_handle,
double left,
double right,
double top,
double bottom,
int clipBehavior,
fml::RefPtr<EngineLayer> oldLayer);
void pushClipRRect(Dart_Handle layer_handle,
const RRect& rrect,
int clipBehavior,
fml::RefPtr<EngineLayer> oldLayer);
void pushClipPath(Dart_Handle layer_handle,
const CanvasPath* path,
int clipBehavior,
fml::RefPtr<EngineLayer> oldLayer);
void pushOpacity(Dart_Handle layer_handle,
int alpha,
double dx,
double dy,
fml::RefPtr<EngineLayer> oldLayer);
void pushColorFilter(Dart_Handle layer_handle,
const ColorFilter* color_filter,
fml::RefPtr<EngineLayer> oldLayer);
void pushImageFilter(Dart_Handle layer_handle,
const ImageFilter* image_filter,
fml::RefPtr<EngineLayer> oldLayer);
void pushBackdropFilter(Dart_Handle layer_handle,
ImageFilter* filter,
int blendMode,
fml::RefPtr<EngineLayer> oldLayer);
void pushShaderMask(Dart_Handle layer_handle,
Shader* shader,
double maskRectLeft,
double maskRectRight,
double maskRectTop,
double maskRectBottom,
int blendMode,
int filterQualityIndex,
fml::RefPtr<EngineLayer> oldLayer);
void pushPhysicalShape(Dart_Handle layer_handle,
const CanvasPath* path,
double elevation,
int color,
int shadowColor,
int clipBehavior,
fml::RefPtr<EngineLayer> oldLayer);
void addRetained(fml::RefPtr<EngineLayer> retainedLayer);
void pop();
void addPerformanceOverlay(uint64_t enabledOptions,
double left,
double right,
double top,
double bottom);
void addPicture(double dx, double dy, Picture* picture, int hints);
void addTexture(double dx,
double dy,
double width,
double height,
int64_t textureId,
bool freeze,
int filterQuality);
void addPlatformView(double dx,
double dy,
double width,
double height,
int64_t viewId);
void setRasterizerTracingThreshold(uint32_t frameInterval);
void setCheckerboardRasterCacheImages(bool checkerboard);
void setCheckerboardOffscreenLayers(bool checkerboard);
void build(Dart_Handle scene_handle);
const std::vector<std::shared_ptr<ContainerLayer>>& layer_stack() {
return layer_stack_;
}
static void RegisterNatives(tonic::DartLibraryNatives* natives);
private:
SceneBuilder();
void AddLayer(std::shared_ptr<Layer> layer);
void PushLayer(std::shared_ptr<ContainerLayer> layer);
void PopLayer();
std::vector<std::shared_ptr<ContainerLayer>> layer_stack_;
int rasterizer_tracing_threshold_ = 0;
bool checkerboard_raster_cache_images_ = false;
bool checkerboard_offscreen_layers_ = false;
FML_DISALLOW_COPY_AND_ASSIGN(SceneBuilder);
};
} // namespace flutter
#endif // FLUTTER_LIB_UI_COMPOSITING_SCENE_BUILDER_H_