[svgdevice] Add support for color shaders
Handle kColor_GradientType (which is returned by asGradient for color shaders) as a straight color paint server. Bug: skia:12622 Change-Id: I46fa21ed23a7824d67fc0460f92d649743e1b1f2 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/469900 Commit-Queue: Florin Malita <fmalita@chromium.org> Commit-Queue: Florin Malita <fmalita@google.com> Reviewed-by: Tyler Denniston <tdenniston@google.com>
This commit is contained in:
parent
bdfe3b6a2e
commit
a8888cff15
@ -404,8 +404,11 @@ void SkSVGDevice::AutoElement::addGradientShaderResources(const SkShader* shader
|
||||
Resources* resources) {
|
||||
SkShader::GradientInfo grInfo;
|
||||
memset(&grInfo, 0, sizeof(grInfo));
|
||||
if (SkShader::kLinear_GradientType != shader->asAGradient(&grInfo)) {
|
||||
// TODO: non-linear gradient support
|
||||
const auto gradient_type = shader->asAGradient(&grInfo);
|
||||
|
||||
if (gradient_type != SkShader::kColor_GradientType &&
|
||||
gradient_type != SkShader::kLinear_GradientType) {
|
||||
// TODO: other gradient support
|
||||
return;
|
||||
}
|
||||
|
||||
@ -419,7 +422,10 @@ void SkSVGDevice::AutoElement::addGradientShaderResources(const SkShader* shader
|
||||
SkASSERT(grInfo.fColorCount <= grColors.count());
|
||||
SkASSERT(grInfo.fColorCount <= grOffsets.count());
|
||||
|
||||
resources->fPaintServer.printf("url(#%s)", addLinearGradientDef(grInfo, shader).c_str());
|
||||
SkASSERT(grColors.size() > 0);
|
||||
resources->fPaintServer = gradient_type == SkShader::kColor_GradientType
|
||||
? svg_color(grColors[0])
|
||||
: SkStringPrintf("url(#%s)", addLinearGradientDef(grInfo, shader).c_str());
|
||||
}
|
||||
|
||||
void SkSVGDevice::AutoElement::addColorFilterResources(const SkColorFilter& cf,
|
||||
|
@ -588,4 +588,24 @@ DEF_TEST(SVGDevice_relative_path_encoding, reporter) {
|
||||
REPORTER_ASSERT(reporter, !strcmp(d, "m100 50l100 0l0 100l-100 -100Z"));
|
||||
}
|
||||
|
||||
DEF_TEST(SVGDevice_color_shader, reporter) {
|
||||
SkDOM dom;
|
||||
{
|
||||
auto svgCanvas = MakeDOMCanvas(&dom);
|
||||
|
||||
SkPaint paint;
|
||||
paint.setShader(SkShaders::Color(0xffffff00));
|
||||
|
||||
svgCanvas->drawCircle(100, 100, 100, paint);
|
||||
}
|
||||
|
||||
const auto* rootElement = dom.finishParsing();
|
||||
REPORTER_ASSERT(reporter, rootElement, "root element not found");
|
||||
const auto* ellipseElement = dom.getFirstChild(rootElement, "ellipse");
|
||||
REPORTER_ASSERT(reporter, ellipseElement, "ellipse element not found");
|
||||
const auto* fill = dom.findAttr(ellipseElement, "fill");
|
||||
REPORTER_ASSERT(reporter, fill, "fill attribute not found");
|
||||
REPORTER_ASSERT(reporter, !strcmp(fill, "yellow"));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
Loading…
Reference in New Issue
Block a user