From 6dc76e9d37ffd1e11c19fa84a8fcef2151afe6bd Mon Sep 17 00:00:00 2001 From: caochuan Date: Tue, 7 May 2024 14:39:29 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96gif=E5=9B=BE=E7=89=87?= =?UTF-8?q?=E7=9A=84=E6=92=AD=E6=94=BE=E6=AC=A1=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: caochuan --- .../innerkitsimpl/codec/src/image_source.cpp | 42 ++++++ .../image_source_gif_ex_test.cpp | 122 ++++++++++++++++++ .../kits/js/common/image_source_napi.cpp | 1 + interfaces/innerkits/include/image_source.h | 1 + .../kits/native/include/image/image_common.h | 8 ++ .../image/libextplugin/src/ext_decoder.cpp | 30 +++++ .../image/images/moving_test_loop0.gif | Bin 0 -> 3466 bytes .../image/images/moving_test_loop1.gif | Bin 0 -> 3466 bytes .../image/images/moving_test_loop5.gif | Bin 0 -> 3466 bytes test/resource/image/ohos_test.xml | 3 + 10 files changed, 207 insertions(+) create mode 100644 test/resource/image/images/moving_test_loop0.gif create mode 100644 test/resource/image/images/moving_test_loop1.gif create mode 100644 test/resource/image/images/moving_test_loop5.gif diff --git a/frameworks/innerkitsimpl/codec/src/image_source.cpp b/frameworks/innerkitsimpl/codec/src/image_source.cpp index 87099cc3c..ac1f544e0 100644 --- a/frameworks/innerkitsimpl/codec/src/image_source.cpp +++ b/frameworks/innerkitsimpl/codec/src/image_source.cpp @@ -255,6 +255,7 @@ const static std::map ORIENTATION_INT_MAP = { }; const static string IMAGE_DELAY_TIME = "DelayTime"; const static string IMAGE_DISPOSAL_TYPE = "DisposalType"; +const static string IMAGE_GIFLOOPCOUNT_TYPE = "GIFLoopCount"; const static int32_t ZERO = 0; static void UpdatepPlImageInfo(DecodeContext context, bool isHdr, ImagePlugin::PlImageInfo &plInfo); @@ -1402,6 +1403,26 @@ uint32_t ImageSource::GetImagePropertyInt(uint32_t index, const std::string &key uint32_t ImageSource::GetImagePropertyString(uint32_t index, const std::string &key, std::string &value) { + if (key.empty()) { + return Media::ERR_IMAGE_DECODE_EXIF_UNSUPPORT; + } + uint32_t ret = SUCCESS; + if (IMAGE_GIFLOOPCOUNT_TYPE.compare(key) == ZERO) { + IMAGE_LOGD("GetImagePropertyString special key: %{public}s", key.c_str()); + (void)GetFrameCount(ret); + if (ret != SUCCESS || mainDecoder_ == nullptr) { + IMAGE_LOGE("[ImageSource]GetFrameCount get frame sum error."); + return ret; + } else { + ret = mainDecoder_->GetImagePropertyString(index, key, value); + if (ret != SUCCESS) { + IMAGE_LOGE("[ImageSource]GetLoopCount get loop count issue. errorCode=%{public}u", ret); + return ret; + } + } + return ret; + } + std::unique_lock guard(decodingMutex_); return GetImagePropertyCommon(index, key, value); } @@ -2763,6 +2784,27 @@ unique_ptr> ImageSource::GetDisposalType(uint32_t &errorCode) return disposalTypes; } +int32_t ImageSource::GetLoopCount(uint32_t &errorCode) +{ + (void)GetFrameCount(errorCode); + if (errorCode != SUCCESS || mainDecoder_ == nullptr) { + IMAGE_LOGE("[ImageSource]GetLoopCount get frame sum error."); + return errorCode; + } + + int32_t loopCount = 0; + const string IMAGE_LOOP_COUNT = "GIFLoopCount"; + errorCode = mainDecoder_->GetImagePropertyInt(0, IMAGE_LOOP_COUNT, loopCount); + if (errorCode != SUCCESS) { + IMAGE_LOGE("[ImageSource]GetLoopCount get loop count issue. errorCode=%{public}u", errorCode); + return errorCode; + } + + errorCode = SUCCESS; + + return loopCount; +} + uint32_t ImageSource::GetFrameCount(uint32_t &errorCode) { uint32_t frameCount = GetSourceInfo(errorCode).topLevelImageNum; diff --git a/frameworks/innerkitsimpl/test/unittest/image_source_test/image_source_gif_ex_test.cpp b/frameworks/innerkitsimpl/test/unittest/image_source_test/image_source_gif_ex_test.cpp index b4b25fd53..a8e3a598f 100644 --- a/frameworks/innerkitsimpl/test/unittest/image_source_test/image_source_gif_ex_test.cpp +++ b/frameworks/innerkitsimpl/test/unittest/image_source_test/image_source_gif_ex_test.cpp @@ -40,6 +40,12 @@ static const std::string TEST_FILE_MULTI_FRAME_GIF = "moving_test.gif"; static const size_t TEST_FILE_MULTI_FRAME_GIF_FRAME_COUNT = 3; static const std::string TEST_FILE_JPG = "test.jpg"; static const size_t TEST_FILE_JPG_FRAME_COUNT = 1; +static const std::string TEST_FILE_MULTI_FRAME_LOOP0_GIF = "moving_test_loop0.gif"; +static const std::string TEST_FILE_MULTI_FRAME_LOOP1_GIF = "moving_test_loop1.gif"; +static const std::string TEST_FILE_MULTI_FRAME_LOOP5_GIF = "moving_test_loop5.gif"; +static const int32_t TEST_FILE_MULTI_FRAME_GIF_LOOP_COUNT_1 = 1; +static const int32_t TEST_FILE_MULTI_FRAME_GIF_LOOP_COUNT_5 = 5; +static const int32_t TEST_FILE_MULTI_FRAME_GIF_LOOP_COUNT_INF = 0; } class ImageSourceGifExTest : public testing::Test { @@ -420,5 +426,121 @@ HWTEST_F(ImageSourceGifExTest, GetEncodedFormat001, TestSize.Level3) GTEST_LOG_(INFO) << "ImageSourceGifExTest: imageInfo2 encodedFormat " << imageInfo2.encodedFormat; GTEST_LOG_(INFO) << "ImageSourceGifExTest: GetEncodedFormat001 end"; } + +/** + * @tc.name: GetLoopCount001 + * @tc.desc: test GetLoopCount + * @tc.type: FUNC + */ +HWTEST_F(ImageSourceGifExTest, GetLoopCount001, TestSize.Level3) +{ + GTEST_LOG_(INFO) << "ImageSourceGifExTest: GetLoopCount001 start"; + + const std::string testName = TEST_FILE_MULTI_FRAME_LOOP5_GIF; + + uint32_t errorCode = 0; + const SourceOptions opts; + const std::string inputName = INPUT_PATH + testName; + auto imageSource = ImageSource::CreateImageSource(inputName, opts, errorCode); + ASSERT_NE(imageSource, nullptr); + + auto loopCount = imageSource->GetLoopCount(errorCode); + ASSERT_EQ(loopCount, TEST_FILE_MULTI_FRAME_GIF_LOOP_COUNT_5); + + GTEST_LOG_(INFO) << "ImageSourceGifExTest: GetLoopCount001 end"; +} + +/** + * @tc.name: GetLoopCount002 + * @tc.desc: test GetLoopCount + * @tc.type: FUNC + */ +HWTEST_F(ImageSourceGifExTest, GetLoopCount002, TestSize.Level3) +{ + GTEST_LOG_(INFO) << "ImageSourceGifExTest: GetLoopCount002 start"; + + const std::string testName = TEST_FILE_MULTI_FRAME_LOOP1_GIF; + + uint32_t errorCode = 0; + const SourceOptions opts; + const std::string inputName = INPUT_PATH + testName; + auto imageSource = ImageSource::CreateImageSource(inputName, opts, errorCode); + ASSERT_NE(imageSource, nullptr); + + auto loopCount = imageSource->GetLoopCount(errorCode); + ASSERT_EQ(loopCount, TEST_FILE_MULTI_FRAME_GIF_LOOP_COUNT_1); + + GTEST_LOG_(INFO) << "ImageSourceGifExTest: GetLoopCount002 end"; +} + +/** + * @tc.name: GetLoopCount003 + * @tc.desc: test GetLoopCount + * @tc.type: FUNC + */ +HWTEST_F(ImageSourceGifExTest, GetLoopCount003, TestSize.Level3) +{ + GTEST_LOG_(INFO) << "ImageSourceGifExTest: GetLoopCount003 start"; + + const std::string testName = TEST_FILE_MULTI_FRAME_LOOP0_GIF; + + uint32_t errorCode = 0; + const SourceOptions opts; + const std::string inputName = INPUT_PATH + testName; + auto imageSource = ImageSource::CreateImageSource(inputName, opts, errorCode); + ASSERT_NE(imageSource, nullptr); + + auto loopCount = imageSource->GetLoopCount(errorCode); + ASSERT_EQ(loopCount, TEST_FILE_MULTI_FRAME_GIF_LOOP_COUNT_INF); + + GTEST_LOG_(INFO) << "ImageSourceGifExTest: GetLoopCount003 end"; +} + +/** + * @tc.name: GetLoopCount004 + * @tc.desc: test GetLoopCount + * @tc.type: FUNC + */ +HWTEST_F(ImageSourceGifExTest, GetLoopCount004, TestSize.Level3) +{ + GTEST_LOG_(INFO) << "ImageSourceGifExTest: GetLoopCount004 start"; + + const std::string testName = TEST_FILE_MULTI_FRAME_GIF; + + uint32_t errorCode = 0; + const SourceOptions opts; + const std::string inputName = INPUT_PATH + testName; + auto imageSource = ImageSource::CreateImageSource(inputName, opts, errorCode); + ASSERT_NE(imageSource, nullptr); + + auto loopCount = imageSource->GetLoopCount(errorCode); + ASSERT_EQ(loopCount, TEST_FILE_MULTI_FRAME_GIF_LOOP_COUNT_INF); + + GTEST_LOG_(INFO) << "ImageSourceGifExTest: GetLoopCount004 end"; +} + +/** + * @tc.name: GetLoopCount005 + * @tc.desc: test GetLoopCount + * @tc.type: FUNC + */ +HWTEST_F(ImageSourceGifExTest, GetLoopCount005, TestSize.Level3) +{ + GTEST_LOG_(INFO) << "ImageSourceGifExTest: GetLoopCount005 start"; + + const std::string testName = TEST_FILE_JPG; + + uint32_t errorCode = 0; + const SourceOptions opts; + const std::string inputName = INPUT_PATH + testName; + auto imageSource = ImageSource::CreateImageSource(inputName, opts, errorCode); + ASSERT_NE(imageSource, nullptr); + + imageSource->GetLoopCount(errorCode); + + ASSERT_EQ(errorCode, ERR_MEDIA_INVALID_PARAM); + + GTEST_LOG_(INFO) << "ImageSourceGifExTest: GetLoopCount005 end"; +} } // namespace Multimedia } // namespace OHOS \ No newline at end of file diff --git a/frameworks/kits/js/common/image_source_napi.cpp b/frameworks/kits/js/common/image_source_napi.cpp index 4449ae271..e6e0355fe 100644 --- a/frameworks/kits/js/common/image_source_napi.cpp +++ b/frameworks/kits/js/common/image_source_napi.cpp @@ -188,6 +188,7 @@ static std::vector sPropertyKeyMap = { {"SCENE_TEXT_CONF", 0, "HwMnoteSceneTextConf"}, {"FACE_COUNT", 0, "HwMnoteFaceCount"}, {"FOCUS_MODE", 0, "HwMnoteFocusMode"}, + {"GIF_LOOP_COUNT", 0, "GIFLoopCount"}, }; static std::vector sImageFormatMap = { {"YCBCR_422_SP", 1000, ""}, diff --git a/interfaces/innerkits/include/image_source.h b/interfaces/innerkits/include/image_source.h index a4be89fbc..9760ae106 100644 --- a/interfaces/innerkits/include/image_source.h +++ b/interfaces/innerkits/include/image_source.h @@ -216,6 +216,7 @@ public: uint32_t &errorCode); NATIVEEXPORT std::unique_ptr> GetDelayTime(uint32_t &errorCode); NATIVEEXPORT std::unique_ptr> GetDisposalType(uint32_t &errorCode); + NATIVEEXPORT int32_t GetLoopCount(uint32_t &errorCode); NATIVEEXPORT uint32_t GetFrameCount(uint32_t &errorCode); #ifdef IMAGE_PURGEABLE_PIXELMAP NATIVEEXPORT size_t GetSourceSize() const; diff --git a/interfaces/kits/native/include/image/image_common.h b/interfaces/kits/native/include/image/image_common.h index a234a0500..28852fc29 100644 --- a/interfaces/kits/native/include/image/image_common.h +++ b/interfaces/kits/native/include/image/image_common.h @@ -1258,6 +1258,14 @@ static const char *OHOS_IMAGE_PROPERTY_SCENE_POINTER = "HwMnoteScenePointer"; * @since 12 */ static const char *OHOS_IMAGE_PROPERTY_SCENE_VERSION = "HwMnoteSceneVersion"; + +/** + * @brief Scene Version + * It is used in {@link OH_ImageSource_GetImageProperty} and {@link OH_ImageSource_ModifyImageProperty}. + * + * @since 12 + */ +static const char *OHOS_IMAGE_PROPERTY_GIF_LOOP_COUNT = "GIFLoopCount"; #ifdef __cplusplus }; #endif diff --git a/plugins/common/libs/image/libextplugin/src/ext_decoder.cpp b/plugins/common/libs/image/libextplugin/src/ext_decoder.cpp index ca181cea1..204878759 100644 --- a/plugins/common/libs/image/libextplugin/src/ext_decoder.cpp +++ b/plugins/common/libs/image/libextplugin/src/ext_decoder.cpp @@ -73,6 +73,9 @@ namespace { constexpr static float ONE_EIGHTH = 0.125; constexpr static uint64_t ICC_HEADER_SIZE = 132; constexpr static size_t SMALL_FILE_SIZE = 1000 * 1000 * 10; + constexpr static int32_t LOOP_COUNT_INFINITE = 0; + constexpr static int32_t SK_REPETITION_COUNT_INFINITE = -1; + constexpr static int32_t SK_REPETITION_COUNT_ERROR_VALUE = -2; } namespace OHOS { @@ -92,6 +95,7 @@ const static string TAG_ORIENTATION_STRING = "Orientation"; const static string TAG_ORIENTATION_INT = "OrientationInt"; const static string IMAGE_DELAY_TIME = "DelayTime"; const static string IMAGE_DISPOSAL_TYPE = "DisposalType"; +const static string IMAGE_LOOP_COUNT = "GIFLoopCount"; const static std::string HW_MNOTE_TAG_HEADER = "HwMnote"; const static std::string HW_MNOTE_CAPTURE_MODE = "HwMnoteCaptureMode"; const static std::string HW_MNOTE_PHYSICAL_APERTURE = "HwMnotePhysicalAperture"; @@ -1393,6 +1397,24 @@ static uint32_t GetDisposalType(SkCodec * codec, uint32_t index, int32_t &value) return SUCCESS; } +static uint32_t GetLoopCount(SkCodec *codec, int32_t &value) +{ + if (codec->getEncodedFormat() != SkEncodedImageFormat::kGIF) { + IMAGE_LOGE("[GetLoopCount] Should not get loop count in %{public}d", codec->getEncodedFormat()); + return ERR_MEDIA_INVALID_PARAM; + } + auto count = codec->getRepetitionCount(); + if (count == LOOP_COUNT_INFINITE || count <= SK_REPETITION_COUNT_ERROR_VALUE) { + IMAGE_LOGE("[GetLoopCount] getRepetitionCount error"); + return ERR_IMAGE_SOURCE_DATA; + } + if (count == SK_REPETITION_COUNT_INFINITE) { + count = LOOP_COUNT_INFINITE; + } + value = static_cast(count); + return SUCCESS; +} + uint32_t ExtDecoder::GetImagePropertyInt(uint32_t index, const std::string &key, int32_t &value) { IMAGE_LOGD("[GetImagePropertyInt] enter ExtDecoder plugin, key:%{public}s", key.c_str()); @@ -1406,6 +1428,9 @@ uint32_t ExtDecoder::GetImagePropertyInt(uint32_t index, const std::string &key, if (IMAGE_DISPOSAL_TYPE.compare(key) == ZERO) { return GetDisposalType(codec_.get(), index, value); } + if (IMAGE_LOOP_COUNT.compare(key) == ZERO) { + return GetLoopCount(codec_.get(), value); + } // There can add some not need exif property if (res == Media::ERR_IMAGE_DECODE_EXIF_UNSUPPORT) { return res; @@ -1445,6 +1470,11 @@ uint32_t ExtDecoder::GetImagePropertyString(uint32_t index, const std::string &k res = GetDisposalType(codec_.get(), index, disposalType); value = std::to_string(disposalType); return res; + } else if (IMAGE_LOOP_COUNT.compare(key) == ZERO) { + int loopCount = ZERO; + res = GetLoopCount(codec_.get(), loopCount); + value = std::to_string(loopCount); + return res; } if (res == Media::ERR_IMAGE_DECODE_EXIF_UNSUPPORT) { return res; diff --git a/test/resource/image/images/moving_test_loop0.gif b/test/resource/image/images/moving_test_loop0.gif new file mode 100644 index 0000000000000000000000000000000000000000..6643f465ae71b561e337349063f9fa13500ad4bf GIT binary patch literal 3466 zcmZ?wbhEHbJjQT};X4Dv|NsBL*bAq95oQ<#qaiTzLO}69x1VcBu(M-;tC5}oGb1nr z6o0a?umfowP-uX%2?NJJ21X7Uj|~eBHggDT#hlo%@Nm0;ve%prgNCEs62@6~PHbF! zykEh&OvGW+l9Q7)f>*_y+_d!cbWPV&b38XMJIi2D{OZoh$I2&JEt2b+=;c>hP)2hx7h=ObvHL{;m2JaCd*Je)ztC zUw&`zAFmIo5BT@@XSjGn1!skDBdb(|aFdH>hH$g35bV-iRUy%>z4L`&kIu;-O1&C4PYCvPy__M~Z}{_v@`MSTHzg*j zNmi;%QqimwoUCe@DLBQ~%X2A1kRMy>wD2O&rPHIMelDGnXmwL{rccvMwOJmkZmP|8 z*(Iqy$Kh0@`dph^Gu7u=yt=7A-{hC1#sUMbD2;_WQnNG`X=vTjSgc|trMX1GD@t>z zOw=sRWfEDpG?$A6sk~aTWLnm%l`EF5dbMiJwpXuKU)pd?>-Cx~*Ro!(-SKSI>vem+ zy?VX=0Gsxk4M)VX-)uagw))McGiI;fY`);8{dUWhu$lqL?c7Hgg{eI7vYuWGj{&=?f{k}inUccYZz^?P*0E>9ehl3pI zYd##}F@N*nuz`Ki5S(0;nwl4q@1B{)U=0A? Cc2EZZ literal 0 HcmV?d00001 diff --git a/test/resource/image/images/moving_test_loop1.gif b/test/resource/image/images/moving_test_loop1.gif new file mode 100644 index 0000000000000000000000000000000000000000..ccfb06616aa6e45472ae9d66a22b73a69fdeef15 GIT binary patch literal 3466 zcmZ?wbhEHbJjQT};X4Dv|NsBL*bAq95oQ<#qaiTzLO}69x1VcBu(M-;tC5}oGb1Ad zgW^vX7It7r=zu~4luZ~o{xL9e$arj6aIl#}SS#klhJ}aQ1(dz!bQm-o?Updkx^rUV z;^X}a&SfGFo0goMtP#8_=H#ZOr>ASWo|@yidD&S8gW^|rPELM)cD_S%*Bj3*D+1>_ zP1f?Q+OqQUa__}nbAN7Gb#-p==B&FFTUUoqjXs?B*K69E8=HepuiD$SP51KFg4w&~ z{x)8BcTvgbOM6a>ufDfm;Wt+u=Z+624t5-rit91l_;_-U^5YtxNTcLaQ+1_}{fYRT zcCOP_oJ}_BOZ=q{-}!F35nJP~t&P3hdN=%A&aLv?^GD}Kmq*_#tNqW$7j6;t=xA@Z z>%Op`MbA>_wztZ~?h1RAwl@9fztG=h?_&4<^JkThs|op(b5`FqKlE?aw}89*TlK^D z1^n`Rd;fTSNPWP+zdysp8!9*}gd16xW>M=Bf&bZta~f1bcK&{!r@GxOqabuj}Ou!G6P^Ka?j-;Jhg@ zQBAT^Ws-_!rQl>$%S^#3zFwY78G`)SQm2I%c`ltE9rbhRj6|!Osxy6>W~$BdSanlv zw#zO_^*IiwBGu>G+?uIA&*Ifh_4y{hBsCToa7Ae>)RCH{u}DMfmd0WgD=Ez-3SLo~ zOJ$;FX)cq8dhL#9t6s0$ z^X=8^^#|Cr-)uM{mi=bq3ANR4Hk~nh{but8H|@7uu7qX3-FhQ!_1kTC%3iIvfu4|v269bU2nF%ez*I>G41zzzFfR3d%N$73?(Z$2JZXxI64LS=f+r;{4X*L*sqv;EDd z(+00u}NBz(U?@>#D1(BY=hcsjaK8uTMDKCF{Ly&CSgj zmsiD}-nRDk_JYT!=6Y{mcXxNi=T~=6Z(o0Ze*-hOoX?I84-a<;Ysa05C_u`!DGaF$ zNuXRCB0QRFN0ac#4FQe?gF4sdm?$tP{uA|0Oi5KJ&n(GM2u?0aP0b6*ch5{?um%9= C<4_0y literal 0 HcmV?d00001 diff --git a/test/resource/image/images/moving_test_loop5.gif b/test/resource/image/images/moving_test_loop5.gif new file mode 100644 index 0000000000000000000000000000000000000000..a6402560e4ffb02c2a0fe1091e31a7eaea5342ea GIT binary patch literal 3466 zcmZ?wbhEHbJjQT};X4Dv|NsBL*bAq95oQ<#qaiTzLO}69x1VcBu(M-;tC5}oGb1Yl zgW^vX7It7r=zu~4luZ~o{xL9e$arj6aIl#}SS#klhJ}aQ1(dz!bQm-o?Updkx^rUV z;^X}a&SfGFo0goMtP#8_=H#ZOr>ASWo|@yidD&S8gW^|rPELM)cD_S%*Bj3*D+1>_ zP1f?Q+OqQUa__}nbAN7Gb#-p==B&FFTUUoqjXs?B*K69E8=HepuiD$SP51KFg4w&~ z{x)8BcTvgbOM6a>ufDfm;Wt+u=Z+624t5-rit91l_;_-U^5YtxNTcLaQ+1_}{fYRT zcCOP_oJ}_BOZ=q{-}!F35nJP~t&P3hdN=%A&aLv?^GD}Kmq*_#tNqW$7j6;t=xA@Z z>%Op`MbA>_wztZ~?h1RAwl@9fztG=h?_&4<^JkThs|op(b5`FqKlE?aw}89*TlK^D z1^n`Rd;fTSNPWP+zdysp8!9*}gd16xW>M=Bf&bZta~f1bcK&{!r@GxOqabuj}Ou!G6P^Ka?j-;Jhg@ zQBAT^Ws-_!rQl>$%S^#3zFwY78G`)SQm2I%c`ltE9rbhRj6|!Osxy6>W~$BdSanlv zw#zO_^*IiwBGu>G+?uIA&*Ifh_4y{hBsCToa7Ae>)RCH{u}DMfmd0WgD=Ez-3SLo~ zOJ$;FX)cq8dhL#9t6s0$ z^X=8^^#|Cr-)uM{mi=bq3ANR4Hk~nh{but8H|@7uu7qX3-FhQ!_1kTC%3iIvfu4|v269bU2nF%ez*I>G41zzzFfR3d%N$73?(Z$2JZXxI64LS=f+r;{4X*L*sqv;EDd z(+00u}NBz(U?@>#D1(BY=hcsjaK8uTMDKCF{Ly&CSgj zmsiD}-nRDk_JYT!=6Y{mcXxNi=T~=6Z(o0Ze*-hOoX?I84-a<;Ysa05C_u`!DGaF$ zNuXRCB0QRFN0ac#4FQe?gF4sdm?$tP{uA|0Oi5KJ&n(GM2u?0aP0b6*ch5{?um%7U Crcew3 literal 0 HcmV?d00001 diff --git a/test/resource/image/ohos_test.xml b/test/resource/image/ohos_test.xml index 1a254fbc3..bee0e6d69 100644 --- a/test/resource/image/ohos_test.xml +++ b/test/resource/image/ohos_test.xml @@ -79,6 +79,9 @@