• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2023 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 CORECANVASIMPL_H
17 #define CORECANVASIMPL_H
18 #include "base_impl.h"
19 #include "securec.h"
20 
21 #include "include/core/SkRefCnt.h"
22 
23 #include "draw/clip.h"
24 #include "draw/path.h"
25 #include "draw/paint.h"
26 #include "draw/shadow.h"
27 #include "draw/sdf_shaper_base.h"
28 #include "effect/filter.h"
29 #include "draw/OpListHandle.h"
30 #include "image/bitmap.h"
31 #include "image/image_info.h"
32 #ifdef RS_ENABLE_GPU
33 #include "image/gpu_context.h"
34 #endif
35 #include "image/image.h"
36 #include "image/picture.h"
37 #include "text/hm_symbol.h"
38 #include "text/text.h"
39 #include "text/text_blob.h"
40 #include "utils/matrix.h"
41 #include "utils/point.h"
42 #include "utils/point3.h"
43 #include "utils/rect.h"
44 #include "utils/region.h"
45 #include "utils/round_rect.h"
46 #include "utils/sampling_options.h"
47 #include "utils/scalar.h"
48 #include "utils/vertices.h"
49 
50 class SkSVGDOM;
51 
52 namespace OHOS {
53 namespace Rosen {
54 namespace Drawing {
55 enum class SrcRectConstraint;
56 class SaveLayerOps;
57 enum class PointMode;
58 struct Lattice;
59 class Canvas;
60 struct HpsBlurParameter;
61 enum class QuadAAFlags;
62 
63 class CoreCanvasImpl : public BaseImpl {
64 public:
CoreCanvasImpl()65     CoreCanvasImpl() {};
~CoreCanvasImpl()66     ~CoreCanvasImpl() override {};
67 
68     virtual void Bind(const Bitmap& bitmap) = 0;
69 
70     virtual Matrix GetTotalMatrix() const = 0;
71     virtual Rect GetLocalClipBounds() const = 0;
72     virtual RectI GetDeviceClipBounds() const = 0;
73     virtual RectI GetRoundInDeviceClipBounds() const = 0;
74 #ifdef RS_ENABLE_GPU
75     virtual std::shared_ptr<GPUContext> GetGPUContext() const = 0;
76 #endif
77     virtual int32_t GetWidth() const = 0;
78     virtual int32_t GetHeight() const = 0;
79     virtual ImageInfo GetImageInfo() = 0;
80     virtual bool ReadPixels(const ImageInfo& dstInfo, void* dstPixels, size_t dstRowBytes,
81         int srcX, int srcY) = 0;
82     virtual bool ReadPixels(const Bitmap& dstBitmap, int srcX, int srcY) = 0;
83     // shapes
84     virtual void DrawPoint(const Point& point, const Paint& paint) = 0;
85     virtual void DrawSdf(const SDFShapeBase& shape) = 0;
86     virtual void DrawPoints(PointMode mode, size_t count, const Point pts[], const Paint& paint) = 0;
87     virtual void DrawLine(const Point& startPt, const Point& endPt, const Paint& paint) = 0;
88     virtual void DrawRect(const Rect& rect, const Paint& paint) = 0;
89     virtual void DrawRoundRect(const RoundRect& roundRect, const Paint& paint) = 0;
90     virtual void DrawNestedRoundRect(const RoundRect& outer, const RoundRect& inner, const Paint& paint) = 0;
91     virtual void DrawArc(const Rect& oval, scalar startAngle, scalar sweepAngle, const Paint& paint) = 0;
92     virtual void DrawPie(const Rect& oval, scalar startAngle, scalar sweepAngle, const Paint& paint) = 0;
93     virtual void DrawOval(const Rect& oval, const Paint& paint) = 0;
94     virtual void DrawCircle(const Point& centerPt, scalar radius, const Paint& paint) = 0;
95     virtual void DrawPath(const Path& path, const Paint& paint) = 0;
96 
DrawPathWithStencil(const Path & path,uint32_t stencilVal,const Paint & paint)97     virtual void DrawPathWithStencil(const Path& path, uint32_t stencilVal, const Paint& paint)
98     {
99         (void)stencilVal;
100         DrawPath(path, paint);
101     }
102 
103     virtual void DrawBackground(const Brush& brush) = 0;
104     virtual void DrawShadow(const Path& path, const Point3& planeParams, const Point3& devLightPos, scalar lightRadius,
105         Color ambientColor, Color spotColor, ShadowFlags flag) = 0;
106     virtual void DrawShadowStyle(const Path& path, const Point3& planeParams, const Point3& devLightPos,
107         scalar lightRadius, Color ambientColor, Color spotColor, ShadowFlags flag, bool isLimitElevation) = 0;
108     virtual void DrawRegion(const Region& region, const Paint& paint) = 0;
109     virtual void DrawPatch(const Point cubics[12], const ColorQuad colors[4],
110         const Point texCoords[4], BlendMode mode, const Paint& paint) = 0;
111     virtual void DrawVertices(const Vertices& vertices, BlendMode mode, const Paint& paint) = 0;
112 
113     virtual void DrawImageNine(const Image* image, const RectI& center, const Rect& dst,
114         FilterMode filter, const Brush* brush = nullptr) = 0;
115     virtual void DrawImageLattice(const Image* image, const Lattice& lattice, const Rect& dst,
116         FilterMode filter, const Paint& paint) = 0;
117 
118     // color
119     virtual void DrawColor(ColorQuad color, BlendMode mode) = 0;
120 
121     // opinc calculate realdraw rect
122     virtual bool OpCalculateBefore(const Matrix& matrix) = 0;
123     virtual std::shared_ptr<Drawing::OpListHandle> OpCalculateAfter(const Rect& bound) = 0;
124 
125     // image
126     virtual void DrawAtlas(const Image* atlas, const RSXform xform[], const Rect tex[], const ColorQuad colors[],
127         int count, BlendMode mode, const SamplingOptions& sampling, const Rect* cullRect, const Paint& paint) = 0;
128     virtual void DrawBitmap(const Bitmap& bitmap, const scalar px, const scalar py, const Paint& paint) = 0;
129     virtual void DrawImage(const Image& image, const scalar px, const scalar py, const SamplingOptions& sampling,
130         const Paint& paint) = 0;
131 
DrawImageWithStencil(const Image & image,const scalar px,const scalar py,const SamplingOptions & sampling,uint32_t stencilVal,const Paint & paint)132     virtual void DrawImageWithStencil(const Image& image, const scalar px, const scalar py,
133         const SamplingOptions& sampling, uint32_t stencilVal, const Paint& paint)
134     {
135         (void)stencilVal;
136         DrawImage(image, px, py, sampling, paint);
137     }
138 
139     virtual void DrawImageRect(const Image& image, const Rect& src, const Rect& dst, const SamplingOptions& sampling,
140         SrcRectConstraint constraint, const Paint& paint) = 0;
141     virtual void DrawImageRect(const Image& image, const Rect& dst, const SamplingOptions& sampling,
142         const Paint& paint) = 0;
143     virtual void DrawPicture(const Picture& picture) = 0;
144 
145     // temporary interface. Support drawing of SkSVGDOM
146     virtual void DrawSVGDOM(const sk_sp<SkSVGDOM>& svgDom) = 0;
147 
148     // text
149     virtual void DrawTextBlob(const TextBlob* blob, const scalar x, const scalar y, const Paint& paint) = 0;
150 
151     // symbol
152     virtual void DrawSymbol(const DrawingHMSymbolData& symbol, Point locate, const Paint& paint) = 0;
153 
154     // stencil culling
ClearStencil(const RectI & rect,uint32_t stencilVal)155     virtual void ClearStencil(const RectI& rect, uint32_t stencilVal)
156     {
157         (void)rect;
158         (void)stencilVal;
159     }
160 
161     // clip
162     virtual void ClipRect(const Rect& rect, ClipOp op, bool doAntiAlias = false) = 0;
163     virtual void ClipIRect(const RectI& rect, ClipOp op = ClipOp::INTERSECT) = 0;
164     virtual void ClipRoundRect(const RoundRect& roundRect, ClipOp op, bool doAntiAlias = false) = 0;
165     virtual void ClipRoundRect(const Rect& rect, std::vector<Point>& pts, bool doAntiAlias = false) = 0;
166     virtual void ClipPath(const Path& path, ClipOp op, bool doAntiAlias = false) = 0;
167     virtual void ClipRegion(const Region& region, ClipOp op = ClipOp::INTERSECT) = 0;
168     virtual bool IsClipEmpty() = 0;
169     virtual bool IsClipRect() = 0;
170     virtual void ResetClip() = 0;
171     virtual bool QuickReject(const Path& path) = 0;
172     virtual bool QuickReject(const Rect& rect) = 0;
173 
174     // transform
175     virtual void SetMatrix(const Matrix& matrix) = 0;
176     virtual void ResetMatrix() = 0;
177     virtual void ConcatMatrix(const Matrix& matrix) = 0;
178     virtual void Translate(scalar dx, scalar dy) = 0;
179     virtual void Scale(scalar sx, scalar sy) = 0;
180     virtual void Rotate(scalar deg, scalar sx, scalar sy) = 0;
181     virtual void Shear(scalar sx, scalar sy) = 0;
182 
183     // state
184     virtual void Flush() = 0;
185     virtual void Clear(ColorQuad color) = 0;
186     virtual uint32_t Save() = 0;
187     virtual void SaveLayer(const SaveLayerOps& saveLayerOption) = 0;
188     virtual void Restore() = 0;
189     virtual uint32_t  GetSaveCount() const = 0;
190     virtual void Discard() = 0;
191 
192     virtual void BuildOverDraw(std::shared_ptr<Canvas> canvas) = 0;
193 
194     virtual void BuildNoDraw(int32_t width, int32_t height) = 0;
195 
196     virtual void Reset(int32_t width, int32_t height) = 0;
197 
198     virtual bool DrawBlurImage(const Image& image, const Drawing::HpsBlurParameter& blurParams) = 0;
199 
200     virtual std::array<int, 2> CalcHpsBluredImageDimension(const Drawing::HpsBlurParameter& blurParams) = 0;
201 };
202 } // namespace Drawing
203 } // namespace Rosen
204 } // namespace OHOS
205 #endif
206