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