From d66f9a0a62ef8b43c0bbd18e78793efe241212fa Mon Sep 17 00:00:00 2001 From: liyujie Date: Wed, 25 Jun 2025 23:40:51 +0800 Subject: [PATCH] Add pixelmap and drawable support to image component Signed-off-by: liyujie Change-Id: I74d6fb73d6668c5525be622a1e9b16927ec14c1f --- .../ohos/osal/drawable_descriptor_ohos.cpp | 2 +- adapter/ohos/osal/drawable_descriptor_ohos.h | 8 +- frameworks/base/image/drawable_descriptor.h | 6 +- .../src/ani/arkts/ArkUIAniModule.ts | 3 + .../arkui-ohos/src/ani/native/BUILD.gn | 8 +- .../{native_image.cpp => image_module.cpp} | 31 +++++- .../image/{native_image.h => image_module.h} | 3 + .../arkui-ohos/src/ani/native/module.cpp | 12 ++- .../arkui-ohos/src/component/image.ts | 23 +--- .../src/handwritten/component/image.ts | 72 ++++++++++++- .../declarative_frontend/jsview/js_image.cpp | 2 +- frameworks/core/BUILD.gn | 5 + .../components_ng/pattern/image/image_model.h | 2 +- .../pattern/image/image_model_ng.cpp | 2 +- .../pattern/image/image_model_ng.h | 2 +- .../pattern/image/image_model_static.cpp | 100 ++++++++++++++++-- .../pattern/image/image_model_static.h | 8 ++ .../pattern/image/image_pattern.h | 4 +- .../drawable/layered_drawable_descriptor.cpp | 29 ++--- frameworks/core/interfaces/ani/ani_api.h | 1 + .../native/ani/image_ani_modifier.cpp | 15 ++- .../drawable/drawable_descriptor_ani.cpp | 8 +- test/mock/base/mock_pixel_map.cpp | 5 + test/mock/core/rosen/testing_bitmap.h | 59 ++++++----- test/mock/core/rosen/testing_canvas.h | 4 + test/mock/core/rosen/testing_image_info.h | 22 +++- test/unittest/BUILD.gn | 8 +- 27 files changed, 346 insertions(+), 98 deletions(-) rename frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/{native_image.cpp => image_module.cpp} (51%) rename frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/{native_image.h => image_module.h} (77%) diff --git a/adapter/ohos/osal/drawable_descriptor_ohos.cpp b/adapter/ohos/osal/drawable_descriptor_ohos.cpp index 1a666c178c6..413d9840a22 100644 --- a/adapter/ohos/osal/drawable_descriptor_ohos.cpp +++ b/adapter/ohos/osal/drawable_descriptor_ohos.cpp @@ -19,7 +19,7 @@ #include "core/components/common/layout/constants.h" namespace OHOS::Ace { -RefPtr DrawableDescriptor::CreateDrawable(void* sptrAddr) +RefPtr AceDrawableDescriptor::CreateDrawable(void* sptrAddr) { auto* drawable = reinterpret_cast(sptrAddr); if (drawable == nullptr) { diff --git a/adapter/ohos/osal/drawable_descriptor_ohos.h b/adapter/ohos/osal/drawable_descriptor_ohos.h index 0a641e18822..a59f40c531b 100644 --- a/adapter/ohos/osal/drawable_descriptor_ohos.h +++ b/adapter/ohos/osal/drawable_descriptor_ohos.h @@ -25,8 +25,8 @@ namespace OHOS::Ace { -class DrawableDescriptorOhos : public DrawableDescriptor { - DECLARE_ACE_TYPE(DrawableDescriptorOhos, DrawableDescriptor); +class DrawableDescriptorOhos : public AceDrawableDescriptor { + DECLARE_ACE_TYPE(DrawableDescriptorOhos, AceDrawableDescriptor); public: explicit DrawableDescriptorOhos(Drawable::DrawableDescriptor* drawable); @@ -40,7 +40,7 @@ public: private: Drawable::PaintConfig ConverConfig(const NG::ImagePaintConfig& config); - + // do not take the object out Drawable::DrawableDescriptor* drawable_; std::shared_ptr mutex_ = std::make_shared(); @@ -49,4 +49,4 @@ private: } // namespace OHOS::Ace -#endif // FOUNDATION_ACE_ADAPTER_OHOS_OSAL_DRAWABLE_DESCRIPTOR_OHOS_H \ No newline at end of file +#endif // FOUNDATION_ACE_ADAPTER_OHOS_OSAL_DRAWABLE_DESCRIPTOR_OHOS_H diff --git a/frameworks/base/image/drawable_descriptor.h b/frameworks/base/image/drawable_descriptor.h index 87d0677c819..99cb8a1285c 100644 --- a/frameworks/base/image/drawable_descriptor.h +++ b/frameworks/base/image/drawable_descriptor.h @@ -26,13 +26,13 @@ namespace OHOS { namespace Ace { -class DrawableDescriptor : public AceType { - DECLARE_ACE_TYPE(DrawableDescriptor, AceType); +class AceDrawableDescriptor : public AceType { + DECLARE_ACE_TYPE(AceDrawableDescriptor, AceType); public: using RedrawCallback = std::function; - static RefPtr CreateDrawable(void* sptrAddr); + static RefPtr CreateDrawable(void* sptrAddr); virtual void RegisterRedrawCallback(RedrawCallback&& callback) = 0; diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts index edb84967947..6fb8cdd6290 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/arkts/ArkUIAniModule.ts @@ -27,6 +27,7 @@ import { WaterFlowOptions,WaterFlowSections, XComponentControllerCallbackInterna import { HookDragInfo } from "arkui/handwritten" import { dragController } from "@ohos/arkui/dragController" import { componentSnapshot } from "@ohos/arkui/componentSnapshot" +import { DrawableDescriptor } from "@ohos.arkui.drawableDescriptor" export class ArkUIAniModule { static { @@ -34,6 +35,8 @@ export class ArkUIAniModule { } native static _Image_ResizableOptions(ptr: KPointer, value: drawing.Lattice): void + native static _Image_Consturct_PixelMap(ptr: KPointer, value: image.PixelMap): void + native static _Image_Consturct_DrawableDescriptor(ptr: KPointer, value: DrawableDescriptor, type: int): void native static _Web_SetWebOptions(ptr: KPointer, webviewController: webview.WebviewController): void native static _Web_SetWebController_ControllerHandler(ptr: KPointer, webviewController: webview.WebviewController): void native static _ConvertUtils_ConvertFromPixelMapAni(pixelmap: image.PixelMap): KPointer diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/BUILD.gn b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/BUILD.gn index de8be9fa272..0bef192f32d 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/BUILD.gn +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/BUILD.gn @@ -33,17 +33,17 @@ ohos_shared_library("arkoala_native_ani") { "custom_node/custom_node_module.cpp", "dragController/drag_controller_module.cpp", "drag_and_drop/native_drag_drop_global.cpp", - "image/native_image.cpp", + "image/image_module.cpp", "image_span/image_span_module.cpp", + "interop/interop_module.cpp", "load.cpp", "module.cpp", + "shape/shape_module_methods.cpp", "utils/ani_utils.cpp", "utils/convert_utils.cpp", + "video/video_module_methods.cpp", "water_flow/waterFlowSection_module.cpp", "web/web_module_methods.cpp", - "interop/interop_module.cpp", - "video/video_module_methods.cpp", - "shape/shape_module_methods.cpp", "xcomponent/xcomponent_module_methods.cpp", ] diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/native_image.cpp b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/image_module.cpp similarity index 51% rename from frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/native_image.cpp rename to frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/image_module.cpp index 1303405e54b..4593a908c7c 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/native_image.cpp +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/image_module.cpp @@ -13,7 +13,7 @@ * limitations under the License. */ -#include "native_image.h" +#include "image_module.h" #include "load.h" #include "log/log.h" @@ -36,4 +36,33 @@ void ImageResizableOptions(ani_env* env, [[maybe_unused]] ani_object obj, ani_lo } modifier->getImageAniModifier()->setResizableLattice(arkNode, lattice); } + +void ImageConstructPixelMap(ani_env* env, [[maybe_unused]] ani_object obj, ani_long node, ani_object pixelMapAni) +{ + auto* arkNode = reinterpret_cast(node); + const auto* modifier = GetNodeAniModifier(); + if (!modifier || !arkNode) { + return; + } + auto pixelMap = OHOS::Media::PixelMapTaiheAni::GetNativePixelMap(env, pixelMapAni); + modifier->getImageAniModifier()->setPixelMap(arkNode, &pixelMap); +} + +void ImageConstructDrawableDescriptor( + ani_env* env, [[maybe_unused]] ani_object obj, ani_long node, ani_object drawableAni, ani_int drawableType) +{ + auto* arkNode = reinterpret_cast(node); + const auto* modifier = GetNodeAniModifier(); + if (!modifier || !arkNode) { + return; + } + ani_long nativeObj = 0; + env->Object_GetPropertyByName_Long(drawableAni, "nativeObj", &nativeObj); + auto* drawable = reinterpret_cast(nativeObj); + if (drawable == nullptr) { + HILOGE("image construct with drawable descriptor failed, nativeObj is nullptr"); + return; + } + modifier->getImageAniModifier()->setDrawableDescriptor(arkNode, drawable, static_cast(drawableType)); +} } // namespace OHOS::Ace::Ani diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/native_image.h b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/image_module.h similarity index 77% rename from frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/native_image.h rename to frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/image_module.h index fe80c6bc727..07c560e9fc7 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/native_image.h +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/image/image_module.h @@ -20,6 +20,9 @@ namespace OHOS::Ace::Ani { void ImageResizableOptions(ani_env* env, [[maybe_unused]] ani_object obj, ani_long node, ani_object latticeAni); +void ImageConstructPixelMap(ani_env* env, [[maybe_unused]] ani_object obj, ani_long node, ani_object pixelMapAni); +void ImageConstructDrawableDescriptor( + ani_env* env, [[maybe_unused]] ani_object obj, ani_long node, ani_object drawableAni, ani_int drawableType); } // namespace OHOS::Ace::Ani #endif // KOALA_PROJECTS_ARKOALA_ARKTS_ARKUI_OHOS_ANI_NATIVE_IMAGE_NATIVE_IMAGE_H diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/module.cpp b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/module.cpp index c00894707b9..a7bc6656337 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/module.cpp +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/ani/native/module.cpp @@ -24,7 +24,7 @@ #include "drag_and_drop/native_drag_drop_global.h" #include "dragController/drag_controller_module.h" #include "image_span/image_span_module.h" -#include "image/native_image.h" +#include "image/image_module.h" #include "load.h" #include "log/log.h" #include "utils/convert_utils.h" @@ -54,6 +54,16 @@ ANI_EXPORT ani_status ANI_Constructor(ani_vm* vm, uint32_t* result) nullptr, reinterpret_cast(OHOS::Ace::Ani::ImageResizableOptions) }, + ani_native_function { + "_Image_Consturct_PixelMap", + nullptr, + reinterpret_cast(OHOS::Ace::Ani::ImageConstructPixelMap) + }, + ani_native_function { + "_Image_Consturct_DrawableDescriptor", + nullptr, + reinterpret_cast(OHOS::Ace::Ani::ImageConstructDrawableDescriptor) + }, ani_native_function { "_Web_SetWebOptions", "JL@ohos/web/webview/webview/WebviewController;:V", diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/image.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/image.ts index 831b4b34bf9..b688f20ea71 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/image.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/component/image.ts @@ -24,7 +24,7 @@ import { PeerNode } from "./../PeerNode" import { ArkUIGeneratedNativeModule, TypeChecker } from "#components" import { ArkCommonMethodPeer, CommonMethod, PointLightStyle, ArkCommonMethodComponent, ArkCommonMethodStyle, AttributeModifier } from "./common" import { Resource } from "global.resource" -import { PixelMap } from "#external" +import { PixelMap, PixelMapDrawableDescriptor, AnimatedDrawableDescriptor, LayeredDrawableDescriptor } from "#external" import { ResourceColor, ColorFilter, ResourceStr, EdgeWidths } from "./units" import { ImageFit, ImageRepeat, CopyOptions, Color } from "./enums" import { Matrix4Transit } from "./arkui-matrix4" @@ -771,25 +771,8 @@ export class ArkImageComponent extends ArkCommonMethodComponent implements Image public setImageOptions(src: PixelMap | ResourceStr | DrawableDescriptor | PixelMap | ResourceStr | DrawableDescriptor | ImageContent, imageAIOptions?: ImageAIOptions): this { if (this.checkPriority("setImageOptions")) { - const src_type = runtimeType(src) - const imageAIOptions_type = runtimeType(imageAIOptions) - if ((TypeChecker.isPixelMap(src, false, false)) || ((RuntimeType.STRING == src_type) || (RuntimeType.OBJECT == src_type)) || (TypeChecker.isDrawableDescriptor(src))) { - const src_casted = src as (PixelMap | ResourceStr | DrawableDescriptor) - this.getPeer()?.setImageOptions0Attribute(src_casted) - return this - } - if ((TypeChecker.isPixelMap(src, false, false)) || ((RuntimeType.STRING == src_type) || (RuntimeType.OBJECT == src_type)) || (TypeChecker.isDrawableDescriptor(src))) { - const src_casted = src as (PixelMap | ResourceStr | DrawableDescriptor) - const imageAIOptions_casted = imageAIOptions as (ImageAIOptions) - this.getPeer()?.setImageOptions2Attribute(src_casted, imageAIOptions_casted) - return this - } - if ((TypeChecker.isPixelMap(src, false, false)) || ((RuntimeType.STRING == src_type) || (RuntimeType.OBJECT == src_type)) || (TypeChecker.isDrawableDescriptor(src)) || (TypeChecker.isImageContent(src))) { - const src_casted = src as (PixelMap | ResourceStr | DrawableDescriptor | ImageContent) - this.getPeer()?.setImageOptions1Attribute(src_casted) - return this - } - throw new Error("Can not select appropriate overload") + hookSetImageOptions(this, src, imageAIOptions) + return this } return this } diff --git a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/image.ts b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/image.ts index 1ab6d04c866..6492b119de5 100644 --- a/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/image.ts +++ b/frameworks/bridge/arkts_frontend/koala_projects/arkoala-arkts/arkui-ohos/src/handwritten/component/image.ts @@ -16,7 +16,7 @@ import { ArkUIAniModule } from "arkui.ani" export class ColorContent { - constructor() {} + constructor() { } public static readonly ORIGIN: ColorContent = new ColorContent(); } function fillColor0Attribute(peer: KPointer, value: ResourceColor | undefined): void { @@ -80,14 +80,76 @@ function hookSetResizableOptions(peer: ArkImagePeer, value: ResizableOptions | u ArkUIAniModule._Image_ResizableOptions(peer.getPeerPtr(), value.lattice as drawing.Lattice) return } - const thisSerializer : Serializer = Serializer.hold() - let value_type : int32 = RuntimeType.UNDEFINED + const thisSerializer: Serializer = Serializer.hold() + let value_type: int32 = RuntimeType.UNDEFINED value_type = runtimeType(value) thisSerializer.writeInt8(value_type as int32) if ((RuntimeType.UNDEFINED) != (value_type)) { - const value_value = value! + const value_value = value! thisSerializer.writeResizableOptions(value_value) } ArkUIGeneratedNativeModule._ImageAttribute_resizable(peer.getPeerPtr(), thisSerializer.asBuffer(), thisSerializer.length()) thisSerializer.release() -} \ No newline at end of file +} + +enum DrawableType { + BASE = 0, + LAYERDED = 1, + ANIMATED = 2, + PIXELMAP = 3 +} + +function checkDrawableType(value: DrawableDescriptor): DrawableType { + if (value instanceof PixelMapDrawableDescriptor) { + return DrawableType.PIXELMAP + } + if (value instanceof AnimatedDrawableDescriptor) { + return DrawableType.ANIMATED + } + if (value instanceof LayeredDrawableDescriptor) { + return DrawableType.LAYERDED + } + return DrawableType.BASE +} + +function SetImageAIOptions(component: ArkImageComponent, imageAIOptions?: ImageAIOptions) { + if (imageAIOptions == undefined) { + return + } + throw new Error("ImageAIOptions parameters not implemented") +} + +function hookSetImageOptions(component: ArkImageComponent, src: PixelMap | Resource | string | DrawableDescriptor | ImageContent | undefined, imageAIOptions?: ImageAIOptions): void { + if (src instanceof DrawableDescriptor) { + let drawableType = checkDrawableType(src) as int + let value = src as DrawableDescriptor + ArkUIAniModule._Image_Consturct_DrawableDescriptor(component.getPeer().getPeerPtr(), value, drawableType) + SetImageAIOptions(component, imageAIOptions) + return + } + if (src instanceof PixelMap) { + let value = src as PixelMap + ArkUIAniModule._Image_Consturct_PixelMap(component.getPeer().getPeerPtr(), value) + SetImageAIOptions(component, imageAIOptions) + return + } + const thisSerializer: Serializer = Serializer.hold() + if (src instanceof string || src instanceof Resource) { + thisSerializer.writeInt8(1 as int32) + if (src instanceof string) { + thisSerializer.writeInt8(0 as int32) + thisSerializer.writeString(src as string) + } + else if (src instanceof Resource) { + thisSerializer.writeInt8(1 as int32) + thisSerializer.writeResource(src as Resource) + } + } + else if (src instanceof ImageContent) { + thisSerializer.writeInt8(3 as int32) + thisSerializer.writeInt32(src as int32) + } + ArkUIGeneratedNativeModule._ImageInterface_setImageOptions1(component.getPeer().getPeerPtr(), thisSerializer.asBuffer(), thisSerializer.length()) + SetImageAIOptions(component, imageAIOptions) + thisSerializer.release() +} diff --git a/frameworks/bridge/declarative_frontend/jsview/js_image.cpp b/frameworks/bridge/declarative_frontend/jsview/js_image.cpp index b4937bcef12..352402fd24f 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_image.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_image.cpp @@ -402,7 +402,7 @@ void JSImage::CreateImage(const JSCallbackInfo& info, bool isImageSpan) } } else if (type == ImageType::PIXELMAP_DRAWABLE) { auto* address = UnwrapNapiValue(imageInfo); - auto drawable = DrawableDescriptor::CreateDrawable(address); + auto drawable = AceDrawableDescriptor::CreateDrawable(address); if (!drawable) { return; } diff --git a/frameworks/core/BUILD.gn b/frameworks/core/BUILD.gn index c72b8e95833..a71b24d5b11 100644 --- a/frameworks/core/BUILD.gn +++ b/frameworks/core/BUILD.gn @@ -935,6 +935,11 @@ template("ace_core_ng_source_set") { # text "text/text_emoji_processor.cpp", + + # drawable + "drawable/animated_drawable_descriptor.cpp", + "drawable/layered_drawable_descriptor.cpp", + "drawable/pixel_map_drawable_descriptor.cpp", ] include_dirs = [ "$ace_root" ] diff --git a/frameworks/core/components_ng/pattern/image/image_model.h b/frameworks/core/components_ng/pattern/image/image_model.h index 8047a78f70b..a301751d25c 100644 --- a/frameworks/core/components_ng/pattern/image/image_model.h +++ b/frameworks/core/components_ng/pattern/image/image_model.h @@ -49,7 +49,7 @@ class ACE_FORCE_EXPORT ImageModel { public: static ImageModel* GetInstance(); virtual ~ImageModel() = default; - virtual void Create(const RefPtr& drawable) {} + virtual void Create(const RefPtr& drawable) {} virtual void Create(const ImageInfoConfig& imageInfoConfig, RefPtr& pixMap) = 0; virtual void SetAlt(const ImageSourceInfo& src) = 0; diff --git a/frameworks/core/components_ng/pattern/image/image_model_ng.cpp b/frameworks/core/components_ng/pattern/image/image_model_ng.cpp index aabe70f9eeb..b81361e334b 100644 --- a/frameworks/core/components_ng/pattern/image/image_model_ng.cpp +++ b/frameworks/core/components_ng/pattern/image/image_model_ng.cpp @@ -103,7 +103,7 @@ void ImageModelNG::Create(const ImageInfoConfig& imageInfoConfig, RefPtr& drawable) +void ImageModelNG::Create(const RefPtr& drawable) { auto* stack = ViewStackProcessor::GetInstance(); auto nodeId = stack->ClaimNodeId(); diff --git a/frameworks/core/components_ng/pattern/image/image_model_ng.h b/frameworks/core/components_ng/pattern/image/image_model_ng.h index 9550f95a20c..e22ac1dcbc1 100644 --- a/frameworks/core/components_ng/pattern/image/image_model_ng.h +++ b/frameworks/core/components_ng/pattern/image/image_model_ng.h @@ -28,7 +28,7 @@ namespace OHOS::Ace::NG { class ACE_EXPORT ImageModelNG : public OHOS::Ace::ImageModel { public: - void Create(const RefPtr& drawable) override; + void Create(const RefPtr& drawable) override; void Create(const ImageInfoConfig& imageInfoConfig, RefPtr& pixMap) override; void ResetImage() override; void CreateAnimation(const std::vector& imageList, int32_t duration, int32_t iteration) override; diff --git a/frameworks/core/components_ng/pattern/image/image_model_static.cpp b/frameworks/core/components_ng/pattern/image/image_model_static.cpp index 22d8e74d809..96929081ae5 100644 --- a/frameworks/core/components_ng/pattern/image/image_model_static.cpp +++ b/frameworks/core/components_ng/pattern/image/image_model_static.cpp @@ -18,20 +18,27 @@ #include "core/components_ng/pattern/image/image_model_static.h" +#include "interfaces/native/node/resource.h" + +#include "base/image/image_defines.h" #include "core/components/common/layout/constants.h" #include "core/components/image/image_theme.h" #include "core/components_ng/base/frame_node.h" +#include "core/components_ng/base/view_abstract.h" #include "core/components_ng/pattern/image/image_render_property.h" +#include "core/components_ng/pattern/text/span_node.h" +#include "core/drawable/animated_drawable_descriptor.h" +#include "core/drawable/layered_drawable_descriptor.h" +#include "core/drawable/pixel_map_drawable_descriptor.h" #include "core/image/image_source_info.h" #include "core/pipeline/pipeline_base.h" -#ifndef ACE_UNITTEST -#include "core/components_ng/base/view_abstract.h" -#endif -#include "interfaces/native/node/resource.h" - -#include "core/components_ng/pattern/text/span_node.h" namespace OHOS::Ace::NG { +namespace { +constexpr int32_t LAYERED_TYPE = 1; +constexpr int32_t ANIMATED_TYPE = 2; +constexpr int32_t PIXELMAP_TYPE = 3; +} // namespace void ImageModelStatic::SetSmoothEdge(FrameNode* frameNode, const std::optional& value) { CHECK_NULL_VOID(frameNode); @@ -174,5 +181,86 @@ void ImageModelStatic::SetResizableLattice(FrameNode* frameNode, const RefPtr& pixelMap) +{ + CHECK_NULL_VOID(frameNode); + auto srcInfo = ImageSourceInfo(pixelMap); + ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode); +} + +void ImageModelStatic::SetDrawableDescriptor(FrameNode* frameNode, void* drawable, int type) +{ + CHECK_NULL_VOID(frameNode); + if (type == LAYERED_TYPE) { + // layered + auto layeredDrawable = reinterpret_cast(drawable); + CHECK_NULL_VOID(layeredDrawable); + auto pixelMap = layeredDrawable->GetPixelMap(); + SetPixelMap(frameNode, pixelMap); + } else if (type == ANIMATED_TYPE) { + // animated + auto animatedDrawable = reinterpret_cast(drawable); + CHECK_NULL_VOID(animatedDrawable); + auto pixelMaps = animatedDrawable->GetPixelMapList(); + auto duration = animatedDrawable->GetTotalDuration(); + auto iterations = animatedDrawable->GetIterations(); + SetPixelMapList(frameNode, pixelMaps, duration, iterations); + } else if (type == PIXELMAP_TYPE) { + // pixelmap + auto pixelmapDrawable = reinterpret_cast(drawable); + CHECK_NULL_VOID(pixelmapDrawable); + auto pixelMap = pixelmapDrawable->GetPixelMap(); + SetPixelMap(frameNode, pixelMap); + } +} + +void ImageModelStatic::SetPixelMapList( + FrameNode* frameNode, const std::vector>& pixelMaps, int32_t duration, int32_t iteration) +{ + std::vector imageList; + for (int i = 0; i < static_cast(pixelMaps.size()); i++) { + ImageProperties image; + image.pixelMap = pixelMaps[i]; + imageList.push_back(image); + } + if (frameNode->GetChildren().empty()) { + auto imageNode = FrameNode::CreateFrameNode( + V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr()); + CHECK_NULL_VOID(imageNode); + auto imageLayoutProperty = AceType::DynamicCast(imageNode->GetLayoutProperty()); + CHECK_NULL_VOID(imageLayoutProperty); + imageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT); + frameNode->GetLayoutProperty()->UpdateAlignment(Alignment::TOP_LEFT); + frameNode->AddChild(imageNode); + } + auto pattern = frameNode->GetPattern(); + CHECK_NULL_VOID(pattern); + if (!pattern->GetIsAnimation()) { + auto castImageLayoutProperty = frameNode->GetLayoutPropertyPtr(); + CHECK_NULL_VOID(castImageLayoutProperty); + castImageLayoutProperty->Reset(); + auto castImageRenderProperty = frameNode->GetPaintPropertyPtr(); + CHECK_NULL_VOID(castImageRenderProperty); + castImageRenderProperty->Reset(); + pattern->ResetImageAndAlt(); + pattern->ResetImageProperties(); + } + auto pipeline = frameNode->GetContext(); + CHECK_NULL_VOID(pipeline); + auto draggable = pipeline->GetDraggable(); + if (draggable && !frameNode->IsDraggable()) { + auto gestureHub = frameNode->GetOrCreateGestureEventHub(); + CHECK_NULL_VOID(gestureHub); + gestureHub->InitDragDropEvent(); + } + pattern->SetSrcUndefined(false); + pattern->StopAnimation(); + pattern->SetImageType(ImageType::ANIMATED_DRAWABLE); + pattern->SetImages(std::move(imageList)); + pattern->SetDuration(duration); + pattern->SetIteration(iteration); + pattern->StartAnimation(); +} } // namespace OHOS::Ace::NG #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_IMAGE_IMAGE_MODEL_STATIC_CPP diff --git a/frameworks/core/components_ng/pattern/image/image_model_static.h b/frameworks/core/components_ng/pattern/image/image_model_static.h index 41e351e5f11..2d18d4e3d52 100644 --- a/frameworks/core/components_ng/pattern/image/image_model_static.h +++ b/frameworks/core/components_ng/pattern/image/image_model_static.h @@ -17,6 +17,7 @@ #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_IMAGE_IMAGE_MODEL_STATIC_H #include "base/image/drawing_lattice.h" +#include "base/image/pixel_map.h" #include "core/components/declaration/image/image_animator_declaration.h" #include "core/components/image/image_event.h" #include "core/components_ng/base/frame_node.h" @@ -27,6 +28,8 @@ namespace OHOS::Ace::NG { class ACE_EXPORT ImageModelStatic { public: + static void SetPixelMap(FrameNode* frameNode, const RefPtr& pixelMap); + static void SetDrawableDescriptor(FrameNode* frameNode, void* drawable, int type); static void SetSmoothEdge(FrameNode* frameNode, const std::optional& value); static void SetCopyOption(FrameNode* frameNode, const std::optional& copyOption); static void SetImageRepeat(FrameNode* frameNode, const std::optional& imageRepeat); @@ -41,6 +44,11 @@ public: static void SetOrientation(FrameNode* frameNode, const std::optional& orientation); static void SetEnhancedImageQuality(FrameNode* frameNode, const std::optional& imageQuality); static void SetResizableLattice(FrameNode* frameNode, const RefPtr& lattice); + +private: + // temporary animation + static void SetPixelMapList( + FrameNode* frameNode, const std::vector>& pixelMaps, int32_t duration, int32_t iteration); }; } // namespace OHOS::Ace::NG #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_IMAGE_IMAGE_MODEL_STATIC_H diff --git a/frameworks/core/components_ng/pattern/image/image_pattern.h b/frameworks/core/components_ng/pattern/image/image_pattern.h index 8cd17179361..dddca58780d 100644 --- a/frameworks/core/components_ng/pattern/image/image_pattern.h +++ b/frameworks/core/components_ng/pattern/image/image_pattern.h @@ -371,7 +371,7 @@ public: } void AddPixelMapToUiManager(); - void SetDrawable(const RefPtr& drawable) + void SetDrawable(const RefPtr& drawable) { drawable_ = drawable; } @@ -558,7 +558,7 @@ private: // The component has an internal encapsulation class drawable of the image. // The internal drawable has an external raw pointer. - RefPtr drawable_; + RefPtr drawable_; bool isRegisterRedrawCallback_ = false; ACE_DISALLOW_COPY_AND_MOVE(ImagePattern); diff --git a/frameworks/core/drawable/layered_drawable_descriptor.cpp b/frameworks/core/drawable/layered_drawable_descriptor.cpp index 055af6260ed..3c487046dd2 100644 --- a/frameworks/core/drawable/layered_drawable_descriptor.cpp +++ b/frameworks/core/drawable/layered_drawable_descriptor.cpp @@ -25,6 +25,7 @@ #include "base/image/image_source.h" #include "base/image/pixel_map.h" +#include "base/utils/utils.h" #include "core/components_ng/render/drawing.h" namespace OHOS::Ace { @@ -32,7 +33,6 @@ namespace { constexpr float HALF = 0.5; constexpr float SIDE = 192.0f; constexpr int32_t NOT_ADAPTIVE_SIZE = 288; -constexpr float THRESHOLD = 0.001; RSColorType PixelFormatToColorType(PixelFormat format) { @@ -102,7 +102,7 @@ void BlendForeground(RSCanvas& bitmapCanvas, RSBrush& brush, RSImage& image, } auto scale = std::min(background->GetWidth() * 1.0f / foreground->GetWidth(), background->GetHeight() * 1.0f / foreground->GetHeight()); - if ((scale - 0.0) > THRESHOLD) { + if (NearEqual(scale, 0.0)) { return; } auto destWidth = foreground->GetWidth() * scale; @@ -137,8 +137,8 @@ std::shared_ptr PixelMapToBitMap(RefPtr& pixelmap) RefPtr BitMapToPixelMap(const RSBitmap& bitmap, InitializationOptions& opts) { auto data = bitmap.GetPixels(); - opts.size.SetWidth(static_cast(bitmap.GetWidth())); - opts.size.SetHeight(static_cast(bitmap.GetHeight())); + opts.size.SetWidth(bitmap.GetWidth()); + opts.size.SetHeight(bitmap.GetHeight()); opts.editable = false; auto pixelmap = PixelMap::Create(opts); if (!pixelmap) { @@ -168,14 +168,18 @@ RefPtr CompositeLayerAdaptive( tempCache.Build(imageInfo); RSCanvas bitmapCanvas; bitmapCanvas.Bind(tempCache); - brush.SetBlendMode(RSBlendMode::SRC); - bitmapCanvas.AttachBrush(brush); - DrawOntoCanvas(backBitmap, background->GetWidth(), background->GetHeight(), bitmapCanvas); - bitmapCanvas.DetachBrush(); - RSRect dstRect(0.0, 0.0, static_cast(background->GetWidth()), static_cast(background->GetHeight())); - RSImage image; + if (backBitmap) { + brush.SetBlendMode(RSBlendMode::SRC); + bitmapCanvas.AttachBrush(brush); + DrawOntoCanvas(backBitmap, background->GetWidth(), background->GetHeight(), bitmapCanvas); + bitmapCanvas.DetachBrush(); + } + + RSImage image; if (maskBitmap) { + RSRect dstRect( + 0.0, 0.0, static_cast(background->GetWidth()), static_cast(background->GetHeight())); RSRect srcRect(0.0, 0.0, static_cast(mask->GetWidth()), static_cast(mask->GetHeight())); image.BuildFromBitmap(*maskBitmap); brush.SetBlendMode(RSBlendMode::DST_IN); @@ -184,9 +188,11 @@ RefPtr CompositeLayerAdaptive( image, srcRect, dstRect, RSSamplingOptions(), RSSrcRectConstraint::FAST_SRC_RECT_CONSTRAINT); bitmapCanvas.DetachBrush(); } + if (foreBitmap) { BlendForeground(bitmapCanvas, brush, image, backBitmap, foreBitmap); } + bitmapCanvas.ReadPixels(imageInfo, tempCache.GetPixels(), tempCache.GetRowBytes(), 0, 0); InitializationOptions opts; opts.alphaType = background->GetAlphaType(); @@ -379,8 +385,7 @@ extern "C" ACE_FORCE_EXPORT void OHOS_ACE_LayeredDrawableDescriptor_SetBackgroun } } -extern "C" ACE_FORCE_EXPORT void OHOS_ACE_LayeredDrawableDescriptor_SetMaskData( - void* object, uint8_t* data, size_t len) +extern "C" ACE_FORCE_EXPORT void OHOS_ACE_LayeredDrawableDescriptor_SetMaskData(void* object, uint8_t* data, size_t len) { auto* drawable = reinterpret_cast(object); if (drawable) { diff --git a/frameworks/core/interfaces/ani/ani_api.h b/frameworks/core/interfaces/ani/ani_api.h index 1f15dddd49b..ffbaccb167f 100644 --- a/frameworks/core/interfaces/ani/ani_api.h +++ b/frameworks/core/interfaces/ani/ani_api.h @@ -65,6 +65,7 @@ struct ArkUIDragInfo { struct ArkUIAniImageModifier { void (*setPixelMap)(ArkUINodeHandle node, void* pixelmap); + void (*setDrawableDescriptor)(ArkUINodeHandle node, void* drawablem, int type); void (*setResizableLattice)(ArkUINodeHandle node, void* lattice); }; diff --git a/frameworks/core/interfaces/native/ani/image_ani_modifier.cpp b/frameworks/core/interfaces/native/ani/image_ani_modifier.cpp index 282ec1e0a6b..1fc0d3a3e0b 100644 --- a/frameworks/core/interfaces/native/ani/image_ani_modifier.cpp +++ b/frameworks/core/interfaces/native/ani/image_ani_modifier.cpp @@ -16,12 +16,24 @@ #include "image_ani_modifier.h" #include "base/image/drawing_lattice.h" +#include "base/image/pixel_map.h" #include "base/log/log.h" #include "core/components_ng/pattern/image/image_model_static.h" namespace OHOS::Ace::NG { -void SetPixelMap(ArkUINodeHandle node, void* pixelMap) {} +void SetPixelMap(ArkUINodeHandle node, void* pixelMap) +{ + auto pixelMapRef = PixelMap::CreatePixelMap(pixelMap); + auto frameNode = reinterpret_cast(node); + ImageModelStatic::SetPixelMap(frameNode, pixelMapRef); +} + +void SetDrawableDescriptor(ArkUINodeHandle node, void* drawableDescriptor, int type) +{ + auto frameNode = reinterpret_cast(node); + ImageModelStatic::SetDrawableDescriptor(frameNode, drawableDescriptor, type); +} void SetResizableLattice(ArkUINodeHandle node, void* aniLattice) { @@ -34,6 +46,7 @@ const ArkUIAniImageModifier* GetImageAniModifier() { static const ArkUIAniImageModifier impl = { .setPixelMap = OHOS::Ace::NG::SetPixelMap, + .setDrawableDescriptor = OHOS::Ace::NG::SetDrawableDescriptor, .setResizableLattice = OHOS::Ace::NG::SetResizableLattice, }; return &impl; diff --git a/interfaces/inner_api/drawable/drawable_descriptor_ani.cpp b/interfaces/inner_api/drawable/drawable_descriptor_ani.cpp index 2d8c6ee1aec..b47d5810c80 100644 --- a/interfaces/inner_api/drawable/drawable_descriptor_ani.cpp +++ b/interfaces/inner_api/drawable/drawable_descriptor_ani.cpp @@ -64,7 +64,7 @@ void PixelMapDrawableSetRawDataC(void* drawable, uint8_t* data, size_t len) entry(drawable, data, len); } -void LayeredDrawableSetForegoundDataC(void* drawable, uint8_t* data, size_t len) +void LayeredDrawableSetForegroundDataC(void* drawable, uint8_t* data, size_t len) { void* handle = dlopen(LIBACE_MODULE, RTLD_LAZY | RTLD_LOCAL); if (handle == nullptr) { @@ -202,7 +202,7 @@ ani_object CreatePixelMapDrawable(ani_env* env, const MediaData& mediaData) env->Object_GetPropertyByName_Long(obj, "nativeObj", &nativeObj); // take native pixelmap drawable auto drawable = reinterpret_cast(nativeObj); - if (drawable) { + if (drawable == nullptr) { return obj; } PixelMapDrawableSetRawDataC(drawable, mediaData.data.get(), mediaData.len); @@ -246,7 +246,7 @@ ani_object CreateLayeredDrawableByJsonBuffer(ani_env* env, const DrawableInfo& i if (datas.size() < BUFFER_NUMBER) { return obj; } - LayeredDrawableSetForegoundDataC(drawable, datas[0].first, datas[0].second); + LayeredDrawableSetForegroundDataC(drawable, datas[0].first, datas[0].second); LayeredDrawableSetBackgroundDataC(drawable, datas[1].first, datas[1].second); // initialize mask data std::unique_ptr maskData; @@ -275,7 +275,7 @@ ani_object CreateLayerdDrawableByTwoBuffer(ani_env* env, const DrawableInfo& inf if (drawable == nullptr) { return obj; } - LayeredDrawableSetForegoundDataC(drawable, info.firstBuffer.data.get(), info.firstBuffer.len); + LayeredDrawableSetForegroundDataC(drawable, info.firstBuffer.data.get(), info.firstBuffer.len); LayeredDrawableSetBackgroundDataC(drawable, info.secondBuffer.data.get(), info.secondBuffer.len); // initialize mask data auto resMgr = info.manager; diff --git a/test/mock/base/mock_pixel_map.cpp b/test/mock/base/mock_pixel_map.cpp index f72c5e9faa7..02a147c7b45 100644 --- a/test/mock/base/mock_pixel_map.cpp +++ b/test/mock/base/mock_pixel_map.cpp @@ -31,4 +31,9 @@ RefPtr PixelMap::CreatePixelMapFromDataAbility(void* /*rawPtr*/) { return AceType::MakeRefPtr<::testing::NiceMock>(); } + +RefPtr PixelMap::Create(const InitializationOptions& opts) +{ + return AceType::MakeRefPtr<::testing::NiceMock>(); +} } // namespace OHOS::Ace diff --git a/test/mock/core/rosen/testing_bitmap.h b/test/mock/core/rosen/testing_bitmap.h index b496e187bcc..a2377c12485 100644 --- a/test/mock/core/rosen/testing_bitmap.h +++ b/test/mock/core/rosen/testing_bitmap.h @@ -19,51 +19,53 @@ #include #include +#include "testing_image_info.h" #include "testing_rect.h" namespace OHOS::Ace::Testing { -class TestingImageInfo; typedef uint32_t ColorQuad; - -enum ColorType { - COLORTYPE_UNKNOWN = 0, - COLORTYPE_ALPHA_8, - COLORTYPE_RGB_565, - COLORTYPE_ARGB_4444, - COLORTYPE_RGBA_8888, - COLORTYPE_BGRA_8888, -}; - -enum AlphaType { - ALPHATYPE_UNKNOWN = 0, - ALPHATYPE_OPAQUE, - ALPHATYPE_PREMUL, - ALPHATYPE_UNPREMUL, -}; - -struct BitmapFormat { - ColorType colorType; - AlphaType alphaType; -}; - class TestingBitmap { public: TestingBitmap() = default; - ~TestingBitmap() = default; + virtual ~TestingBitmap() = default; + + bool Build(const Testing::TestingImageInfo& imageInfo, int32_t stride = 0) + { + return true; + } - virtual void* GetPixels() + virtual void* GetPixels() const { - return nullptr; + return pixels_; } - void SetPixels(void* pixel) {} + void SetPixels(void* pixel) + { + pixels_ = pixel; + } void ClearWithColor(const ColorQuad& color) const {} + size_t ComputeByteSize() const { return 0; } + int GetWidth() const + { + return 100; + } + + int GetHeight() const + { + return 100; + } + + int GetRowBytes() const + { + return 0; + } + bool ExtractSubset(TestingBitmap& dst, const TestingRect& subset) const { return false; @@ -81,6 +83,9 @@ public: { return false; } + +private: + void* pixels_; }; } // namespace OHOS::Ace::Testing #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_MOCK_ROSEN_TEST_TESTING_BITMAP_H diff --git a/test/mock/core/rosen/testing_canvas.h b/test/mock/core/rosen/testing_canvas.h index 8c42ec8d028..43f7c243649 100644 --- a/test/mock/core/rosen/testing_canvas.h +++ b/test/mock/core/rosen/testing_canvas.h @@ -98,6 +98,10 @@ public: return std::shared_ptr(); } + virtual bool ReadPixels(const TestingImageInfo& info, void* dstPixels, size_t dstRowBytes, int32_t srcX, int32_t srcY) + { + return true; + } virtual void Save() {} virtual void Restore() {} virtual void DrawCircle(const TestingPoint& center, float radius) {} diff --git a/test/mock/core/rosen/testing_image_info.h b/test/mock/core/rosen/testing_image_info.h index 392e71d8a21..42aa6ec6622 100644 --- a/test/mock/core/rosen/testing_image_info.h +++ b/test/mock/core/rosen/testing_image_info.h @@ -18,10 +18,30 @@ #include -#include "testing_bitmap.h" #include "testing_color_space.h" namespace OHOS::Ace::Testing { +enum ColorType { + COLORTYPE_UNKNOWN = 0, + COLORTYPE_ALPHA_8, + COLORTYPE_RGB_565, + COLORTYPE_ARGB_4444, + COLORTYPE_RGBA_8888, + COLORTYPE_BGRA_8888, +}; + +enum AlphaType { + ALPHATYPE_UNKNOWN = 0, + ALPHATYPE_OPAQUE, + ALPHATYPE_PREMUL, + ALPHATYPE_UNPREMUL, +}; + +struct BitmapFormat { + ColorType colorType; + AlphaType alphaType; +}; + class TestingImageInfo { public: TestingImageInfo() = default; diff --git a/test/unittest/BUILD.gn b/test/unittest/BUILD.gn index d84525bcfc5..ce30a7f0a0d 100644 --- a/test/unittest/BUILD.gn +++ b/test/unittest/BUILD.gn @@ -265,6 +265,7 @@ ohos_source_set("ace_components_base") { "$ace_root/frameworks/core/components_ng/base/geometry_node.cpp", "$ace_root/frameworks/core/components_ng/base/inspector.cpp", "$ace_root/frameworks/core/components_ng/base/inspector_filter.cpp", + "$ace_root/frameworks/core/components_ng/base/interop/view_stack_processor_interop.cpp", "$ace_root/frameworks/core/components_ng/base/lazy_compose_adapter.cpp", "$ace_root/frameworks/core/components_ng/base/modifier.cpp", "$ace_root/frameworks/core/components_ng/base/navigation_register.cpp", @@ -277,7 +278,6 @@ ohos_source_set("ace_components_base") { "$ace_root/frameworks/core/components_ng/base/view_full_update_model_ng.cpp", "$ace_root/frameworks/core/components_ng/base/view_partial_update_model_ng.cpp", "$ace_root/frameworks/core/components_ng/base/view_stack_processor.cpp", - "$ace_root/frameworks/core/components_ng/base/interop/view_stack_processor_interop.cpp", "$ace_root/frameworks/core/components_ng/pattern/ui_extension/dynamic_component/dynamic_component_manager.cpp", ] if (ace_engine_feature_enable_split_mode && @@ -660,6 +660,9 @@ ohos_source_set("ace_core_extra") { "$ace_root/frameworks/core/components_v2/grid_layout/grid_container_utils.cpp", "$ace_root/frameworks/core/components_v2/inspector/inspector_constants.cpp", "$ace_root/frameworks/core/components_v2/inspector/utils.cpp", + "$ace_root/frameworks/core/drawable/animated_drawable_descriptor.cpp", + "$ace_root/frameworks/core/drawable/layered_drawable_descriptor.cpp", + "$ace_root/frameworks/core/drawable/pixel_map_drawable_descriptor.cpp", "$ace_root/frameworks/core/event/back_end_event_manager.cpp", "$ace_root/frameworks/core/event/key_event.cpp", "$ace_root/frameworks/core/gestures/drag_event.cpp", @@ -678,6 +681,7 @@ ohos_source_set("ace_core_extra") { "//third_party/icu/icu4c:static_icuuc", ] external_deps = [ + "bounds_checking_function:libsec_static", "googletest:gmock", "googletest:gtest_main", ] @@ -1504,8 +1508,8 @@ ohos_source_set("ace_components_pattern") { "$ace_root/frameworks/core/components_ng/pattern/xcomponent/xcomponent_model_ng.cpp", "$ace_root/frameworks/core/components_ng/pattern/xcomponent/xcomponent_paint_method.cpp", "$ace_root/frameworks/core/components_ng/pattern/xcomponent/xcomponent_pattern.cpp", - "$ace_root/frameworks/core/components_ng/pattern/xcomponent/xcomponent_pattern_v2.cpp", "$ace_root/frameworks/core/components_ng/pattern/xcomponent/xcomponent_pattern_multithread.cpp", + "$ace_root/frameworks/core/components_ng/pattern/xcomponent/xcomponent_pattern_v2.cpp", "$ace_root/test/mock/core/pattern/mock_canvas_pattern.cpp", "$ace_root/test/mock/core/pattern/mock_indexer_vibrator.cpp", "$ace_root/test/mock/core/pattern/mock_picker_haptic_controller.cpp", -- Gitee