• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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