Flutter Engine
canvas.h
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef FLUTTER_LIB_UI_PAINTING_CANVAS_H_
6 #define FLUTTER_LIB_UI_PAINTING_CANVAS_H_
7 
8 #include "flutter/lib/ui/dart_wrapper.h"
9 #include "flutter/lib/ui/painting/paint.h"
10 #include "flutter/lib/ui/painting/path.h"
11 #include "flutter/lib/ui/painting/picture.h"
12 #include "flutter/lib/ui/painting/picture_recorder.h"
13 #include "flutter/lib/ui/painting/rrect.h"
14 #include "flutter/lib/ui/painting/vertices.h"
15 #include "third_party/skia/include/core/SkCanvas.h"
16 #include "third_party/skia/include/utils/SkShadowUtils.h"
18 
19 namespace tonic {
20 class DartLibraryNatives;
21 } // namespace tonic
22 
23 namespace flutter {
24 class CanvasImage;
25 
26 class Canvas : public RefCountedDartWrappable<Canvas> {
29 
30  public:
31  static fml::RefPtr<Canvas> Create(PictureRecorder* recorder,
32  double left,
33  double top,
34  double right,
35  double bottom);
36 
37  ~Canvas() override;
38 
39  void save();
40  void saveLayerWithoutBounds(const Paint& paint, const PaintData& paint_data);
41  void saveLayer(double left,
42  double top,
43  double right,
44  double bottom,
45  const Paint& paint,
46  const PaintData& paint_data);
47  void restore();
48  int getSaveCount();
49 
50  void translate(double dx, double dy);
51  void scale(double sx, double sy);
52  void rotate(double radians);
53  void skew(double sx, double sy);
54  void transform(const tonic::Float64List& matrix4);
55 
56  void clipRect(double left,
57  double top,
58  double right,
59  double bottom,
60  SkClipOp clipOp,
61  bool doAntiAlias = true);
62  void clipRRect(const RRect& rrect, bool doAntiAlias = true);
63  void clipPath(const CanvasPath* path, bool doAntiAlias = true);
64 
65  void drawColor(SkColor color, SkBlendMode blend_mode);
66  void drawLine(double x1,
67  double y1,
68  double x2,
69  double y2,
70  const Paint& paint,
71  const PaintData& paint_data);
72  void drawPaint(const Paint& paint, const PaintData& paint_data);
73  void drawRect(double left,
74  double top,
75  double right,
76  double bottom,
77  const Paint& paint,
78  const PaintData& paint_data);
79  void drawRRect(const RRect& rrect,
80  const Paint& paint,
81  const PaintData& paint_data);
82  void drawDRRect(const RRect& outer,
83  const RRect& inner,
84  const Paint& paint,
85  const PaintData& paint_data);
86  void drawOval(double left,
87  double top,
88  double right,
89  double bottom,
90  const Paint& paint,
91  const PaintData& paint_data);
92  void drawCircle(double x,
93  double y,
94  double radius,
95  const Paint& paint,
96  const PaintData& paint_data);
97  void drawArc(double left,
98  double top,
99  double right,
100  double bottom,
101  double startAngle,
102  double sweepAngle,
103  bool useCenter,
104  const Paint& paint,
105  const PaintData& paint_data);
106  void drawPath(const CanvasPath* path,
107  const Paint& paint,
108  const PaintData& paint_data);
109  void drawImage(const CanvasImage* image,
110  double x,
111  double y,
112  const Paint& paint,
113  const PaintData& paint_data);
114  void drawImageRect(const CanvasImage* image,
115  double src_left,
116  double src_top,
117  double src_right,
118  double src_bottom,
119  double dst_left,
120  double dst_top,
121  double dst_right,
122  double dst_bottom,
123  const Paint& paint,
124  const PaintData& paint_data);
125  void drawImageNine(const CanvasImage* image,
126  double center_left,
127  double center_top,
128  double center_right,
129  double center_bottom,
130  double dst_left,
131  double dst_top,
132  double dst_right,
133  double dst_bottom,
134  const Paint& paint,
135  const PaintData& paint_data);
136  void drawPicture(Picture* picture);
137 
138  // The paint argument is first for the following functions because Paint
139  // unwraps a number of C++ objects. Once we create a view unto a
140  // Float32List, we cannot re-enter the VM to unwrap objects. That means we
141  // either need to process the paint argument first.
142 
143  void drawPoints(const Paint& paint,
144  const PaintData& paint_data,
145  SkCanvas::PointMode point_mode,
146  const tonic::Float32List& points);
147 
148  void drawVertices(const Vertices* vertices,
149  SkBlendMode blend_mode,
150  const Paint& paint,
151  const PaintData& paint_data);
152 
153  void drawAtlas(const Paint& paint,
154  const PaintData& paint_data,
155  CanvasImage* atlas,
156  const tonic::Float32List& transforms,
157  const tonic::Float32List& rects,
158  const tonic::Int32List& colors,
159  SkBlendMode blend_mode,
160  const tonic::Float32List& cull_rect);
161 
162  void drawShadow(const CanvasPath* path,
163  SkColor color,
164  double elevation,
165  bool transparentOccluder);
166 
167  SkCanvas* canvas() const { return canvas_; }
168  void Invalidate();
169 
170  static void RegisterNatives(tonic::DartLibraryNatives* natives);
171 
172  private:
173  explicit Canvas(SkCanvas* canvas);
174 
175  // The SkCanvas is supplied by a call to SkPictureRecorder::beginRecording,
176  // which does not transfer ownership. For this reason, we hold a raw
177  // pointer and manually set to null in Clear.
178  SkCanvas* canvas_;
179 };
180 
181 } // namespace flutter
182 
183 #endif // FLUTTER_LIB_UI_PAINTING_CANVAS_H_
DEF_SWITCHES_START snapshot asset path
Definition: switches.h:32
#define DEFINE_WRAPPERTYPEINFO()
SkCanvas * canvas() const
Definition: canvas.h:167
#define FML_FRIEND_MAKE_REF_COUNTED(T)
Definition: ref_counted.h:131