mirror of
https://gitee.com/openharmony/arkui_ace_engine
synced 2024-11-23 15:10:30 +00:00
bugfix:修复svg线性渐变颜色识别错误
Signed-off-by: Zhang Jinyu <zhangjinyu101@huawei.com> Change-Id: I53872c205d3b7440e99d71a231e00710446cd538
This commit is contained in:
parent
b9c36704d9
commit
4f0cde8b47
@ -21,6 +21,10 @@ const char LINECAP_ROUND[] = "round";
|
||||
const char LINECAP_SQUARE[] = "square";
|
||||
const char LINEJOIN_BEVEL[] = "bevel";
|
||||
const char LINEJOIN_ROUND[] = "round";
|
||||
const std::regex COLOR_WITH_ALPHA(
|
||||
R"(rgba?\(([0-9]{1,3})\,([0-9]{1,3})\,([0-9]{1,3})\,(\d+\.?\d*)\))", std::regex::icase);
|
||||
constexpr uint32_t RGBA_SUB_MATCH_SIZE = 5;
|
||||
constexpr double MAX_ALPHA = 1.0;
|
||||
}
|
||||
|
||||
LineCapStyle SvgAttributesParser::GetLineCapStyle(const std::string& val)
|
||||
@ -214,4 +218,20 @@ double SvgAttributesParser::ParseDouble(const std::string& value)
|
||||
return StringUtils::StringToDouble(value);
|
||||
}
|
||||
|
||||
bool SvgAttributesParser::CheckColorAlpha(const std::string& colorStr, Color& result)
|
||||
{
|
||||
std::smatch matches;
|
||||
if (std::regex_match(colorStr, matches, COLOR_WITH_ALPHA)) {
|
||||
if (matches.size() == RGBA_SUB_MATCH_SIZE) {
|
||||
auto red = static_cast<uint8_t>(std::stoi(matches[1]));
|
||||
auto green = static_cast<uint8_t>(std::stoi(matches[2]));
|
||||
auto blue = static_cast<uint8_t>(std::stoi(matches[3]));
|
||||
auto alpha = static_cast<double>(std::stod(matches[4]));
|
||||
// Scale up from 0~1.0 to 255
|
||||
result = Color::FromARGB(static_cast<uint8_t>(std::min(MAX_ALPHA, alpha)) * 0xff, red, green, blue);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} // namespace OHOS::Ace::NG
|
||||
|
@ -32,6 +32,7 @@ public:
|
||||
static LineJoinStyle GetLineJoinStyle(const std::string& val);
|
||||
static Dimension ParseDimension(const std::string& value, bool useVp = false);
|
||||
static double ParseDouble(const std::string& value);
|
||||
static bool CheckColorAlpha(const std::string& colorStr, Color& result);
|
||||
};
|
||||
|
||||
enum class SvgFeColorMatrixType {
|
||||
|
@ -83,6 +83,11 @@ void SvgGraphic::SetLinearGradient(const Size& viewPort, OHOS::Ace::Gradient& gr
|
||||
const auto& linearGradient = gradient.GetLinearGradient();
|
||||
auto gradientInfo = OHOS::Ace::LinearGradientInfo();
|
||||
|
||||
if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN) &&
|
||||
NearEqual(linearGradient.x1, linearGradient.y1) && NearEqual(linearGradient.x2, linearGradient.y2)) {
|
||||
RectifyTargetSize(bounds, width, height);
|
||||
}
|
||||
|
||||
gradientInfo.x1 = linearGradient.x1 ? ConvertDimensionToPx(linearGradient.x1.value(), width) : 0.0;
|
||||
if (linearGradient.x1 && linearGradient.x1.value().Unit() == DimensionUnit::PERCENT) {
|
||||
gradientInfo.x1 += bounds.Left();
|
||||
@ -372,4 +377,14 @@ void SvgGraphic::UpdateColorFilter(RSFilter& filter)
|
||||
}
|
||||
filter.SetColorFilter(*colorFilterSptrAddr);
|
||||
}
|
||||
|
||||
void SvgGraphic::RectifyTargetSize(const Rect& bounds, double& width, double& height)
|
||||
{
|
||||
if (NearZero(bounds.Height())) {
|
||||
return;
|
||||
}
|
||||
auto scalar = bounds.Width() / bounds.Height();
|
||||
width = 2 * bounds.Height() * sin(std::atan(scalar)) * cos(atan(scalar)); // 2: algorithm parameters
|
||||
height = 2 * bounds.Height() * sin(std::atan(scalar)) * sin(atan(scalar)); // 2: algorithm parameters
|
||||
}
|
||||
} // namespace OHOS::Ace::NG
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2022 Huawei Device Co., Ltd.
|
||||
* Copyright (c) 2022-2024 Huawei Device Co., Ltd.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
@ -160,6 +160,7 @@ protected:
|
||||
private:
|
||||
void UpdateColorFilter(RSFilter& filter);
|
||||
bool CheckHrefPattern();
|
||||
void RectifyTargetSize(const Rect& bounds, double& width, double& height);
|
||||
};
|
||||
|
||||
} // namespace OHOS::Ace::NG
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2022 Huawei Device Co., Ltd.
|
||||
* Copyright (c) 2022-2024 Huawei Device Co., Ltd.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
@ -15,6 +15,7 @@
|
||||
|
||||
#include "frameworks/core/components_ng/svg/parse/svg_stop.h"
|
||||
|
||||
#include "core/common/container.h"
|
||||
#include "frameworks/core/components_ng/svg/parse/svg_constants.h"
|
||||
|
||||
namespace OHOS::Ace::NG {
|
||||
@ -31,10 +32,13 @@ RefPtr<SvgNode> SvgStop::Create()
|
||||
{
|
||||
auto svgNode = AceType::MakeRefPtr<SvgStop>();
|
||||
svgNode->stopAttr_.gradientColor.SetDimension(0.0);
|
||||
if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
|
||||
svgNode->stopAttr_.gradientColor.SetColor(Color::BLACK);
|
||||
}
|
||||
return svgNode;
|
||||
}
|
||||
|
||||
const GradientColor& SvgStop::GetGradientColor() const
|
||||
const Ace::GradientColor& SvgStop::GetGradientColor() const
|
||||
{
|
||||
return stopAttr_.gradientColor;
|
||||
}
|
||||
@ -50,6 +54,10 @@ bool SvgStop::ParseAndSetSpecializedAttr(const std::string& name, const std::str
|
||||
[](const std::string& val, SvgStopAttribute& attribute) {
|
||||
Color color = (val == VALUE_NONE ? Color::TRANSPARENT : SvgAttributesParser::GetColor(val));
|
||||
attribute.gradientColor.SetColor(color);
|
||||
if (Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
|
||||
SvgAttributesParser::CheckColorAlpha(val, color);
|
||||
attribute.gradientColor.SetColor(color);
|
||||
}
|
||||
} },
|
||||
{ DOM_SVG_SRC_STOP_OPACITY,
|
||||
[](const std::string& val, SvgStopAttribute& attribute) {
|
||||
|
@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2022 Huawei Device Co., Ltd.
|
||||
* Copyright (c) 2022-2024 Huawei Device Co., Ltd.
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
@ -30,7 +30,7 @@ public:
|
||||
|
||||
static RefPtr<SvgNode> Create();
|
||||
bool ParseAndSetSpecializedAttr(const std::string& name, const std::string& value) override;
|
||||
const GradientColor& GetGradientColor() const;
|
||||
const Ace::GradientColor& GetGradientColor() const;
|
||||
|
||||
private:
|
||||
SvgStopAttribute stopAttr_;
|
||||
|
Loading…
Reference in New Issue
Block a user