Fix single color stop with longer hue makes DrawRectOp failed to Deserialize
After crrev.com/c/6197018, The single stop case it valid, it was assumed
that colors should have at least two. This CL is a continuation on
crrev.com/c/6275826, details see in that CL. Basically this CL fixes
single stop with longer hue interpolation will makes content disappear
silently and only logs `RasterCHROMIUM: serialization failure` without
crash.
Bug: 344620213
Change-Id: I0015c815ea4a11b53be877dbdb6a9e10ef614bea
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/6293745
Auto-Submit: Jason Leo <m.jason.liu@gmail.com>
Commit-Queue: Aaron Krajeski <aaronhk@chromium.org>
Reviewed-by: Aaron Krajeski <aaronhk@chromium.org>
Reviewed-by: Xianzhu Wang <wangxianzhu@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1424477}
diff --git a/cc/paint/paint_shader.cc b/cc/paint/paint_shader.cc
index cdff3bc..4998d43 100644
--- a/cc/paint/paint_shader.cc
+++ b/cc/paint/paint_shader.cc
@@ -677,7 +677,7 @@
case Type::kLinearGradient:
case Type::kRadialGradient:
case Type::kTwoPointConicalGradient:
- return colors_.size() >= 2 &&
+ return colors_.size() >= 1 &&
(positions_.empty() || positions_.size() == colors_.size());
case Type::kImage:
// We may not be able to decode the image, in which case it would be
diff --git a/cc/paint/paint_shader_unittest.cc b/cc/paint/paint_shader_unittest.cc
index 74d4039..fec796f 100644
--- a/cc/paint/paint_shader_unittest.cc
+++ b/cc/paint/paint_shader_unittest.cc
@@ -13,6 +13,7 @@
#include "cc/test/test_skcanvas.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/skia/include/core/SkBitmap.h"
+#include "third_party/skia/include/core/SkColor.h"
#include "third_party/skia/include/core/SkImage.h"
#include "third_party/skia/include/core/SkImageInfo.h"
#include "third_party/skia/include/core/SkMatrix.h"
@@ -129,4 +130,18 @@
EXPECT_EQ(image_provider.draw_image().scale().height(), 0.25f);
}
+TEST(PaintShaderTest, GradientSingleStopValidTest) {
+ SkPoint points[] = {
+ SkPoint::Make(0, 0),
+ SkPoint::Make(100, 100)
+ };
+ SkColor4f colors[] = {
+ SkColor4f::FromColor(SK_ColorGREEN),
+ };
+ SkScalar positions[] = {0.0f};
+ auto shader = PaintShader::MakeLinearGradient(points, colors, positions, 1,
+ SkTileMode::kClamp);
+ EXPECT_TRUE(shader->IsValid());
+}
+
} // namespace cc