diff --git a/frameworks/bridge/declarative_frontend/jsview/js_canvas_renderer.cpp b/frameworks/bridge/declarative_frontend/jsview/js_canvas_renderer.cpp index 3b98af434e5199cb8ed90f8d0162920a230240a9..5140e17488be6fcaeeb7f55c5218a7b9225ffb6e 100644 --- a/frameworks/bridge/declarative_frontend/jsview/js_canvas_renderer.cpp +++ b/frameworks/bridge/declarative_frontend/jsview/js_canvas_renderer.cpp @@ -1431,12 +1431,11 @@ void JSCanvasRenderer::JsGetFilter(const JSCallbackInfo& info) void JSCanvasRenderer::JsSetFilter(const JSCallbackInfo& info) { - if (!info[0]->IsString()) { + if (!info[0]->IsString() || info[0]->IsUndefined() || info[0]->IsNull()) { return; } - std::string filterStr; + std::string filterStr = "none"; JSViewAbstract::ParseJsString(info[0], filterStr); - // null and undefined are the same. if (filterStr == "") { LOGE("invalid filter string"); return; diff --git a/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.cpp b/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.cpp index db15bedf0b83329fd98608493458f29a92bd4dae..409d1a1da8e83e7876519bfd09b163c4d571dca0 100644 --- a/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.cpp +++ b/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.cpp @@ -1319,9 +1319,9 @@ void CustomPaintPaintMethod::SetPaintImage(SkPaint& paint) // https://drafts.fxtf.org/filter-effects/#grayscaleEquivalent void CustomPaintPaintMethod::SetGrayFilter(const std::string& percent, SkPaint& paint) { - float percentNum = PercentStrToFloat(percent); - if (percentNum > 1) { - percentNum = 1; + float percentNum = 1.0f; + if (!CheckNumberAndPercentage(percent, percentNum, true)) { + return; } float matrix[20] = { 0.0f }; @@ -1346,9 +1346,9 @@ void CustomPaintPaintMethod::SetGrayFilter(const std::string& percent, SkPaint& // https://drafts.fxtf.org/filter-effects/#sepiaEquivalent void CustomPaintPaintMethod::SetSepiaFilter(const std::string& percent, SkPaint& paint) { - float percentNum = PercentStrToFloat(percent); - if (percentNum > 1) { - percentNum = 1; + float percentNum = 1.0f; + if (!CheckNumberAndPercentage(percent, percentNum, true)) { + return; } float matrix[20] = { 0.0f }; matrix[0] = 1.0f - percentNum * 0.607f; @@ -1370,7 +1370,10 @@ void CustomPaintPaintMethod::SetSepiaFilter(const std::string& percent, SkPaint& // https://drafts.fxtf.org/filter-effects/#saturateEquivalent void CustomPaintPaintMethod::SetSaturateFilter(const std::string& percent, SkPaint& paint) { - float percentNum = PercentStrToFloat(percent); + float percentNum = 1.0f; + if (!CheckNumberAndPercentage(percent, percentNum, false)) { + return; + } float matrix[20] = { 0.0f }; matrix[0] = LUMR + (1 - LUMR) * percentNum; @@ -1447,9 +1450,9 @@ void CustomPaintPaintMethod::SetHueRotateFilter(const std::string& filterParam, */ void CustomPaintPaintMethod::SetInvertFilter(const std::string& percent, SkPaint& paint) { - float percentNum = PercentStrToFloat(percent); - if (percentNum > 1) { - percentNum = 1; + float percentNum = 1.0f; + if (!CheckNumberAndPercentage(percent, percentNum, true)) { + return; } float matrix[20] = { 0.0f }; matrix[0] = matrix[6] = matrix[12] = 1.0 - 2.0 * percentNum; @@ -1469,9 +1472,9 @@ void CustomPaintPaintMethod::SetInvertFilter(const std::string& percent, SkPaint */ void CustomPaintPaintMethod::SetOpacityFilter(const std::string& percent, SkPaint& paint) { - float percentNum = PercentStrToFloat(percent); - if (percentNum > 1) { - percentNum = 1; + float percentNum = 1.0f; + if (!CheckNumberAndPercentage(percent, percentNum, true)) { + return; } float matrix[20] = { 0.0f }; matrix[0] = matrix[6] = matrix[12] = 1.0f; @@ -1487,8 +1490,8 @@ void CustomPaintPaintMethod::SetOpacityFilter(const std::string& percent, SkPain */ void CustomPaintPaintMethod::SetBrightnessFilter(const std::string& percent, SkPaint& paint) { - float percentNum = PercentStrToFloat(percent); - if (percentNum < 0) { + float percentNum = 1.0f; + if (!CheckNumberAndPercentage(percent, percentNum, false)) { return; } float matrix[20] = { 0.0f }; @@ -1505,7 +1508,10 @@ void CustomPaintPaintMethod::SetBrightnessFilter(const std::string& percent, SkP */ void CustomPaintPaintMethod::SetContrastFilter(const std::string& percent, SkPaint& paint) { - float percentNum = PercentStrToFloat(percent); + float percentNum = 1.0f; + if (!CheckNumberAndPercentage(percent, percentNum, false)) { + return; + } float matrix[20] = { 0.0f }; matrix[0] = matrix[6] = matrix[12] = percentNum; matrix[4] = matrix[9] = matrix[14] = 0.5f * (1 - percentNum); @@ -1516,10 +1522,15 @@ void CustomPaintPaintMethod::SetContrastFilter(const std::string& percent, SkPai // https://drafts.fxtf.org/filter-effects/#blurEquivalent void CustomPaintPaintMethod::SetBlurFilter(const std::string& percent, SkPaint& paint) { + float blurNum = 0.0f; + blurNum = BlurStrToDouble(percent); + if (Negative(blurNum)) { + return; + } #ifdef NEW_SKIA - paint.setImageFilter(SkImageFilters::Blur(BlurStrToDouble(percent), BlurStrToDouble(percent), nullptr)); + paint.setImageFilter(SkImageFilters::Blur(blurNum, blurNum, nullptr)); #else - paint.setImageFilter(SkBlurImageFilter::Make(BlurStrToDouble(percent), BlurStrToDouble(percent), nullptr)); + paint.setImageFilter(SkBlurImageFilter::Make(blurNum, blurNum, nullptr)); #endif } @@ -1546,10 +1557,9 @@ bool CustomPaintPaintMethod::GetFilterType(FilterType& filterType, std::string& filterType = FilterStrToFilterType(paramData.substr(0, index)); filterParam = paramData.substr(index + 1); size_t endIndex = filterParam.find(")"); - if (endIndex == std::string::npos) { - return false; + if (endIndex != std::string::npos) { + filterParam.erase(endIndex, 1); } - filterParam.erase(endIndex, 1); return true; } @@ -1611,6 +1621,28 @@ float CustomPaintPaintMethod::PercentStrToFloat(const std::string& percentStr) return percentNum; } +bool CustomPaintPaintMethod::CheckNumberAndPercentage(const std::string& param, float& result, bool isClamped) +{ + // param.size() == 1, param[0] != 0 ~ 9, return false + if (param.size() == 1 && (param[0] < '0' || param[0] > '9')) { + return false; + } + // param.size() > 1, param[i] != (. || 0 ~ 9), return false (except for the last one) + for (int i = 0; i < param.size() - 1; i++) { + if (param[i] < '.' || param[i] == '/' || param[i] > '9') { + return false; + } + } + result = PercentStrToFloat(param); + if (Negative(result)) { + return false; + } + if (isClamped && GreatNotEqual(result, 1.0f)) { + result = 1.0f; + } + return true; +} + FilterType CustomPaintPaintMethod::FilterStrToFilterType(const std::string& filterStr) { const LinearMapNode filterTypeTable[] = { diff --git a/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.h b/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.h index 772e75d4fc80bf360157598044dc108633039c9e..0af329251e51799cb9a687807179a714add3d0f2 100644 --- a/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.h +++ b/frameworks/core/components_ng/pattern/custom_paint/custom_paint_paint_method.h @@ -333,6 +333,7 @@ protected: bool IsPercentStr(std::string& percentStr); double PxStrToDouble(const std::string& str); double BlurStrToDouble(const std::string& str); + bool CheckNumberAndPercentage(const std::string& param, float& result, bool isClamped); #ifndef NEW_SKIA void InitImagePaint(SkPaint& paint); void GetStrokePaint(SkPaint& paint);