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     virtual void DrawBackground(const Brush& brush) = 0;
97     virtual void DrawShadow(const Path& path, const Point3& planeParams, const Point3& devLightPos, scalar lightRadius,
98         Color ambientColor, Color spotColor, ShadowFlags flag) = 0;
99     virtual void DrawShadowStyle(const Path& path, const Point3& planeParams, const Point3& devLightPos,
100         scalar lightRadius, Color ambientColor, Color spotColor, ShadowFlags flag, bool isLimitElevation) = 0;
101     virtual void DrawRegion(const Region& region, const Paint& paint) = 0;
102     virtual void DrawPatch(const Point cubics[12], const ColorQuad colors[4],
103         const Point texCoords[4], BlendMode mode, const Paint& paint) = 0;
104     virtual void DrawVertices(const Vertices& vertices, BlendMode mode, const Paint& paint) = 0;
105 
106     virtual void DrawImageNine(const Image* image, const RectI& center, const Rect& dst,
107         FilterMode filter, const Brush* brush = nullptr) = 0;
108     virtual void DrawImageLattice(const Image* image, const Lattice& lattice, const Rect& dst,
109         FilterMode filter, const Paint& paint) = 0;
110 
111     // color
112     virtual void DrawColor(ColorQuad color, BlendMode mode) = 0;
113 
114     // opinc calculate realdraw rect
115     virtual bool OpCalculateBefore(const Matrix& matrix) = 0;
116     virtual std::shared_ptr<Drawing::OpListHandle> OpCalculateAfter(const Rect& bound) = 0;
117 
118     // image
119     virtual void DrawAtlas(const Image* atlas, const RSXform xform[], const Rect tex[], const ColorQuad colors[],
120         int count, BlendMode mode, const SamplingOptions& sampling, const Rect* cullRect, const Paint& paint) = 0;
121     virtual void DrawBitmap(const Bitmap& bitmap, const scalar px, const scalar py, const Paint& paint) = 0;
122     virtual void DrawImage(const Image& image, const scalar px, const scalar p, const SamplingOptions& sampling,
123         const Paint& paint) = 0;
124     virtual void DrawImageRect(const Image& image, const Rect& src, const Rect& dst, const SamplingOptions& sampling,
125         SrcRectConstraint constraint, const Paint& paint) = 0;
126     virtual void DrawImageRect(const Image& image, const Rect& dst, const SamplingOptions& sampling,
127         const Paint& paint) = 0;
128     virtual void DrawPicture(const Picture& picture) = 0;
129 
130     // temporary interface. Support drawing of SkSVGDOM
131     virtual void DrawSVGDOM(const sk_sp<SkSVGDOM>& svgDom) = 0;
132 
133     // text
134     virtual void DrawTextBlob(const TextBlob* blob, const scalar x, const scalar y, const Paint& paint) = 0;
135 
136     // symbol
137     virtual void DrawSymbol(const DrawingHMSymbolData& symbol, Point locate, const Paint& paint) = 0;
138 
139     // clip
140     virtual void ClipRect(const Rect& rect, ClipOp op, bool doAntiAlias = false) = 0;
141     virtual void ClipIRect(const RectI& rect, ClipOp op = ClipOp::INTERSECT) = 0;
142     virtual void ClipRoundRect(const RoundRect& roundRect, ClipOp op, bool doAntiAlias = false) = 0;
143     virtual void ClipRoundRect(const Rect& rect, std::vector<Point>& pts, bool doAntiAlias = false) = 0;
144     virtual void ClipPath(const Path& path, ClipOp op, bool doAntiAlias = false) = 0;
145     virtual void ClipRegion(const Region& region, ClipOp op = ClipOp::INTERSECT) = 0;
146     virtual bool IsClipEmpty() = 0;
147     virtual bool IsClipRect() = 0;
148     virtual bool QuickReject(const Rect& rect) = 0;
149 
150     // transform
151     virtual void SetMatrix(const Matrix& matrix) = 0;
152     virtual void ResetMatrix() = 0;
153     virtual void ConcatMatrix(const Matrix& matrix) = 0;
154     virtual void Translate(scalar dx, scalar dy) = 0;
155     virtual void Scale(scalar sx, scalar sy) = 0;
156     virtual void Rotate(scalar deg, scalar sx, scalar sy) = 0;
157     virtual void Shear(scalar sx, scalar sy) = 0;
158 
159     // state
160     virtual void Flush() = 0;
161     virtual void Clear(ColorQuad color) = 0;
162     virtual uint32_t Save() = 0;
163     virtual void SaveLayer(const SaveLayerOps& saveLayerOption) = 0;
164     virtual void Restore() = 0;
165     virtual uint32_t  GetSaveCount() const = 0;
166     virtual void Discard() = 0;
167 
168     virtual void BuildOverDraw(std::shared_ptr<Canvas> canvas) = 0;
169 
170     virtual void BuildNoDraw(int32_t width, int32_t height) = 0;
171 
172     virtual void Reset(int32_t width, int32_t height) = 0;
173 
174     virtual bool DrawBlurImage(const Image& image, const Drawing::HpsBlurParameter& blurParams) = 0;
175 
176     virtual std::array<int, 2> CalcHpsBluredImageDimension(const Drawing::HpsBlurParameter& blurParams) = 0;
177 };
178 } // namespace Drawing
179 } // namespace Rosen
180 } // namespace OHOS
181 #endif
182