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 INTERFACES_KITS_JS_COMMON_INCLUDE_DETAIL_ENHANCE_NAPI_FORMAL_H 17 #define INTERFACES_KITS_JS_COMMON_INCLUDE_DETAIL_ENHANCE_NAPI_FORMAL_H 18 19 #include "detail_enhancer_image.h" 20 #include "contrast_enhancer_image.h" 21 #include "image_type.h" 22 #include "image_processing_types.h" 23 #include "pixel_map_napi.h" 24 25 namespace OHOS { 26 namespace Media { 27 class VpeNapi { 28 public: 29 VpeNapi() = default; 30 ~VpeNapi() = default; 31 32 static napi_value Init(napi_env env, napi_value exports); 33 static napi_value Create(napi_env env, napi_callback_info info); 34 static napi_value EnhanceDetail(napi_env env, napi_callback_info info); 35 static napi_value EnhanceDetailSync(napi_env env, napi_callback_info info); 36 static napi_value SetDetailImage(napi_env env, napi_callback_info info); 37 static napi_value SetLcdImage(napi_env env, napi_callback_info info); 38 static napi_value RegisterCallback(napi_env env, napi_callback_info info); 39 static napi_value InitializeEnvironment(napi_env env, napi_callback_info info); 40 static napi_value DeinitializeEnvironment(napi_env env, napi_callback_info info); 41 42 private: 43 struct DetailEnhanceContext { 44 napi_async_work asyncWork{}; // asynchronous work object 45 napi_deferred deferred{}; // Delayed execution object (used to return calculation results in Promise) 46 napi_ref callbackRef{}; // Reference object of callback func(used to return calculation results) 47 double xArg{}; 48 double yArg{}; 49 int32_t qualityLevel{}; 50 std::shared_ptr<PixelMap> inputPixelMap{}; 51 std::shared_ptr<PixelMap> outputPixelMap{}; 52 }; 53 54 struct ContrastEnhanceContext { 55 napi_env env; 56 napi_async_work asyncWork{}; // asynchronous work object 57 napi_deferred deferred; 58 napi_ref callbackRef; 59 std::shared_ptr<PixelMap> inputPixelMap{}; 60 std::shared_ptr<PixelMap> lcdPixelMap{}; 61 OHOS::Rect curPixelmapArea; 62 OHOS::Rect displayArea; 63 int pixelmapId = -1; 64 double fullRatio{};; // 传入的pixelmap 相对于原图的缩放比例 65 int sharpnessIntensity{};; 66 int32_t contentId = -1; 67 int oriHeight{}; 68 int oriWidth{}; 69 unsigned int lcdHeight{}; 70 unsigned int lcdWidth{}; 71 bool isLocalDecoding{}; 72 napi_ref callbackFunc; 73 double defaultRatio{}; 74 bool isLCDLutFinished{}; 75 bool isCanceled{}; 76 bool genFinalEffect{}; 77 double maxRatio{}; 78 int animationDuration{}; 79 double curRatio{}; 80 }; 81 82 struct NapiValues { 83 napi_status status = napi_ok; 84 napi_value thisVar{}; 85 napi_value result{}; 86 napi_value* argv{}; 87 size_t argc = 0; 88 }; 89 90 static thread_local napi_ref constructor_; 91 static thread_local napi_ref qualityLevelTypeRef_; 92 static thread_local std::shared_ptr<ContrastEnhanceContext> contrastContext_; 93 static thread_local std::shared_ptr<DetailEnhanceContext> detailContext_; 94 95 static bool PrepareNapiEnv(napi_env env, napi_callback_info info, NapiValues* nVal); 96 static bool ParseRect(napi_env env, napi_value nVal, OHOS::Rect& rect); 97 static bool ParseSize(napi_env env, napi_value nVal); 98 static std::shared_ptr<PixelMap> PrepareDstPixelMap(napi_env env, VpeNapi::DetailEnhanceContext* context); 99 static ImageType ParserImageType(napi_env env, napi_value argv); 100 101 static void SetDstPixelMapInfo(OHOS::Media::PixelMap& source, void* dstPixels, uint32_t dstPixelsSize, 102 std::unique_ptr<OHOS::Media::AbsMemory>& memory, OHOS::Media::PixelMap& dstPixelMap); 103 static bool AllocMemory(OHOS::Media::PixelMap& source, OHOS::Media::PixelMap& dstPixelMap, 104 const InitializationOptions& opt); 105 static bool ConvertPixelmapToSurfaceBuffer(const std::shared_ptr<OHOS::Media::PixelMap>& pixelmap, 106 sptr<SurfaceBuffer>& bufferImpl); 107 static std::unique_ptr<OHOS::Media::PixelMap> CreateDstPixelMap(OHOS::Media::PixelMap& source, 108 const OHOS::Media::InitializationOptions& opts); 109 static sptr<OHOS::SurfaceBuffer> GetSurfaceBufferFromDMAPixelMap( 110 const std::shared_ptr<OHOS::Media::PixelMap>& pixelmap); 111 static napi_value CreateEnumTypeObject(napi_env env, 112 napi_valuetype type, napi_ref* ref, std::vector<struct QualityLevelEnum>& imageEnumMap); 113 114 // detail enhancer 115 static bool InitDetailAlgo(napi_env env); 116 static bool ConfigResolutionBasedOnRatio(napi_env env, napi_value& nVal, 117 std::shared_ptr<VpeNapi::DetailEnhanceContext> context); 118 static bool ConfigResolution(napi_env env, napi_value& width, napi_value& height, 119 std::shared_ptr<VpeNapi::DetailEnhanceContext> context); 120 static bool ParseDetailEnhanceParameter(napi_env env, napi_callback_info info); 121 static std::shared_ptr<PixelMap> DetailEnhanceImpl(napi_env env, VpeNapi::DetailEnhanceContext* context); 122 static bool SetDetailAlgoParam(napi_env env, int level); 123 static void EnhanceDetailWork(napi_env env, void* data); 124 static void EnhanceDetailCallBackWork(napi_env env, napi_status status, void* data); 125 126 // contrast enhancer 127 static bool InitContrastAlgo(napi_env env); 128 static bool ParseLCDParameter(napi_env env, napi_callback_info info, NapiValues& nVal); 129 static bool ParseDetailImageParameter(napi_env env, napi_callback_info info, NapiValues& nVal); 130 static bool GenerateRegionHist(napi_env env, ContrastEnhanceContext* context); 131 static bool UpdateMetadataBasedOnHist(ContrastEnhanceContext* context); 132 static bool UpdateMetadataBasedOnPixel(ContrastEnhanceContext* context); 133 static napi_value CallCallback(napi_env env, ContrastEnhanceContext* context); 134 static OHOS::Rect PrepareRect(std::shared_ptr<PixelMap> input, OHOS::Rect& displayArea, float ratio); 135 136 static napi_value Constructor(napi_env env, napi_callback_info info); 137 static void Destructor(napi_env env, void* nativeObject, void* finalize); 138 static void ThrowExceptionError(napi_env env, const int32_t errCode, const std::string errMsg); 139 static napi_value DoInitAfter(napi_env env, napi_value exports, napi_value constructor, size_t property_count, 140 const napi_property_descriptor* properties); 141 static std::vector<napi_property_descriptor> RegisterNapi(); 142 }; 143 } 144 } 145 #endif // INTERFACES_KITS_JS_COMMON_INCLUDE_DETAIL_ENHANCE_NAPI_FORMAL_H