• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2025 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 SAMPLE_GRAPHICS_H
17 #define SAMPLE_GRAPHICS_H
18 #include <ace/xcomponent/native_interface_xcomponent.h>
19 #include <native_window/external_window.h>
20 #include <native_drawing/drawing_bitmap.h>
21 #include <native_drawing/drawing_color.h>
22 #include <native_drawing/drawing_canvas.h>
23 #include <native_drawing/drawing_pen.h>
24 #include <native_drawing/drawing_brush.h>
25 #include <native_drawing/drawing_path.h>
26 #include <cstdint>
27 #include <unordered_map>
28 #include <string>
29 #include <EGL/egl.h>
30 #include <EGL/eglext.h>
31 #include <GLES3/gl3.h>
32 #include "napi/native_api.h"
33 #include <multimedia/image_framework/image_pixel_map_mdk.h>
34 
35 
36 class SampleGraphics {
37 public:
38     SampleGraphics() = default;
39     ~SampleGraphics();
SampleGraphics(std::string id)40     explicit SampleGraphics(std::string id) : id_(id)
41     {
42         InitializeEglContext();
43     }
44     static napi_value Draw(napi_env env, napi_callback_info info);
45     static napi_value DrawImage(napi_env env, napi_callback_info info);
46     static void Release(std::string &id);
47     void SetWidth(uint64_t width);
48     void SetHeight(uint64_t height);
49     void SetNativeWindow(OHNativeWindow *nativeWindow);
50 
51     // brush
52     void DrawBrushBasic(OH_Drawing_Canvas *canvas);
53     void DrawMixedMode(OH_Drawing_Canvas *canvas);
54     void DrawShaderEffect1Line(OH_Drawing_Canvas *canvas);
55     void DrawShaderEffect2Line(OH_Drawing_Canvas *canvas);
56     void DrawShaderEffect(OH_Drawing_Canvas *canvas);
57     void DrawColorFilter(OH_Drawing_Canvas *canvas);
58     void DrawMaskFilterBrush(OH_Drawing_Canvas *canvas);
59 
60     // pen
61     void DrawPenBasic(OH_Drawing_Canvas *canvas);
62     void DrawPenLinearGradient(OH_Drawing_Canvas *canvas);
63     void DrawMiterLimit(OH_Drawing_Canvas *canvas);
64     void DrawStroke(OH_Drawing_Canvas *canvas);
65     void DrawPathEffect(OH_Drawing_Canvas *canvas);
66     void DrawImageFilter(OH_Drawing_Canvas *canvas);
67     void DrawMaskFilterPen(OH_Drawing_Canvas *canvas);
68 
69     // rect
70     void DrawRectBasic(OH_Drawing_Canvas *canvas);
71     void DrawRectIntersect(OH_Drawing_Canvas *canvas);
72     void DrawRectJoin(OH_Drawing_Canvas *canvas);
73     void DrawRoundRect(OH_Drawing_Canvas *canvas);
74 
75     // path
76     OH_Drawing_Path* DrawPathBasicTriangle(float startX, float startY, int32_t w);
77     void DrawPathBasic(OH_Drawing_Canvas *canvas);
78     void DrawPathAdd(OH_Drawing_Canvas *canvas);
79     void DrawPathAdd1Line(OH_Drawing_Canvas *canvas);
80     void DrawPathAdd2Line(OH_Drawing_Canvas *canvas);
81     void DrawPathAdd3Line(OH_Drawing_Canvas *canvas);
82     void DrawPathAdd4Line(OH_Drawing_Canvas *canvas);
83     void DrawPathTo(OH_Drawing_Canvas *canvas);
84     void DrawPathTo1Line(OH_Drawing_Canvas *canvas);
85     void DrawPathTo2Line(OH_Drawing_Canvas *canvas);
86     void DrawStar(OH_Drawing_Canvas *canvas);
87     void BuildFromSvgString(OH_Drawing_Canvas *canvas);
88 
89     // matrix
90     void DrawMatrixBasic(OH_Drawing_Canvas *canvas);
91     void DrawTranslationOperation(OH_Drawing_Canvas *canvas);
92     void DrawPreTranslationOperation(OH_Drawing_Canvas *canvas);
93     void DrawPostTranslationOperation(OH_Drawing_Canvas *canvas);
94     void DrawRotationOperation(OH_Drawing_Canvas *canvas);
95     void DrawPreRotationOperation(OH_Drawing_Canvas *canvas);
96     void DrawPostRotationOperation(OH_Drawing_Canvas *canvas);
97     void DrawScaleOperation(OH_Drawing_Canvas *canvas);
98     void DrawPreScaleOperation(OH_Drawing_Canvas *canvas);
99     void DrawPostScaleOperation(OH_Drawing_Canvas *canvas);
100     void DrawConcatOperation(OH_Drawing_Canvas *canvas);
101 
102     // Canvas
103     void DrawCreateCanvas(OH_Drawing_Canvas *canvas);
104     void DrawClipOperation(OH_Drawing_Canvas *canvas);
105     void CanvasSaveOperation(OH_Drawing_Canvas *canvas);
106     void CanvasSaveLayerOperation(OH_Drawing_Canvas *canvas);
107     void DrawCanvasConcatMatrix(OH_Drawing_Canvas *canvas);
108     void DrawRegion(OH_Drawing_Canvas *canvas);
109 
110     void DrawCustomPixelMap(OH_Drawing_Canvas *canvas);
111     void DrawPixelMapRect(OH_Drawing_Canvas *canvas);
112     void DrawBitmap(OH_Drawing_Canvas *canvas);
113     void DrawImage(OH_Drawing_Canvas *canvas);
114 
115     // 创建画布及绘图结果显示
116     void Prepare();
117     void Create();
118     void CreateByCPU();
119     void CreateByGPU();
120     void DisPlay();
121     void DisPlayCPU();
122     void DisPlayGPU();
123 
124     void Export(napi_env env, napi_value exports);
125     void RegisterCallback(OH_NativeXComponent *nativeXComponent);
126     void Destroy();
127     static SampleGraphics *GetInstance(std::string &id);
128     std::string id_;
129 private:
130     std::unordered_map<std::string,  void (SampleGraphics::*)(OH_Drawing_Canvas *)> drawFunctionMap_;
131     void InitDrawFunction(std::string id);
132     void DoRender(SampleGraphics *render, char* canvasType, char* shapeType);
133     int32_t InitializeEglContext();
134     void DeInitializeEglContext();
135     OH_NativeXComponent_Callback renderCallback_;
136 
137     uint64_t width_ = 0;
138     uint64_t height_ = 0;
139 
140     static float value10_;
141     static float value15_;
142     static float value20_;
143     static float value30_;
144     static float value45_;
145     static float value50_;
146     static float value70_;
147     static float value90_;
148     static float value100_;
149     static float value120_;
150     static float value150_;
151     static float value200_;
152     static float value300_;
153     static float value400_;
154     static float value500_;
155     static float value551_;
156     static float value600_;
157     static float value630_;
158     static float value700_;
159     static float value800_;
160     static float value900_;
161     static float value1000_;
162     static float value1100_;
163     static float value1200_;
164     bool desc = false;
165 
166     EGLDisplay EGLDisplay_ = EGL_NO_DISPLAY;
167     EGLConfig EGLConfig_ = nullptr;
168     EGLContext EGLContext_ = EGL_NO_CONTEXT;
169     EGLSurface EGLSurface_ = nullptr;
170 
171     OH_Drawing_Bitmap *cScreenBitmap_ = nullptr;
172     OH_Drawing_Canvas *cScreenCanvas_ = nullptr;
173     OH_Drawing_Bitmap *cOffScreenBitmap_ = nullptr;
174     OH_Drawing_Canvas *cCPUCanvas_ = nullptr;
175     OH_Drawing_Canvas *cGPUCanvas_ = nullptr;
176     NativePixelMap *nativePixelMap_ = nullptr;
177 
178     OHNativeWindow *nativeWindow_ = nullptr;
179     uint32_t *mappedAddr_ = nullptr;
180     BufferHandle *bufferHandle_ = nullptr;
181     struct NativeWindowBuffer *buffer_ = nullptr;
182     int fenceFd_ = 0;
183 
184     const uint16_t rgbaMin_ = 0x00;
185     const uint16_t rgbaMax_ = 0xFF;
186     const uint16_t rgbaHalf_ = 0x80;
187     const uint16_t rgbaSize_ = 4;
188     const uint16_t indexOne_ = 1;
189     const uint16_t indexTwo_ = 2;
190     const uint16_t indexThree_ = 3;
191     const uint16_t indexFour_ = 4;
192     const uint16_t indexFive_ = 5;
193     const uint16_t indexSix_ = 6;
194     const uint16_t indexSeven_ = 7;
195     const uint16_t indexEight_ = 8;
196     const uint16_t indexNine_ = 9;
197 };
198 
199 #endif // SAMPLE_GRAPHICS_H
200