1 /*
2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #ifndef USE_ROSEN_DRAWING
17 #include "pipeline/rs_recording_canvas.h"
18
19 #include "rs_trace.h"
20
21 #include "pipeline/rs_draw_cmd.h"
22 #include "platform/common/rs_log.h"
23 #include "platform/common/rs_system_properties.h"
24
25 #define RS_DRAWOP_TRACE_FUNC() \
26 if (RSSystemProperties::GetDrawOpTraceEnabled()) { \
27 RS_TRACE_FUNC(); \
28 } do {} while (0)
29
30 namespace OHOS {
31 namespace Rosen {
RSRecordingCanvas(int width,int height)32 RSRecordingCanvas::RSRecordingCanvas(int width, int height) : SkCanvasVirtualEnforcer<SkNoDrawCanvas>(width, height)
33 {
34 drawCmdList_ = std::make_shared<DrawCmdList>(width, height);
35 }
36
37 RSRecordingCanvas::~RSRecordingCanvas() = default;
38
GetDrawCmdList() const39 std::shared_ptr<DrawCmdList> RSRecordingCanvas::GetDrawCmdList() const
40 {
41 return drawCmdList_;
42 }
43
recordingContext()44 GrRecordingContext* RSRecordingCanvas::recordingContext()
45 {
46 return grContext_;
47 }
48
SetGrRecordingContext(GrRecordingContext * context)49 void RSRecordingCanvas::SetGrRecordingContext(GrRecordingContext* context)
50 {
51 grContext_ = context;
52 }
53
didConcat44(const SkM44 & mat)54 void RSRecordingCanvas::didConcat44(const SkM44& mat)
55 {
56 RS_DRAWOP_TRACE_FUNC();
57 std::unique_ptr<OpItem> op = std::make_unique<ConcatOpItem>(mat);
58 AddOp(std::move(op));
59 }
60
didSetM44(const SkM44 & mat)61 void RSRecordingCanvas::didSetM44(const SkM44& mat)
62 {
63 RS_DRAWOP_TRACE_FUNC();
64 std::unique_ptr<OpItem> op = std::make_unique<MatrixOpItem>(mat);
65 AddOp(std::move(op));
66 }
67
didScale(SkScalar dx,SkScalar dy)68 void RSRecordingCanvas::didScale(SkScalar dx, SkScalar dy)
69 {
70 RS_DRAWOP_TRACE_FUNC();
71 std::unique_ptr<OpItem> op = std::make_unique<ScaleOpItem>(dx, dy);
72 AddOp(std::move(op));
73 }
74
onDrawGlyphRunList(const SkGlyphRunList & glyphRunList,const SkPaint & paint)75 void RSRecordingCanvas::onDrawGlyphRunList(const SkGlyphRunList& glyphRunList, const SkPaint& paint)
76 {
77 ROSEN_LOGE("RSRecordingCanvas::onDrawGlyphRunList not support yet");
78 }
onDrawImage2(const SkImage * img,SkScalar dx,SkScalar dy,const SkSamplingOptions & samplingOptions,const SkPaint * paint)79 void RSRecordingCanvas::onDrawImage2(const SkImage* img, SkScalar dx, SkScalar dy,
80 const SkSamplingOptions& samplingOptions, const SkPaint* paint)
81 {
82 RS_DRAWOP_TRACE_FUNC();
83 std::unique_ptr<OpItem> op = std::make_unique<BitmapOpItem>(sk_ref_sp(img), dx, dy, samplingOptions, paint);
84 AddOp(std::move(op));
85 }
onDrawImageRect2(const SkImage * img,const SkRect & src,const SkRect & dst,const SkSamplingOptions & samplingOptions,const SkPaint * paint,SrcRectConstraint constraint)86 void RSRecordingCanvas::onDrawImageRect2(const SkImage* img, const SkRect& src, const SkRect& dst,
87 const SkSamplingOptions& samplingOptions, const SkPaint* paint, SrcRectConstraint constraint)
88 {
89 RS_DRAWOP_TRACE_FUNC();
90 std::unique_ptr<OpItem> op =
91 std::make_unique<BitmapRectOpItem>(sk_ref_sp(img), &src, dst, samplingOptions, paint, constraint);
92 AddOp(std::move(op));
93 }
onDrawImageLattice2(const SkImage * img,const Lattice & lattice,const SkRect & dst,SkFilterMode mode,const SkPaint * paint)94 void RSRecordingCanvas::onDrawImageLattice2(const SkImage* img, const Lattice& lattice, const SkRect& dst,
95 SkFilterMode mode, const SkPaint* paint)
96 {
97 DrawImageLatticeAsBitmap(img, lattice, dst, paint);
98 }
99
onDrawAtlas2(const SkImage *,const SkRSXform[],const SkRect src[],const SkColor[],int count,SkBlendMode mode,const SkSamplingOptions & samplingOptions,const SkRect * cull,const SkPaint * paint)100 void RSRecordingCanvas::onDrawAtlas2(const SkImage*, const SkRSXform[], const SkRect src[],
101 const SkColor[], int count, SkBlendMode mode, const SkSamplingOptions& samplingOptions,
102 const SkRect* cull, const SkPaint* paint)
103 {
104 ROSEN_LOGE("RSRecordingCanvas::onDrawAtlas2 not support yet");
105 }
onDrawEdgeAAImageSet2(const ImageSetEntry imageSet[],int count,const SkPoint dstClips[],const SkMatrix preViewMatrices[],const SkSamplingOptions & SamplingOptions,const SkPaint * paint,SrcRectConstraint constraint)106 void RSRecordingCanvas::onDrawEdgeAAImageSet2(const ImageSetEntry imageSet[], int count,
107 const SkPoint dstClips[], const SkMatrix preViewMatrices[],
108 const SkSamplingOptions& SamplingOptions, const SkPaint* paint,
109 SrcRectConstraint constraint)
110 {
111 ROSEN_LOGE("RSRecordingCanvas::onDrawEdgeAAImageSet2 not support yet");
112 }
onDrawVerticesObject(const SkVertices * vertices,SkBlendMode mode,const SkPaint & paint)113 void RSRecordingCanvas::onDrawVerticesObject(const SkVertices* vertices, SkBlendMode mode, const SkPaint& paint)
114 {
115 RS_DRAWOP_TRACE_FUNC();
116 std::unique_ptr<OpItem> op = std::make_unique<VerticesOpItem>(vertices, mode, paint);
117 AddOp(std::move(op));
118 }
onDrawEdgeAAQuad(const SkRect & rect,const SkPoint clip[4],QuadAAFlags aaFlags,const SkColor4f & color,SkBlendMode mode)119 void RSRecordingCanvas::onDrawEdgeAAQuad(const SkRect& rect, const SkPoint clip[4], QuadAAFlags aaFlags,
120 const SkColor4f& color, SkBlendMode mode)
121 {
122 ROSEN_LOGE("RSRecordingCanvas::onDrawEdgeAAQuad not support yet");
123 }
124
DrawPixelMapRect(const std::shared_ptr<Media::PixelMap> & pixelmap,const SkRect & src,const SkRect & dst,const SkSamplingOptions & samplingOptions,const SkPaint * paint,SrcRectConstraint constraint)125 void RSRecordingCanvas::DrawPixelMapRect(
126 const std::shared_ptr<Media::PixelMap>& pixelmap, const SkRect& src, const SkRect& dst,
127 const SkSamplingOptions& samplingOptions, const SkPaint* paint, SrcRectConstraint constraint)
128 {
129 RS_DRAWOP_TRACE_FUNC();
130 std::unique_ptr<OpItem> op =
131 std::make_unique<PixelMapRectOpItem>(pixelmap, src, dst, samplingOptions, paint, constraint);
132 AddOp(std::move(op));
133 }
134
DrawPixelMapRect(const std::shared_ptr<Media::PixelMap> & pixelmap,const SkRect & dst,const SkSamplingOptions & samplingOptions,const SkPaint * paint)135 void RSRecordingCanvas::DrawPixelMapRect(const std::shared_ptr<Media::PixelMap>& pixelmap, const SkRect& dst,
136 const SkSamplingOptions& samplingOptions, const SkPaint* paint)
137 {
138 DrawPixelMapRect(pixelmap, SkRect::MakeIWH(pixelmap->GetWidth(), pixelmap->GetHeight()),
139 dst, samplingOptions, paint);
140 }
141
DrawRsImage(const std::shared_ptr<RSImageBase> & rsImage,const SkSamplingOptions & samplingOptions,const SkPaint & paint,SrcRectConstraint constraint)142 void RSRecordingCanvas::DrawRsImage(const std::shared_ptr<RSImageBase>& rsImage,
143 const SkSamplingOptions& samplingOptions, const SkPaint& paint, SrcRectConstraint constraint)
144 {
145 RS_DRAWOP_TRACE_FUNC();
146 std::unique_ptr<OpItem> op = std::make_unique<PixelMapRectOpItem>(rsImage, samplingOptions, paint, constraint);
147 AddOp(std::move(op));
148 }
149
DrawPixelMap(const std::shared_ptr<Media::PixelMap> & pixelmap,SkScalar x,SkScalar y,const SkSamplingOptions & samplingOptions,const SkPaint * paint)150 void RSRecordingCanvas::DrawPixelMap(const std::shared_ptr<Media::PixelMap>& pixelmap, SkScalar x, SkScalar y,
151 const SkSamplingOptions& samplingOptions, const SkPaint* paint)
152 {
153 RS_DRAWOP_TRACE_FUNC();
154 std::unique_ptr<OpItem> op = std::make_unique<PixelMapOpItem>(pixelmap, x, y, samplingOptions, paint);
155 AddOp(std::move(op));
156 }
157
DrawImageWithParm(const sk_sp<SkImage> img,const sk_sp<SkData> data,const Rosen::RsImageInfo & rsimageInfo,const SkSamplingOptions & samplingOptions,const SkPaint & paint)158 void RSRecordingCanvas::DrawImageWithParm(const sk_sp<SkImage>img, const sk_sp<SkData> data,
159 const Rosen::RsImageInfo& rsimageInfo, const SkSamplingOptions& samplingOptions, const SkPaint& paint)
160 {
161 RS_DRAWOP_TRACE_FUNC();
162 std::unique_ptr<OpItem> op = std::make_unique<ImageWithParmOpItem>(
163 img, data, rsimageInfo, samplingOptions, paint);
164 AddOp(std::move(op));
165 }
166
DrawPixelMapWithParm(const std::shared_ptr<Media::PixelMap> & pixelmap,const Rosen::RsImageInfo & rsImageInfo,const SkSamplingOptions & samplingOptions,const SkPaint & paint)167 void RSRecordingCanvas::DrawPixelMapWithParm(const std::shared_ptr<Media::PixelMap>& pixelmap,
168 const Rosen::RsImageInfo& rsImageInfo, const SkSamplingOptions& samplingOptions, const SkPaint& paint)
169 {
170 RS_DRAWOP_TRACE_FUNC();
171 std::unique_ptr<OpItem> op = std::make_unique<ImageWithParmOpItem>(pixelmap, rsImageInfo, samplingOptions, paint);
172 AddOp(std::move(op));
173 }
174
DrawImageNine(const std::shared_ptr<Media::PixelMap> & pixelmap,const SkIRect & center,const SkRect & dst,SkFilterMode filter,const SkPaint * paint)175 void RSRecordingCanvas::DrawImageNine(
176 const std::shared_ptr<Media::PixelMap>& pixelmap, const SkIRect& center, const SkRect& dst,
177 SkFilterMode filter, const SkPaint* paint)
178 {
179 RS_DRAWOP_TRACE_FUNC();
180 std::unique_ptr<OpItem> op = std::make_unique<PixelmapNineOpItem>(pixelmap, center, dst, filter, paint);
181 AddOp(std::move(op));
182 }
183
DrawImageLatticeAsBitmap(const SkImage * image,const SkCanvas::Lattice & lattice,const SkRect & dst,const SkPaint * paint)184 void RSRecordingCanvas::DrawImageLatticeAsBitmap(
185 const SkImage* image, const SkCanvas::Lattice& lattice, const SkRect& dst, const SkPaint* paint)
186 {
187 SkBitmap bitmap;
188 auto imageInfo = SkImageInfo::Make(dst.width(), dst.height(), kRGBA_8888_SkColorType, kPremul_SkAlphaType);
189 bitmap.allocPixels(imageInfo);
190 SkCanvas tempCanvas(bitmap);
191 // align to [0, 0]
192 tempCanvas.translate(-dst.left(), -dst.top());
193 tempCanvas.drawImageLattice(image, lattice, dst, SkFilterMode::kNearest, paint);
194 tempCanvas.flush();
195 // draw on canvas with correct offset
196 drawImage(bitmap.asImage(), dst.left(), dst.top());
197 }
198
Clear() const199 void RSRecordingCanvas::Clear() const
200 {
201 if (drawCmdList_ == nullptr) {
202 return;
203 }
204 drawCmdList_->ClearOp();
205 }
206
AddOp(std::unique_ptr<OpItem> && opItem)207 void RSRecordingCanvas::AddOp(std::unique_ptr<OpItem>&& opItem)
208 {
209 if (drawCmdList_ == nullptr || opItem == nullptr) {
210 ROSEN_LOGE("RSRecordingCanvas:AddOp, drawCmdList_ or opItem is nullptr");
211 return;
212 }
213 drawCmdList_->AddOp(std::move(opItem));
214 }
215
onNewSurface(const SkImageInfo & info,const SkSurfaceProps & props)216 sk_sp<SkSurface> RSRecordingCanvas::onNewSurface(const SkImageInfo& info, const SkSurfaceProps& props)
217 {
218 return nullptr;
219 }
220
onFlush()221 void RSRecordingCanvas::onFlush()
222 {
223 RS_DRAWOP_TRACE_FUNC();
224 std::unique_ptr<OpItem> op = std::make_unique<FlushOpItem>();
225 AddOp(std::move(op));
226 }
227
willSave()228 void RSRecordingCanvas::willSave()
229 {
230 RS_DRAWOP_TRACE_FUNC();
231 std::unique_ptr<OpItem> op = std::make_unique<SaveOpItem>();
232 AddOp(std::move(op));
233 saveCount_++;
234 }
235
getSaveLayerStrategy(const SaveLayerRec & rec)236 SkCanvas::SaveLayerStrategy RSRecordingCanvas::getSaveLayerStrategy(const SaveLayerRec& rec)
237 {
238 RS_DRAWOP_TRACE_FUNC();
239 std::unique_ptr<OpItem> op = std::make_unique<SaveLayerOpItem>(rec);
240 AddOp(std::move(op));
241 saveCount_++;
242 return SkCanvas::kNoLayer_SaveLayerStrategy;
243 }
244
willRestore()245 void RSRecordingCanvas::willRestore()
246 {
247 if (saveCount_ > 0) {
248 RS_DRAWOP_TRACE_FUNC();
249 std::unique_ptr<OpItem> op = std::make_unique<RestoreOpItem>();
250 AddOp(std::move(op));
251 --saveCount_;
252 }
253 }
254
didTranslate(SkScalar dx,SkScalar dy)255 void RSRecordingCanvas::didTranslate(SkScalar dx, SkScalar dy)
256 {
257 RS_DRAWOP_TRACE_FUNC();
258 std::unique_ptr<OpItem> op = std::make_unique<TranslateOpItem>(dx, dy);
259 AddOp(std::move(op));
260 }
261
onClipRect(const SkRect & rect,SkClipOp clipOp,ClipEdgeStyle style)262 void RSRecordingCanvas::onClipRect(const SkRect& rect, SkClipOp clipOp, ClipEdgeStyle style)
263 {
264 RS_DRAWOP_TRACE_FUNC();
265 std::unique_ptr<OpItem> op = std::make_unique<ClipRectOpItem>(rect, clipOp, style == kSoft_ClipEdgeStyle);
266 AddOp(std::move(op));
267 }
268
onClipRRect(const SkRRect & rrect,SkClipOp clipOp,ClipEdgeStyle style)269 void RSRecordingCanvas::onClipRRect(const SkRRect& rrect, SkClipOp clipOp, ClipEdgeStyle style)
270 {
271 RS_DRAWOP_TRACE_FUNC();
272 std::unique_ptr<OpItem> op = std::make_unique<ClipRRectOpItem>(rrect, clipOp, style == kSoft_ClipEdgeStyle);
273 AddOp(std::move(op));
274 }
275
onClipPath(const SkPath & path,SkClipOp clipOp,ClipEdgeStyle style)276 void RSRecordingCanvas::onClipPath(const SkPath& path, SkClipOp clipOp, ClipEdgeStyle style)
277 {
278 RS_DRAWOP_TRACE_FUNC();
279 std::unique_ptr<OpItem> op = std::make_unique<ClipPathOpItem>(path, clipOp, style == kSoft_ClipEdgeStyle);
280 AddOp(std::move(op));
281 }
282
onClipRegion(const SkRegion & region,SkClipOp clipop)283 void RSRecordingCanvas::onClipRegion(const SkRegion& region, SkClipOp clipop)
284 {
285 RS_DRAWOP_TRACE_FUNC();
286 std::unique_ptr<OpItem> op = std::make_unique<ClipRegionOpItem>(region, clipop);
287 AddOp(std::move(op));
288 }
289
onDrawPaint(const SkPaint & paint)290 void RSRecordingCanvas::onDrawPaint(const SkPaint& paint)
291 {
292 RS_DRAWOP_TRACE_FUNC();
293 std::unique_ptr<OpItem> op = std::make_unique<PaintOpItem>(paint);
294 AddOp(std::move(op));
295 }
296
297 #ifdef ROSEN_OHOS
DrawSurfaceBuffer(const RSSurfaceBufferInfo & surfaceBufferInfo)298 void RSRecordingCanvas::DrawSurfaceBuffer(const RSSurfaceBufferInfo& surfaceBufferInfo)
299 {
300 RS_DRAWOP_TRACE_FUNC();
301 std::unique_ptr<OpItem> op = std::make_unique<SurfaceBufferOpItem>(surfaceBufferInfo);
302 AddOp(std::move(op));
303 }
304 #endif
305
onDrawBehind(const SkPaint & paint)306 void RSRecordingCanvas::onDrawBehind(const SkPaint& paint)
307 {
308 // [PLANNING]: To be implemented
309 ROSEN_LOGE("RSRecordingCanvas::onDrawBehind not support yet");
310 }
311
onDrawPath(const SkPath & path,const SkPaint & paint)312 void RSRecordingCanvas::onDrawPath(const SkPath& path, const SkPaint& paint)
313 {
314 RS_DRAWOP_TRACE_FUNC();
315 std::unique_ptr<OpItem> op = std::make_unique<PathOpItem>(path, paint);
316 AddOp(std::move(op));
317 }
318
onDrawRect(const SkRect & rect,const SkPaint & paint)319 void RSRecordingCanvas::onDrawRect(const SkRect& rect, const SkPaint& paint)
320 {
321 RS_DRAWOP_TRACE_FUNC();
322 std::unique_ptr<OpItem> op = std::make_unique<RectOpItem>(rect, paint);
323 AddOp(std::move(op));
324 }
325
onDrawRegion(const SkRegion & region,const SkPaint & paint)326 void RSRecordingCanvas::onDrawRegion(const SkRegion& region, const SkPaint& paint)
327 {
328 RS_DRAWOP_TRACE_FUNC();
329 std::unique_ptr<OpItem> op = std::make_unique<RegionOpItem>(region, paint);
330 AddOp(std::move(op));
331 }
332
onDrawOval(const SkRect & oval,const SkPaint & paint)333 void RSRecordingCanvas::onDrawOval(const SkRect& oval, const SkPaint& paint)
334 {
335 RS_DRAWOP_TRACE_FUNC();
336 std::unique_ptr<OpItem> op = std::make_unique<OvalOpItem>(oval, paint);
337 AddOp(std::move(op));
338 }
339
onDrawArc(const SkRect & oval,SkScalar startAngle,SkScalar sweepAngle,bool useCenter,const SkPaint & paint)340 void RSRecordingCanvas::onDrawArc(
341 const SkRect& oval, SkScalar startAngle, SkScalar sweepAngle, bool useCenter, const SkPaint& paint)
342 {
343 RS_DRAWOP_TRACE_FUNC();
344 std::unique_ptr<OpItem> op = std::make_unique<ArcOpItem>(oval, startAngle, sweepAngle, useCenter, paint);
345 AddOp(std::move(op));
346 }
347
onDrawRRect(const SkRRect & rrect,const SkPaint & paint)348 void RSRecordingCanvas::onDrawRRect(const SkRRect& rrect, const SkPaint& paint)
349 {
350 RS_DRAWOP_TRACE_FUNC();
351 std::unique_ptr<OpItem> op = std::make_unique<RoundRectOpItem>(rrect, paint);
352 AddOp(std::move(op));
353 }
354
onDrawDRRect(const SkRRect & out,const SkRRect & in,const SkPaint & paint)355 void RSRecordingCanvas::onDrawDRRect(const SkRRect& out, const SkRRect& in, const SkPaint& paint)
356 {
357 RS_DRAWOP_TRACE_FUNC();
358 std::unique_ptr<OpItem> op = std::make_unique<DRRectOpItem>(out, in, paint);
359 AddOp(std::move(op));
360 }
361
onDrawDrawable(SkDrawable * drawable,const SkMatrix * matrix)362 void RSRecordingCanvas::onDrawDrawable(SkDrawable* drawable, const SkMatrix* matrix)
363 {
364 RS_DRAWOP_TRACE_FUNC();
365 std::unique_ptr<OpItem> op = std::make_unique<DrawableOpItem>(drawable, matrix);
366 AddOp(std::move(op));
367 }
368
onDrawPicture(const SkPicture * picture,const SkMatrix * matrix,const SkPaint * paint)369 void RSRecordingCanvas::onDrawPicture(const SkPicture* picture, const SkMatrix* matrix, const SkPaint* paint)
370 {
371 RS_DRAWOP_TRACE_FUNC();
372 std::unique_ptr<OpItem> op = std::make_unique<PictureOpItem>(sk_ref_sp(picture), matrix, paint);
373 AddOp(std::move(op));
374 }
375
onDrawAnnotation(const SkRect & rect,const char key[],SkData * val)376 void RSRecordingCanvas::onDrawAnnotation(const SkRect& rect, const char key[], SkData* val)
377 {
378 // [PLANNING]: To be implemented
379 ROSEN_LOGE("RSRecordingCanvas::onDrawAnnotation not support yet");
380 }
381
onDrawTextBlob(const SkTextBlob * blob,SkScalar x,SkScalar y,const SkPaint & paint)382 void RSRecordingCanvas::onDrawTextBlob(const SkTextBlob* blob, SkScalar x, SkScalar y, const SkPaint& paint)
383 {
384 RS_DRAWOP_TRACE_FUNC();
385 std::unique_ptr<OpItem> op = std::make_unique<TextBlobOpItem>(sk_ref_sp(blob), x, y, paint);
386 if (IsCustomTextType()) {
387 // replace drawOpItem with cached one (generated by CPU)
388 ROSEN_LOGD("RSRecordingCanvas::onDrawTextBlob replace drawOpItem with cached one");
389 op = op->GenerateCachedOpItem();
390 }
391 AddOp(std::move(op));
392 }
393
onDrawSymbol(const HMSymbolData & symbol,SkPoint locate,const SkPaint & paint)394 void RSRecordingCanvas::onDrawSymbol(const HMSymbolData& symbol, SkPoint locate, const SkPaint& paint)
395 {
396 RS_DRAWOP_TRACE_FUNC();
397 std::unique_ptr<OpItem> op = std::make_unique<SymbolOpItem>(symbol, locate, paint);
398 AddOp(std::move(op));
399 }
400
DrawAdaptiveRRect(float radius,const SkPaint & paint)401 void RSRecordingCanvas::DrawAdaptiveRRect(float radius, const SkPaint& paint)
402 {
403 RS_DRAWOP_TRACE_FUNC();
404 std::unique_ptr<OpItem> op = std::make_unique<AdaptiveRRectOpItem>(radius, paint);
405 AddOp(std::move(op));
406 }
407
DrawAdaptiveRRectScale(float radiusRatio,const SkPaint & paint)408 void RSRecordingCanvas::DrawAdaptiveRRectScale(float radiusRatio, const SkPaint& paint)
409 {
410 RS_DRAWOP_TRACE_FUNC();
411 std::unique_ptr<OpItem> op = std::make_unique<AdaptiveRRectScaleOpItem>(radiusRatio, paint);
412 AddOp(std::move(op));
413 }
414
ClipAdaptiveRRect(const SkVector radius[])415 void RSRecordingCanvas::ClipAdaptiveRRect(const SkVector radius[])
416 {
417 RS_DRAWOP_TRACE_FUNC();
418 std::unique_ptr<OpItem> op = std::make_unique<ClipAdaptiveRRectOpItem>(radius);
419 AddOp(std::move(op));
420 }
421
ClipOutsetRect(float dx,float dy)422 void RSRecordingCanvas::ClipOutsetRect(float dx, float dy)
423 {
424 RS_DRAWOP_TRACE_FUNC();
425 std::unique_ptr<OpItem> op = std::make_unique<ClipOutsetRectOpItem>(dx, dy);
426 AddOp(std::move(op));
427 }
428
onDrawPatch(const SkPoint cubics[12],const SkColor colors[4],const SkPoint texCoords[4],SkBlendMode bmode,const SkPaint & paint)429 void RSRecordingCanvas::onDrawPatch(const SkPoint cubics[12], const SkColor colors[4], const SkPoint texCoords[4],
430 SkBlendMode bmode, const SkPaint& paint)
431 {
432 // [PLANNING]: To be implemented
433 ROSEN_LOGE("RSRecordingCanvas::onDrawPatch not support yet");
434 }
435
onDrawPoints(SkCanvas::PointMode mode,size_t count,const SkPoint pts[],const SkPaint & paint)436 void RSRecordingCanvas::onDrawPoints(SkCanvas::PointMode mode, size_t count, const SkPoint pts[], const SkPaint& paint)
437 {
438 RS_DRAWOP_TRACE_FUNC();
439 std::unique_ptr<OpItem> op = std::make_unique<PointsOpItem>(mode, count, pts, paint);
440 AddOp(std::move(op));
441 }
442
onDrawShadowRec(const SkPath & path,const SkDrawShadowRec & rec)443 void RSRecordingCanvas::onDrawShadowRec(const SkPath& path, const SkDrawShadowRec& rec)
444 {
445 RS_DRAWOP_TRACE_FUNC();
446 std::unique_ptr<OpItem> op = std::make_unique<ShadowRecOpItem>(path, rec);
447 AddOp(std::move(op));
448 }
449
MultiplyAlpha(float alpha)450 void RSRecordingCanvas::MultiplyAlpha(float alpha)
451 {
452 RS_DRAWOP_TRACE_FUNC();
453 std::unique_ptr<OpItem> op = std::make_unique<MultiplyAlphaOpItem>(alpha);
454 AddOp(std::move(op));
455 }
456
SaveAlpha()457 void RSRecordingCanvas::SaveAlpha()
458 {
459 RS_DRAWOP_TRACE_FUNC();
460 std::unique_ptr<OpItem> op = std::make_unique<SaveAlphaOpItem>();
461 AddOp(std::move(op));
462 }
463
RestoreAlpha()464 void RSRecordingCanvas::RestoreAlpha()
465 {
466 RS_DRAWOP_TRACE_FUNC();
467 std::unique_ptr<OpItem> op = std::make_unique<RestoreAlphaOpItem>();
468 AddOp(std::move(op));
469 }
470
SetIsCustomTextType(bool isCustomTextType)471 void RSRecordingCanvas::SetIsCustomTextType(bool isCustomTextType)
472 {
473 isCustomTextType_ = isCustomTextType;
474 }
475
IsCustomTextType() const476 bool RSRecordingCanvas::IsCustomTextType() const
477 {
478 return isCustomTextType_;
479 }
DrawDrawFunc(DrawFunc && drawFunc)480 void RSRecordingCanvas::DrawDrawFunc(DrawFunc && drawFunc)
481 {
482 RS_DRAWOP_TRACE_FUNC();
483 std::unique_ptr<OpItem> op = std::make_unique<DrawFuncOpItem>(std::move(drawFunc));
484 AddOp(std::move(op));
485 }
486 } // namespace Rosen
487 } // namespace OHOS
488
489 #else
490 #include "pipeline/rs_recording_canvas.h"
491 #include "pipeline/rs_draw_cmd.h"
492 #include "recording/cmd_list_helper.h"
493 #include "render/rs_pixel_map_util.h"
494
495 namespace OHOS {
496 namespace Rosen {
497
ExtendRecordingCanvas(int width,int height,bool addDrawOpImmediate)498 ExtendRecordingCanvas::ExtendRecordingCanvas(int width, int height, bool addDrawOpImmediate)
499 : Drawing::RecordingCanvas(width, height, addDrawOpImmediate) {}
500
DrawImageWithParm(const std::shared_ptr<Drawing::Image> & image,const std::shared_ptr<Drawing::Data> & data,const Drawing::AdaptiveImageInfo & rsImageInfo,const Drawing::SamplingOptions & sampling)501 void ExtendRecordingCanvas::DrawImageWithParm(
502 const std::shared_ptr<Drawing::Image>& image, const std::shared_ptr<Drawing::Data>& data,
503 const Drawing::AdaptiveImageInfo& rsImageInfo, const Drawing::SamplingOptions& sampling)
504 {
505 if (!addDrawOpImmediate_) {
506 AddDrawOpDeferred<Drawing::DrawImageWithParmOpItem>(image, data, rsImageInfo, sampling);
507 return;
508 }
509 auto object = std::make_shared<RSExtendImageObject>(image, data, rsImageInfo);
510 auto drawCallList = Drawing::RecordingCanvas::GetDrawCmdList();
511 auto objectHandle =
512 Drawing::CmdListHelper::AddImageObjectToCmdList(*drawCallList, object);
513 AddDrawOpImmediate<Drawing::DrawImageWithParmOpItem::ConstructorHandle>(objectHandle, sampling);
514 }
515
DrawPixelMapWithParm(const std::shared_ptr<Media::PixelMap> & pixelMap,const Drawing::AdaptiveImageInfo & rsImageInfo,const Drawing::SamplingOptions & sampling)516 void ExtendRecordingCanvas::DrawPixelMapWithParm(const std::shared_ptr<Media::PixelMap>& pixelMap,
517 const Drawing::AdaptiveImageInfo& rsImageInfo, const Drawing::SamplingOptions& sampling)
518 {
519 if (!addDrawOpImmediate_) {
520 AddDrawOpDeferred<Drawing::DrawPixelMapWithParmOpItem>(pixelMap, rsImageInfo, sampling);
521 return;
522 }
523 auto object = std::make_shared<RSExtendImageObject>(pixelMap, rsImageInfo);
524 auto drawCallList = Drawing::RecordingCanvas::GetDrawCmdList();
525 auto objectHandle =
526 Drawing::CmdListHelper::AddImageObjectToCmdList(*drawCallList, object);
527 AddDrawOpImmediate<Drawing::DrawPixelMapWithParmOpItem::ConstructorHandle>(objectHandle, sampling);
528 }
529
DrawPixelMapRect(const std::shared_ptr<Media::PixelMap> & pixelMap,const Drawing::Rect & src,const Drawing::Rect & dst,const Drawing::SamplingOptions & sampling,Drawing::SrcRectConstraint constraint)530 void ExtendRecordingCanvas::DrawPixelMapRect(const std::shared_ptr<Media::PixelMap>& pixelMap, const Drawing::Rect& src,
531 const Drawing::Rect& dst, const Drawing::SamplingOptions& sampling,
532 Drawing::SrcRectConstraint constraint)
533 {
534 if (!addDrawOpImmediate_) {
535 AddDrawOpDeferred<Drawing::DrawPixelMapRectOpItem>(pixelMap, src, dst, sampling);
536 return;
537 }
538 auto object = std::make_shared<RSExtendImageBaseObj>(pixelMap, src, dst);
539 auto drawCallList = Drawing::RecordingCanvas::GetDrawCmdList();
540 auto objectHandle =
541 Drawing::CmdListHelper::AddImageBaseObjToCmdList(*drawCallList, object);
542 AddDrawOpImmediate<Drawing::DrawPixelMapRectOpItem::ConstructorHandle>(objectHandle, sampling);
543 }
544
DrawDrawFunc(Drawing::RecordingCanvas::DrawFunc && drawFunc)545 void ExtendRecordingCanvas::DrawDrawFunc(Drawing::RecordingCanvas::DrawFunc&& drawFunc)
546 {
547 if (!addDrawOpImmediate_) {
548 cmdList_->AddDrawOp(std::make_shared<Drawing::DrawFuncOpItem>(std::move(drawFunc)));
549 return;
550 }
551 auto object = std::make_shared<RSExtendDrawFuncObj>(std::move(drawFunc));
552 auto drawCallList = Drawing::RecordingCanvas::GetDrawCmdList();
553 auto objectHandle =
554 Drawing::CmdListHelper::AddDrawFuncObjToCmdList(*drawCallList, object);
555 cmdList_->AddOp<Drawing::DrawFuncOpItem::ConstructorHandle>(objectHandle);
556 }
557
558 #ifdef ROSEN_OHOS
DrawSurfaceBuffer(const DrawingSurfaceBufferInfo & surfaceBufferInfo)559 void ExtendRecordingCanvas::DrawSurfaceBuffer(const DrawingSurfaceBufferInfo& surfaceBufferInfo)
560 {
561 if (!addDrawOpImmediate_) {
562 AddDrawOpDeferred<Drawing::DrawSurfaceBufferOpItem>(surfaceBufferInfo);
563 return;
564 }
565 AddDrawOpImmediate<Drawing::DrawSurfaceBufferOpItem::ConstructorHandle>(
566 Drawing::CmdListHelper::AddSurfaceBufferToCmdList(*cmdList_, surfaceBufferInfo.surfaceBuffer_),
567 surfaceBufferInfo.offSetX_, surfaceBufferInfo.offSetY_,
568 surfaceBufferInfo.width_, surfaceBufferInfo.height_);
569 }
570 #endif
571
572 template<typename T, typename... Args>
AddDrawOpImmediate(Args &&...args)573 void ExtendRecordingCanvas::AddDrawOpImmediate(Args&&... args)
574 {
575 bool brushValid = paintBrush_.IsValid();
576 bool penValid = paintPen_.IsValid();
577 if (!brushValid && !penValid) {
578 Drawing::PaintHandle paintHandle;
579 paintHandle.isAntiAlias = true;
580 paintHandle.style = Drawing::Paint::PaintStyle::PAINT_FILL;
581 cmdList_->AddDrawOp<T>(std::forward<Args>(args)..., paintHandle);
582 return;
583 }
584 if (brushValid && penValid && Drawing::Paint::CanCombinePaint(paintBrush_, paintPen_)) {
585 Drawing::PaintHandle paintHandle;
586 paintPen_.SetStyle(Drawing::Paint::PaintStyle::PAINT_FILL_STROKE);
587 Drawing::DrawOpItem::GenerateHandleFromPaint(*cmdList_, paintPen_, paintHandle);
588 cmdList_->AddDrawOp<T>(std::forward<Args>(args)..., paintHandle);
589 paintPen_.SetStyle(Drawing::Paint::PaintStyle::PAINT_STROKE);
590 return;
591 }
592 if (brushValid) {
593 Drawing::PaintHandle paintHandle;
594 Drawing::DrawOpItem::GenerateHandleFromPaint(*cmdList_, paintBrush_, paintHandle);
595 cmdList_->AddDrawOp<T>(std::forward<Args>(args)..., paintHandle);
596 }
597 if (penValid) {
598 Drawing::PaintHandle paintHandle;
599 Drawing::DrawOpItem::GenerateHandleFromPaint(*cmdList_, paintPen_, paintHandle);
600 cmdList_->AddDrawOp<T>(std::forward<Args>(args)..., paintHandle);
601 }
602 }
603
604 template<typename T, typename... Args>
AddDrawOpDeferred(Args &&...args)605 void ExtendRecordingCanvas::AddDrawOpDeferred(Args&&... args)
606 {
607 bool brushValid = paintBrush_.IsValid();
608 bool penValid = paintPen_.IsValid();
609 if (!brushValid && !penValid) {
610 Drawing::Paint paint;
611 paint.SetAntiAlias(true);
612 paint.SetStyle(Drawing::Paint::PaintStyle::PAINT_FILL);
613 cmdList_->AddDrawOp(std::make_shared<T>(std::forward<Args>(args)..., paint));
614 return;
615 }
616 if (brushValid && penValid && Drawing::Paint::CanCombinePaint(paintBrush_, paintPen_)) {
617 paintPen_.SetStyle(Drawing::Paint::PaintStyle::PAINT_FILL_STROKE);
618 cmdList_->AddDrawOp(std::make_shared<T>(std::forward<Args>(args)..., paintPen_));
619 paintPen_.SetStyle(Drawing::Paint::PaintStyle::PAINT_STROKE);
620 return;
621 }
622 if (brushValid) {
623 cmdList_->AddDrawOp(std::make_shared<T>(std::forward<Args>(args)..., paintBrush_));
624 }
625 if (penValid) {
626 cmdList_->AddDrawOp(std::make_shared<T>(std::forward<Args>(args)..., paintPen_));
627 }
628 }
629
DrawImageNineWithPixelMap(const std::shared_ptr<Media::PixelMap> & pixelmap,const Drawing::RectI & center,const Drawing::Rect & dst,Drawing::FilterMode filter,const Drawing::Brush * brush)630 void ExtendRecordingCanvas::DrawImageNineWithPixelMap(const std::shared_ptr<Media::PixelMap>& pixelmap,
631 const Drawing::RectI& center, const Drawing::Rect& dst, Drawing::FilterMode filter, const Drawing::Brush* brush)
632 {
633 auto image = RSPixelMapUtil::ExtractDrawingImage(pixelmap);
634 Drawing::RecordingCanvas::DrawImageNine(image.get(), center, dst, filter, brush);
635 }
636 } // namespace Rosen
637 } // namespace OHOS
638 #endif // USE_ROSEN_DRAWING
639