// 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_PAINTING_CANVAS_H_ #define FLUTTER_LIB_UI_PAINTING_CANVAS_H_ #include "flutter/display_list/dl_blend_mode.h" #include "flutter/display_list/dl_op_flags.h" #include "flutter/lib/ui/dart_wrapper.h" #include "flutter/lib/ui/painting/path.h" #include "flutter/lib/ui/painting/picture.h" #include "flutter/lib/ui/painting/picture_recorder.h" #include "flutter/lib/ui/painting/rrect.h" #include "flutter/lib/ui/painting/vertices.h" #include "third_party/tonic/typed_data/typed_list.h" namespace flutter { class CanvasImage; class Canvas : public RefCountedDartWrappable, DisplayListOpFlags { DEFINE_WRAPPERTYPEINFO(); FML_FRIEND_MAKE_REF_COUNTED(Canvas); public: static void Create(Dart_Handle wrapper, PictureRecorder* recorder, double left, double top, double right, double bottom); ~Canvas() override; void save(); void saveLayerWithoutBounds(Dart_Handle paint_objects, Dart_Handle paint_data); void saveLayer(double left, double top, double right, double bottom, Dart_Handle paint_objects, Dart_Handle paint_data); void restore(); int getSaveCount(); void restoreToCount(int count); void translate(double dx, double dy); void scale(double sx, double sy); void rotate(double radians); void skew(double sx, double sy); void transform(const tonic::Float64List& matrix4); void getTransform(Dart_Handle matrix4_handle); void clipRect(double left, double top, double right, double bottom, DlCanvas::ClipOp clipOp, bool doAntiAlias = true); void clipRRect(const RRect& rrect, bool doAntiAlias = true); void clipPath(const CanvasPath* path, bool doAntiAlias = true); void getDestinationClipBounds(Dart_Handle rect_handle); void getLocalClipBounds(Dart_Handle rect_handle); void drawColor(SkColor color, DlBlendMode blend_mode); void drawLine(double x1, double y1, double x2, double y2, Dart_Handle paint_objects, Dart_Handle paint_data); void drawPaint(Dart_Handle paint_objects, Dart_Handle paint_data); void drawRect(double left, double top, double right, double bottom, Dart_Handle paint_objects, Dart_Handle paint_data); void drawRRect(const RRect& rrect, Dart_Handle paint_objects, Dart_Handle paint_data); void drawDRRect(const RRect& outer, const RRect& inner, Dart_Handle paint_objects, Dart_Handle paint_data); void drawOval(double left, double top, double right, double bottom, Dart_Handle paint_objects, Dart_Handle paint_data); void drawCircle(double x, double y, double radius, Dart_Handle paint_objects, Dart_Handle paint_data); void drawArc(double left, double top, double right, double bottom, double startAngle, double sweepAngle, bool useCenter, Dart_Handle paint_objects, Dart_Handle paint_data); void drawPath(const CanvasPath* path, Dart_Handle paint_objects, Dart_Handle paint_data); Dart_Handle drawImage(const CanvasImage* image, double x, double y, Dart_Handle paint_objects, Dart_Handle paint_data, int filterQualityIndex); Dart_Handle drawImageRect(const CanvasImage* image, double src_left, double src_top, double src_right, double src_bottom, double dst_left, double dst_top, double dst_right, double dst_bottom, Dart_Handle paint_objects, Dart_Handle paint_data, int filterQualityIndex); Dart_Handle drawImageNine(const CanvasImage* image, double center_left, double center_top, double center_right, double center_bottom, double dst_left, double dst_top, double dst_right, double dst_bottom, Dart_Handle paint_objects, Dart_Handle paint_data, int bitmapSamplingIndex); void drawPicture(Picture* picture); // The paint argument is first for the following functions because Paint // unwraps a number of C++ objects. Once we create a view unto a // Float32List, we cannot re-enter the VM to unwrap objects. That means we // either need to process the paint argument first. void drawPoints(Dart_Handle paint_objects, Dart_Handle paint_data, DlCanvas::PointMode point_mode, const tonic::Float32List& points); void drawVertices(const Vertices* vertices, DlBlendMode blend_mode, Dart_Handle paint_objects, Dart_Handle paint_data); Dart_Handle drawAtlas(Dart_Handle paint_objects, Dart_Handle paint_data, int filterQualityIndex, CanvasImage* atlas, Dart_Handle transforms_handle, Dart_Handle rects_handle, Dart_Handle colors_handle, DlBlendMode blend_mode, Dart_Handle cull_rect_handle); void drawShadow(const CanvasPath* path, SkColor color, double elevation, bool transparentOccluder); void Invalidate(); DisplayListBuilder* builder() { return display_list_builder_.get(); } private: explicit Canvas(sk_sp builder); sk_sp display_list_builder_; }; } // namespace flutter #endif // FLUTTER_LIB_UI_PAINTING_CANVAS_H_