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